From 106a83e86c0f0942f14390bae1c54121ff264ecd Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Mon, 1 Dec 2025 19:34:54 +0700 Subject: [PATCH 01/24] feat: enhance identifier handling with new generated model - Introduced IdentifierModelConverter for converting generated KERIA models to domain models. - Added IdentifierPayloadMapper to build request payloads for identifier endpoints. - Updated Identifier class to utilize GeneratedModelMapper for JSON parsing. - Modified IdentifierListResponse to use a list of Identifier objects instead of generic Object. - Implemented KeyStateRecordDeserializer to handle deserialization of KeyStateRecord. - Centralized Jackson configuration in GeneratedModelConfig for better management of generated models. - Updated various tests to reflect changes in identifier handling and ensure consistency. --- .../signify/app/aiding/Identifier.java | 45 +++--- .../app/aiding/IdentifierListResponse.java | 6 +- .../app/aiding/IdentifierModelConverter.java | 136 ++++++++++++++++++ .../app/aiding/IdentifierPayloadMapper.java | 109 ++++++++++++++ .../aiding/KeyStateRecordDeserializer.java | 46 ++++++ .../app/config/GeneratedModelConfig.java | 52 +++++++ .../app/config/GeneratedModelMapper.java | 34 +++++ .../signify/cesr/util/Utils.java | 4 +- .../signify/e2e/MultisigHolderTest.java | 29 ++-- .../signify/e2e/MultisigTest.java | 44 +++--- .../signify/e2e/RandyTest.java | 16 +-- .../signify/e2e/SaltyTests.java | 59 ++++---- .../signify/e2e/utils/TestUtils.java | 10 ++ 13 files changed, 494 insertions(+), 96 deletions(-) create mode 100644 src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java create mode 100644 src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java create mode 100644 src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java create mode 100644 src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelConfig.java create mode 100644 src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java b/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java index 3325793a..930bf368 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java @@ -18,6 +18,7 @@ import org.cardanofoundation.signify.core.Httping; import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.core.Manager.Algos; +import org.cardanofoundation.signify.app.config.GeneratedModelMapper; import java.io.IOException; import java.math.BigInteger; @@ -68,7 +69,7 @@ public IdentifierListResponse list(Integer start, Integer end) throws Interrupte range.start(), range.end(), range.total(), - response.body() + Arrays.asList(GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier[].class)) ); } @@ -96,7 +97,9 @@ public Optional get(String name) throws InterruptedException, I return Optional.empty(); } - return Optional.of(Utils.fromJson(response.body(), States.HabState.class)); + org.cardanofoundation.signify.generated.keria.model.Identifier identifier = + GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier.class); + return Optional.ofNullable(IdentifierModelConverter.toHabState(identifier)); } /** @@ -110,8 +113,14 @@ public States.HabState update(String name, IdentifierInfo info) throws Interrupt final String path = "/identifiers/" + name; final String method = "PUT"; - HttpResponse response = this.client.fetch(path, method, info); - return Utils.fromJson(response.body(), States.HabState.class); + HttpResponse response = this.client.fetch( + path, + method, + IdentifierPayloadMapper.buildUpdateNamePayload(info.getName()) + ); + org.cardanofoundation.signify.generated.keria.model.Identifier identifier = + GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier.class); + return IdentifierModelConverter.toHabState(identifier); } /** @@ -253,15 +262,17 @@ public EventResult create(String name, CreateIdentifierArgs kargs) throws Interr rmids = rstateDeserialized.stream().map(States.State::getI).toList(); } - Map jsondata = new LinkedHashMap<>(); - jsondata.put("name", name); - jsondata.put("icp", serder.getKed()); - jsondata.put("sigs", sigs); - jsondata.put("proxy", proxy); - jsondata.put("smids", smids); - jsondata.put("rmids", rmids); - - jsondata.put(algo.getValue(), keeper.getParams().toMap()); + Map jsondata = IdentifierPayloadMapper.buildCreatePayload( + name, + serder.getKed(), + sigs, + proxy, + smids, + rmids, + keeper.getAlgo(), + keeper.getParams().toMap(), + extern + ); this.client.setPidx(this.client.getPidx() + 1); @@ -292,14 +303,10 @@ public EventResult addEndRole(String name, String role, String eid, String stamp Keeping.SignResult signResult = keeper.sign(rpy.getRaw().getBytes()); List sigs = signResult.signatures(); - LinkedHashMap jsondata = new LinkedHashMap<>(); - jsondata.put("rpy", rpy.getKed()); - jsondata.put("sigs", sigs); - HttpResponse res = this.client.fetch( "/identifiers/" + name + "/endroles", "POST", - jsondata + IdentifierPayloadMapper.buildEndRolePayload(rpy.getKed(), sigs) ); return new EventResult(rpy, sigs, res); } @@ -472,4 +479,4 @@ public Object members(String name) throws LibsodiumException, InterruptedExcepti ); return Utils.fromJson(response.body(), Object.class); } -} \ No newline at end of file +} diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierListResponse.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierListResponse.java index c90d357d..3baea6c6 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierListResponse.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierListResponse.java @@ -1,4 +1,8 @@ package org.cardanofoundation.signify.app.aiding; -public record IdentifierListResponse(int start, int end, int total, Object aids) { +import org.cardanofoundation.signify.generated.keria.model.Identifier; + +import java.util.List; + +public record IdentifierListResponse(int start, int end, int total, List aids) { } diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java new file mode 100644 index 00000000..603b5758 --- /dev/null +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java @@ -0,0 +1,136 @@ +package org.cardanofoundation.signify.app.aiding; + +import org.cardanofoundation.signify.core.States; +import org.cardanofoundation.signify.generated.keria.model.GroupKeyState; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; +import org.cardanofoundation.signify.generated.keria.model.RandyKeyState; +import org.cardanofoundation.signify.generated.keria.model.SaltyState; +import org.cardanofoundation.signify.generated.keria.model.StateEERecord; +import org.openapitools.jackson.nullable.JsonNullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * Converts generated KERIA models to the domain models used by CESR operations. + */ +public final class IdentifierModelConverter { + private IdentifierModelConverter() { + } + + public static States.HabState toHabState(Identifier identifier) { + if (identifier == null) { + return null; + } + + return buildHabState(identifier, true); + } + + private static States.HabState buildHabState(Identifier identifier, boolean includeGroup) { + return States.HabState.builder() + .name(identifier.getName()) + .prefix(identifier.getPrefix()) + .transferable(unwrap(identifier.getTransferable_JsonNullable(), Boolean.TRUE)) + .state(toState(identifier.getState())) + .windexes(new ArrayList<>(unwrap(identifier.getWindexes_JsonNullable(), List.of()))) + .salty(toSaltyState(identifier.getSalty())) + .randy(toRandyState(identifier.getRandy())) + .group(includeGroup ? toGroupState(identifier.getGroup()) : null) + .build(); + } + + public static States.State toState(KeyStateRecord record) { + if (record == null) { + return null; + } + + int[] vn = record.getVn() == null ? null + : record.getVn().stream().filter(Objects::nonNull).mapToInt(Integer::intValue).toArray(); + + return States.State.builder() + .vn(vn) + .i(record.getI()) + .s(record.getS()) + .p(record.getP()) + .d(record.getD()) + .f(record.getF()) + .dt(record.getDt()) + .et(record.getEt()) + .kt(record.getKt()) + .k(record.getK()) + .nt(record.getNt()) + .n(record.getN()) + .bt(record.getBt()) + .b(record.getB()) + .c(record.getC()) + .ee(toEstablishmentState(record.getEe())) + .di(record.getDi()) + .build(); + } + + private static States.EstablishmentState toEstablishmentState(StateEERecord ee) { + if (ee == null) { + return null; + } + return States.EstablishmentState.builder() + .d(ee.getD()) + .s(ee.getS()) + .build(); + } + + private static States.SaltyState toSaltyState(SaltyState salty) { + if (salty == null) { + return null; + } + return States.SaltyState.builder() + .sxlt(salty.getSxlt()) + .pidx(defaultInt(salty.getPidx())) + .kidx(defaultInt(salty.getKidx())) + .stem(salty.getStem()) + .tier(salty.getTier() != null ? org.cardanofoundation.signify.cesr.Salter.Tier.valueOf(salty.getTier().getValue()) : null) + .dcode(salty.getDcode()) + .icodes(salty.getIcodes()) + .ncodes(salty.getNcodes()) + .transferable(defaultBoolean(salty.getTransferable())) + .build(); + } + + private static States.RandyState toRandyState(RandyKeyState randy) { + if (randy == null) { + return null; + } + return States.RandyState.builder() + .prxs(randy.getPrxs()) + .nxts(randy.getNxts()) + .build(); + } + + private static States.GroupState toGroupState(GroupKeyState group) { + if (group == null) { + return null; + } + + return States.GroupState.builder() + .mhab(buildHabState(group.getMhab(), false)) // avoid deep recursion + .keys(group.getKeys()) + .ndigs(group.getNdigs()) + .build(); + } + + private static T unwrap(JsonNullable nullable, T defaultValue) { + if (nullable == null || !nullable.isPresent()) { + return defaultValue; + } + return nullable.get(); + } + + private static int defaultInt(Integer value) { + return value != null ? value : 0; + } + + private static boolean defaultBoolean(Boolean value) { + return value != null && value; + } +} diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java new file mode 100644 index 00000000..772616ff --- /dev/null +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java @@ -0,0 +1,109 @@ +package org.cardanofoundation.signify.app.aiding; + +import com.fasterxml.jackson.core.type.TypeReference; +import org.cardanofoundation.signify.core.Manager.Algos; +import org.cardanofoundation.signify.generated.keria.model.EndrolesAidPostRequest; +import org.cardanofoundation.signify.generated.keria.model.IdentifiersNameExchangesPostRequest; +import org.cardanofoundation.signify.generated.keria.model.IdentifiersNamePutRequest; +import org.cardanofoundation.signify.generated.keria.model.IdentifiersPostRequest; +import org.cardanofoundation.signify.cesr.util.Utils; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Helper to build request payloads for identifier endpoints using generated KERIA models. + */ +public final class IdentifierPayloadMapper { + + private IdentifierPayloadMapper() { + } + + public static Map buildCreatePayload( + String name, + Map icp, + List sigs, + String proxy, + List smids, + List rmids, + Algos algo, + Map algoParams, + Object extern + ) { + IdentifiersPostRequest request = new IdentifiersPostRequest() + .name(name) + .icp(icp) + .sigs(sigs) + .extern(extern); + + if (algoParams != null && algo != null) { + switch (algo) { + case salty -> request.setSalty(algoParams); + case randy -> request.setRandy(algoParams); + case group -> request.setGroup(algoParams); + } + } + + Map payload = toPayloadMap(request); + + if (proxy != null) { + payload.put("proxy", proxy); + } + if (smids != null) { + payload.put("smids", smids); + } + if (rmids != null) { + payload.put("rmids", rmids); + } + + return payload; + } + + public static IdentifiersNamePutRequest buildUpdateNamePayload(String newName) { + return new IdentifiersNamePutRequest().name(newName); + } + + public static EndrolesAidPostRequest buildEndRolePayload(Object rpy, List sigs) { + return new EndrolesAidPostRequest() + .rpy(rpy) + .sigs(sigs); + } + + public static Map buildExchangePayload( + String topic, + Object exn, + List sigs, + String atc, + List recipients + ) { + IdentifiersNameExchangesPostRequest request = new IdentifiersNameExchangesPostRequest() + .tpc(topic) + .exn(exn) + .sigs(sigs) + .atc(atc) + .rec(recipients); + + Map payload = toPayloadMap(request); + // Drop nulls/empties to mimic original hand-built payloads. + payload.entrySet().removeIf(entry -> { + Object value = entry.getValue(); + if (value == null) { + return true; + } + if (value instanceof List list) { + return list.isEmpty(); + } + return false; + }); + return payload; + } + + private static Map toPayloadMap(Object data) { + if (data == null) { + return new LinkedHashMap<>(); + } + String json = Utils.jsonStringify(data); + return Utils.fromJson(json, new TypeReference<>() {}); + } +} diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java new file mode 100644 index 00000000..99f4b8f4 --- /dev/null +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java @@ -0,0 +1,46 @@ +package org.cardanofoundation.signify.app.aiding; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; +import org.cardanofoundation.signify.app.config.GeneratedModelConfig; + +import java.io.IOException; + +/** + * Allows kt/nt fields to arrive as arrays/objects and coerces them to strings for the generated model. + */ +public class KeyStateRecordDeserializer extends StdDeserializer { + + private static final ObjectMapper delegate = GeneratedModelConfig.baseMapper(); + + public KeyStateRecordDeserializer() { + super(KeyStateRecord.class); + } + + @Override + public KeyStateRecord deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + ObjectMapper mapper = (ObjectMapper) p.getCodec(); + ObjectNode node = mapper.readTree(p); + + coerceToString(node, "kt"); + coerceToString(node, "nt"); + + return delegate.treeToValue(node, KeyStateRecord.class); + } + + private void coerceToString(ObjectNode node, String field) { + JsonNode value = node.get(field); + if (value == null) { + return; + } + if (value.isTextual()) { + return; + } + node.put(field, value.toString()); + } +} diff --git a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelConfig.java b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelConfig.java new file mode 100644 index 00000000..b2b71d7e --- /dev/null +++ b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelConfig.java @@ -0,0 +1,52 @@ +package org.cardanofoundation.signify.app.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.cardanofoundation.signify.app.aiding.KeyStateRecordDeserializer; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; +import org.openapitools.jackson.nullable.JsonNullableModule; + +/** + * Centralizes Jackson configuration for OpenAPI-generated models. + */ +public final class GeneratedModelConfig { + private GeneratedModelConfig() { + } + + public static ObjectMapper mapper() { + ObjectMapper mapper = baseMapper(); + mapper.registerModule(generatedModule()); + return mapper; + } + + /** + * Apply the generated-model settings to an existing mapper. + */ + public static void configure(ObjectMapper mapper) { + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + mapper.registerModule(new JsonNullableModule()); + mapper.registerModule(generatedModule()); + } + + /** + * Base mapper with nullable module but without the custom generated module. + * Useful for internal delegates to avoid recursive deserializer lookups. + */ + public static ObjectMapper baseMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + mapper.registerModule(new JsonNullableModule()); + return mapper; + } + + private static Module generatedModule() { + SimpleModule module = new SimpleModule("GeneratedModelModule"); + module.addDeserializer(KeyStateRecord.class, new KeyStateRecordDeserializer()); + return module; + } +} diff --git a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java new file mode 100644 index 00000000..7ff1a0d7 --- /dev/null +++ b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java @@ -0,0 +1,34 @@ +package org.cardanofoundation.signify.app.config; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Shared accessor for the generated-model ObjectMapper. + */ +public final class GeneratedModelMapper { + private static final ObjectMapper MAPPER = GeneratedModelConfig.mapper(); + + private GeneratedModelMapper() { + } + + public static ObjectMapper mapper() { + return MAPPER; + } + + public static T read(String json, Class type) { + try { + return MAPPER.readValue(json, type); + } catch (Exception e) { + throw new RuntimeException("Failed to parse generated model JSON", e); + } + } + + public static T read(String json, TypeReference type) { + try { + return MAPPER.readValue(json, type); + } catch (Exception e) { + throw new RuntimeException("Failed to parse generated model JSON", e); + } + } +} diff --git a/src/main/java/org/cardanofoundation/signify/cesr/util/Utils.java b/src/main/java/org/cardanofoundation/signify/cesr/util/Utils.java index 206982df..8c8ad171 100644 --- a/src/main/java/org/cardanofoundation/signify/cesr/util/Utils.java +++ b/src/main/java/org/cardanofoundation/signify/cesr/util/Utils.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import org.cardanofoundation.signify.app.config.GeneratedModelConfig; import org.cardanofoundation.signify.cesr.*; import org.cardanofoundation.signify.cesr.args.CounterArgs; import org.cardanofoundation.signify.cesr.exceptions.material.InvalidSizeException; @@ -18,8 +19,7 @@ public class Utils { private static final ObjectMapper objectMapper = new ObjectMapper(); static { - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + GeneratedModelConfig.configure(objectMapper); } public static byte[] intToBytes(BigInteger value, int size) { diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java index d764bce8..8435ad5c 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java @@ -1,6 +1,5 @@ package org.cardanofoundation.signify.e2e; -import com.fasterxml.jackson.core.type.TypeReference; import org.cardanofoundation.signify.app.Exchanging; import org.cardanofoundation.signify.app.aiding.EventResult; import org.cardanofoundation.signify.app.aiding.IdentifierListResponse; @@ -15,6 +14,7 @@ import org.cardanofoundation.signify.cesr.Serder; import org.cardanofoundation.signify.cesr.Siger; import org.cardanofoundation.signify.cesr.util.Utils; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.core.Eventing; import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.MultisigUtils.AcceptMultisigInceptArgs; @@ -39,7 +39,7 @@ public class MultisigHolderTest extends BaseIntegrationTest { States.HabState aid1, aid2, aid3; Object oobi1, oobi2, oobi3; String oobis1, oobis2, oobis3; - private List> registryList, indentifierMap1, indentifierMap2; + private List> registryList; ResolveEnv.EnvironmentConfig env = ResolveEnv.resolveEnvironment(null); ArrayList WITNESS_AIDS = new ArrayList<>(Arrays.asList( @@ -141,28 +141,27 @@ void multisigHolderTest() throws Exception { System.out.println("Multisig created!"); IdentifierListResponse identifiers1 = client1.identifiers().list(); - indentifierMap1 = Utils.fromJson(identifiers1.aids().toString(), new TypeReference<>() {}); - assertEquals(2, indentifierMap1.size()); - + List aids1 = identifiers1.aids(); + assertEquals(2, aids1.size()); IdentifierListResponse identifiers2 = client1.identifiers().list(); - indentifierMap2 = Utils.fromJson(identifiers2.aids().toString(), new TypeReference<>() {}); - assertEquals(2, indentifierMap2.size()); + List aids2 = identifiers2.aids(); + assertEquals(2, aids2.size()); System.out.printf( "Client 1 managed AIDs:\n%s [%s]\n%s [%s]%n", - Utils.toMap(indentifierMap1.get(0)).get("name"), - Utils.toMap(indentifierMap1.get(0)).get("prefix"), - Utils.toMap(indentifierMap1.get(1)).get("name"), - Utils.toMap(indentifierMap1.get(1)).get("prefix") + aids1.get(0).getName(), + aids1.get(0).getPrefix(), + aids1.get(1).getName(), + aids1.get(1).getPrefix() ); System.out.printf( "Client 2 managed AIDs:\n%s [%s]\n%s [%s]%n", - Utils.toMap(indentifierMap2.get(0)).get("name"), - Utils.toMap(indentifierMap2.get(0)).get("prefix"), - Utils.toMap(indentifierMap2.get(1)).get("name"), - Utils.toMap(indentifierMap2.get(1)).get("prefix") + aids2.get(0).getName(), + aids2.get(0).getPrefix(), + aids2.get(1).getName(), + aids2.get(1).getPrefix() ); // Multisig end role diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java index 378a203a..6849e3e6 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java @@ -1,6 +1,5 @@ package org.cardanofoundation.signify.e2e; -import com.fasterxml.jackson.core.type.TypeReference; import org.cardanofoundation.signify.app.Exchanging; import org.cardanofoundation.signify.app.aiding.CreateIdentifierArgs; import org.cardanofoundation.signify.app.aiding.EventResult; @@ -25,6 +24,7 @@ import org.cardanofoundation.signify.core.Eventing; import org.cardanofoundation.signify.core.Manager; import org.cardanofoundation.signify.core.States; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.e2e.utils.MultisigUtils; import org.cardanofoundation.signify.e2e.utils.ResolveEnv; import org.cardanofoundation.signify.e2e.utils.TestUtils; @@ -219,45 +219,45 @@ public void multisig() throws Exception { System.out.println("Multisig created!"); IdentifierListResponse identifiers1 = client1.identifiers().list(); - List> aids1 = Utils.fromJson(identifiers1.aids().toString(), new TypeReference<>() {}); + List aids1 = identifiers1.aids(); assertEquals(2, aids1.size()); - assertEquals("member1", aids1.get(0).get("name")); - assertEquals("multisig", aids1.get(1).get("name")); + assertEquals("member1", aids1.get(0).getName()); + assertEquals("multisig", aids1.get(1).getName()); IdentifierListResponse identifiers2 = client2.identifiers().list(); - List> aids2 = Utils.fromJson(identifiers2.aids().toString(), new TypeReference<>() {}); + List aids2 = identifiers2.aids(); assertEquals(2, aids2.size()); - assertEquals("member2", aids2.get(0).get("name")); - assertEquals("multisig", aids2.get(1).get("name")); + assertEquals("member2", aids2.get(0).getName()); + assertEquals("multisig", aids2.get(1).getName()); IdentifierListResponse identifiers3 = client3.identifiers().list(); - List> aids3 = Utils.fromJson(identifiers3.aids().toString(), new TypeReference<>() {}); + List aids3 = identifiers3.aids(); assertEquals(2, aids3.size()); - assertEquals("member3", aids3.get(0).get("name")); - assertEquals("multisig", aids3.get(1).get("name")); + assertEquals("member3", aids3.get(0).getName()); + assertEquals("multisig", aids3.get(1).getName()); System.out.printf( "Client 1 managed AIDs:\n%s [%s]\n%s [%s]%n", - Utils.toMap(aids1.get(0)).get("name"), - Utils.toMap(aids1.get(0)).get("prefix"), - Utils.toMap(aids1.get(1)).get("name"), - Utils.toMap(aids1.get(1)).get("prefix") + aids1.get(0).getName(), + aids1.get(0).getPrefix(), + aids1.get(1).getName(), + aids1.get(1).getPrefix() ); System.out.printf( "Client 2 managed AIDs:\n%s [%s]\n%s [%s]%n", - Utils.toMap(aids2.get(0)).get("name"), - Utils.toMap(aids2.get(0)).get("prefix"), - Utils.toMap(aids2.get(1)).get("name"), - Utils.toMap(aids2.get(1)).get("prefix") + aids2.get(0).getName(), + aids2.get(0).getPrefix(), + aids2.get(1).getName(), + aids2.get(1).getPrefix() ); System.out.printf( "Client 3 managed AIDs:\n%s [%s]\n%s [%s]%n", - Utils.toMap(aids3.get(0)).get("name"), - Utils.toMap(aids3.get(0)).get("prefix"), - Utils.toMap(aids3.get(1)).get("name"), - Utils.toMap(aids3.get(1)).get("prefix") + aids3.get(0).getName(), + aids3.get(0).getPrefix(), + aids3.get(1).getName(), + aids3.get(1).getPrefix() ); String multisig = Utils.toMap(aids3.get(1)).get("prefix").toString(); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java b/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java index 3940af39..ef959e6c 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java @@ -1,6 +1,5 @@ package org.cardanofoundation.signify.e2e; -import com.fasterxml.jackson.core.type.TypeReference; import lombok.extern.slf4j.Slf4j; import org.cardanofoundation.signify.app.aiding.CreateIdentifierArgs; import org.cardanofoundation.signify.app.aiding.EventResult; @@ -11,6 +10,7 @@ import org.cardanofoundation.signify.cesr.*; import org.cardanofoundation.signify.cesr.args.RawArgs; import org.cardanofoundation.signify.cesr.util.Utils; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.core.Manager; import org.junit.jupiter.api.Test; @@ -63,10 +63,10 @@ void randyTest() throws Exception { assertEquals("1", icp.getKed().get("nt")); IdentifierListResponse aids = client1.identifiers().list(0, 24); - List> aidsList = Utils.fromJson(aids.aids().toString(), new TypeReference<>() {}); - for (Map aid1 : aidsList) { - opResponseName = aid1.get("name").toString(); - opResponsePrefix = aid1.get("prefix").toString(); + List aidsList = aids.aids(); + for (Identifier aid1 : aidsList) { + opResponseName = aid1.getName(); + opResponsePrefix = aid1.getPrefix(); } assertEquals(1, aidsList.size()); @@ -82,9 +82,9 @@ void randyTest() throws Exception { assertEquals(List.of(icp.getPre()), ixn.getKed().get("a")); aids = client1.identifiers().list(0, 24); - aidsList = Utils.fromJson(aids.aids().toString(), new TypeReference<>() {}); - for (Map aid1 : aidsList) { - opResponsePrefix = aid1.get("prefix").toString(); + aidsList = aids.aids(); + for (Identifier aid1 : aidsList) { + opResponsePrefix = aid1.getPrefix(); } assertEquals(1, aidsList.size()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java b/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java index 7c5ca67f..325f1c73 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java @@ -1,6 +1,5 @@ package org.cardanofoundation.signify.e2e; -import com.fasterxml.jackson.core.type.TypeReference; import org.cardanofoundation.signify.app.aiding.CreateIdentifierArgs; import org.cardanofoundation.signify.app.aiding.EventResult; import org.cardanofoundation.signify.app.aiding.IdentifierInfo; @@ -13,6 +12,8 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Manager; import org.cardanofoundation.signify.core.States; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.SaltyState; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -65,15 +66,15 @@ void saltyTest() throws Exception { assertEquals("1", icp.getKed().get("nt")); IdentifierListResponse aidsJson = client.identifiers().list(0, 24); - List> aids = Utils.fromJson(aidsJson.aids().toString(), new TypeReference<>() {}); + List aids = aidsJson.aids(); Assertions.assertEquals(1, aids.size()); - Map aidLast = aids.removeLast(); - Assertions.assertEquals("aid1", aidLast.get("name")); - Map salty = (Map) aidLast.get("salty"); - Assertions.assertEquals(0, salty.get("pidx")); - Assertions.assertEquals("signify:aid", salty.get("stem")); - Assertions.assertEquals(icp.getPre(), aidLast.get("prefix")); + Identifier aidLast = aids.getFirst(); + Assertions.assertEquals("aid1", aidLast.getName()); + SaltyState salty = aidLast.getSalty(); + Assertions.assertEquals(0, salty.getPidx()); + Assertions.assertEquals("signify:aid", salty.getStem()); + Assertions.assertEquals(icp.getPre(), aidLast.getPrefix()); CreateIdentifierArgs params = new CreateIdentifierArgs(); params.setCount(3); @@ -103,16 +104,16 @@ void saltyTest() throws Exception { assertEquals("2", icp2.getKed().get("nt")); IdentifierListResponse aidsJson1 = client.identifiers().list(0, 24); - List> aids1 = Utils.fromJson(aidsJson1.aids().toString(), new TypeReference<>() {}); + List aids1 = aidsJson1.aids(); Assertions.assertEquals(2, aids1.size()); - Map aid3 = aids1.removeLast(); - Assertions.assertEquals("aid2", aid3.get("name")); + Identifier aid3 = aids1.getLast(); + Assertions.assertEquals("aid2", aid3.getName()); - Map salty1 = (Map) aid3.get("salty"); - Assertions.assertEquals(1, salty1.get("pidx")); - Assertions.assertEquals("signify:aid", salty1.get("stem")); - Assertions.assertEquals(icp2.getPre(), aid3.get("prefix")); + SaltyState salty1 = aid3.getSalty(); + Assertions.assertEquals(1, salty1.getPidx()); + Assertions.assertEquals("signify:aid", salty1.getStem()); + Assertions.assertEquals(icp2.getPre(), aid3.getPrefix()); CreateIdentifierArgs kargs = new CreateIdentifierArgs(); kargs.setAlgo(Manager.Algos.salty); @@ -120,25 +121,25 @@ void saltyTest() throws Exception { waitOperation(client, icpResult2.op()); IdentifierListResponse aidsJson2 = client.identifiers().list(0, 24); - List> aids2 = Utils.fromJson(aidsJson2.aids().toString(), new TypeReference<>() {}); + List aids2 = aidsJson2.aids(); Assertions.assertEquals(3, aids2.size()); - Map aid4 = aids2.getFirst(); - Assertions.assertEquals("aid1", aid4.get("name")); + Identifier aid4 = aids2.getFirst(); + Assertions.assertEquals("aid1", aid4.getName()); IdentifierListResponse aidsJson3 = client.identifiers().list(1, 2); - List> aids3 = Utils.fromJson(aidsJson3.aids().toString(), new TypeReference<>() {}); + List aids3 = aidsJson3.aids(); Assertions.assertEquals(2, aids3.size()); - Map aid5 = aids3.getFirst(); - Assertions.assertEquals("aid2", aid5.get("name")); + Identifier aid5 = aids3.getFirst(); + Assertions.assertEquals("aid2", aid5.getName()); IdentifierListResponse aidsJson4 = client.identifiers().list(2, 2); - List> aids4 = Utils.fromJson(aidsJson4.aids().toString(), new TypeReference<>() {}); + List aids4 = aidsJson4.aids(); Assertions.assertEquals(1, aids4.size()); - Map aid6 = aids4.getFirst(); - Assertions.assertEquals("aid3", aid6.get("name")); + Identifier aid6 = aids4.getFirst(); + Assertions.assertEquals("aid3", aid6.getName()); // Rotate EventResult icpResultRotate = client.identifiers().rotate("aid1"); @@ -176,7 +177,7 @@ void saltyTest() throws Exception { // KeyEvents Coring.KeyEvents events = client.keyEvents(); - List> log = (List>) events.get((String) aidLast.get("prefix")); + List> log = (List>) events.get(aidLast.getPrefix()); assertEquals(3, log.size()); Serder serder = new Serder((Map) log.getFirst().get("ked")); @@ -201,11 +202,11 @@ void saltyTest() throws Exception { States.HabState retrievedState = client.identifiers().get("aid4").get(); assertEquals("aid4", retrievedState.getName()); IdentifierListResponse response = client.identifiers().list(2, 2); - List> identifiers = Utils.fromJson(response.aids().toString(), new TypeReference<>() {}); + List identifiers = response.aids(); assertEquals(1, identifiers.size()); - Map firstIdentifier = identifiers.getFirst(); - assertEquals("aid4", firstIdentifier.get("name")); + Identifier firstIdentifier = identifiers.getFirst(); + assertEquals("aid4", firstIdentifier.getName()); } -} \ No newline at end of file +} diff --git a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java index df3178ca..4f0c5a0e 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java @@ -12,6 +12,7 @@ import org.cardanofoundation.signify.app.Notifying; import org.cardanofoundation.signify.app.aiding.CreateIdentifierArgs; import org.cardanofoundation.signify.app.aiding.EventResult; +import org.cardanofoundation.signify.app.aiding.IdentifierListResponse; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.app.credentialing.credentials.CredentialData; @@ -21,6 +22,7 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.core.States; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import java.io.IOException; import java.net.http.HttpResponse; @@ -575,6 +577,14 @@ public static List> castObjectToListMap(Object object) { return (List>) object; } + /** + * Convenience wrapper to access generated identifiers from list responses. + */ + public static List identifiers(IdentifierListResponse response + ) { + return response.aids(); + } + @FunctionalInterface public interface ThrowingSupplier { T get() throws Exception; From 446f3641d07fa2e822f174a2a0b513db0124208f Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Mon, 1 Dec 2025 19:40:30 +0700 Subject: [PATCH 02/24] chore: remove inline import --- .../signify/app/aiding/Identifier.java | 8 +++----- .../signify/app/config/GeneratedModelMapper.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java b/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java index 930bf368..f2323f06 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java @@ -69,7 +69,7 @@ public IdentifierListResponse list(Integer start, Integer end) throws Interrupte range.start(), range.end(), range.total(), - Arrays.asList(GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier[].class)) + Arrays.asList(GeneratedModelMapper.readIdentifierArray(response.body())) ); } @@ -97,8 +97,7 @@ public Optional get(String name) throws InterruptedException, I return Optional.empty(); } - org.cardanofoundation.signify.generated.keria.model.Identifier identifier = - GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier.class); + var identifier = GeneratedModelMapper.readIdentifier(response.body()); return Optional.ofNullable(IdentifierModelConverter.toHabState(identifier)); } @@ -118,8 +117,7 @@ public States.HabState update(String name, IdentifierInfo info) throws Interrupt method, IdentifierPayloadMapper.buildUpdateNamePayload(info.getName()) ); - org.cardanofoundation.signify.generated.keria.model.Identifier identifier = - GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier.class); + var identifier = GeneratedModelMapper.readIdentifier(response.body()); return IdentifierModelConverter.toHabState(identifier); } diff --git a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java index 7ff1a0d7..9c9a79f5 100644 --- a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java +++ b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.cardanofoundation.signify.generated.keria.model.Identifier; /** * Shared accessor for the generated-model ObjectMapper. @@ -31,4 +32,16 @@ public static T read(String json, TypeReference type) { throw new RuntimeException("Failed to parse generated model JSON", e); } } + + public static Identifier readIdentifier(String json) { + return read(json, Identifier.class); + } + + public static Identifier[] readIdentifierArray(String json) { + return read(json, Identifier[].class); + } + + public static java.util.List readIdentifierList(String json) { + return read(json, new TypeReference<>() {}); + } } From 3810e9bfbdf7af363b4a64ae3645b2a1905f6537 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Tue, 2 Dec 2025 16:12:01 +0700 Subject: [PATCH 03/24] refactor: streamline JSON parsing in Identifier class --- .../signify/app/aiding/Identifier.java | 8 +++----- .../signify/app/config/GeneratedModelMapper.java | 12 ------------ 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java b/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java index f2323f06..cc692945 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java @@ -69,7 +69,7 @@ public IdentifierListResponse list(Integer start, Integer end) throws Interrupte range.start(), range.end(), range.total(), - Arrays.asList(GeneratedModelMapper.readIdentifierArray(response.body())) + Arrays.asList(GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier[].class)) ); } @@ -97,8 +97,7 @@ public Optional get(String name) throws InterruptedException, I return Optional.empty(); } - var identifier = GeneratedModelMapper.readIdentifier(response.body()); - return Optional.ofNullable(IdentifierModelConverter.toHabState(identifier)); + return Optional.of(Utils.fromJson(response.body(), States.HabState.class)); } /** @@ -117,8 +116,7 @@ public States.HabState update(String name, IdentifierInfo info) throws Interrupt method, IdentifierPayloadMapper.buildUpdateNamePayload(info.getName()) ); - var identifier = GeneratedModelMapper.readIdentifier(response.body()); - return IdentifierModelConverter.toHabState(identifier); + return GeneratedModelMapper.read(response.body(), States.HabState.class); } /** diff --git a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java index 9c9a79f5..5c7fd045 100644 --- a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java +++ b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java @@ -32,16 +32,4 @@ public static T read(String json, TypeReference type) { throw new RuntimeException("Failed to parse generated model JSON", e); } } - - public static Identifier readIdentifier(String json) { - return read(json, Identifier.class); - } - - public static Identifier[] readIdentifierArray(String json) { - return read(json, Identifier[].class); - } - - public static java.util.List readIdentifierList(String json) { - return read(json, new TypeReference<>() {}); - } } From 7e9a24409e517e293d660b2b52bae615b570710c Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Tue, 2 Dec 2025 16:12:14 +0700 Subject: [PATCH 04/24] refactor: simplify group state handling in IdentifierModelConverter --- .../signify/app/aiding/IdentifierModelConverter.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java index 603b5758..6ebe73e0 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java @@ -25,10 +25,6 @@ public static States.HabState toHabState(Identifier identifier) { return null; } - return buildHabState(identifier, true); - } - - private static States.HabState buildHabState(Identifier identifier, boolean includeGroup) { return States.HabState.builder() .name(identifier.getName()) .prefix(identifier.getPrefix()) @@ -37,7 +33,7 @@ private static States.HabState buildHabState(Identifier identifier, boolean incl .windexes(new ArrayList<>(unwrap(identifier.getWindexes_JsonNullable(), List.of()))) .salty(toSaltyState(identifier.getSalty())) .randy(toRandyState(identifier.getRandy())) - .group(includeGroup ? toGroupState(identifier.getGroup()) : null) + .group(toGroupState(identifier.getGroup())) .build(); } @@ -113,7 +109,7 @@ private static States.GroupState toGroupState(GroupKeyState group) { } return States.GroupState.builder() - .mhab(buildHabState(group.getMhab(), false)) // avoid deep recursion + .mhab(toHabState(group.getMhab())) .keys(group.getKeys()) .ndigs(group.getNdigs()) .build(); From babb9eaa13df6c1debc4676309f968ca21039e1e Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Tue, 2 Dec 2025 16:20:54 +0700 Subject: [PATCH 05/24] fix: improve KeyStateRecordDeserializer to handle numeric nodes correctly --- .../signify/app/aiding/KeyStateRecordDeserializer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java index 99f4b8f4..ce183c6c 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java @@ -38,9 +38,12 @@ private void coerceToString(ObjectNode node, String field) { if (value == null) { return; } - if (value.isTextual()) { + // Leave arrays (kt/nt can be arrays of strings); only coerce numeric nodes. + if (value.isTextual() || value.isArray()) { return; } - node.put(field, value.toString()); + if (value.isNumber()) { + node.put(field, value.asText()); + } } } From 678cc85e63680493d53eb572c2e340849ec74fdf Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Tue, 2 Dec 2025 16:51:37 +0700 Subject: [PATCH 06/24] refactor: use direct method calls for transferable and windexes --- .../signify/app/aiding/IdentifierModelConverter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java index 6ebe73e0..7274ce42 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java @@ -28,9 +28,9 @@ public static States.HabState toHabState(Identifier identifier) { return States.HabState.builder() .name(identifier.getName()) .prefix(identifier.getPrefix()) - .transferable(unwrap(identifier.getTransferable_JsonNullable(), Boolean.TRUE)) + .transferable(identifier.getTransferable()) .state(toState(identifier.getState())) - .windexes(new ArrayList<>(unwrap(identifier.getWindexes_JsonNullable(), List.of()))) + .windexes(new ArrayList<>(identifier.getWindexes())) .salty(toSaltyState(identifier.getSalty())) .randy(toRandyState(identifier.getRandy())) .group(toGroupState(identifier.getGroup())) From 5e5f848e6c146c4d8ae477880413a8d85b0939d7 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Tue, 2 Dec 2025 17:07:25 +0700 Subject: [PATCH 07/24] refactor: simplify IdentifierModelConverter by removing default methods and using direct calls --- .../app/aiding/IdentifierModelConverter.java | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java index 7274ce42..26b5f89a 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java @@ -1,6 +1,7 @@ package org.cardanofoundation.signify.app.aiding; import org.cardanofoundation.signify.core.States; +import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.generated.keria.model.GroupKeyState; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; @@ -10,7 +11,6 @@ import org.openapitools.jackson.nullable.JsonNullable; import java.util.ArrayList; -import java.util.List; import java.util.Objects; /** @@ -82,14 +82,14 @@ private static States.SaltyState toSaltyState(SaltyState salty) { } return States.SaltyState.builder() .sxlt(salty.getSxlt()) - .pidx(defaultInt(salty.getPidx())) - .kidx(defaultInt(salty.getKidx())) + .pidx(salty.getPidx()) + .kidx(salty.getKidx()) .stem(salty.getStem()) - .tier(salty.getTier() != null ? org.cardanofoundation.signify.cesr.Salter.Tier.valueOf(salty.getTier().getValue()) : null) + .tier(salty.getTier() != null ? Salter.Tier.fromString(salty.getTier().getValue()) : null) .dcode(salty.getDcode()) .icodes(salty.getIcodes()) .ncodes(salty.getNcodes()) - .transferable(defaultBoolean(salty.getTransferable())) + .transferable(salty.getTransferable()) .build(); } @@ -121,12 +121,4 @@ private static T unwrap(JsonNullable nullable, T defaultValue) { } return nullable.get(); } - - private static int defaultInt(Integer value) { - return value != null ? value : 0; - } - - private static boolean defaultBoolean(Boolean value) { - return value != null && value; - } } From 0ab4dd02519c7662767d765801a1d7dccfa2647e Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Tue, 2 Dec 2025 17:13:12 +0700 Subject: [PATCH 08/24] refactor: enforce non-null parameters in IdentifierPayloadMapper --- .../app/aiding/IdentifierPayloadMapper.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java index 772616ff..4853897b 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java @@ -11,6 +11,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Helper to build request payloads for identifier endpoints using generated KERIA models. @@ -37,12 +38,13 @@ public static Map buildCreatePayload( .sigs(sigs) .extern(extern); - if (algoParams != null && algo != null) { - switch (algo) { - case salty -> request.setSalty(algoParams); - case randy -> request.setRandy(algoParams); - case group -> request.setGroup(algoParams); - } + Objects.requireNonNull(algo, "algo is required"); + Objects.requireNonNull(algoParams, "algo params are required"); + switch (algo) { + case salty -> request.setSalty(algoParams); + case randy -> request.setRandy(algoParams); + case group -> request.setGroup(algoParams); + default -> throw new IllegalArgumentException("Invalid algo: " + algo); } Map payload = toPayloadMap(request); From 4cca6380d80ccda54c28c2ac8a548d90a4bf5937 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Wed, 3 Dec 2025 15:36:39 +0700 Subject: [PATCH 09/24] refactor: add nullability annotations to pars --- .../app/aiding/IdentifierPayloadMapper.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java index 4853897b..c84f2ec1 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java @@ -11,7 +11,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Objects; +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; /** * Helper to build request payloads for identifier endpoints using generated KERIA models. @@ -23,14 +24,14 @@ private IdentifierPayloadMapper() { public static Map buildCreatePayload( String name, - Map icp, - List sigs, - String proxy, - List smids, - List rmids, - Algos algo, - Map algoParams, - Object extern + @Nonnull Map icp, + @Nonnull List sigs, + @Nullable String proxy, + @Nullable List smids, + @Nullable List rmids, + @Nonnull Algos algo, + @Nonnull Map algoParams, + @Nullable Object extern ) { IdentifiersPostRequest request = new IdentifiersPostRequest() .name(name) @@ -38,8 +39,6 @@ public static Map buildCreatePayload( .sigs(sigs) .extern(extern); - Objects.requireNonNull(algo, "algo is required"); - Objects.requireNonNull(algoParams, "algo params are required"); switch (algo) { case salty -> request.setSalty(algoParams); case randy -> request.setRandy(algoParams); From 0126fbc56bfb602b0fb4d76fc114de774770fb03 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Wed, 3 Dec 2025 15:39:29 +0700 Subject: [PATCH 10/24] refactor: update KeyStateRecordDeserializer to fail fast on unexpected node types --- .../signify/app/aiding/KeyStateRecordDeserializer.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java index ce183c6c..f9e20428 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java @@ -38,12 +38,10 @@ private void coerceToString(ObjectNode node, String field) { if (value == null) { return; } - // Leave arrays (kt/nt can be arrays of strings); only coerce numeric nodes. + // Leave arrays (kt/nt can be arrays of strings); fail fast otherwise. if (value.isTextual() || value.isArray()) { return; } - if (value.isNumber()) { - node.put(field, value.asText()); - } + throw new IllegalArgumentException("Unexpected type for field '" + field + "': " + value.getNodeType()); } } From 2b4451d54ded17688a2d6564324ef9a1c2e42692 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Wed, 3 Dec 2025 15:40:53 +0700 Subject: [PATCH 11/24] refactor: remove unused buildExchangePayload --- .../app/aiding/IdentifierPayloadMapper.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java index c84f2ec1..ebaaec17 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import org.cardanofoundation.signify.core.Manager.Algos; import org.cardanofoundation.signify.generated.keria.model.EndrolesAidPostRequest; -import org.cardanofoundation.signify.generated.keria.model.IdentifiersNameExchangesPostRequest; import org.cardanofoundation.signify.generated.keria.model.IdentifiersNamePutRequest; import org.cardanofoundation.signify.generated.keria.model.IdentifiersPostRequest; import org.cardanofoundation.signify.cesr.util.Utils; @@ -71,35 +70,6 @@ public static EndrolesAidPostRequest buildEndRolePayload(Object rpy, List buildExchangePayload( - String topic, - Object exn, - List sigs, - String atc, - List recipients - ) { - IdentifiersNameExchangesPostRequest request = new IdentifiersNameExchangesPostRequest() - .tpc(topic) - .exn(exn) - .sigs(sigs) - .atc(atc) - .rec(recipients); - - Map payload = toPayloadMap(request); - // Drop nulls/empties to mimic original hand-built payloads. - payload.entrySet().removeIf(entry -> { - Object value = entry.getValue(); - if (value == null) { - return true; - } - if (value instanceof List list) { - return list.isEmpty(); - } - return false; - }); - return payload; - } - private static Map toPayloadMap(Object data) { if (data == null) { return new LinkedHashMap<>(); From c099e484b0777cce1d0e58b275ad604c5d21ca65 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Wed, 3 Dec 2025 18:43:05 +0700 Subject: [PATCH 12/24] refactor: replace HabState with Identifier in various classes and methods for consistency --- .../signify/app/Contacting.java | 3 +- .../signify/app/Exchanging.java | 5 +- .../app/aiding/CreateIdentifierArgs.java | 3 +- ...ntifier.java => IdentifierController.java} | 34 ++--- .../app/aiding/IdentifierModelConverter.java | 124 ------------------ .../app/aiding/RotateIdentifierArgs.java | 5 +- .../signify/app/clienting/SignifyClient.java | 8 +- .../credentials/Credentials.java | 5 +- .../signify/app/credentialing/ipex/Ipex.java | 11 +- .../credentialing/registries/Registries.java | 5 +- .../signify/cesr/Keeping.java | 72 +++++----- .../signify/cesr/params/GroupParams.java | 3 +- .../signify/app/ClientingTest.java | 4 +- .../signify/app/RegistryTest.java | 42 +++--- .../signify/core/ManagerTest.java | 28 ++-- .../signify/e2e/BaseIntegrationTest.java | 13 +- .../signify/e2e/DelegationMultisigTest.java | 24 ++-- .../signify/e2e/DelegationTest.java | 6 +- .../signify/e2e/MultisigHolderTest.java | 34 ++--- .../signify/e2e/MultisigInceptionTest.java | 6 +- .../signify/e2e/MultisigJoinTest.java | 34 ++--- .../signify/e2e/MultisigTest.java | 49 +++---- .../e2e/MultisigVleiIssuanaceTest.java | 34 ++--- .../signify/e2e/SaltyTests.java | 12 +- .../signify/e2e/SinglesigDIPTest.java | 5 +- .../signify/e2e/SinglesigDRTTest.java | 3 +- .../signify/e2e/WitnessTest.java | 3 +- .../signify/e2e/utils/MultisigUtils.java | 110 ++++++++-------- .../signify/e2e/utils/TestUtils.java | 16 +-- 29 files changed, 303 insertions(+), 398 deletions(-) rename src/main/java/org/cardanofoundation/signify/app/aiding/{Identifier.java => IdentifierController.java} (93%) delete mode 100644 src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java diff --git a/src/main/java/org/cardanofoundation/signify/app/Contacting.java b/src/main/java/org/cardanofoundation/signify/app/Contacting.java index 5f873179..e9cac3b7 100644 --- a/src/main/java/org/cardanofoundation/signify/app/Contacting.java +++ b/src/main/java/org/cardanofoundation/signify/app/Contacting.java @@ -19,6 +19,7 @@ import java.util.Optional; import com.fasterxml.jackson.annotation.JsonAnySetter; import java.util.concurrent.ExecutionException; +import org.cardanofoundation.signify.generated.keria.model.Identifier; public class Contacting { @@ -66,7 +67,7 @@ public Challenge generate() throws LibsodiumException, IOException, InterruptedE * @throws Exception if the fetch operation fails */ public Object respond(String name, String recipient, List words) throws IOException, InterruptedException, DigestException, ExecutionException, LibsodiumException { - States.HabState hab = this.client.identifiers().get(name) + Identifier hab = this.client.identifiers().get(name) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + name)); Exchanging.Exchanges exchanges = this.client.exchanges(); diff --git a/src/main/java/org/cardanofoundation/signify/app/Exchanging.java b/src/main/java/org/cardanofoundation/signify/app/Exchanging.java index ce9c6095..5f4ffdc2 100644 --- a/src/main/java/org/cardanofoundation/signify/app/Exchanging.java +++ b/src/main/java/org/cardanofoundation/signify/app/Exchanging.java @@ -19,6 +19,7 @@ import java.security.DigestException; import java.util.*; import java.util.concurrent.ExecutionException; +import org.cardanofoundation.signify.generated.keria.model.Identifier; public class Exchanging { @Getter @@ -46,7 +47,7 @@ public Exchanges(SignifyClient client) { * @return array containing [Serder, signatures, attachment] */ public ExchangeMessageResult createExchangeMessage( - HabState sender, + Identifier sender, String route, Map payload, Map> embeds, @@ -89,7 +90,7 @@ public ExchangeMessageResult createExchangeMessage( public Object send( String name, String topic, - HabState sender, + Identifier sender, String route, Map payload, Map> embeds, diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java b/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java index 95661450..ac2e0d8c 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java @@ -6,6 +6,7 @@ import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.core.Manager.Algos; import org.cardanofoundation.signify.core.States.HabState; +import org.cardanofoundation.signify.generated.keria.model.Identifier; @Getter @Setter @@ -28,7 +29,7 @@ public class CreateIdentifierArgs { private List rstates; private List prxs; private List nxts; - private HabState mhab; + private Identifier mhab; private List keys; private List ndigs; private String bran; diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java similarity index 93% rename from src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java rename to src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java index cc692945..1d3b4b2f 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/Identifier.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java @@ -28,11 +28,13 @@ import java.security.DigestException; import java.util.*; import java.util.concurrent.ExecutionException; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import static org.cardanofoundation.signify.cesr.util.CoreUtil.Versionage; import static org.cardanofoundation.signify.core.Httping.parseRangeHeaders; -public class Identifier { +public class IdentifierController { public final IdentifierDeps client; /** @@ -40,7 +42,7 @@ public class Identifier { * * @param client the client dependencies */ - public Identifier(IdentifierDeps client) { + public IdentifierController(IdentifierDeps client) { this.client = client; } @@ -69,7 +71,7 @@ public IdentifierListResponse list(Integer start, Integer end) throws Interrupte range.start(), range.end(), range.total(), - Arrays.asList(GeneratedModelMapper.read(response.body(), org.cardanofoundation.signify.generated.keria.model.Identifier[].class)) + Arrays.asList(Utils.fromJson(response.body(), Identifier[].class)) ); } @@ -87,7 +89,7 @@ public IdentifierListResponse list(Integer start) throws IOException, Interrupte * @param name Prefix or alias of the identifier * @return An Optional containing the HabState if found, or empty if not found */ - public Optional get(String name) throws InterruptedException, IOException, LibsodiumException { + public Optional get(String name) throws InterruptedException, IOException, LibsodiumException { final String path = "/identifiers/" + URI.create(name).toASCIIString(); final String method = "GET"; @@ -97,7 +99,7 @@ public Optional get(String name) throws InterruptedException, I return Optional.empty(); } - return Optional.of(Utils.fromJson(response.body(), States.HabState.class)); + return Optional.of(Utils.fromJson(response.body(), Identifier.class)); } /** @@ -107,7 +109,7 @@ public Optional get(String name) throws InterruptedException, I * @param info Information to update for the given identifier * @return A HabState to the identifier information after updating */ - public States.HabState update(String name, IdentifierInfo info) throws InterruptedException, IOException, LibsodiumException { + public Identifier update(String name, IdentifierInfo info) throws InterruptedException, IOException, LibsodiumException { final String path = "/identifiers/" + name; final String method = "PUT"; @@ -116,7 +118,7 @@ public States.HabState update(String name, IdentifierInfo info) throws Interrupt method, IdentifierPayloadMapper.buildUpdateNamePayload(info.getName()) ); - return GeneratedModelMapper.read(response.body(), States.HabState.class); + return Utils.fromJson(response.body(), Identifier.class); } /** @@ -289,7 +291,7 @@ public EventResult create(String name, CreateIdentifierArgs kargs) throws Interr * @throws LibsodiumException if there is an error in the cryptographic operations */ public EventResult addEndRole(String name, String role, String eid, String stamp) throws InterruptedException, DigestException, IOException, LibsodiumException { - States.HabState hab = this.get(name) + Identifier hab = this.get(name) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + name)); String pre = hab.getPrefix(); @@ -340,11 +342,11 @@ public EventResult interact(String name, Object data) throws InterruptedExceptio } public InteractionResponse createInteract(String name, Object data) throws InterruptedException, DigestException, IOException, LibsodiumException { - States.HabState hab = this.get(name) + Identifier hab = this.get(name) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + name)); String pre = hab.getPrefix(); - States.State state = hab.getState(); + KeyStateRecord state = hab.getState(); int sn = Integer.parseInt(state.getS(), 16); String dig = state.getD(); @@ -379,12 +381,12 @@ public EventResult rotate(String name, RotateIdentifierArgs kargs) throws Interr String ncode = kargs.getNcode() != null ? kargs.getNcode() : MatterCodex.Ed25519_Seed.getValue(); int ncount = kargs.getNcount() != null ? kargs.getNcount() : 1; - States.HabState hab = this.get(name) + Identifier hab = this.get(name) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + name)); String pre = hab.getPrefix(); boolean delegated = !hab.getState().getDi().isEmpty(); - States.State state = hab.getState(); + KeyStateRecord state = hab.getState(); int count = state.getK().size(); String dig = state.getD(); int ridx = Integer.parseInt(state.getS(), 16) + 1; @@ -410,8 +412,8 @@ public EventResult rotate(String name, RotateIdentifierArgs kargs) throws Interr // Create new keys for next digests List ncodes = kargs.getNcodes() != null ? kargs.getNcodes() : Collections.nCopies(ncount, ncode); - List states = kargs.getStates() == null ? new ArrayList<>() : kargs.getStates(); - List rstates = kargs.getStates() == null ? new ArrayList<>() : kargs.getRstates(); + List states = kargs.getStates() == null ? new ArrayList<>() : kargs.getStates(); + List rstates = kargs.getStates() == null ? new ArrayList<>() : kargs.getRstates(); KeeperResult keeperResult = keeper.rotate( ncodes, transferable, @@ -449,8 +451,8 @@ public EventResult rotate(String name, RotateIdentifierArgs kargs) throws Interr Map jsondata = new LinkedHashMap<>(); jsondata.put("rot", serder.getKed()); jsondata.put("sigs", sigs); - jsondata.put("smids", !states.isEmpty() ? states.stream().map(States.State::getI).toList() : null); - jsondata.put("rmids", !rstates.isEmpty() ? rstates.stream().map(States.State::getI).toList() : null); + jsondata.put("smids", !states.isEmpty() ? states.stream().map(KeyStateRecord::getI).toList() : null); + jsondata.put("rmids", !rstates.isEmpty() ? rstates.stream().map(KeyStateRecord::getI).toList() : null); jsondata.put(keeper.getAlgo().toString(), keeper.getParams().toMap()); HttpResponse res = this.client.fetch( diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java deleted file mode 100644 index 26b5f89a..00000000 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierModelConverter.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.cardanofoundation.signify.app.aiding; - -import org.cardanofoundation.signify.core.States; -import org.cardanofoundation.signify.cesr.Salter; -import org.cardanofoundation.signify.generated.keria.model.GroupKeyState; -import org.cardanofoundation.signify.generated.keria.model.Identifier; -import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; -import org.cardanofoundation.signify.generated.keria.model.RandyKeyState; -import org.cardanofoundation.signify.generated.keria.model.SaltyState; -import org.cardanofoundation.signify.generated.keria.model.StateEERecord; -import org.openapitools.jackson.nullable.JsonNullable; - -import java.util.ArrayList; -import java.util.Objects; - -/** - * Converts generated KERIA models to the domain models used by CESR operations. - */ -public final class IdentifierModelConverter { - private IdentifierModelConverter() { - } - - public static States.HabState toHabState(Identifier identifier) { - if (identifier == null) { - return null; - } - - return States.HabState.builder() - .name(identifier.getName()) - .prefix(identifier.getPrefix()) - .transferable(identifier.getTransferable()) - .state(toState(identifier.getState())) - .windexes(new ArrayList<>(identifier.getWindexes())) - .salty(toSaltyState(identifier.getSalty())) - .randy(toRandyState(identifier.getRandy())) - .group(toGroupState(identifier.getGroup())) - .build(); - } - - public static States.State toState(KeyStateRecord record) { - if (record == null) { - return null; - } - - int[] vn = record.getVn() == null ? null - : record.getVn().stream().filter(Objects::nonNull).mapToInt(Integer::intValue).toArray(); - - return States.State.builder() - .vn(vn) - .i(record.getI()) - .s(record.getS()) - .p(record.getP()) - .d(record.getD()) - .f(record.getF()) - .dt(record.getDt()) - .et(record.getEt()) - .kt(record.getKt()) - .k(record.getK()) - .nt(record.getNt()) - .n(record.getN()) - .bt(record.getBt()) - .b(record.getB()) - .c(record.getC()) - .ee(toEstablishmentState(record.getEe())) - .di(record.getDi()) - .build(); - } - - private static States.EstablishmentState toEstablishmentState(StateEERecord ee) { - if (ee == null) { - return null; - } - return States.EstablishmentState.builder() - .d(ee.getD()) - .s(ee.getS()) - .build(); - } - - private static States.SaltyState toSaltyState(SaltyState salty) { - if (salty == null) { - return null; - } - return States.SaltyState.builder() - .sxlt(salty.getSxlt()) - .pidx(salty.getPidx()) - .kidx(salty.getKidx()) - .stem(salty.getStem()) - .tier(salty.getTier() != null ? Salter.Tier.fromString(salty.getTier().getValue()) : null) - .dcode(salty.getDcode()) - .icodes(salty.getIcodes()) - .ncodes(salty.getNcodes()) - .transferable(salty.getTransferable()) - .build(); - } - - private static States.RandyState toRandyState(RandyKeyState randy) { - if (randy == null) { - return null; - } - return States.RandyState.builder() - .prxs(randy.getPrxs()) - .nxts(randy.getNxts()) - .build(); - } - - private static States.GroupState toGroupState(GroupKeyState group) { - if (group == null) { - return null; - } - - return States.GroupState.builder() - .mhab(toHabState(group.getMhab())) - .keys(group.getKeys()) - .ndigs(group.getNdigs()) - .build(); - } - - private static T unwrap(JsonNullable nullable, T defaultValue) { - if (nullable == null || !nullable.isPresent()) { - return defaultValue; - } - return nullable.get(); - } -} diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java b/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java index f2510d3c..90d75646 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java @@ -6,6 +6,7 @@ import org.cardanofoundation.signify.core.States; import java.util.List; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; @Builder @Getter @@ -20,6 +21,6 @@ public class RotateIdentifierArgs { private String ncode; private Integer ncount; private List ncodes; - private List states; - private List rstates; + private List states; + private List rstates; } diff --git a/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java b/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java index ffd22419..87d08816 100644 --- a/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java +++ b/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java @@ -16,7 +16,7 @@ import org.cardanofoundation.signify.app.Exchanging.Exchanges; import org.cardanofoundation.signify.app.Grouping.Groups; import org.cardanofoundation.signify.app.Notifying.Notifications; -import org.cardanofoundation.signify.app.aiding.Identifier; +import org.cardanofoundation.signify.app.aiding.IdentifierController; import org.cardanofoundation.signify.app.clienting.exception.HeaderVerificationException; import org.cardanofoundation.signify.app.clienting.exception.UnexpectedResponseStatusException; import org.cardanofoundation.signify.app.coring.KeyStates; @@ -61,7 +61,7 @@ public class SignifyClient implements IdentifierDeps, OperationsDeps { private String bootUrl; private List externalModules; - private Identifier identifierInstance = new Identifier(this); + private IdentifierController identifierControllerInstance = new IdentifierController(this); private Oobis oobisInstance = new Oobis(this); private Operations operationsInstance = new Operations(this); private KeyEvents keyEventsInstance = new KeyEvents(this); @@ -374,8 +374,8 @@ public void approveDelegation() throws DigestException, IOException, Interrupted * * @return {Identifier} */ - public Identifier identifiers() { - return identifierInstance; + public IdentifierController identifiers() { + return identifierControllerInstance; } /** diff --git a/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java b/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java index bc434d1e..c0065aa8 100644 --- a/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java +++ b/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java @@ -18,6 +18,7 @@ import java.net.http.HttpResponse; import java.security.DigestException; import java.util.*; +import org.cardanofoundation.signify.generated.keria.model.Identifier; public class Credentials { @@ -106,7 +107,7 @@ public Optional state(String ri, String said) throws IOException, Interr * Issue a credential */ public IssueCredentialResult issue(String name, CredentialData args) throws IOException, InterruptedException, DigestException, LibsodiumException { - final States.HabState hab = this.client.identifiers().get(name) + final Identifier hab = this.client.identifiers().get(name) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + name)); final boolean estOnly = hab.getState().getC() != null && hab.getState().getC().contains("EO"); @@ -189,7 +190,7 @@ public IssueCredentialResult issue(String name, CredentialData args) throws IOEx * @return A promise to the long-running operation */ public RevokeCredentialResult revoke(String name, String said, String datetime) throws IOException, InterruptedException, DigestException, LibsodiumException { - final States.HabState hab = this.client.identifiers().get(name) + final Identifier hab = this.client.identifiers().get(name) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + name)); final String pre = hab.getPrefix(); diff --git a/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java b/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java index 5054278b..a43306a6 100644 --- a/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java +++ b/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java @@ -16,6 +16,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.cardanofoundation.signify.generated.keria.model.Identifier; public class Ipex { private final SignifyClient client; @@ -25,7 +26,7 @@ public Ipex(SignifyClient client) { } public Exchanging.ExchangeMessageResult apply(IpexApplyArgs args) throws InterruptedException, DigestException, IOException, LibsodiumException { - HabState hab = this.client.identifiers().get(args.getSenderName()) + Identifier hab = this.client.identifiers().get(args.getSenderName()) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + args.getSenderName())); Map data = new LinkedHashMap<>(); data.put("m", args.getMessage() != null ? args.getMessage() : ""); @@ -63,7 +64,7 @@ public Object submitApply(String name, Serder exn, List sigs, List new IllegalArgumentException("Identifier not found: " + args.getSenderName())); Map data = new LinkedHashMap<>(); data.put("m", args.getMessage() != null ? args.getMessage() : ""); @@ -103,7 +104,7 @@ public Object submitOffer(String name, Serder exn, List sigs, String atc * Create an IPEX agree EXN message */ public Exchanging.ExchangeMessageResult agree(IpexAgreeArgs args) throws InterruptedException, DigestException, IOException, LibsodiumException { - HabState hab = this.client.identifiers().get(args.getSenderName()) + Identifier hab = this.client.identifiers().get(args.getSenderName()) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + args.getSenderName())); Map data = new LinkedHashMap<>(); data.put("m", args.getMessage() != null ? args.getMessage() : ""); @@ -139,7 +140,7 @@ public Object submitAgree(String name, Serder exn, List sigs, List new IllegalArgumentException("Identifier not found: " + args.getSenderName())); Map data = Map.of( "m", args.getMessage() != null ? args.getMessage() : "" @@ -195,7 +196,7 @@ public Object submitGrant(String name, Serder exn, List sigs, String atc * Create an IPEX admit EXN message */ public Exchanging.ExchangeMessageResult admit(IpexAdmitArgs args) throws InterruptedException, DigestException, IOException, LibsodiumException { - HabState hab = this.client.identifiers().get(args.getSenderName()) + Identifier hab = this.client.identifiers().get(args.getSenderName()) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + args.getSenderName())); LinkedHashMap data = new LinkedHashMap<>(); data.put("m", args.getMessage()); diff --git a/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java b/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java index 41626b5d..2a363183 100644 --- a/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java +++ b/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java @@ -18,6 +18,7 @@ import java.net.http.HttpResponse; import java.security.DigestException; import java.util.*; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import static org.cardanofoundation.signify.cesr.util.CoreUtil.Versionage; @@ -55,7 +56,7 @@ public Object list(String name) throws IOException, InterruptedException, Libsod * @throws LibsodiumException if a sodium exception occurs */ public RegistryResult create(CreateRegistryArgs args) throws IOException, InterruptedException, DigestException, LibsodiumException { - States.HabState hab = this.client.identifiers().get(args.getName()) + Identifier hab = this.client.identifiers().get(args.getName()) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + args.getName())); String pre = hab.getPrefix(); @@ -122,7 +123,7 @@ public RegistryResult create(CreateRegistryArgs args) throws IOException, Interr * @throws LibsodiumException if a sodium exception occurs */ private HttpResponse createFromEvents( - States.HabState hab, + Identifier hab, String name, String registryName, Map vcp, diff --git a/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java b/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java index 1056fc41..9619f91a 100644 --- a/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java +++ b/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java @@ -15,8 +15,6 @@ import org.cardanofoundation.signify.core.Manager.RandyCreator; import org.cardanofoundation.signify.core.Manager.SaltyCreator; import org.cardanofoundation.signify.core.Manager.Algos; -import org.cardanofoundation.signify.core.States; -import org.cardanofoundation.signify.core.States.HabState; import org.cardanofoundation.signify.core.States.State; import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.cesr.Codex.MatterCodex; @@ -25,6 +23,11 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; +import org.cardanofoundation.signify.generated.keria.model.GroupKeyState; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; +import org.cardanofoundation.signify.generated.keria.model.RandyKeyState; +import org.cardanofoundation.signify.generated.keria.model.SaltyState; public class Keeping { // External module interface @@ -44,8 +47,8 @@ public interface Keeper { KeeperResult rotate( List ncodes, boolean transferable, - List states, - List rstates + List states, + List rstates ) throws DigestException, LibsodiumException; SignResult sign( @@ -118,7 +121,7 @@ public Keeper create(Algos algo, int pidx, Map new GroupKeeper( this, - (HabState) kargs.get("mhab"), + (Identifier) kargs.get("mhab"), Utils.fromJson(Utils.jsonStringify(kargs.get("states")), new TypeReference<>() {}), Utils.fromJson(Utils.jsonStringify(kargs.get("rstates")), new TypeReference<>() {}), Utils.fromJson(Utils.jsonStringify(kargs.get("keys")), new TypeReference<>() {}), @@ -128,29 +131,31 @@ public Keeper create(Algos algo, int pidx, Map get(HabState aid) throws LibsodiumException { - if (aid.containsKey(Algos.salty.getValue())) { - States.SaltyState kargs = (States.SaltyState) aid.get(Algos.salty.getValue()); + public Keeper get(Identifier aid) throws LibsodiumException { + SaltyState saltyState = aid.getSalty(); + RandyKeyState randyState = aid.getRandy(); + GroupKeyState groupKeyState = aid.getGroup(); + + if (saltyState != null) { return new SaltyKeeper( salter, - kargs.getPidx(), - kargs.getKidx(), - kargs.getTier(), - kargs.isTransferable(), - kargs.getStem(), + saltyState.getPidx(), + saltyState.getKidx(), + Tier.fromString(saltyState.getTier().getValue()), // TODO convert TIER + saltyState.getTransferable(), + saltyState.getStem(), null, null, - kargs.getIcodes(), + saltyState.getIcodes(), null, null, - kargs.getNcodes(), - kargs.getDcode(), + saltyState.getNcodes(), + saltyState.getDcode(), null, - kargs.getSxlt() + saltyState.getSxlt() ); - } else if (aid.containsKey(Algos.randy.getValue())) { + } else if (randyState != null) { Prefixer pre = new Prefixer(aid.getPrefix()); - States.RandyState kargs = (States.RandyState) aid.get(Algos.randy.getValue()); return new RandyKeeper( salter, null, @@ -161,18 +166,17 @@ public Keeper get(HabState aid) throws LibsodiumExceptio null, List.of(), null, - kargs.getPrxs(), - kargs.getNxts() + randyState.getPrxs(), + randyState.getNxts() ); - } else if (aid.containsKey(Algos.group.name())) { - States.GroupState kargs = (States.GroupState) aid.get(Algos.group.name()); + } else if (groupKeyState != null) { return new GroupKeeper( this, - kargs.getMhab(), + groupKeyState.getMhab(), null, null, - kargs.getKeys(), - kargs.getNdigs() + groupKeyState.getKeys(), + groupKeyState.getNdigs() ); } else { throw new UnsupportedOperationException("Algo not allowed yet"); @@ -347,8 +351,8 @@ public KeeperResult incept(boolean transferable) throws DigestException, Libsodi public KeeperResult rotate( List ncodes, boolean transferable, - List states, - List rstates + List states, + List rstates ) throws DigestException, LibsodiumException { this.ncodes = ncodes; this.transferable = transferable; @@ -566,8 +570,8 @@ public KeeperResult incept(boolean transferable) throws DigestException, Libsodi public KeeperResult rotate( List ncodes, boolean transferable, - List states, - List rstates + List states, + List rstates ) throws DigestException, LibsodiumException { this.ncodes = ncodes; this.transferable = transferable; @@ -661,7 +665,7 @@ public SignResult sign( @Getter public static class GroupKeeper implements Keeper { private final KeyManager manager; - private final HabState mhab; + private final Identifier mhab; private final Algos algo = Algos.group; private final List signers; private List gkeys; @@ -669,7 +673,7 @@ public static class GroupKeeper implements Keeper { public GroupKeeper( KeyManager manager, - HabState mhab, + Identifier mhab, List states, List rstates, List keys, @@ -716,8 +720,8 @@ public KeeperResult incept(boolean transferable) { public KeeperResult rotate( List ncodes, boolean transferable, - List states, - List rstates + List states, + List rstates ) { this.gkeys = states.stream() .map(state -> state.getK().getFirst()) diff --git a/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java b/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java index df16f0b8..7c8c888a 100644 --- a/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java +++ b/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java @@ -4,10 +4,11 @@ import lombok.Setter; import lombok.experimental.SuperBuilder; import org.cardanofoundation.signify.core.States.HabState; +import org.cardanofoundation.signify.generated.keria.model.Identifier; @Getter @Setter @SuperBuilder public class GroupParams extends KeeperParams { - private HabState mhab; + private Identifier mhab; } \ No newline at end of file diff --git a/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java b/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java index 7878ff35..b839e6b3 100644 --- a/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java @@ -4,7 +4,7 @@ import okhttp3.mockwebserver.RecordedRequest; import org.cardanofoundation.signify.app.clienting.*; -import org.cardanofoundation.signify.app.aiding.Identifier; +import org.cardanofoundation.signify.app.aiding.IdentifierController; import org.cardanofoundation.signify.app.clienting.exception.HeaderVerificationException; import org.cardanofoundation.signify.app.coring.Coring; import org.cardanofoundation.signify.app.coring.KeyStates; @@ -140,7 +140,7 @@ void testSignifyClientInitialization() throws Exception { assertEquals(bran, data[1]); // Validate service instances - assertInstanceOf(Identifier.class, client.identifiers()); + assertInstanceOf(IdentifierController.class, client.identifiers()); assertInstanceOf(Operations.class, client.operations()); assertInstanceOf(Coring.KeyEvents.class, client.keyEvents()); assertInstanceOf(KeyStates.class, client.keyStates()); diff --git a/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java b/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java index 8fde0bcb..5d1bda46 100644 --- a/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java @@ -1,13 +1,15 @@ package org.cardanofoundation.signify.app; import org.cardanofoundation.signify.app.clienting.SignifyClient; -import org.cardanofoundation.signify.app.aiding.Identifier; +import org.cardanofoundation.signify.app.aiding.IdentifierController; import org.cardanofoundation.signify.app.credentialing.registries.CreateRegistryArgs; import org.cardanofoundation.signify.app.credentialing.registries.Registries; import org.cardanofoundation.signify.cesr.Keeping; import org.cardanofoundation.signify.cesr.params.SaltyParams; import org.cardanofoundation.signify.core.Manager; import org.cardanofoundation.signify.core.States; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -25,7 +27,7 @@ public class RegistryTest { @Mock private SignifyClient mockedClient; @Mock - private Identifier mockedIdentifiers; + private IdentifierController mockedIdentifiers; @Mock private Keeping.KeyManager mockedKeyManager; @Mock @@ -42,13 +44,13 @@ void setUp() { @Test @DisplayName("should create a registry") void shouldCreateRegistry() throws Exception { - States.HabState hab = States.HabState.builder() - .prefix("hab prefix") - .state(States.State.builder() - .s("0") - .d("a digest") - .build()) - .build(); + Identifier hab = new Identifier(); + hab.setPrefix("hab prefix"); + + KeyStateRecord keyStateRecord = new KeyStateRecord(); + keyStateRecord.setS("0"); + keyStateRecord.setD("a digest"); + hab.setState(keyStateRecord); when(mockedClient.getManager()).thenReturn(mockedKeyManager); when(mockedKeyManager.get(hab)).thenReturn(mockedKeeper); @@ -78,17 +80,17 @@ void shouldCreateRegistry() throws Exception { @Test @DisplayName("should fail on establishment only for now") void shouldFailOnEstablishmentOnly() throws Exception { - States.HabState hab = States.HabState.builder() - .prefix("hab prefix") - .state(States.State.builder() - .s("0") - .d("a digest") - .c(Collections.singletonList("EO")) - .build()) - .name("a name") - .transferable(true) - .windexes(Collections.emptyList()) - .build(); + Identifier hab = new Identifier(); + hab.setPrefix("hab prefix"); + hab.setName("a name"); + hab.setTransferable(true); + hab.setWindexes(Collections.emptyList()); + + KeyStateRecord keyStateRecord = new KeyStateRecord(); + keyStateRecord.setS("0"); + keyStateRecord.setD("a digest"); + keyStateRecord.setC(Collections.singletonList("EO")); + hab.setState(keyStateRecord); when(mockedIdentifiers.get("a name")).thenReturn(Optional.of(hab)); when(mockedClient.identifiers()).thenReturn(mockedIdentifiers); diff --git a/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java b/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java index 61b55ea2..4b115cda 100644 --- a/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java +++ b/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java @@ -3,6 +3,9 @@ import org.cardanofoundation.signify.cesr.*; import org.cardanofoundation.signify.cesr.args.RawArgs; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; +import org.cardanofoundation.signify.generated.keria.model.RandyKeyState; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -696,19 +699,18 @@ void testManager_ShouldSupportCreatingAndGettingRandyKeeper() throws DigestExcep List keys = keeperResult.verfers(); Prefixer prefixes = new Prefixer(keys.getFirst()); - States.RandyState randyState = States.RandyState.builder() - .nxts(keeper0.getParams().getNxts()) - .prxs(keeper0.getParams().getPrxs()) - .build(); - States.HabState habState = States.HabState.builder() - .prefix(prefixes.getQb64()) - .name("") - .state(new States.State()) - .randy(randyState) - .transferable(false) - .windexes(Collections.emptyList()) - .build(); - Keeping.Keeper keeper1 = manager.get(habState); + RandyKeyState randyKeyState = new RandyKeyState(); + randyKeyState.setNxts(keeper0.getParams().getNxts()); + randyKeyState.setPrxs(keeper0.getParams().getPrxs()); + + Identifier identifier = new Identifier(); + identifier.setPrefix(prefixes.getQb64()); + identifier.setName(""); + identifier.setState(new KeyStateRecord()); + identifier.setRandy(randyKeyState); + identifier.setTransferable(true); + identifier.setWindexes(Collections.emptyList()); + Keeping.Keeper keeper1 = manager.get(identifier); assertInstanceOf(Keeping.RandyKeeper.class, keeper1); } diff --git a/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java b/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java index 0ee33877..12111238 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import static org.cardanofoundation.signify.e2e.utils.TestUtils.unchecked; @@ -26,8 +27,8 @@ public static List getOrCreateClientsAsync(int count) throws Exce return bootFutures.stream().map(CompletableFuture::join).toList(); } - public static List createAidAndGetHabStateAsync(CreateAidArgs... createAidArgs) { - List> createAidFutures = new ArrayList<>(); + public static List createAidAndGetHabStateAsync(CreateAidArgs... createAidArgs) { + List> createAidFutures = new ArrayList<>(); for (CreateAidArgs createAidArg : createAidArgs) { createAidFutures.add(createAidAndGetHabStateFuture(createAidArg.signifyClient, createAidArg.name)); } @@ -83,8 +84,8 @@ public List createAidAsync(CreateAidArgs... createAidArgs) { return createAidFutures.stream().map(CompletableFuture::join).toList(); } - public static List getOrCreateAIDAsync(CreateAidArgs... createAidArgs) { - List> getOrCreateAIDFutures = new ArrayList<>(); + public static List getOrCreateAIDAsync(CreateAidArgs... createAidArgs) { + List> getOrCreateAIDFutures = new ArrayList<>(); for (CreateAidArgs getOrCreateAIDArg : createAidArgs) { getOrCreateAIDFutures.add(getOrCreateAIDFuture(getOrCreateAIDArg.signifyClient, getOrCreateAIDArg.name, getOrCreateAIDArg.args)); } @@ -103,7 +104,7 @@ static CompletableFuture bootClientFuture() { )); } - static CompletableFuture createAidAndGetHabStateFuture(SignifyClient client, String name) { + static CompletableFuture createAidAndGetHabStateFuture(SignifyClient client, String name) { return CompletableFuture.supplyAsync(unchecked(() -> TestUtils.createAidAndGetHabState(client, name) )); @@ -140,7 +141,7 @@ CompletableFuture createAidFuture(SignifyClient client, String na )); } - static CompletableFuture getOrCreateAIDFuture(SignifyClient client, String name, CreateIdentifierArgs args) { + static CompletableFuture getOrCreateAIDFuture(SignifyClient client, String name, CreateIdentifierArgs args) { return CompletableFuture.supplyAsync(unchecked(() -> TestUtils.getOrCreateAID(client, name, args) )); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/DelegationMultisigTest.java b/src/test/java/org/cardanofoundation/signify/e2e/DelegationMultisigTest.java index f7892560..1bfaccdf 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/DelegationMultisigTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/DelegationMultisigTest.java @@ -3,11 +3,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.app.coring.Operation; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.MultisigUtils; import org.cardanofoundation.signify.e2e.utils.Retry; import org.cardanofoundation.signify.e2e.utils.TestSteps; import org.cardanofoundation.signify.e2e.utils.TestUtils; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -39,7 +39,7 @@ void delegationMultisigTest() throws Exception { SignifyClient delegatee2Client = signifyClients.get(3); // Create delegator and delegatee identifiers clients - List aids = testSteps.step("Creating single sig aids", () -> + List aids = testSteps.step("Creating single sig aids", () -> createAidAndGetHabStateAsync( new CreateAidArgs(delegator1Client, delegator1Name), new CreateAidArgs(delegator2Client, delegator2Name), @@ -47,10 +47,10 @@ void delegationMultisigTest() throws Exception { new CreateAidArgs(delegatee2Client, delegatee2Name)) ); - States.HabState delegator1Aid = aids.get(0); - States.HabState delegator2Aid = aids.get(1); - States.HabState delegatee1Aid = aids.get(2); - States.HabState delegatee2Aid = aids.get(3); + Identifier delegator1Aid = aids.get(0); + Identifier delegator2Aid = aids.get(1); + Identifier delegatee1Aid = aids.get(2); + Identifier delegatee2Aid = aids.get(3); // Exchange OOBIs List oobis = testSteps.step("Exchanging OOBIs", () -> @@ -139,13 +139,13 @@ void delegationMultisigTest() throws Exception { new WaitOperationArgs(delegator2Client, otor2) ); - States.HabState adelegatorGroupName1 = delegator1Client.identifiers().get(delegatorGroupName).get(); - States.HabState adelegatorGroupName2 = delegator2Client.identifiers().get(delegatorGroupName).get(); + Identifier adelegatorGroupName1 = delegator1Client.identifiers().get(delegatorGroupName).get(); + Identifier adelegatorGroupName2 = delegator2Client.identifiers().get(delegatorGroupName).get(); assertEquals(adelegatorGroupName1.getPrefix(), adelegatorGroupName2.getPrefix()); assertEquals(adelegatorGroupName1.getName(), adelegatorGroupName2.getName()); - States.HabState adelegatorGroupName = adelegatorGroupName1; + Identifier adelegatorGroupName = adelegatorGroupName1; //Resolve delegator OOBI String delegatorGroupNameOobi = testSteps.step(String.format("Add and resolve delegator OOBI %s(%s)", delegatorGroupName, adelegatorGroupName.getPrefix()), () -> { @@ -235,8 +235,8 @@ void delegationMultisigTest() throws Exception { Object opDelegatee2 = MultisigUtils.acceptMultisigIncept(delegatee2Client, acceptMultisigInceptArgs); System.out.println(delegatee2Name + " joined multisig, waiting for delegator..."); - States.HabState agtee1 = delegatee1Client.identifiers().get(delegateeGroupName).get(); - States.HabState agtee2 = delegatee2Client.identifiers().get(delegateeGroupName).get(); + Identifier agtee1 = delegatee1Client.identifiers().get(delegateeGroupName).get(); + Identifier agtee2 = delegatee2Client.identifiers().get(delegateeGroupName).get(); assertEquals(agtee1.getPrefix(), agtee2.getPrefix()); assertEquals(agtee1.getName(), agtee2.getName()); @@ -302,7 +302,7 @@ void delegationMultisigTest() throws Exception { ); System.out.println("Delegated multisig created!"); - States.HabState agtee = delegatee1Client.identifiers().get(delegateeGroupName).get(); + Identifier agtee = delegatee1Client.identifiers().get(delegateeGroupName).get(); assertEquals(agtee.getPrefix(), teepre); List clients = Arrays.asList( diff --git a/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java b/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java index e482630c..8a94c0a9 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java @@ -7,8 +7,8 @@ import org.cardanofoundation.signify.app.coring.Coring; import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.cesr.Salter; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.TestSteps; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.Test; import java.util.*; @@ -63,7 +63,7 @@ void delegationTest() throws Exception { EventResult icpResult1 = client1.identifiers().create("delegator", kargs); waitOperation(client1, icpResult1.op()); - States.HabState ator = client1.identifiers().get("delegator").get(); + Identifier ator = client1.identifiers().get("delegator").get(); EventResult rpyResult1 = client1.identifiers().addEndRole( "delegator", "agent", @@ -109,7 +109,7 @@ void delegationTest() throws Exception { // Client 2 check approval waitOperation(client2, op2); - States.HabState aid2 = client2.identifiers().get("delegate").get(); + Identifier aid2 = client2.identifiers().get("delegate").get(); assertEquals(delegatePrefix, aid2.getPrefix()); System.out.println("Delegation approved for aid: " + aid2.getPrefix()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java index 8435ad5c..8579bda3 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigHolderTest.java @@ -16,11 +16,11 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.core.Eventing; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.MultisigUtils.AcceptMultisigInceptArgs; import org.cardanofoundation.signify.e2e.utils.MultisigUtils.StartMultisigInceptArgs; import org.cardanofoundation.signify.app.credentialing.credentials.CredentialData.CredentialSubject; import org.cardanofoundation.signify.e2e.utils.ResolveEnv; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,7 +36,7 @@ public class MultisigHolderTest extends BaseIntegrationTest { SignifyClient client1, client2, client3; - States.HabState aid1, aid2, aid3; + Identifier aid1, aid2, aid3; Object oobi1, oobi2, oobi3; String oobis1, oobis2, oobis3; private List> registryList; @@ -62,7 +62,7 @@ void multisigHolderTest() throws Exception { client3 = signifyClients.get(2); // Create four identifiers, one for each client - List aids = createAidAndGetHabStateAsync( + List aids = createAidAndGetHabStateAsync( new CreateAidArgs(client1, "member1"), new CreateAidArgs(client2, "member2"), new CreateAidArgs(client3, "issuer") @@ -168,7 +168,7 @@ void multisigHolderTest() throws Exception { aid1 = client1.identifiers().get("member1").get(); aid2 = client2.identifiers().get("member2").get(); Object members = client1.identifiers().members("holder"); - States.HabState ghab1 = client1.identifiers().get("holder").get(); + Identifier ghab1 = client1.identifiers().get("holder").get(); List> signing = (List>) Utils.toMap(members).get("signing"); String eid1 = Utils.toList(Utils.toMap(Utils.toMap(signing.getFirst().get("ends")).get("agent")).keySet()).getFirst(); String eid2 = Utils.toList(Utils.toMap(Utils.toMap(signing.get(1).get("ends")).get("agent")).keySet()).getFirst(); @@ -202,7 +202,7 @@ void multisigHolderTest() throws Exception { roleembeds.put("rpy", Arrays.asList(rpy, atc)); List recp = Stream.of(aid2.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); Object resp = client1.exchanges().send( @@ -237,7 +237,7 @@ void multisigHolderTest() throws Exception { rpy = endRoleRes.serder(); sigs = endRoleRes.sigs(); - States.HabState ghab2 = client2.identifiers().get("holder").get(); + Identifier ghab2 = client2.identifiers().get("holder").get(); Map ghabState2 = Utils.toMap(ghab2.getState()); seal = Arrays.asList( "SealEvent", @@ -259,7 +259,7 @@ void multisigHolderTest() throws Exception { roleembeds.put("rpy", Arrays.asList(rpy, atc)); recp = Stream.of(aid1.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); resp = client2.exchanges().send( @@ -307,7 +307,7 @@ void multisigHolderTest() throws Exception { roleembeds.put("rpy", Arrays.asList(rpy, atc)); recp = Stream.of(aid2.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); resp = client1.exchanges().send( @@ -366,7 +366,7 @@ void multisigHolderTest() throws Exception { roleembeds.put("rpy", Arrays.asList(rpy, atc)); recp = Stream.of(aid1.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); resp = client2.exchanges().send( @@ -396,7 +396,7 @@ void multisigHolderTest() throws Exception { waitOperation(client3, op3); System.out.println("Issuer resolved multisig holder OOBI"); - States.HabState holderAid = client1.identifiers().get("holder").get(); + Identifier holderAid = client1.identifiers().get("holder").get(); aid1 = client1.identifiers().get("member1").get(); aid2 = client2.identifiers().get("member2").get(); @@ -429,7 +429,7 @@ void multisigHolderTest() throws Exception { Object exnRes = client1.exchanges().get(grantMsgSaid).get(); recp = Stream.of(aid2.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); LinkedHashMap exnResList = castObjectToLinkedHashMap(exnRes); @@ -456,7 +456,7 @@ void multisigHolderTest() throws Exception { System.out.println("Member2 /exn/ipex/grant msg : " + Utils.jsonStringify(exnRes2)); List recp2 = Stream.of(aid1.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .toList(); op2 = multisigAdmitCredential(client2, @@ -493,9 +493,9 @@ void multisigHolderTest() throws Exception { warnNotifications(clientList); } - public States.HabState createAid(SignifyClient client, String name, List wits) throws Exception { + public Identifier createAid(SignifyClient client, String name, List wits) throws Exception { getOrCreateIdentifier(client, name, null); - States.HabState aid = client.identifiers().get(name).get(); + Identifier aid = client.identifiers().get(name).get(); System.out.println(name + "AID:" + aid.getPrefix()); return aid; } @@ -572,8 +572,8 @@ public Object multisigAdmitCredential( String issuerPrefix, List recipients ) throws Exception { - States.HabState mhab = client.identifiers().get(memberAlias).get(); - States.HabState ghab = client.identifiers().get(groupName).get(); + Identifier mhab = client.identifiers().get(memberAlias).get(); + Identifier ghab = client.identifiers().get(groupName).get(); IpexAdmitArgs ipexAdmitArgs = IpexAdmitArgs .builder() @@ -596,7 +596,7 @@ public Object multisigAdmitCredential( List.of(issuerPrefix) ); - States.State mstate = ghab.getState(); + KeyStateRecord mstate = ghab.getState(); Map sealMap = new LinkedHashMap<>(); sealMap.put("i", ghab.getPrefix()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigInceptionTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigInceptionTest.java index 65f19291..732f3fa0 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigInceptionTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigInceptionTest.java @@ -2,11 +2,11 @@ import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.util.Utils; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.MultisigUtils; import org.cardanofoundation.signify.e2e.utils.TestSteps; import org.cardanofoundation.signify.e2e.utils.TestUtils; import org.cardanofoundation.signify.e2e.utils.TestUtils.Notification; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -83,8 +83,8 @@ public void testMultisigInception() throws Exception { ); System.out.println("Multisig created!"); - States.HabState multisig1 = client1.identifiers().get(groupName).get(); - States.HabState multisig2 = client2.identifiers().get(groupName).get(); + Identifier multisig1 = client1.identifiers().get(groupName).get(); + Identifier multisig2 = client2.identifiers().get(groupName).get(); assertEquals(multisig1.getPrefix(), multisig2.getPrefix()); Object members = client1.identifiers().members(groupName); Map membersMap = Utils.toMap(members); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java index e6842850..c5e8d2c2 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java @@ -13,6 +13,8 @@ import org.cardanofoundation.signify.core.Manager; import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.TestUtils; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.*; import java.util.*; @@ -27,7 +29,7 @@ public class MultisigJoinTest extends BaseIntegrationTest { private static SignifyClient client1, client2, client3; - States.HabState aid1, aid2, aid3; + Identifier aid1, aid2, aid3; static String nameMember1 = "member1"; static String nameMember2 = "member2"; static String nameMember3 = "member3"; @@ -61,7 +63,7 @@ public static void getClients() throws Exception { @Test @Order(1) public void multisigJoinTest() throws Exception { - List aids = createAidAndGetHabStateAsync( + List aids = createAidAndGetHabStateAsync( new CreateAidArgs(client1, nameMember1), new CreateAidArgs(client2, nameMember2) ); @@ -231,12 +233,12 @@ public void multisigJoinTestAddMember3() throws Exception { Object aid1States = statesUpdate.get(2); Object aid3States = statesUpdate.get(1); - States.State aid2State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid2States).getResponse()), States.State.class); - States.State aid1State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid1States).getResponse()), States.State.class); - States.State aid3State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid3States).getResponse()), States.State.class); + KeyStateRecord aid2State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid2States).getResponse()), KeyStateRecord.class); + KeyStateRecord aid1State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid1States).getResponse()), KeyStateRecord.class); + KeyStateRecord aid3State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid3States).getResponse()), KeyStateRecord.class); - List states = Arrays.asList(aid1State, aid2State); - List rstates = new ArrayList<>(states); + List states = Arrays.asList(aid1State, aid2State); + List rstates = new ArrayList<>(states); rstates.add(aid3State); EventResult rotateOperation1 = client1.identifiers().rotate(nameMultisig, RotateIdentifierArgs.builder() @@ -264,7 +266,7 @@ public void multisigJoinTestAddMember3() throws Exception { .collect(Collectors.toList()); List recp = Stream.of(aid2.getState(), aid3.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); Map payload1 = new LinkedHashMap<>(); @@ -285,7 +287,7 @@ public void multisigJoinTestAddMember3() throws Exception { TestUtils.waitAndMarkNotification(client2, "/multisig/rot"); TestUtils.waitAndMarkNotification(client3, "/multisig/rot"); - States.HabState multiSigAid = client1.identifiers().get(nameMultisig).get(); + Identifier multiSigAid = client1.identifiers().get(nameMultisig).get(); assertEquals(2, multiSigAid.getState().getK().size()); assertEquals(aid1.getState().getK().getFirst(), multiSigAid.getState().getK().getFirst()); @@ -336,11 +338,11 @@ public void signingKeysAndJoinTest() throws Exception { Object aid1States = statesUpdate.get(2); Object aid3States = statesUpdate.get(1); - States.State aid2State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid2States).getResponse()), States.State.class); - States.State aid1State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid1States).getResponse()), States.State.class); - States.State aid3State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid3States).getResponse()), States.State.class); + KeyStateRecord aid2State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid2States).getResponse()), KeyStateRecord.class); + KeyStateRecord aid1State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid1States).getResponse()), KeyStateRecord.class); + KeyStateRecord aid3State = Utils.fromJson(Utils.jsonStringify(Operation.fromObject(aid3States).getResponse()), KeyStateRecord.class); - List states = Arrays.asList(aid1State, aid2State, aid3State); + List states = Arrays.asList(aid1State, aid2State, aid3State); EventResult rotateOperation1 = client1.identifiers().rotate(nameMultisig, RotateIdentifierArgs.builder() .states(states) @@ -367,7 +369,7 @@ public void signingKeysAndJoinTest() throws Exception { .collect(Collectors.toList()); List recp = Stream.of(aid2.getState(), aid3.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); Map payload1 = new LinkedHashMap<>(); @@ -410,7 +412,7 @@ public void signingKeysAndJoinTest() throws Exception { waitOperation(client3, joinOperation); - States.HabState multiSigAid = client3.identifiers().get(nameMultisig).get(); + Identifier multiSigAid = client3.identifiers().get(nameMultisig).get(); assertEquals(3, multiSigAid.getState().getK().size()); assertEquals(aid1.getState().getK().getFirst(), multiSigAid.getState().getK().getFirst()); @@ -433,7 +435,7 @@ public void signingKeysAndJoinTest() throws Exception { assertNull(Utils.toMap(endRoleResult).get("error")); } - public static States.HabState createAID(SignifyClient client, String name, List wits) throws Exception { + public static Identifier createAID(SignifyClient client, String name, List wits) throws Exception { CreateIdentifierArgs iargs = new CreateIdentifierArgs(); iargs.setWits(wits); iargs.setToad(wits.size()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java index 6849e3e6..0f5ed639 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java @@ -28,6 +28,7 @@ import org.cardanofoundation.signify.e2e.utils.MultisigUtils; import org.cardanofoundation.signify.e2e.utils.ResolveEnv; import org.cardanofoundation.signify.e2e.utils.TestUtils; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.Test; import java.io.IOException; @@ -63,16 +64,16 @@ public void multisig() throws Exception { .wits(WITNESS_AIDS) .toad(WITNESS_AIDS.size()) .build(); - List aids = createAidAndGetHabStateAsync( + List aids = createAidAndGetHabStateAsync( new CreateAidArgs(client1, "member1", createIdentifierArgs), new CreateAidArgs(client2, "member2", createIdentifierArgs), new CreateAidArgs(client3, "member3", createIdentifierArgs), new CreateAidArgs(client4, "holder", createIdentifierArgs) ); - States.HabState aid1 = aids.get(0); - States.HabState aid2 = aids.get(1); - States.HabState aid3 = aids.get(2); - States.HabState aid4 = aids.get(3); + Identifier aid1 = aids.get(0); + Identifier aid2 = aids.get(1); + Identifier aid3 = aids.get(2); + Identifier aid4 = aids.get(3); // Exchange OOBIs System.out.println("Resolving OOBIs"); @@ -262,7 +263,7 @@ public void multisig() throws Exception { String multisig = Utils.toMap(aids3.get(1)).get("prefix").toString(); - States.HabState multisigAID = client1.identifiers().get("multisig").get(); + Identifier multisigAID = client1.identifiers().get("multisig").get(); String timestamp = TestUtils.createTimestamp(); List opList1 = MultisigUtils.addEndRoleMultisigs( @@ -405,12 +406,12 @@ public void multisig() throws Exception { op4 = client4.keyStates().query(aid3.getPrefix(), "1"); op4 = waitOperation(client4, op4); - List rstateLst = List.of( - Utils.fromJson(Utils.jsonStringify(aid1State), States.State.class), - Utils.fromJson(Utils.jsonStringify(aid2State), States.State.class), - Utils.fromJson(Utils.jsonStringify(aid3State), States.State.class) + List rstateLst = List.of( + Utils.fromJson(Utils.jsonStringify(aid1State), KeyStateRecord.class), + Utils.fromJson(Utils.jsonStringify(aid2State), KeyStateRecord.class), + Utils.fromJson(Utils.jsonStringify(aid3State), KeyStateRecord.class) ); - List stateLst = rstateLst; + List stateLst = rstateLst; // Multisig Rotation @@ -460,7 +461,7 @@ public void multisig() throws Exception { new WaitOperationArgs(client3, op3) ); - States.HabState hab = client1.identifiers().get("multisig").get(); + Identifier hab = client1.identifiers().get("multisig").get(); String aid = hab.getPrefix(); // Multisig Registry creation @@ -601,7 +602,7 @@ public void multisig() throws Exception { ); System.out.println("Multisig create credential completed!"); - States.HabState m = client1.identifiers().get("multisig").get(); + Identifier m = client1.identifiers().get("multisig").get(); // Update states op1 = client1.keyStates().query(m.getPrefix(), "4"); @@ -652,7 +653,7 @@ public void multisig() throws Exception { gembeds.put("exn", Arrays.asList(grant, atc)); List recp = Stream.of(aid2.getState(), aid3.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); client1.exchanges().send( @@ -699,7 +700,7 @@ public void multisig() throws Exception { gembeds = new LinkedHashMap<>(); gembeds.put("exn", Arrays.asList(grant2, atc)); recp = Stream.of(aid1.getState(), aid3.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); client2.exchanges().send( @@ -747,7 +748,7 @@ public void multisig() throws Exception { gembeds = new LinkedHashMap<>(); gembeds.put("exn", Arrays.asList(grant3, atc)); recp = Stream.of(aid1.getState(), aid2.getState()) - .map(States.State::getI) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); client3.exchanges().send( @@ -844,8 +845,8 @@ public void multisigIssue( String groupName, IssueCredentialResult result ) throws Exception { - States.HabState leaderHab = client.identifiers().get(memberName).get(); - States.HabState groupHab = client.identifiers().get(groupName).get(); + Identifier leaderHab = client.identifiers().get(memberName).get(); + Identifier groupHab = client.identifiers().get(groupName).get(); Object members = client.identifiers().members(groupName); Keeping.Keeper keeper = client.getManager().get(groupHab); @@ -887,8 +888,8 @@ public void multisigRevoke( Serder rev, Serder anc ) throws Exception { - States.HabState leaderHab = client.identifiers().get(memberName).get(); - States.HabState groupHab = client.identifiers().get(groupName).get(); + Identifier leaderHab = client.identifiers().get(memberName).get(); + Identifier groupHab = client.identifiers().get(groupName).get(); Object members = client.identifiers().members(groupName); Keeping.Keeper keeper = client.getManager().get(groupHab); @@ -924,9 +925,9 @@ public void multisigRevoke( public static List createRegistryMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, - States.HabState multisigAID, + Identifier aid, + List otherMembersAIDs, + Identifier multisigAID, String registryName, String nonce, boolean isInitiator) throws Exception { @@ -959,7 +960,7 @@ public static List createRegistryMultisig( }}; List recp = otherMembersAIDs.stream() - .map(States.HabState::getPrefix) + .map(Identifier::getPrefix) .toList(); client.exchanges().send( diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java index 665484f0..60e87df1 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java @@ -8,10 +8,10 @@ import org.cardanofoundation.signify.cesr.Saider; import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.core.Manager; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.MultisigUtils; import org.cardanofoundation.signify.e2e.utils.ResolveEnv; import org.cardanofoundation.signify.e2e.utils.TestUtils; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -116,7 +116,7 @@ void testMultisigVleiIssuance() throws Exception { .wits(env.witnessIds()) .build(); - List habStates = createAidAndGetHabStateAsync( + List habStates = createAidAndGetHabStateAsync( new CreateAidArgs(clientGAR1, "GAR1", kargsAID), new CreateAidArgs(clientGAR2, "GAR2", kargsAID), new CreateAidArgs(clientQAR1, "QAR1", kargsAID), @@ -127,15 +127,15 @@ void testMultisigVleiIssuance() throws Exception { new CreateAidArgs(clientLAR3, "LAR3", kargsAID), new CreateAidArgs(clientECR, "ECR", kargsAID) ); - States.HabState aidGAR1 = habStates.get(0); - States.HabState aidGAR2 = habStates.get(1); - States.HabState aidQAR1 = habStates.get(2); - States.HabState aidQAR2 = habStates.get(3); - States.HabState aidQAR3 = habStates.get(4); - States.HabState aidLAR1 = habStates.get(5); - States.HabState aidLAR2 = habStates.get(6); - States.HabState aidLAR3 = habStates.get(7); - States.HabState aidECR = habStates.get(8); + Identifier aidGAR1 = habStates.get(0); + Identifier aidGAR2 = habStates.get(1); + Identifier aidQAR1 = habStates.get(2); + Identifier aidQAR2 = habStates.get(3); + Identifier aidQAR3 = habStates.get(4); + Identifier aidLAR1 = habStates.get(5); + Identifier aidLAR2 = habStates.get(6); + Identifier aidLAR3 = habStates.get(7); + Identifier aidECR = habStates.get(8); List oobisLst = getOobisAsync( new GetOobisArgs(clientGAR1, "GAR1", "agent"), @@ -203,7 +203,7 @@ void testMultisigVleiIssuance() throws Exception { // Create a multisig AID for the GEDA. // Skip if a GEDA AID has already been incepted. - States.HabState aidGEDAbyGAR1, aidGEDAbyGAR2; + Identifier aidGEDAbyGAR1, aidGEDAbyGAR2; try { aidGEDAbyGAR1 = clientGAR1.identifiers().get("GEDA").get(); aidGEDAbyGAR2 = clientGAR2.identifiers().get("GEDA").get(); @@ -255,7 +255,7 @@ void testMultisigVleiIssuance() throws Exception { assertEquals(aidGEDAbyGAR1.getPrefix(), aidGEDAbyGAR2.getPrefix()); assertEquals(aidGEDAbyGAR1.getName(), aidGEDAbyGAR2.getName()); - States.HabState aidGEDA = aidGEDAbyGAR1; + Identifier aidGEDA = aidGEDAbyGAR1; // Add endpoint role authorization for all GARs' agents. // Skip if they have already been authorized. @@ -312,7 +312,7 @@ void testMultisigVleiIssuance() throws Exception { // Create a multisig AID for the QVI. // Skip if a QVI AID has already been incepted. - States.HabState aidQVIbyQAR1, aidQVIbyQAR2, aidQVIbyQAR3; + Identifier aidQVIbyQAR1, aidQVIbyQAR2, aidQVIbyQAR3; try { aidQVIbyQAR1 = clientQAR1.identifiers().get("QVI").get(); aidQVIbyQAR2 = clientQAR2.identifiers().get("QVI").get(); @@ -423,7 +423,7 @@ void testMultisigVleiIssuance() throws Exception { assertEquals(aidQVIbyQAR1.getName(), aidQVIbyQAR2.getName()); assertEquals(aidQVIbyQAR1.getName(), aidQVIbyQAR3.getName()); - States.HabState aidQVI = aidQVIbyQAR1; + Identifier aidQVI = aidQVIbyQAR1; // Add endpoint role authorization for all QARs' agents. // Skip if they have already been authorized. @@ -712,7 +712,7 @@ void testMultisigVleiIssuance() throws Exception { // Create a multisig AID for the LE. // Skip if a LE AID has already been incepted. - States.HabState aidLEbyLAR1, aidLEbyLAR2, aidLEbyLAR3; + Identifier aidLEbyLAR1, aidLEbyLAR2, aidLEbyLAR3; try { aidLEbyLAR1 = clientLAR1.identifiers().get("LE").get(); aidLEbyLAR2 = clientLAR2.identifiers().get("LE").get(); @@ -779,7 +779,7 @@ void testMultisigVleiIssuance() throws Exception { assertEquals(aidLEbyLAR1.getName(), aidLEbyLAR2.getName()); assertEquals(aidLEbyLAR1.getName(), aidLEbyLAR3.getName()); - States.HabState aidLE = aidLEbyLAR1; + Identifier aidLE = aidLEbyLAR1; // Add endpoint role authorization for all LARs' agents. // Skip if they have already been authorized. oobiLst = getOobisAsync( diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java b/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java index 325f1c73..f5f2a850 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java @@ -13,7 +13,9 @@ import org.cardanofoundation.signify.core.Manager; import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.cardanofoundation.signify.generated.keria.model.SaltyState; +import org.cardanofoundation.signify.generated.keria.model.StateEERecord; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -165,14 +167,14 @@ void saltyTest() throws Exception { Assertions.assertEquals(List.of(icp.getPre()), ixn.getKed().get("a")); // Get Identifiers - States.HabState aidState = client.identifiers().get("aid1").get(); - States.State stateGet = aidState.getState(); + Identifier aidState = client.identifiers().get("aid1").get(); + KeyStateRecord stateGet = aidState.getState(); Assertions.assertEquals("2", stateGet.getS()); Assertions.assertEquals("2", stateGet.getF()); Assertions.assertEquals(ixn.getKed().get("d"), stateGet.getD()); - States.EstablishmentState ee = stateGet.getEe(); + StateEERecord ee = stateGet.getEe(); Assertions.assertEquals(rotRotate.getKed().get("d"), ee.getD()); // KeyEvents @@ -196,10 +198,10 @@ void saltyTest() throws Exception { IdentifierInfo identifierInfo = new IdentifierInfo(); identifierInfo.setName("aid4"); - States.HabState updatedState = client.identifiers().update("aid3", identifierInfo); + Identifier updatedState = client.identifiers().update("aid3", identifierInfo); assertEquals("aid4", updatedState.getName()); - States.HabState retrievedState = client.identifiers().get("aid4").get(); + Identifier retrievedState = client.identifiers().get("aid4").get(); assertEquals("aid4", retrievedState.getName()); IdentifierListResponse response = client.identifiers().list(2, 2); List identifiers = response.aids(); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java index 0c8d5a52..e44d6b32 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java @@ -8,6 +8,7 @@ import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.ResolveEnv; import org.cardanofoundation.signify.e2e.utils.TestUtils; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.*; @@ -51,7 +52,7 @@ public void singlesig_dip() throws Exception { kargs.setDelpre(name1_id); EventResult result = client2.identifiers().create("delegate1", kargs); Operation op = Operation.fromObject(result.op()); - States.HabState delegate1 = client2.identifiers().get("delegate1").get(); + Identifier delegate1 = client2.identifiers().get("delegate1").get(); opResponseName = op.getName(); Assertions.assertEquals(opResponseName, "delegation." + delegate1.getPrefix()); @@ -89,7 +90,7 @@ public void singlesig_dip() throws Exception { op = Operation.fromObject(result.op()); opResponseName = op.getName(); - States.HabState delegate2 = client2.identifiers().get("delegate2").get(); + Identifier delegate2 = client2.identifiers().get("delegate2").get(); Assertions.assertEquals(opResponseName, "delegation." + delegate2.getPrefix()); // Delegator approves delegate diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java index e88cde7e..95c466c7 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java @@ -8,6 +8,7 @@ import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.TestUtils; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -54,7 +55,7 @@ public void singlesig_drt() throws Exception { EventResult result = delegate.identifiers().create("delegate1", kargs); Operation op = Operation.fromObject(result.op()); - States.HabState delegate1 = delegate.identifiers().get("delegate1").get(); + Identifier delegate1 = delegate.identifiers().get("delegate1").get(); opResponseName = op.getName(); Assertions.assertEquals(opResponseName, "delegation." + delegate1.getPrefix()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java b/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java index dcf7e80c..2436693a 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java @@ -7,6 +7,7 @@ import org.cardanofoundation.signify.app.aiding.RotateIdentifierArgs; import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.core.States; +import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -54,7 +55,7 @@ public void testWitness() throws Exception { EventResult icpResult1 = client1.identifiers().create("aid1", kargs); waitOperation(client1, icpResult1.op()); - States.HabState aid1 = client1.identifiers().get("aid1").get(); + Identifier aid1 = client1.identifiers().get("aid1").get(); System.out.println("AID1: " + aid1.getPrefix()); assertEquals(1, aid1.getState().getB().size()); assertEquals(WITNESS_AID, aid1.getState().getB().getFirst()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java b/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java index 571dbcce..2f3c3164 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java @@ -30,11 +30,13 @@ import java.util.*; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; +import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; public class MultisigUtils { public static Object acceptMultisigIncept(SignifyClient client2, AcceptMultisigInceptArgs args) throws IOException, InterruptedException, DigestException, LibsodiumException, ExecutionException { - final States.HabState memberHab = client2.identifiers().get(args.getLocalMemberName()) + final Identifier memberHab = client2.identifiers().get(args.getLocalMemberName()) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + args.getLocalMemberName())); List res = (List) client2.groups().getRequest(args.getMsgSaid()).get(); @@ -83,8 +85,8 @@ public static Object acceptMultisigIncept(SignifyClient client2, AcceptMultisigI return op2; } - public static Object interactMultisig(SignifyClient client, String groupName, States.HabState aid, - List otherMemberAIDs, + public static Object interactMultisig(SignifyClient client, String groupName, Identifier aid, + List otherMemberAIDs, Object data, List states, boolean isInitiator) throws Exception { @@ -109,12 +111,12 @@ public static Object interactMultisig(SignifyClient client, String groupName, St List smids = states.stream().map(state -> { if (state instanceof Map stateMap) { return stateMap.get("i").toString(); - } else if (state instanceof States.State stateHab) { + } else if (state instanceof KeyStateRecord stateHab) { return stateHab.getI(); } return null; }).toList(); - List recp = otherMemberAIDs.stream().map(States.HabState::getPrefix).toList(); + List recp = otherMemberAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>() {{ put("gid", serder.getPre()); @@ -135,8 +137,8 @@ public static Object interactMultisig(SignifyClient client, String groupName, St return interactResult.op(); } - public static Object rotateMultisig(SignifyClient client, String groupName, States.HabState aid, - List otherMemberAIDs, + public static Object rotateMultisig(SignifyClient client, String groupName, Identifier aid, + List otherMemberAIDs, RotateIdentifierArgs kargs, String route, boolean isInitiator) throws Exception { @@ -161,12 +163,12 @@ public static Object rotateMultisig(SignifyClient client, String groupName, Stat List smids = kargs.getStates().stream().map(state -> { if (state instanceof Map stateMap) { return stateMap.get("i").toString(); - } else if (state instanceof States.State stateHab) { + } else if (state instanceof KeyStateRecord stateHab) { return stateHab.getI(); } return null; }).toList(); - List recp = otherMemberAIDs.stream().map(States.HabState::getPrefix).toList(); + List recp = otherMemberAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>() {{ put("gid", serder.getPre()); @@ -187,8 +189,8 @@ public static Object rotateMultisig(SignifyClient client, String groupName, Stat return interactResult.op(); } - public static List addEndRoleMultisig(SignifyClient client, String groupName, States.HabState aid, - List otherMemberAIDs, States.HabState multisigAID, + public static List addEndRoleMultisig(SignifyClient client, String groupName, Identifier aid, + List otherMemberAIDs, Identifier multisigAID, String timestamp, boolean isInitiator) throws Exception { if (!isInitiator) { @@ -213,7 +215,7 @@ public static List addEndRoleMultisig(SignifyClient client, String group Serder rpy = endRoleResult.serder(); List sigs = endRoleResult.sigs(); - States.State ghapState1 = multisigAID.getState(); + KeyStateRecord ghapState1 = multisigAID.getState(); Map seal2 = new LinkedHashMap<>(); seal2.put("i", multisigAID.getPrefix()); @@ -227,7 +229,7 @@ public static List addEndRoleMultisig(SignifyClient client, String group Map> roleEmbeds = new LinkedHashMap<>(); roleEmbeds.put("rpy", List.of(rpy, atc)); - List recp = otherMemberAIDs.stream().map(States.HabState::getPrefix).toList(); + List recp = otherMemberAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>(); payload.put("gid", multisigAID.getPrefix()); @@ -246,8 +248,8 @@ public static List addEndRoleMultisig(SignifyClient client, String group return opList; } - public static List addEndRoleMultisigs(SignifyClient client, String groupName, States.HabState aid, - List otherMemberAIDs, States.HabState multisigAID, + public static List addEndRoleMultisigs(SignifyClient client, String groupName, Identifier aid, + List otherMemberAIDs, Identifier multisigAID, String timestamp, boolean isInitiator) throws Exception { if (!isInitiator) { @@ -271,7 +273,7 @@ public static List addEndRoleMultisigs(SignifyClient client, String grou Serder rpy = endRoleResult.serder(); List sigs = endRoleResult.sigs(); - States.State ghapState1 = multisigAID.getState(); + KeyStateRecord ghapState1 = multisigAID.getState(); Map seal2 = new LinkedHashMap<>(); seal2.put("i", multisigAID.getPrefix()); @@ -285,7 +287,7 @@ public static List addEndRoleMultisigs(SignifyClient client, String grou Map> roleEmbeds = new LinkedHashMap<>(); roleEmbeds.put("rpy", List.of(rpy, atc)); - List recp = otherMemberAIDs.stream().map(States.HabState::getPrefix).toList(); + List recp = otherMemberAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>(); payload.put("gid", multisigAID.getPrefix()); @@ -304,10 +306,10 @@ public static List addEndRoleMultisigs(SignifyClient client, String grou public static void admitMultisig( SignifyClient client, - States.HabState aid, - List otherMemberAIDs, - States.HabState multisigAID, - States.HabState recipientAID, + Identifier aid, + List otherMemberAIDs, + Identifier multisigAID, + Identifier recipientAID, String timestamp ) throws Exception { String grantMsgSaid = TestUtils.waitAndMarkNotification(client, "/exn/ipex/grant"); @@ -334,7 +336,7 @@ public static void admitMultisig( List.of(recipientAID.getPrefix()) ); - States.State mstate = multisigAID.getState(); + KeyStateRecord mstate = multisigAID.getState(); Map sealMap = new LinkedHashMap<>(); sealMap.put("i", multisigAID.getPrefix()); @@ -349,7 +351,7 @@ public static void admitMultisig( Map> gembeds = new LinkedHashMap<>(); gembeds.put("exn", List.of(admit, atc)); - List recp = otherMemberAIDs.stream().map(States.HabState::getPrefix).toList(); + List recp = otherMemberAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>(); payload.put("gid", multisigAID.getPrefix()); @@ -366,8 +368,8 @@ public static void admitMultisig( public static Object createAIDMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, + Identifier aid, + List otherMembersAIDs, String groupName, CreateIdentifierArgs kargs, boolean isInitiator) throws Exception { @@ -390,12 +392,12 @@ public static Object createAIDMultisig( List smids = kargs.getStates().stream().map(state -> { if (state instanceof Map stateMap) { return stateMap.get("i").toString(); - } else if (state instanceof States.State stateHab) { + } else if (state instanceof KeyStateRecord stateHab) { return stateHab.getI(); } return null; }).toList(); - List recp = otherMembersAIDs.stream().map(States.HabState::getPrefix).toList(); + List recp = otherMembersAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>() {{ put("gid", serder.getPre()); @@ -418,9 +420,9 @@ public static Object createAIDMultisig( public static Object createRegistryMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, - States.HabState multisigAID, + Identifier aid, + List otherMembersAIDs, + Identifier multisigAID, String registryName, String nonce, String topic, @@ -453,7 +455,7 @@ public static Object createRegistryMultisig( }}; List recp = otherMembersAIDs.stream() - .map(States.HabState::getPrefix) + .map(Identifier::getPrefix) .toList(); client.exchanges().send( @@ -471,9 +473,9 @@ public static Object createRegistryMultisig( public static Object createRegistryMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, - States.HabState multisigAID, + Identifier aid, + List otherMembersAIDs, + Identifier multisigAID, String registryName, String nonce, boolean isInitiator) throws Exception { @@ -483,9 +485,9 @@ public static Object createRegistryMultisig( public static Object createMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, - States.HabState multisigAID, + Identifier aid, + List otherMembersAIDs, + Identifier multisigAID, String registryName, String nonce, boolean isInitiator) throws Exception { @@ -517,7 +519,7 @@ public static Object createMultisig( }}; List recp = otherMembersAIDs.stream() - .map(States.HabState::getPrefix) + .map(Identifier::getPrefix) .toList(); client.exchanges().send( @@ -536,9 +538,9 @@ public static Object createMultisig( public static Object delegateMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, - States.HabState multisigAID, + Identifier aid, + List otherMembersAIDs, + Identifier multisigAID, Map anchor, boolean isInitiator) throws Exception { @@ -566,9 +568,9 @@ public static Object delegateMultisig( Map> xembeds = Map.of("ixn", List.of(serder, atc)); List smids = new ArrayList<>(); smids.add(aid.getPrefix()); - smids.addAll(otherMembersAIDs.stream().map(States.HabState::getPrefix).toList()); + smids.addAll(otherMembersAIDs.stream().map(Identifier::getPrefix).toList()); - List recp = otherMembersAIDs.stream().map(States.HabState::getPrefix).toList(); + List recp = otherMembersAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>() {{ put("gid", serder.getPre()); @@ -596,10 +598,10 @@ public static Object delegateMultisig( public static void grantMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, - States.HabState multisigAID, - States.HabState recipientAID, + Identifier aid, + List otherMembersAIDs, + Identifier multisigAID, + Identifier recipientAID, Object credential, String timestamp, boolean isInitiator) throws Exception { @@ -635,7 +637,7 @@ public static void grantMultisig( List.of(recipientAID.getPrefix()) ); - States.State mstate = multisigAID.getState(); + KeyStateRecord mstate = multisigAID.getState(); Map sealMap = new LinkedHashMap<>() {{ put("i", multisigAID.getPrefix()); put("s", mstate.getEe().getS()); @@ -649,7 +651,7 @@ public static void grantMultisig( String atc = gims.substring(grant.getSize()) + end; Map> gembeds = Map.of("exn", List.of(grant, atc)); - List recp = otherMembersAIDs.stream().map(States.HabState::getPrefix).collect(Collectors.toList()); + List recp = otherMembersAIDs.stream().map(Identifier::getPrefix).collect(Collectors.toList()); client.exchanges().send( aid.getName(), @@ -664,8 +666,8 @@ public static void grantMultisig( public static Object issueCredentialMultisig( SignifyClient client, - States.HabState aid, - List otherMembersAIDs, + Identifier aid, + List otherMembersAIDs, String multisigAIDName, CredentialData kargsIss, boolean isInitiator) throws Exception { @@ -677,7 +679,7 @@ public static Object issueCredentialMultisig( IssueCredentialResult credResult = client.credentials().issue(multisigAIDName, kargsIss); Operation op = credResult.getOp(); - States.HabState multisigAID = client.identifiers().get(multisigAIDName) + Identifier multisigAID = client.identifiers().get(multisigAIDName) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + multisigAIDName)); Keeping.Keeper keeper = client.getManager().get(multisigAID); List sigs = keeper.sign(credResult.getAnc().getRaw().getBytes()).signatures(); @@ -693,7 +695,7 @@ public static Object issueCredentialMultisig( List recp = otherMembersAIDs.stream() - .map(States.HabState::getPrefix) + .map(Identifier::getPrefix) .collect(Collectors.toList()); client.exchanges().send( @@ -713,7 +715,7 @@ public static Object startMultisigIncept( SignifyClient client, StartMultisigInceptArgs args ) throws IOException, InterruptedException, DigestException, LibsodiumException, ExecutionException { - States.HabState aid1 = client.identifiers().get(args.getLocalMemberName()) + Identifier aid1 = client.identifiers().get(args.getLocalMemberName()) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + args.getLocalMemberName())); List participantStates = TestUtils.getStates(client, args.getParticipants()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java index 4f0c5a0e..edf58d64 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java @@ -83,7 +83,7 @@ public static void sleep(long ms) { } } - public static void admitSinglesig(SignifyClient client, String aidName, States.HabState recipientAid) { + public static void admitSinglesig(SignifyClient client, String aidName, Identifier recipientAid) { // TO-DO } @@ -112,7 +112,7 @@ public static Aid createAid(SignifyClient client, String name) throws Exception return new Aid(name, prefix, oobi); } - public static States.HabState createAidAndGetHabState(SignifyClient client, String name) throws Exception { + public static Identifier createAidAndGetHabState(SignifyClient client, String name) throws Exception { getOrCreateIdentifier(client, name, null); return client.identifiers().get(name) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + name)); @@ -138,8 +138,8 @@ public static List> getEndRoles(SignifyClient client, String public static Object getIssuedCredential( SignifyClient issuerClient, - States.HabState issuerAid, - States.HabState recipientAid, + Identifier issuerAid, + Identifier recipientAid, String schemaSAID ) throws IOException, InterruptedException, LibsodiumException { Map filter = new LinkedHashMap<>() {{ @@ -155,15 +155,15 @@ public static Object getIssuedCredential( return credentialList.isEmpty() ? null : credentialList.getFirst(); } - public static States.HabState getOrCreateAID(SignifyClient client, String name, CreateIdentifierArgs kargs) throws InterruptedException, IOException, DigestException, LibsodiumException { - Optional existingAID = client.identifiers().get(name); + public static Identifier getOrCreateAID(SignifyClient client, String name, CreateIdentifierArgs kargs) throws InterruptedException, IOException, DigestException, LibsodiumException { + Optional existingAID = client.identifiers().get(name); if (existingAID.isPresent()) { return existingAID.get(); } else { EventResult result = client.identifiers().create(name, kargs); waitOperation(client, result.op()); - States.HabState aid = client.identifiers().get(name) + Identifier aid = client.identifiers().get(name) .orElseThrow(() -> new IllegalArgumentException("Failed to create identifier: " + name)); if (client.getAgent() == null || client.getAgent().getPre() == null) { @@ -241,7 +241,7 @@ public static String[] getOrCreateIdentifier(SignifyClient client, String name, String eid; Object op, ops; - Optional optionalIdentifier = client.identifiers().get(name); + Optional optionalIdentifier = client.identifiers().get(name); if (optionalIdentifier.isPresent()) { id = optionalIdentifier.get().getPrefix(); From 68dd69667ebe2dc1e187773c2a23fc598d83b0fc Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Thu, 4 Dec 2025 18:10:24 +0700 Subject: [PATCH 13/24] refactor: replace States with Tier in multiple classes for improved consistency and clarity --- .../signify/app/Contacting.java | 1 - .../signify/app/Exchanging.java | 1 - .../app/aiding/CreateIdentifierArgs.java | 3 +- .../app/aiding/IdentifierController.java | 10 +- .../app/aiding/RotateIdentifierArgs.java | 1 - .../signify/app/clienting/SignifyClient.java | 7 +- .../signify/app/controlller/Controller.java | 6 +- .../signify/app/coring/Coring.java | 3 +- .../credentials/Credentials.java | 1 - .../signify/app/credentialing/ipex/Ipex.java | 1 - .../credentialing/registries/Registries.java | 1 - .../signify/cesr/Keeping.java | 11 +- .../signify/cesr/Salter.java | 32 +--- .../signify/cesr/params/GroupParams.java | 1 - .../signify/cesr/params/SaltyParams.java | 2 +- .../signify/core/Manager.java | 33 ++-- .../signify/core/States.java | 163 ------------------ .../signify/app/BaseMockServerTest.java | 3 +- .../signify/app/ChallengesTest.java | 3 +- .../signify/app/ClientingTest.java | 14 +- .../signify/app/ControllerTest.java | 9 +- .../signify/app/CoringTest.java | 5 +- .../signify/app/CredentialingTest.java | 5 +- .../signify/app/DelegatingTest.java | 3 +- .../signify/app/EscrowingTest.java | 3 +- .../signify/app/ExchangingTest.java | 14 +- .../signify/app/GroupingTest.java | 3 +- .../signify/app/IpexTest.java | 7 +- .../signify/app/NotifyingTest.java | 3 +- .../signify/app/OobisTest.java | 3 +- .../signify/app/RegistryTest.java | 1 - .../signify/cesr/SalterTest.java | 14 +- .../signify/cesr/SerderTest.java | 6 +- .../signify/core/ManagerTest.java | 17 +- .../signify/e2e/BaseIntegrationTest.java | 1 - .../signify/e2e/ChallengesTest.java | 5 +- .../signify/e2e/DelegationTest.java | 5 +- .../signify/e2e/MultisigJoinTest.java | 1 - .../signify/e2e/MultisigTest.java | 1 - .../signify/e2e/RandyTest.java | 3 +- .../signify/e2e/SaltyTests.java | 5 +- .../signify/e2e/SinglesigDIPTest.java | 1 - .../signify/e2e/SinglesigDRTTest.java | 1 - .../signify/e2e/WitnessTest.java | 4 +- .../signify/e2e/utils/MultisigUtils.java | 1 - .../signify/e2e/utils/TestUtils.java | 4 +- .../signify/end/SignageTest.java | 3 +- 47 files changed, 124 insertions(+), 301 deletions(-) delete mode 100644 src/main/java/org/cardanofoundation/signify/core/States.java diff --git a/src/main/java/org/cardanofoundation/signify/app/Contacting.java b/src/main/java/org/cardanofoundation/signify/app/Contacting.java index e9cac3b7..4c627678 100644 --- a/src/main/java/org/cardanofoundation/signify/app/Contacting.java +++ b/src/main/java/org/cardanofoundation/signify/app/Contacting.java @@ -4,7 +4,6 @@ import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.cesr.util.Utils; -import org.cardanofoundation.signify.core.States; import java.io.IOException; import java.net.HttpURLConnection; diff --git a/src/main/java/org/cardanofoundation/signify/app/Exchanging.java b/src/main/java/org/cardanofoundation/signify/app/Exchanging.java index 5f4ffdc2..040345ac 100644 --- a/src/main/java/org/cardanofoundation/signify/app/Exchanging.java +++ b/src/main/java/org/cardanofoundation/signify/app/Exchanging.java @@ -11,7 +11,6 @@ import org.cardanofoundation.signify.cesr.params.KeeperParams; import org.cardanofoundation.signify.cesr.util.CoreUtil; import org.cardanofoundation.signify.cesr.util.Utils; -import org.cardanofoundation.signify.core.States.HabState; import java.io.IOException; import java.net.HttpURLConnection; diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java b/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java index ac2e0d8c..c9205ac9 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java @@ -3,10 +3,9 @@ import java.util.List; import lombok.*; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.core.Manager.Algos; -import org.cardanofoundation.signify.core.States.HabState; import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.Tier; @Getter @Setter diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java index 1d3b4b2f..514d0143 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java @@ -16,9 +16,7 @@ import org.cardanofoundation.signify.cesr.util.CoreUtil.Serials; import org.cardanofoundation.signify.core.Eventing; import org.cardanofoundation.signify.core.Httping; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.core.Manager.Algos; -import org.cardanofoundation.signify.app.config.GeneratedModelMapper; import java.io.IOException; import java.math.BigInteger; @@ -251,13 +249,13 @@ public EventResult create(String name, CreateIdentifierArgs kargs) throws Interr List rmids = null; if (states != null) { - List stateDeserialized = Utils.fromJson(Utils.jsonStringify(states), new TypeReference<>() {}); - smids = stateDeserialized.stream().map(States.State::getI).toList(); + List stateDeserialized = Utils.fromJson(Utils.jsonStringify(states), new TypeReference<>() {}); + smids = stateDeserialized.stream().map(KeyStateRecord::getI).toList(); } if (rstates != null) { - List rstateDeserialized = Utils.fromJson(Utils.jsonStringify(rstates), new TypeReference<>() {}); - rmids = rstateDeserialized.stream().map(States.State::getI).toList(); + List rstateDeserialized = Utils.fromJson(Utils.jsonStringify(rstates), new TypeReference<>() {}); + rmids = rstateDeserialized.stream().map(KeyStateRecord::getI).toList(); } Map jsondata = IdentifierPayloadMapper.buildCreatePayload( diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java b/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java index 90d75646..b1ce42e3 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/RotateIdentifierArgs.java @@ -3,7 +3,6 @@ import lombok.Builder; import lombok.Getter; import lombok.Setter; -import org.cardanofoundation.signify.core.States; import java.util.List; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; diff --git a/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java b/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java index 87d08816..ad27c45e 100644 --- a/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java +++ b/src/main/java/org/cardanofoundation/signify/app/clienting/SignifyClient.java @@ -45,6 +45,7 @@ import java.net.http.HttpResponse; import java.security.DigestException; import java.util.*; +import org.cardanofoundation.signify.generated.keria.model.Tier; @Getter @Setter @@ -57,7 +58,7 @@ public class SignifyClient implements IdentifierDeps, OperationsDeps { private Agent agent; private Authenticater authn; private Keeping.KeyManager manager; - private Salter.Tier tier; + private Tier tier; private String bootUrl; private List externalModules; @@ -93,11 +94,11 @@ public class SignifyClient implements IdentifierDeps, OperationsDeps { public SignifyClient( String url, String bran, - Salter.Tier tier, + Tier tier, String bootUrl, List externalModules ) throws DigestException, LibsodiumException { - tier = tier != null ? tier : Salter.Tier.low; + tier = tier != null ? tier : Tier.LOW; this.url = url; if (bran.length() < 21) { throw new InvalidValueException("bran must be 21 characters"); diff --git a/src/main/java/org/cardanofoundation/signify/app/controlller/Controller.java b/src/main/java/org/cardanofoundation/signify/app/controlller/Controller.java index e8d9f9c1..e51e9648 100644 --- a/src/main/java/org/cardanofoundation/signify/app/controlller/Controller.java +++ b/src/main/java/org/cardanofoundation/signify/app/controlller/Controller.java @@ -4,7 +4,6 @@ import lombok.Setter; import org.cardanofoundation.signify.app.clienting.State; import org.cardanofoundation.signify.cesr.*; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.cesr.Codex.MatterCodex; import org.cardanofoundation.signify.cesr.args.InceptArgs; import org.cardanofoundation.signify.cesr.args.InteractArgs; @@ -17,12 +16,13 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; import org.cardanofoundation.signify.core.Manager; -import org.cardanofoundation.signify.core.States; import java.math.BigInteger; import java.security.DigestException; import java.util.*; import java.util.stream.Collectors; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; +import org.cardanofoundation.signify.generated.keria.model.Tier; /** * Controller is responsible for managing signing keys for the client and agent. The client @@ -158,7 +158,7 @@ public Verfer[] getVerfers() { } public Serder derive(Object state) throws DigestException { - if (state != null && ((States.State) state).getEe().getS().equals("0")) { + if (state != null && ((KeyStateRecord) state).getEe().getS().equals("0")) { return Eventing.incept(InceptArgs.builder() .keys(this.keys) .isith("1") diff --git a/src/main/java/org/cardanofoundation/signify/app/coring/Coring.java b/src/main/java/org/cardanofoundation/signify/app/coring/Coring.java index 65383d86..0ee8fd48 100644 --- a/src/main/java/org/cardanofoundation/signify/app/coring/Coring.java +++ b/src/main/java/org/cardanofoundation/signify/app/coring/Coring.java @@ -11,6 +11,7 @@ import org.cardanofoundation.signify.cesr.util.Utils; import java.net.http.HttpResponse; +import org.cardanofoundation.signify.generated.keria.model.Tier; public class Coring { public static String randomPasscode() { @@ -20,7 +21,7 @@ public static String randomPasscode() { .raw(raw) .code(Codex.MatterCodex.Salt_128.getValue()) .build(); - final Salter salter = new Salter(args, Salter.Tier.low); + final Salter salter = new Salter(args, Tier.LOW); // https://github.com/WebOfTrust/signify-ts/issues/242 return salter.getQb64().substring(2, 23); diff --git a/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java b/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java index c0065aa8..c53c120f 100644 --- a/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java +++ b/src/main/java/org/cardanofoundation/signify/app/credentialing/credentials/Credentials.java @@ -11,7 +11,6 @@ import org.cardanofoundation.signify.cesr.util.CoreUtil; import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; -import org.cardanofoundation.signify.core.States; import java.io.IOException; import java.math.BigInteger; diff --git a/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java b/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java index a43306a6..4fd504f1 100644 --- a/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java +++ b/src/main/java/org/cardanofoundation/signify/app/credentialing/ipex/Ipex.java @@ -7,7 +7,6 @@ import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; -import org.cardanofoundation.signify.core.States.HabState; import org.cardanofoundation.signify.cesr.Siger; import java.io.IOException; diff --git a/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java b/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java index 2a363183..7201215b 100644 --- a/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java +++ b/src/main/java/org/cardanofoundation/signify/app/credentialing/registries/Registries.java @@ -10,7 +10,6 @@ import org.cardanofoundation.signify.cesr.util.CoreUtil; import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.core.Vdring; import java.io.IOException; diff --git a/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java b/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java index 9619f91a..2b4a9154 100644 --- a/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java +++ b/src/main/java/org/cardanofoundation/signify/cesr/Keeping.java @@ -15,8 +15,6 @@ import org.cardanofoundation.signify.core.Manager.RandyCreator; import org.cardanofoundation.signify.core.Manager.SaltyCreator; import org.cardanofoundation.signify.core.Manager.Algos; -import org.cardanofoundation.signify.core.States.State; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.cesr.Codex.MatterCodex; import java.security.DigestException; @@ -28,6 +26,7 @@ import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.cardanofoundation.signify.generated.keria.model.RandyKeyState; import org.cardanofoundation.signify.generated.keria.model.SaltyState; +import org.cardanofoundation.signify.generated.keria.model.Tier; public class Keeping { // External module interface @@ -141,7 +140,7 @@ public Keeper get(Identifier aid) throws LibsodiumExcept salter, saltyState.getPidx(), saltyState.getKidx(), - Tier.fromString(saltyState.getTier().getValue()), // TODO convert TIER + saltyState.getTier(), saltyState.getTransferable(), saltyState.getStem(), null, @@ -228,7 +227,7 @@ public SaltyKeeper( this.salter = salter; this.pidx = pidx; this.kidx = kidx != null ? kidx : 0; - this.tier = tier != null ? tier : Tier.low; + this.tier = tier != null ? tier : Tier.LOW; this.transferable = transferable; this.code = code != null ? code : MatterCodex.Ed25519_Seed.getValue(); this.count = count != null ? count : 1; @@ -674,8 +673,8 @@ public static class GroupKeeper implements Keeper { public GroupKeeper( KeyManager manager, Identifier mhab, - List states, - List rstates, + List states, + List rstates, List keys, List ndigs ) { diff --git a/src/main/java/org/cardanofoundation/signify/cesr/Salter.java b/src/main/java/org/cardanofoundation/signify/cesr/Salter.java index 6b5a9ace..4f65d44e 100644 --- a/src/main/java/org/cardanofoundation/signify/cesr/Salter.java +++ b/src/main/java/org/cardanofoundation/signify/cesr/Salter.java @@ -6,6 +6,7 @@ import com.goterl.lazysodium.interfaces.PwHash.Alg; import lombok.Getter; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; +import org.cardanofoundation.signify.generated.keria.model.Tier; public class Salter extends Matter { @Getter @@ -17,46 +18,31 @@ public Salter() { this(RawArgs.builder() .code(Codex.MatterCodex.Salt_128.getValue()) .build(), - Tier.low); + Tier.LOW); } public Salter(RawArgs args) { - this(args, Tier.low); + this(args, Tier.LOW); } public Salter(String qb64) { - this(qb64, Tier.low); + this(qb64, Tier.LOW); } public Salter(RawArgs args, Tier tier) { super(RawArgs.generateSalt128Raw(args)); - this.tier = tier == null ? Tier.low : tier; + this.tier = tier == null ? Tier.LOW : tier; } public Salter(String qb64, Tier tier) { super(qb64); - this.tier = tier == null ? Tier.low : tier; + this.tier = tier == null ? Tier.LOW : tier; } public Salter(byte[] qb64b) { super(qb64b); } - public enum Tier { - low, - med, - high; - - public static Tier fromString(String tier) { - return switch (tier) { - case "low" -> Tier.low; - case "med" -> Tier.med; - case "high" -> Tier.high; - default -> null; - }; - } - } - public byte[] stretch() throws LibsodiumException { return stretch(32); } @@ -83,15 +69,15 @@ public byte[] stretch(int size, String path, Tier tier, boolean temp) throws Lib memlimit = 8192; //libsodium.crypto_pwhash_MEMLIMIT_MIN } else { memlimit = switch (tier) { - case Tier.low -> { + case Tier.LOW -> { opslimit = 2; // libsodium.crypto_pwhash_OPSLIMIT_INTERACTIVE yield 67108864; } - case Tier.med -> { + case Tier.MED -> { opslimit = 3; // libsodium.crypto_pwhash_OPSLIMIT_MODERATE yield 268435456; } - case Tier.high -> { + case Tier.HIGH -> { opslimit = 4; // libsodium.crypto_pwhash_OPSLIMIT_SENSITIVE yield 1073741824; } diff --git a/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java b/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java index 7c8c888a..9c293e5a 100644 --- a/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java +++ b/src/main/java/org/cardanofoundation/signify/cesr/params/GroupParams.java @@ -3,7 +3,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.SuperBuilder; -import org.cardanofoundation.signify.core.States.HabState; import org.cardanofoundation.signify.generated.keria.model.Identifier; @Getter diff --git a/src/main/java/org/cardanofoundation/signify/cesr/params/SaltyParams.java b/src/main/java/org/cardanofoundation/signify/cesr/params/SaltyParams.java index cf4c3860..e9340a9e 100644 --- a/src/main/java/org/cardanofoundation/signify/cesr/params/SaltyParams.java +++ b/src/main/java/org/cardanofoundation/signify/cesr/params/SaltyParams.java @@ -3,8 +3,8 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.SuperBuilder; -import org.cardanofoundation.signify.cesr.Salter.Tier; import java.util.List; +import org.cardanofoundation.signify.generated.keria.model.Tier; @Getter @Setter diff --git a/src/main/java/org/cardanofoundation/signify/core/Manager.java b/src/main/java/org/cardanofoundation/signify/core/Manager.java index b64c5ce1..beaab72b 100644 --- a/src/main/java/org/cardanofoundation/signify/core/Manager.java +++ b/src/main/java/org/cardanofoundation/signify/core/Manager.java @@ -8,10 +8,10 @@ import lombok.Setter; import org.cardanofoundation.signify.cesr.*; import org.cardanofoundation.signify.cesr.Codex.MatterCodex; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.cesr.args.RawArgs; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.cesr.exceptions.material.InvalidSizeException; +import org.cardanofoundation.signify.generated.keria.model.Tier; @Getter public class Manager { @@ -33,7 +33,7 @@ public Manager(ManagerArgs args) throws LibsodiumException { args.algo = args.algo == null ? Algos.salty : args.algo; String salt = args.salter != null ? args.salter.getQb64() : null; - args.tier = args.tier == null ? Tier.low.name() : args.tier; + args.tier = args.tier == null ? Tier.LOW : args.tier; if (this.getPidx() == null) { this.setPidx(args.pidx); @@ -123,12 +123,13 @@ public void setSalt(String salt) throws LibsodiumException { } } - public String getTier() { - return this.ks.getGbls("tier"); + public Tier getTier() { + String tier = this.ks.getGbls("tier"); + return Tier.fromValue(tier == null ? Tier.LOW.getValue() : tier); } - public void setTier(String tier) { - this.ks.pinGbls("tier", tier); + public void setTier(Tier tier) { + this.ks.pinGbls("tier", tier.getValue()); } public Algos getAlgo() { @@ -218,7 +219,7 @@ public ManagerInceptResult incept(ManagerInceptArgs args) throws DigestException int ridx = 0; int kidx = 0; - Creator creator = new Creatory(args.algo).make(args.salt, Tier.fromString(args.tier), args.stem); + Creator creator = new Creatory(args.algo).make(args.salt, args.tier, args.stem); if (args.icodes == null) { if (args.icount < 0) { @@ -275,7 +276,7 @@ public ManagerInceptResult incept(ManagerInceptArgs args) throws DigestException : this.encrypter.encrypt(creator.salt().getBytes()).getQb64(); pp.stem = creator.stem(); - pp.tier = creator.tier() != null ? creator.tier().name() : ""; + pp.tier = creator.tier(); String dt = new Date().toString(); PubLot nw = new PubLot(); @@ -469,7 +470,7 @@ public ManagerRotateResult rotate(RotateArgs args) throws DigestException, Libso salt = this.getSalt(); } - Creator creator = new Creatory(pp.algo).make(salt, Tier.fromString(pp.tier), pp.stem); + Creator creator = new Creatory(pp.algo).make(salt, pp.tier, pp.stem); if (args.ncodes == null) { if (args.ncount < 0) { @@ -570,7 +571,7 @@ public Object sign(SignArgs args) throws LibsodiumException { ppt.code, verfer.isTransferable(), ppt.path, - Tier.fromString(ppt.tier), + ppt.tier, ppt.temp ); @@ -596,7 +597,7 @@ public Object sign(SignArgs args) throws LibsodiumException { ppt.code, verfer.isTransferable(), ppt.path, - Tier.fromString(ppt.tier), + ppt.tier, ppt.temp ); signers.add(signer); @@ -791,7 +792,7 @@ public static class ManagerInceptArgs { private Algos algo; private String salt; private String stem; - private String tier; + private Tier tier; @Builder.Default private boolean rooted = true; @Builder.Default @@ -816,7 +817,7 @@ public static class ManagerArgs { Integer pidx; Algos algo; Salter salter; - String tier; + Tier tier; } public static class PubLot { @@ -837,7 +838,7 @@ public static class PrePrm { Algos algo = Algos.salty; // salty default uses indices and salt to create new key pairs String salt = ""; // empty salt used for salty algo String stem = ""; // default unique path stem for salty algo - String tier = ""; // security tier for stretch index salty algo + Tier tier; // security tier for stretch index salty algo } public static class PubSet { @@ -847,7 +848,7 @@ public static class PubSet { public static class PubPath { String path = ""; String code = ""; - String tier = Tier.high.name(); + Tier tier = Tier.HIGH; boolean temp = false; } @@ -940,7 +941,7 @@ public SaltyCreator() { RawArgs rawArgs = RawArgs.builder() .code(MatterCodex.Salt_128.getValue()) .build(); - this.salter = new Salter(rawArgs, Tier.low); + this.salter = new Salter(rawArgs, Tier.LOW); this.stem = ""; } diff --git a/src/main/java/org/cardanofoundation/signify/core/States.java b/src/main/java/org/cardanofoundation/signify/core/States.java deleted file mode 100644 index 2ec1effa..00000000 --- a/src/main/java/org/cardanofoundation/signify/core/States.java +++ /dev/null @@ -1,163 +0,0 @@ -package org.cardanofoundation.signify.core; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.*; -import lombok.Builder; -import lombok.Data; -import org.cardanofoundation.signify.cesr.Salter.Tier; -import org.cardanofoundation.signify.cesr.exceptions.material.InvalidValueException; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class States { - @Data - @AllArgsConstructor - @NoArgsConstructor - @Builder - @JsonIgnoreProperties(ignoreUnknown = true) - public static class State { - @JsonProperty("vn") - private int[] vn; - @JsonProperty("i") - private String i; - @JsonProperty("s") - private String s; - @JsonProperty("p") - private String p; - @JsonProperty("d") - private String d; - @JsonProperty("f") - private String f; - @JsonProperty("dt") - private String dt; - @JsonProperty("et") - private String et; - @JsonProperty("kt") - private Object kt; - @JsonProperty("k") - private List k; - @JsonProperty("nt") - private Object nt; - @JsonProperty("n") - private List n; - @JsonProperty("bt") - private String bt; - @JsonProperty("b") - private List b; - @JsonProperty("c") - private List c; - @JsonProperty("ee") - private EstablishmentState ee; - @JsonProperty("di") - private String di; - } - - @Data - @AllArgsConstructor - @NoArgsConstructor - @Builder - public static class EstablishmentState { - private String d; - private String s; - } - - @Data - @AllArgsConstructor - @NoArgsConstructor - @Builder - public static class SaltyState { - private String sxlt; - private int pidx; - private int kidx; - private String stem; - private Tier tier; - private String dcode; - private List icodes; - private List ncodes; - private boolean transferable; - } - - @Data - @AllArgsConstructor - @NoArgsConstructor - @Builder - public static class RandyState { - private List prxs; - private List nxts; - } - - @Data - @AllArgsConstructor - @NoArgsConstructor - @Builder - public static class GroupState { - private HabState mhab; - private List keys; - private List ndigs; - } - - @Getter - @Builder - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class HabState { - private String name; - private String prefix; - private boolean transferable; - private State state; - private List windexes; - private SaltyState salty; - private RandyState randy; - private GroupState group; - - public boolean containsKey(String algo) { - return switch (algo) { - case "salty" -> salty != null; - case "randy" -> randy != null; - case "group" -> group != null; - default -> throw new InvalidValueException("Unexpected value: " + algo); - }; - } - - public Object get(String algo) { - return switch (algo) { - case "salty" -> salty; - case "randy" -> randy; - case "group" -> group; - default -> throw new InvalidValueException("Unexpected value: " + algo); - }; - } - } - - private static final ObjectMapper objectMapper = new ObjectMapper() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - public static List convertToStates(List nestedStates) { - List flatStates = new ArrayList<>(); - - if (nestedStates == null) { - return flatStates; - } - - for (Object outerItem : nestedStates) { - if (outerItem instanceof List innerList) { - for (Object innerItem : innerList) { - if (innerItem instanceof Map) { - States.State state = objectMapper.convertValue(innerItem, States.State.class); - flatStates.add(state); - } else if (innerItem instanceof States.State) { - flatStates.add((States.State) innerItem); - } - } - } - } - - return flatStates; - } -} \ No newline at end of file diff --git a/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java b/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java index 9dac766b..51a10055 100644 --- a/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java @@ -10,6 +10,7 @@ import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.cesr.Signer; import org.cardanofoundation.signify.core.Httping; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -240,7 +241,7 @@ public MockResponse mockAllRequests(RecordedRequest req) throws LibsodiumExcepti "A", true, "agentagent-ELI7pg979AdhmvrjDeam2eAO2SR5niCgnjAJXJHtJose00", - Salter.Tier.low, + Tier.LOW, false ); diff --git a/src/test/java/org/cardanofoundation/signify/app/ChallengesTest.java b/src/test/java/org/cardanofoundation/signify/app/ChallengesTest.java index 27d4e79e..07cf748b 100644 --- a/src/test/java/org/cardanofoundation/signify/app/ChallengesTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/ChallengesTest.java @@ -5,6 +5,7 @@ import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.cesr.util.Utils; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -18,7 +19,7 @@ public class ChallengesTest extends BaseMockServerTest { @DisplayName("Test Challenges") void testChallenges() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java b/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java index b839e6b3..d512a5db 100644 --- a/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/ClientingTest.java @@ -15,9 +15,9 @@ import org.cardanofoundation.signify.app.credentialing.ipex.Ipex; import org.cardanofoundation.signify.app.credentialing.registries.Registries; import org.cardanofoundation.signify.cesr.Salter; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.cesr.exceptions.material.InvalidValueException; import org.cardanofoundation.signify.cesr.util.Utils; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -34,14 +34,14 @@ public class ClientingTest extends BaseMockServerTest { void testSignifyClientInitialization() throws Exception { InvalidValueException exception = assertThrows( InvalidValueException.class, - () -> new SignifyClient(url, "short", Tier.low, bootUrl, null) + () -> new SignifyClient(url, "short", Tier.LOW, bootUrl, null) ); assertEquals("bran must be 21 characters", exception.getMessage()); SignifyClient client = new SignifyClient( url, bran, - Tier.low, + Tier.LOW, bootUrl, null ); @@ -49,14 +49,14 @@ void testSignifyClientInitialization() throws Exception { assertEquals(bran, client.getBran()); assertEquals(url, client.getUrl()); assertEquals(bootUrl, client.getBootUrl()); - assertEquals(Tier.low, client.getTier()); + assertEquals(Tier.LOW, client.getTier()); assertEquals(0, client.getPidx()); assertEquals( "ELI7pg979AdhmvrjDeam2eAO2SR5niCgnjAJXJHtJose", client.getController().getPre() ); assertEquals("signify:controller", client.getController().getStem()); - assertEquals(Tier.low, client.getController().getTier()); + assertEquals(Tier.LOW, client.getController().getTier()); String expectedSerderRaw = """ {"v":"KERI10JSON00012b_","t":"icp",\ @@ -164,7 +164,7 @@ void testSignifyClientInitialization() throws Exception { void testSignedFetch() throws Exception { // Siged fetch String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.connect(); cleanUpRequest(); @@ -216,7 +216,7 @@ public void testJsonObject() throws Exception { data.put("sig", "AACJwsJ0mvb4VgxD87H4jIsiT1QtlzznUy9zrX3lGdd48jjQRTv8FxlJ8ClDsGtkvK4Eekg5p-oPYiPvK_1eTXEG"); data.put("stem", "signify:controller"); data.put("pidx", 1); - data.put("tier", Salter.Tier.low); + data.put("tier", Tier.LOW); String expectedData = "{\"icp\":{\"v\":\"KERI10JSON00012b_\",\"t\":\"icp\",\"d\":\"ELI7pg979AdhmvrjDeam2eAO2SR5niCgnjAJXJHtJose\",\"i\":\"ELI7pg979AdhmvrjDeam2eAO2SR5niCgnjAJXJHtJose\",\"s\":\"0\",\"kt\":\"1\",\"k\":[\"DAbWjobbaLqRB94KiAutAHb_qzPpOHm3LURA_ksxetVc\"],\"nt\":\"1\",\"n\":[\"EIFG_uqfr1yN560LoHYHfvPAhxQ5sN6xZZT_E3h7d2tL\"],\"bt\":\"0\",\"b\":[],\"c\":[],\"a\":[]},\"sig\":\"AACJwsJ0mvb4VgxD87H4jIsiT1QtlzznUy9zrX3lGdd48jjQRTv8FxlJ8ClDsGtkvK4Eekg5p-oPYiPvK_1eTXEG\",\"stem\":\"signify:controller\",\"pidx\":1,\"tier\":\"low\"}"; assertEquals(obj.writeValueAsString(data), expectedData); diff --git a/src/test/java/org/cardanofoundation/signify/app/ControllerTest.java b/src/test/java/org/cardanofoundation/signify/app/ControllerTest.java index fc43ba9a..3db9a696 100644 --- a/src/test/java/org/cardanofoundation/signify/app/ControllerTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/ControllerTest.java @@ -8,6 +8,7 @@ import org.cardanofoundation.signify.cesr.args.RawArgs; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.core.Manager; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -43,11 +44,11 @@ void controllerTest() throws DigestException, LibsodiumException { // their pubk and my encrypted account package // let pkg = {} - Controller controller = new Controller(passcode, Salter.Tier.low); + Controller controller = new Controller(passcode, Tier.LOW); assertEquals(controller.getPre(), "ELI7pg979AdhmvrjDeam2eAO2SR5niCgnjAJXJHtJose"); passcode = "abcdefghijk0123456789"; - controller = new Controller(passcode, Salter.Tier.low); + controller = new Controller(passcode, Tier.LOW); assertEquals(controller.getPre(), "EIIY2SgE_bqKLl2MlnREUawJ79jTuucvWwh-S6zsSUFo"); } @@ -57,8 +58,8 @@ void shouldGenerateUniqueControllerAIDsPerPasscode() throws DigestException, Lib String passcode1 = Coring.randomPasscode(); String passcode2 = Coring.randomPasscode(); - Controller controller1 = new Controller(passcode1, Salter.Tier.low); - Controller controller2 = new Controller(passcode2, Salter.Tier.low); + Controller controller1 = new Controller(passcode1, Tier.LOW); + Controller controller2 = new Controller(passcode2, Tier.LOW); assertNotEquals(controller1.getPre(), controller2.getPre()); } diff --git a/src/test/java/org/cardanofoundation/signify/app/CoringTest.java b/src/test/java/org/cardanofoundation/signify/app/CoringTest.java index 9c6ee4dd..ecfb448b 100644 --- a/src/test/java/org/cardanofoundation/signify/app/CoringTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/CoringTest.java @@ -6,6 +6,7 @@ import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.app.coring.Coring; import org.cardanofoundation.signify.cesr.Salter; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -33,7 +34,7 @@ public void testRandomPasscode() { @DisplayName("Events and States") void testEventsAndStates() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); @@ -87,7 +88,7 @@ void testEventsAndStates() throws Exception { @DisplayName("Agent configuration") void testAgentConfiguration() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/CredentialingTest.java b/src/test/java/org/cardanofoundation/signify/app/CredentialingTest.java index b8635ba3..d8deb1b9 100644 --- a/src/test/java/org/cardanofoundation/signify/app/CredentialingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/CredentialingTest.java @@ -12,6 +12,7 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Authenticater; import org.cardanofoundation.signify.core.Httping; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -35,7 +36,7 @@ public MockResponse mockAllRequests(RecordedRequest req) throws LibsodiumExcepti "A", true, "agentagent-ELI7pg979AdhmvrjDeam2eAO2SR5niCgnjAJXJHtJose00", - Salter.Tier.low, + Tier.LOW, false ); @@ -63,7 +64,7 @@ public MockResponse mockAllRequests(RecordedRequest req) throws LibsodiumExcepti @DisplayName("Test Credentialing") void testCredentialing() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/DelegatingTest.java b/src/test/java/org/cardanofoundation/signify/app/DelegatingTest.java index b4f7d0b1..1d0a0ee2 100644 --- a/src/test/java/org/cardanofoundation/signify/app/DelegatingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/DelegatingTest.java @@ -3,6 +3,7 @@ import okhttp3.mockwebserver.RecordedRequest; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.Salter; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,7 +15,7 @@ public class DelegatingTest extends BaseMockServerTest { @DisplayName("Test approve delegation") void testApproveDelegation() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/EscrowingTest.java b/src/test/java/org/cardanofoundation/signify/app/EscrowingTest.java index 2353e58e..0e8e8ef3 100644 --- a/src/test/java/org/cardanofoundation/signify/app/EscrowingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/EscrowingTest.java @@ -3,6 +3,7 @@ import okhttp3.mockwebserver.RecordedRequest; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.Salter; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,7 +15,7 @@ public class EscrowingTest extends BaseMockServerTest { @DisplayName("Test Escrows") void testEscrows() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/ExchangingTest.java b/src/test/java/org/cardanofoundation/signify/app/ExchangingTest.java index 11e2f37b..610d9e52 100644 --- a/src/test/java/org/cardanofoundation/signify/app/ExchangingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/ExchangingTest.java @@ -2,12 +2,12 @@ import okhttp3.mockwebserver.RecordedRequest; import org.cardanofoundation.signify.app.clienting.SignifyClient; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.cesr.*; import org.cardanofoundation.signify.cesr.args.RawArgs; import org.cardanofoundation.signify.cesr.Codex.MatterCodex; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.cesr.util.CoreUtil.Ilks; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -67,7 +67,7 @@ public void shouldCreateExchangeMessageWithNoTransposedAttachments() throws Dige MatterCodex.Ed25519_Seed.getValue(), true, "A", - Tier.low, + Tier.LOW, true ); List keys = Collections.singletonList(skp0.getVerfer().getQb64()); @@ -76,7 +76,7 @@ public void shouldCreateExchangeMessageWithNoTransposedAttachments() throws Dige MatterCodex.Ed25519_Seed.getValue(), true, "N", - Tier.low, + Tier.LOW, true ); @@ -184,7 +184,7 @@ public void shouldCreateExchangeMessageWithNoTransposedAttachments() throws Dige @DisplayName("Send from events") void sendFromEvents() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); @@ -205,7 +205,7 @@ void sendFromEvents() throws Exception { MatterCodex.Ed25519_Seed.getValue(), true, "A", - Tier.low, + Tier.LOW, true ); List keys = Collections.singletonList(skp0.getVerfer().getQb64()); @@ -214,7 +214,7 @@ void sendFromEvents() throws Exception { MatterCodex.Ed25519_Seed.getValue(), true, "N", - Tier.low, + Tier.LOW, true ); @@ -251,7 +251,7 @@ void sendFromEvents() throws Exception { @DisplayName("Get exchange") void getExchange() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/GroupingTest.java b/src/test/java/org/cardanofoundation/signify/app/GroupingTest.java index 54dbf612..99f144ed 100644 --- a/src/test/java/org/cardanofoundation/signify/app/GroupingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/GroupingTest.java @@ -3,6 +3,7 @@ import okhttp3.mockwebserver.RecordedRequest; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.Salter; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.Test; import java.util.HashMap; @@ -15,7 +16,7 @@ public class GroupingTest extends BaseMockServerTest { @Test void testGroups() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/IpexTest.java b/src/test/java/org/cardanofoundation/signify/app/IpexTest.java index 6acfcf77..1adb58c1 100644 --- a/src/test/java/org/cardanofoundation/signify/app/IpexTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/IpexTest.java @@ -10,6 +10,7 @@ import org.cardanofoundation.signify.cesr.util.CoreUtil; import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -28,7 +29,7 @@ public class IpexTest extends BaseMockServerTest { @DisplayName("IPEX - grant-admit flow initiated by discloser") void testIpexGrantAdmitFlow() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); @@ -137,7 +138,7 @@ void testIpexGrantAdmitFlow() throws Exception { @DisplayName("IPEX - apply-admit flow initiated by disclosee") void testIpexApplyAdmitFlow() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); @@ -317,7 +318,7 @@ void testIpexApplyAdmitFlow() throws Exception { @DisplayName("IPEX - discloser can create an offer without apply") void testIpexDiscloser() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/NotifyingTest.java b/src/test/java/org/cardanofoundation/signify/app/NotifyingTest.java index ea325290..139468f9 100644 --- a/src/test/java/org/cardanofoundation/signify/app/NotifyingTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/NotifyingTest.java @@ -3,6 +3,7 @@ import okhttp3.mockwebserver.RecordedRequest; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.Salter; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -12,7 +13,7 @@ public class NotifyingTest extends BaseMockServerTest { @Test void testNotifications() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/OobisTest.java b/src/test/java/org/cardanofoundation/signify/app/OobisTest.java index f9f8a3fc..be51a775 100644 --- a/src/test/java/org/cardanofoundation/signify/app/OobisTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/OobisTest.java @@ -5,6 +5,7 @@ import org.cardanofoundation.signify.app.coring.Oobis; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.Salter; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -19,7 +20,7 @@ public class OobisTest extends BaseMockServerTest { @DisplayName("Test Oobis") void testOobis() throws Exception { String bran = "0123456789abcdefghijk"; - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); client.boot(); client.connect(); cleanUpRequest(); diff --git a/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java b/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java index 5d1bda46..a4b0c11c 100644 --- a/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java @@ -7,7 +7,6 @@ import org.cardanofoundation.signify.cesr.Keeping; import org.cardanofoundation.signify.cesr.params.SaltyParams; import org.cardanofoundation.signify.core.Manager; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/org/cardanofoundation/signify/cesr/SalterTest.java b/src/test/java/org/cardanofoundation/signify/cesr/SalterTest.java index e3d593ca..b05bf4ba 100644 --- a/src/test/java/org/cardanofoundation/signify/cesr/SalterTest.java +++ b/src/test/java/org/cardanofoundation/signify/cesr/SalterTest.java @@ -1,10 +1,10 @@ package org.cardanofoundation.signify.cesr; import org.cardanofoundation.signify.cesr.Codex.MatterCodex; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.cardanofoundation.signify.cesr.args.RawArgs; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.cesr.exceptions.extraction.ShortageException; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -27,7 +27,7 @@ void testSalterInstance() throws LibsodiumException { assertArrayEquals(salter.getRaw(), raw); assertEquals(salter.getQb64(), "0AAwMTIzNDU2Nzg5YWJjZGVm"); - Signer signer = salter.signer(MatterCodex.Ed25519_Seed.getValue(), true, "01", Tier.low, true); + Signer signer = salter.signer(MatterCodex.Ed25519_Seed.getValue(), true, "01", Tier.LOW, true); assertEquals(signer.getCode(), Codex.MatterCodex.Ed25519_Seed.getValue()); assertEquals(signer.getRaw().length, Matter.getRawSize(signer.getCode())); assertEquals(signer.getVerfer().getCode(), MatterCodex.Ed25519.getValue()); @@ -35,7 +35,7 @@ void testSalterInstance() throws LibsodiumException { assertEquals(signer.getQb64(), "AMPsqBZxWdtYpBhrWnKYitwFa77s902Q-nX3sPTzqs0R"); assertEquals(signer.getVerfer().getQb64(), "DFYFwZJOMNy3FknECL8tUaQZRBUyQ9xCv6F8ckG-UCrC"); - signer = salter.signer(MatterCodex.Ed25519_Seed.getValue(), true, "01", Tier.low, false); + signer = salter.signer(MatterCodex.Ed25519_Seed.getValue(), true, "01", Tier.LOW, false); assertEquals(signer.getCode(), MatterCodex.Ed25519_Seed.getValue()); assertEquals(signer.getRaw().length, Matter.getRawSize(signer.getCode())); assertEquals(signer.getVerfer().getCode(), MatterCodex.Ed25519.getValue()); @@ -52,13 +52,13 @@ void testSalterInstance() throws LibsodiumException { salter = new Salter(RawArgs.builder() .code(MatterCodex.Salt_128.getValue()) .raw(raw) - .build(), Tier.low); + .build(), Tier.LOW); assertArrayEquals(salter.getRaw(), raw); byte[] stretchTierNull = salter.stretch(32, "", null, true); - byte[] stretchTierLow = salter.stretch(32, "", Tier.low, false); - byte[] stretchTierMed = salter.stretch(32, "", Tier.med, false); - byte[] stretchTierHigh = salter.stretch(32, "", Tier.high, false); + byte[] stretchTierLow = salter.stretch(32, "", Tier.LOW, false); + byte[] stretchTierMed = salter.stretch(32, "", Tier.MED, false); + byte[] stretchTierHigh = salter.stretch(32, "", Tier.HIGH, false); byte[] expectedStretchTierNull = {(byte) 0xd4, 0x40, (byte) 0xeb, (byte) 0xa6, 0x78, (byte) 0x86, (byte) 0xdf, (byte) 0x93, (byte) 0xd6, 0x43, (byte) 0xdc, (byte) 0xb8, (byte) 0xa6, (byte) 0x9b, 0x02, (byte) 0xaf, 0x68, (byte) 0xc1, 0x6d, 0x28, 0x4c, (byte) 0xd6, (byte) 0xf6, (byte) 0x86, 0x59, 0x55, 0x3e, 0x24, 0x5b, (byte) 0xf9, (byte) 0xef, (byte) 0xc0}; assertArrayEquals(stretchTierNull, expectedStretchTierNull); diff --git a/src/test/java/org/cardanofoundation/signify/cesr/SerderTest.java b/src/test/java/org/cardanofoundation/signify/cesr/SerderTest.java index e9a643d3..a1036832 100644 --- a/src/test/java/org/cardanofoundation/signify/cesr/SerderTest.java +++ b/src/test/java/org/cardanofoundation/signify/cesr/SerderTest.java @@ -6,8 +6,8 @@ import org.cardanofoundation.signify.cesr.util.CoreUtil.Ilks; import org.cardanofoundation.signify.cesr.util.CoreUtil.Serials; import org.cardanofoundation.signify.cesr.util.CoreUtil.Version; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; -import org.cardanofoundation.signify.cesr.Salter.Tier; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -47,7 +47,7 @@ void shouldCreateKeriEventsFromDicts() throws Exception { MatterCodex.Ed25519_Seed.getValue(), true, "A", - Tier.low, + Tier.LOW, true ); List keys = new ArrayList<>(); @@ -57,7 +57,7 @@ void shouldCreateKeriEventsFromDicts() throws Exception { MatterCodex.Ed25519_Seed.getValue(), true, "N", - Tier.low, + Tier.LOW, true ); diff --git a/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java b/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java index 4b115cda..cc4ad917 100644 --- a/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java +++ b/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java @@ -6,6 +6,7 @@ import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.cardanofoundation.signify.generated.keria.model.RandyKeyState; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -220,7 +221,7 @@ void testManager_shouldManageKeyPairsForIdentifiers() throws DigestException, Li assertEquals(manager.getAlgo(), Manager.Algos.salty); assertEquals(manager.getSalt(), salt); assertEquals(manager.getPidx(), 0); - assertEquals(manager.getTier(), Salter.Tier.low.name()); + assertEquals(manager.getTier(), Tier.LOW); Cipher saltCipher0 = new Cipher(manager.getKs().getGbls("salt")); assertEquals(((Matter) saltCipher0.decrypt(null, seed0b)).getQb64(), salt); @@ -245,7 +246,7 @@ void testManager_shouldManageKeyPairsForIdentifiers() throws DigestException, Li assertEquals(pp.algo, Manager.Algos.salty); assertEquals(((Matter) manager.getDecrypter().decrypt(pp.salt.getBytes(), null)).getQb64(), salt); assertEquals(pp.stem, ""); - assertEquals(pp.tier, Salter.Tier.low.name()); + assertEquals(pp.tier, Tier.LOW); Manager.PreSit ps = manager.getKs().getSits(spre); assertEquals(ps.old.pubs, Collections.emptyList()); @@ -365,7 +366,7 @@ void testManager_shouldManageKeyPairsForIdentifiers() throws DigestException, Li assertEquals(pp.algo, Manager.Algos.salty); assertEquals(((Matter) manager.getDecrypter().decrypt(pp.salt.getBytes(), null)).getQb64(), salt); assertEquals(pp.stem, ""); - assertEquals(pp.tier, Salter.Tier.low.name()); + assertEquals(pp.tier, Tier.LOW); ps = manager.getKs().getSits(spre); assertEquals(ps.old.pubs.getFirst(), "DB-fH5uto5o5XHZjNN3_W3PdT4MIyTCmQWDzMxMZV2kI"); @@ -445,7 +446,7 @@ void testManager_shouldManageKeyPairsForIdentifiers() throws DigestException, Li assertEquals(pp.algo, Manager.Algos.randy); assertEquals(pp.salt, ""); assertEquals(pp.stem, ""); - assertEquals(pp.tier, ""); + assertEquals(pp.tier, null); ps = manager.getKs().getSits(rpre); assertEquals(ps.old.pubs, Collections.emptyList()); @@ -523,7 +524,7 @@ void testManager_shouldManageKeyPairsForIdentifiers() throws DigestException, Li assertEquals(pp.algo, Manager.Algos.salty); assertEquals(((Matter) manager.getDecrypter().decrypt(pp.salt.getBytes(), null)).getQb64(), salt); assertEquals(pp.stem, stem); - assertEquals(pp.tier, Salter.Tier.low.name()); + assertEquals(pp.tier, Tier.LOW); ps = manager.getKs().getSits(spre); assertEquals(ps.old.pubs, Collections.emptyList()); @@ -615,7 +616,7 @@ void testManager_shouldSupportOnlySaltyEncryptedSaltyUnencryptedRandyEncrypted() Manager.PubPath ppt = manager.getKs().getPths(ps.new_.pubs.getFirst()); assertEquals(ppt.path, "0"); assertEquals(ppt.code, "A"); - assertEquals(ppt.tier, "low"); + assertEquals(ppt.tier, Tier.LOW); assertTrue(ppt.temp); List digs = digers.stream().map(Diger::getQb64).toList(); @@ -650,7 +651,7 @@ void testManager_shouldSupportOnlySaltyEncryptedSaltyUnencryptedRandyEncrypted() assertEquals(pp.algo, Manager.Algos.salty); assertEquals(pp.salt, ""); assertEquals(pp.stem, ""); - assertEquals(pp.tier, Salter.Tier.low.name()); + assertEquals(pp.tier, Tier.LOW); ps = manager.getKs().getSits(spre); assertEquals(ps.old.pubs.getFirst(), "DB-fH5uto5o5XHZjNN3_W3PdT4MIyTCmQWDzMxMZV2kI"); @@ -674,7 +675,7 @@ void testManager_shouldSupportOnlySaltyEncryptedSaltyUnencryptedRandyEncrypted() ppt = manager.getKs().getPths(ps.new_.pubs.getFirst()); assertEquals(ppt.path, "0"); assertEquals(ppt.code, "A"); - assertEquals(ppt.tier, "low"); + assertEquals(ppt.tier, Tier.LOW); assertTrue(ppt.temp); psigers = (List) manager.sign(Manager.SignArgs.builder().ser(serb).pubs(ps.new_.pubs).build()); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java b/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java index 12111238..a387a08a 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/BaseIntegrationTest.java @@ -7,7 +7,6 @@ import org.cardanofoundation.signify.app.aiding.CreateIdentifierArgs; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.app.coring.Operation; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.TestUtils; import java.util.ArrayList; diff --git a/src/test/java/org/cardanofoundation/signify/e2e/ChallengesTest.java b/src/test/java/org/cardanofoundation/signify/e2e/ChallengesTest.java index 4fc4340e..3b691da6 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/ChallengesTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/ChallengesTest.java @@ -10,6 +10,7 @@ import org.cardanofoundation.signify.cesr.Serder; import org.cardanofoundation.signify.cesr.util.Utils; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,14 +35,14 @@ void ChallengeTest() throws Exception { client1 = new SignifyClient( url, bran1, - Salter.Tier.low, + Tier.LOW, bootUrl, null ); client2 = new SignifyClient( url, bran2, - Salter.Tier.low, + Tier.LOW, bootUrl, null ); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java b/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java index 8a94c0a9..3f7cbf35 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/DelegationTest.java @@ -9,6 +9,7 @@ import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.e2e.utils.TestSteps; import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.Test; import java.util.*; @@ -34,14 +35,14 @@ void delegationTest() throws Exception { client1 = new SignifyClient( url, bran1, - Salter.Tier.low, + Tier.LOW, bootUrl, null ); client2 = new SignifyClient( url, bran2, - Salter.Tier.low, + Tier.LOW, bootUrl, null ); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java index c5e8d2c2..b45ecbf2 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java @@ -11,7 +11,6 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; import org.cardanofoundation.signify.core.Manager; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.TestUtils; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java index 0f5ed639..af6d0f20 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java @@ -23,7 +23,6 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; import org.cardanofoundation.signify.core.Manager; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.e2e.utils.MultisigUtils; import org.cardanofoundation.signify.e2e.utils.ResolveEnv; diff --git a/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java b/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java index ef959e6c..4ab4a6f7 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/RandyTest.java @@ -12,6 +12,7 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.core.Manager; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -37,7 +38,7 @@ void randyTest() throws Exception { client1 = new SignifyClient( url, bran, - Salter.Tier.low, + Tier.LOW, bootUrl, null ); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java b/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java index f5f2a850..64ec8b5c 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SaltyTests.java @@ -9,13 +9,12 @@ import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.cesr.Serder; -import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Manager; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.cardanofoundation.signify.generated.keria.model.SaltyState; import org.cardanofoundation.signify.generated.keria.model.StateEERecord; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -35,7 +34,7 @@ void saltyTest() throws Exception { SignifyClient client = new SignifyClient( url, bran1, - Salter.Tier.low, + Tier.LOW, bootUrl, null ); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java index e44d6b32..12dfedcd 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDIPTest.java @@ -5,7 +5,6 @@ import org.cardanofoundation.signify.app.aiding.EventResult; import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.ResolveEnv; import org.cardanofoundation.signify.e2e.utils.TestUtils; import org.cardanofoundation.signify.generated.keria.model.Identifier; diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java index 95c466c7..dbef59ad 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigDRTTest.java @@ -6,7 +6,6 @@ import org.cardanofoundation.signify.app.aiding.RotateIdentifierArgs; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.app.coring.Operation; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.e2e.utils.TestUtils; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.junit.jupiter.api.Assertions; diff --git a/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java b/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java index 2436693a..cd3095b7 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/WitnessTest.java @@ -6,8 +6,8 @@ import org.cardanofoundation.signify.app.aiding.EventResult; import org.cardanofoundation.signify.app.aiding.RotateIdentifierArgs; import org.cardanofoundation.signify.cesr.Salter; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -34,7 +34,7 @@ public void testWitness() throws Exception { client1 = new SignifyClient( url, bran1, - Salter.Tier.low, + Tier.LOW, bootUrl, null ); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java b/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java index 2f3c3164..32d20fa4 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java @@ -23,7 +23,6 @@ import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.core.Eventing; import org.cardanofoundation.signify.core.Manager; -import org.cardanofoundation.signify.core.States; import java.io.IOException; import java.security.DigestException; diff --git a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java index edf58d64..67b4996b 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java @@ -21,7 +21,6 @@ import org.cardanofoundation.signify.cesr.Salter; import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; -import org.cardanofoundation.signify.core.States; import org.cardanofoundation.signify.generated.keria.model.Identifier; import java.io.IOException; @@ -31,6 +30,7 @@ import java.util.concurrent.*; import java.util.function.Supplier; import java.util.stream.Collectors; +import org.cardanofoundation.signify.generated.keria.model.Tier; import static org.cardanofoundation.signify.app.coring.Coring.randomPasscode; import static org.cardanofoundation.signify.e2e.utils.Retry.retry; @@ -221,7 +221,7 @@ public static SignifyClient getOrCreateClient(String bran) throws Exception { bran = randomPasscode(); } - SignifyClient client = new SignifyClient(url, bran, Salter.Tier.low, bootUrl, null); + SignifyClient client = new SignifyClient(url, bran, Tier.LOW, bootUrl, null); try { client.connect(); } catch (Exception e) { diff --git a/src/test/java/org/cardanofoundation/signify/end/SignageTest.java b/src/test/java/org/cardanofoundation/signify/end/SignageTest.java index 97c91509..2b85114b 100644 --- a/src/test/java/org/cardanofoundation/signify/end/SignageTest.java +++ b/src/test/java/org/cardanofoundation/signify/end/SignageTest.java @@ -3,6 +3,7 @@ import org.cardanofoundation.signify.cesr.*; import org.cardanofoundation.signify.cesr.args.RawArgs; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; +import org.cardanofoundation.signify.generated.keria.model.Tier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -253,7 +254,7 @@ private Signer createSigner(String name) throws LibsodiumException { return salter.signer(Codex.MatterCodex.Ed25519_Seed.getValue(), true, name, - Salter.Tier.low, + Tier.LOW, temp); } } \ No newline at end of file From 91ee571bda3f59e57ce6c0afbf76ca7b1e598b7e Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Thu, 4 Dec 2025 19:07:00 +0700 Subject: [PATCH 14/24] refactor: update CreateIdentifierArgs to use KeyStateRecord for states and rstates --- .../app/aiding/CreateIdentifierArgs.java | 5 +-- .../signify/e2e/MultisigJoinTest.java | 2 +- .../signify/e2e/MultisigTest.java | 4 +-- .../e2e/MultisigVleiIssuanaceTest.java | 13 ++++---- .../signify/e2e/utils/MultisigUtils.java | 32 +++++++++++-------- 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java b/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java index c9205ac9..3e67e9ce 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/CreateIdentifierArgs.java @@ -5,6 +5,7 @@ import lombok.*; import org.cardanofoundation.signify.core.Manager.Algos; import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.cardanofoundation.signify.generated.keria.model.Tier; @Getter @@ -24,8 +25,8 @@ public class CreateIdentifierArgs { private Object data; private Algos algo; private String pre; - private List states; - private List rstates; + private List states; + private List rstates; private List prxs; private List nxts; private Identifier mhab; diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java index b45ecbf2..bfe17b29 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigJoinTest.java @@ -69,7 +69,7 @@ public void multisigJoinTest() throws Exception { aid1 = aids.get(0); aid2 = aids.get(1); - List states = Arrays.asList(aid1.getState(), aid2.getState()); + List states = Arrays.asList(aid1.getState(), aid2.getState()); CreateIdentifierArgs kargs = new CreateIdentifierArgs(); kargs.setAlgo(Manager.Algos.group); kargs.setMhab(aid1); diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java index af6d0f20..533bc1bf 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigTest.java @@ -163,8 +163,8 @@ public void multisig() throws Exception { System.out.println("Member1 marked challenge response as accepted"); // First member start the creation of a multisig identifier - List rstates = List.of(aid1.getState(), aid2.getState(), aid3.getState()); - List states = List.copyOf(rstates); + List rstates = List.of(aid1.getState(), aid2.getState(), aid3.getState()); + List states = List.copyOf(rstates); CreateIdentifierArgs kargsMultisigAID = CreateIdentifierArgs .builder() diff --git a/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java b/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java index 60e87df1..bbddfd6e 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/MultisigVleiIssuanaceTest.java @@ -12,6 +12,7 @@ import org.cardanofoundation.signify.e2e.utils.ResolveEnv; import org.cardanofoundation.signify.e2e.utils.TestUtils; import org.cardanofoundation.signify.generated.keria.model.Identifier; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -208,8 +209,8 @@ void testMultisigVleiIssuance() throws Exception { aidGEDAbyGAR1 = clientGAR1.identifiers().get("GEDA").get(); aidGEDAbyGAR2 = clientGAR2.identifiers().get("GEDA").get(); } catch (Exception e) { - List rstates = List.of(aidGAR1.getState(), aidGAR2.getState()); - List states = rstates; + List rstates = List.of(aidGAR1.getState(), aidGAR2.getState()); + List states = rstates; CreateIdentifierArgs kargsMultisigAID = CreateIdentifierArgs .builder() @@ -318,8 +319,8 @@ void testMultisigVleiIssuance() throws Exception { aidQVIbyQAR2 = clientQAR2.identifiers().get("QVI").get(); aidQVIbyQAR3 = clientQAR3.identifiers().get("QVI").get(); } catch (Exception exception) { - List rstates = List.of(aidQAR1.getState(), aidQAR2.getState(), aidQAR3.getState()); - List states = List.copyOf(rstates); + List rstates = List.of(aidQAR1.getState(), aidQAR2.getState(), aidQAR3.getState()); + List states = List.copyOf(rstates); CreateIdentifierArgs kargsMultisigAID = CreateIdentifierArgs .builder() @@ -718,8 +719,8 @@ void testMultisigVleiIssuance() throws Exception { aidLEbyLAR2 = clientLAR2.identifiers().get("LE").get(); aidLEbyLAR3 = clientLAR3.identifiers().get("LE").get(); } catch (Exception e) { - List rstates = List.of(aidLAR1.getState(), aidLAR2.getState(), aidLAR3.getState()); - List states = List.copyOf(rstates); + List rstates = List.of(aidLAR1.getState(), aidLAR2.getState(), aidLAR3.getState()); + List states = List.copyOf(rstates); CreateIdentifierArgs kargsMultisigAID = CreateIdentifierArgs .builder() diff --git a/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java b/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java index 32d20fa4..5252f328 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/utils/MultisigUtils.java @@ -9,6 +9,7 @@ import org.cardanofoundation.signify.app.aiding.EventResult; import org.cardanofoundation.signify.app.aiding.RotateIdentifierArgs; import org.cardanofoundation.signify.app.clienting.SignifyClient; +import org.cardanofoundation.signify.app.clienting.State; import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.app.credentialing.credentials.CredentialData; import org.cardanofoundation.signify.app.credentialing.credentials.IssueCredentialResult; @@ -45,8 +46,15 @@ public static Object acceptMultisigIncept(SignifyClient client2, AcceptMultisigI List smids = (List) ((Map) exn.get("a")).get("smids"); List rmids = (List) ((Map) exn.get("a")).get("rmids"); - List states = TestUtils.getStates(client2, smids); - List rstates = TestUtils.getStates(client2, rmids); + List states = TestUtils.getStates(client2, smids) + .stream() + .map(rawState -> Utils.fromJson(Utils.jsonStringify(rawState), KeyStateRecord.class)) + .collect(Collectors.toList()); + + List rstates = TestUtils.getStates(client2, rmids) + .stream() + .map(rawState -> Utils.fromJson(Utils.jsonStringify(rawState), KeyStateRecord.class)) + .collect(Collectors.toList()); CreateIdentifierArgs createIdentifierArgs = new CreateIdentifierArgs(); createIdentifierArgs.setAlgo(Manager.Algos.group); @@ -87,7 +95,7 @@ public static Object acceptMultisigIncept(SignifyClient client2, AcceptMultisigI public static Object interactMultisig(SignifyClient client, String groupName, Identifier aid, List otherMemberAIDs, Object data, - List states, + List states, boolean isInitiator) throws Exception { if (!isInitiator) { TestUtils.waitAndMarkNotification(client, "/multisig/ixn"); @@ -107,14 +115,7 @@ public static Object interactMultisig(SignifyClient client, String groupName, Id Map> xembeds = new LinkedHashMap<>(); xembeds.put("ixn", List.of(serder, atc)); - List smids = states.stream().map(state -> { - if (state instanceof Map stateMap) { - return stateMap.get("i").toString(); - } else if (state instanceof KeyStateRecord stateHab) { - return stateHab.getI(); - } - return null; - }).toList(); + List smids = states.stream().map(KeyStateRecord::getI).toList(); List recp = otherMemberAIDs.stream().map(Identifier::getPrefix).toList(); Map payload = new LinkedHashMap<>() {{ @@ -716,7 +717,12 @@ public static Object startMultisigIncept( ) throws IOException, InterruptedException, DigestException, LibsodiumException, ExecutionException { Identifier aid1 = client.identifiers().get(args.getLocalMemberName()) .orElseThrow(() -> new IllegalArgumentException("Identifier not found: " + args.getLocalMemberName())); - List participantStates = TestUtils.getStates(client, args.getParticipants()); + + // TODO should update the TestUtils.getStates to return the KeyStateRecord[] + List participantStates = TestUtils.getStates(client, args.getParticipants()) + .stream() + .map(rawState -> Utils.fromJson(Utils.jsonStringify(rawState), KeyStateRecord.class)) + .collect(Collectors.toList()); CreateIdentifierArgs createIdentifierArgs = new CreateIdentifierArgs(); createIdentifierArgs.setAlgo(Manager.Algos.group); @@ -742,7 +748,7 @@ public static Object startMultisigIncept( embeds.put("icp", List.of(serder, atc)); List smids = participantStates.stream() - .map(state -> ((Map) state).get("i").toString()) + .map(KeyStateRecord::getI) .collect(Collectors.toList()); Map payload = new LinkedHashMap<>(); From 45f4e58cf63d2b66f9904c7031852d6d44f2ec39 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Wed, 10 Dec 2025 16:07:37 +0700 Subject: [PATCH 15/24] chore: remove Payload mapper --- .../app/aiding/IdentifierController.java | 28 ++++--- .../app/aiding/IdentifierPayloadMapper.java | 80 ------------------- 2 files changed, 15 insertions(+), 93 deletions(-) delete mode 100644 src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java index 514d0143..7b9f4543 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java @@ -114,7 +114,7 @@ public Identifier update(String name, IdentifierInfo info) throws InterruptedExc HttpResponse response = this.client.fetch( path, method, - IdentifierPayloadMapper.buildUpdateNamePayload(info.getName()) + info ); return Utils.fromJson(response.body(), Identifier.class); } @@ -258,17 +258,15 @@ public EventResult create(String name, CreateIdentifierArgs kargs) throws Interr rmids = rstateDeserialized.stream().map(KeyStateRecord::getI).toList(); } - Map jsondata = IdentifierPayloadMapper.buildCreatePayload( - name, - serder.getKed(), - sigs, - proxy, - smids, - rmids, - keeper.getAlgo(), - keeper.getParams().toMap(), - extern - ); + Map jsondata = new LinkedHashMap<>(); + jsondata.put("name", name); + jsondata.put("icp", serder.getKed()); + jsondata.put("sigs", sigs); + jsondata.put("proxy", proxy); + jsondata.put("smids", smids); + jsondata.put("rmids", rmids); + + jsondata.put(algo.getValue(), keeper.getParams().toMap()); this.client.setPidx(this.client.getPidx() + 1); @@ -299,10 +297,14 @@ public EventResult addEndRole(String name, String role, String eid, String stamp Keeping.SignResult signResult = keeper.sign(rpy.getRaw().getBytes()); List sigs = signResult.signatures(); + LinkedHashMap jsondata = new LinkedHashMap<>(); + jsondata.put("rpy", rpy.getKed()); + jsondata.put("sigs", sigs); + HttpResponse res = this.client.fetch( "/identifiers/" + name + "/endroles", "POST", - IdentifierPayloadMapper.buildEndRolePayload(rpy.getKed(), sigs) + jsondata ); return new EventResult(rpy, sigs, res); } diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java deleted file mode 100644 index ebaaec17..00000000 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierPayloadMapper.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.cardanofoundation.signify.app.aiding; - -import com.fasterxml.jackson.core.type.TypeReference; -import org.cardanofoundation.signify.core.Manager.Algos; -import org.cardanofoundation.signify.generated.keria.model.EndrolesAidPostRequest; -import org.cardanofoundation.signify.generated.keria.model.IdentifiersNamePutRequest; -import org.cardanofoundation.signify.generated.keria.model.IdentifiersPostRequest; -import org.cardanofoundation.signify.cesr.util.Utils; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import jakarta.annotation.Nonnull; -import jakarta.annotation.Nullable; - -/** - * Helper to build request payloads for identifier endpoints using generated KERIA models. - */ -public final class IdentifierPayloadMapper { - - private IdentifierPayloadMapper() { - } - - public static Map buildCreatePayload( - String name, - @Nonnull Map icp, - @Nonnull List sigs, - @Nullable String proxy, - @Nullable List smids, - @Nullable List rmids, - @Nonnull Algos algo, - @Nonnull Map algoParams, - @Nullable Object extern - ) { - IdentifiersPostRequest request = new IdentifiersPostRequest() - .name(name) - .icp(icp) - .sigs(sigs) - .extern(extern); - - switch (algo) { - case salty -> request.setSalty(algoParams); - case randy -> request.setRandy(algoParams); - case group -> request.setGroup(algoParams); - default -> throw new IllegalArgumentException("Invalid algo: " + algo); - } - - Map payload = toPayloadMap(request); - - if (proxy != null) { - payload.put("proxy", proxy); - } - if (smids != null) { - payload.put("smids", smids); - } - if (rmids != null) { - payload.put("rmids", rmids); - } - - return payload; - } - - public static IdentifiersNamePutRequest buildUpdateNamePayload(String newName) { - return new IdentifiersNamePutRequest().name(newName); - } - - public static EndrolesAidPostRequest buildEndRolePayload(Object rpy, List sigs) { - return new EndrolesAidPostRequest() - .rpy(rpy) - .sigs(sigs); - } - - private static Map toPayloadMap(Object data) { - if (data == null) { - return new LinkedHashMap<>(); - } - String json = Utils.jsonStringify(data); - return Utils.fromJson(json, new TypeReference<>() {}); - } -} From 305e1ae8ab4c2d40e6ba153919684c0986474ed3 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Wed, 10 Dec 2025 16:28:13 +0700 Subject: [PATCH 16/24] chore: use inline builder for Identifier --- .../signify/app/RegistryTest.java | 25 +++++++++---------- .../signify/core/ManagerTest.java | 15 +++++------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java b/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java index a4b0c11c..a27acf2f 100644 --- a/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/RegistryTest.java @@ -43,8 +43,7 @@ void setUp() { @Test @DisplayName("should create a registry") void shouldCreateRegistry() throws Exception { - Identifier hab = new Identifier(); - hab.setPrefix("hab prefix"); + Identifier hab = new Identifier().prefix("hab prefix"); KeyStateRecord keyStateRecord = new KeyStateRecord(); keyStateRecord.setS("0"); @@ -79,17 +78,17 @@ void shouldCreateRegistry() throws Exception { @Test @DisplayName("should fail on establishment only for now") void shouldFailOnEstablishmentOnly() throws Exception { - Identifier hab = new Identifier(); - hab.setPrefix("hab prefix"); - hab.setName("a name"); - hab.setTransferable(true); - hab.setWindexes(Collections.emptyList()); - - KeyStateRecord keyStateRecord = new KeyStateRecord(); - keyStateRecord.setS("0"); - keyStateRecord.setD("a digest"); - keyStateRecord.setC(Collections.singletonList("EO")); - hab.setState(keyStateRecord); + KeyStateRecord keyStateRecord = new KeyStateRecord() + .s("0") + .d("a digest") + .c(Collections.singletonList("EO")); + + Identifier hab = new Identifier() + .prefix("hab prefix") + .name("a name") + .transferable(true) + .windexes(Collections.emptyList()) + .state(keyStateRecord); when(mockedIdentifiers.get("a name")).thenReturn(Optional.of(hab)); when(mockedClient.identifiers()).thenReturn(mockedIdentifiers); diff --git a/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java b/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java index cc4ad917..f96638ac 100644 --- a/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java +++ b/src/test/java/org/cardanofoundation/signify/core/ManagerTest.java @@ -704,13 +704,14 @@ void testManager_ShouldSupportCreatingAndGettingRandyKeeper() throws DigestExcep randyKeyState.setNxts(keeper0.getParams().getNxts()); randyKeyState.setPrxs(keeper0.getParams().getPrxs()); - Identifier identifier = new Identifier(); - identifier.setPrefix(prefixes.getQb64()); - identifier.setName(""); - identifier.setState(new KeyStateRecord()); - identifier.setRandy(randyKeyState); - identifier.setTransferable(true); - identifier.setWindexes(Collections.emptyList()); + Identifier identifier = new Identifier() + .prefix(prefixes.getQb64()) + .name("") + .state(new KeyStateRecord()) + .randy(randyKeyState) + .transferable(true) + .windexes(Collections.emptyList()); + Keeping.Keeper keeper1 = manager.get(identifier); assertInstanceOf(Keeping.RandyKeeper.class, keeper1); From cbf3016f3081ceab0aa3b04652a15b414f5b4111 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Thu, 11 Dec 2025 00:23:06 +0700 Subject: [PATCH 17/24] chore: correct getTier() --- src/main/java/org/cardanofoundation/signify/core/Manager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cardanofoundation/signify/core/Manager.java b/src/main/java/org/cardanofoundation/signify/core/Manager.java index beaab72b..f517bdd1 100644 --- a/src/main/java/org/cardanofoundation/signify/core/Manager.java +++ b/src/main/java/org/cardanofoundation/signify/core/Manager.java @@ -125,7 +125,8 @@ public void setSalt(String salt) throws LibsodiumException { public Tier getTier() { String tier = this.ks.getGbls("tier"); - return Tier.fromValue(tier == null ? Tier.LOW.getValue() : tier); + if (tier == null) return null; + return Tier.fromValue(tier); } public void setTier(Tier tier) { From d4243dd7090e0a4aeaf7ed97f12f37ab63c851fe Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Thu, 11 Dec 2025 00:43:49 +0700 Subject: [PATCH 18/24] chore: remove unused file --- .../app/config/GeneratedModelMapper.java | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java diff --git a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java b/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java deleted file mode 100644 index 5c7fd045..00000000 --- a/src/main/java/org/cardanofoundation/signify/app/config/GeneratedModelMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.cardanofoundation.signify.app.config; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.cardanofoundation.signify.generated.keria.model.Identifier; - -/** - * Shared accessor for the generated-model ObjectMapper. - */ -public final class GeneratedModelMapper { - private static final ObjectMapper MAPPER = GeneratedModelConfig.mapper(); - - private GeneratedModelMapper() { - } - - public static ObjectMapper mapper() { - return MAPPER; - } - - public static T read(String json, Class type) { - try { - return MAPPER.readValue(json, type); - } catch (Exception e) { - throw new RuntimeException("Failed to parse generated model JSON", e); - } - } - - public static T read(String json, TypeReference type) { - try { - return MAPPER.readValue(json, type); - } catch (Exception e) { - throw new RuntimeException("Failed to parse generated model JSON", e); - } - } -} From 50ed3aa010987f0c21cc7857a8185e41e2ea0f19 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Sun, 14 Dec 2025 15:02:39 +0700 Subject: [PATCH 19/24] chore: use EndrolesAidPostRequest for addEndRole api --- .../signify/app/aiding/IdentifierController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java index 7b9f4543..dcb2d8fe 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java @@ -26,6 +26,7 @@ import java.security.DigestException; import java.util.*; import java.util.concurrent.ExecutionException; +import org.cardanofoundation.signify.generated.keria.model.EndrolesAidPostRequest; import org.cardanofoundation.signify.generated.keria.model.Identifier; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; @@ -297,14 +298,14 @@ public EventResult addEndRole(String name, String role, String eid, String stamp Keeping.SignResult signResult = keeper.sign(rpy.getRaw().getBytes()); List sigs = signResult.signatures(); - LinkedHashMap jsondata = new LinkedHashMap<>(); - jsondata.put("rpy", rpy.getKed()); - jsondata.put("sigs", sigs); + EndrolesAidPostRequest endrolesAidPostRequest = new EndrolesAidPostRequest() + .rpy(rpy.getKed()) + .sigs(sigs); HttpResponse res = this.client.fetch( "/identifiers/" + name + "/endroles", "POST", - jsondata + endrolesAidPostRequest ); return new EventResult(rpy, sigs, res); } From e604625c32697beeacb7c90de6cbcd20ac53c7fa Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Sun, 14 Dec 2025 19:41:21 +0700 Subject: [PATCH 20/24] feat: Update KeyStates to user KeyStateRecord --- .../signify/app/coring/KeyStates.java | 22 ++-- .../signify/app/BaseMockServerTest.java | 111 +++++++++++++++++- .../signify/e2e/utils/TestUtils.java | 21 +--- 3 files changed, 122 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java b/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java index d6fed4ce..66f2abdd 100644 --- a/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java +++ b/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java @@ -1,16 +1,17 @@ package org.cardanofoundation.signify.app.coring; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; +import org.cardanofoundation.signify.cesr.exceptions.serialize.SerializeException; import org.cardanofoundation.signify.cesr.util.Utils; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import java.io.IOException; import java.net.HttpURLConnection; import java.net.http.HttpResponse; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; public class KeyStates { public final SignifyClient client; @@ -32,7 +33,7 @@ public KeyStates(SignifyClient client) { * @return Optional containing a map representing the key states, or empty if not found * @throws Exception if the fetch operation fails */ - public Optional get(String pre) throws LibsodiumException, IOException, InterruptedException { + public Optional get(String pre) throws LibsodiumException, IOException, InterruptedException { String path = "/states?pre=" + pre; String method = "GET"; HttpResponse res = this.client.fetch(path, method, null); @@ -41,21 +42,18 @@ public Optional get(String pre) throws LibsodiumException, IOException, return Optional.empty(); } - return Optional.of(Utils.fromJson(res.body(), Object.class)); + return Optional.of(Utils.fromJson(res.body(), KeyStateRecord.class)); } /** * Retrieve the key state for a list of identifiers - * - * @param pres List of identifier prefixes - * @return A map representing the key states - * @throws Exception if the fetch operation fails */ - public Object list(List pres) throws LibsodiumException, IOException, InterruptedException { + public List list(List pres) throws LibsodiumException, IOException, InterruptedException { String path = "/states?" + String.join("&", pres.stream().map(pre -> "pre=" + pre).toArray(String[]::new)); String method = "GET"; HttpResponse res = this.client.fetch(path, method, null); - return Utils.fromJson(res.body(), Object.class); + + return Arrays.asList(Utils.fromJson(res.body(), KeyStateRecord[].class)); } /** diff --git a/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java b/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java index 51a10055..41048712 100644 --- a/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java @@ -189,6 +189,101 @@ void tearDown() throws Exception { "windexes": [] }"""; + public static final String MOCK_KEY_STATE = """ + { + "vn": [1, 0], + "i": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "s": "0", + "p": "", + "d": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "f": "0", + "dt": "2023-08-21T22:30:46.473545+00:00", + "et": "icp", + "kt": "1", + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": "1", + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "ee": { + "s": "0", + "d": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "br": [], + "ba": [] + }, + "di": "" + }"""; + + public static final String MOCK_KEY_STATES_ARRAY = """ + [ + { + "vn": [1, 0], + "i": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "s": "0", + "p": "", + "d": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "f": "0", + "dt": "2023-08-21T22:30:46.473545+00:00", + "et": "icp", + "kt": "1", + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": "1", + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "ee": { + "s": "0", + "d": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "br": [], + "ba": [] + }, + "di": "" + }, + { + "vn": [1, 0], + "i": "ELUvZ8aJEHAQE-0nsevyYTP98rBbGJUrTj5an-pCmwrK", + "s": "0", + "p": "", + "d": "ELUvZ8aJEHAQE-0nsevyYTP98rBbGJUrTj5an-pCmwrK", + "f": "0", + "dt": "2023-08-21T22:30:46.473545+00:00", + "et": "icp", + "kt": "1", + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": "1", + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "ee": { + "s": "0", + "d": "ELUvZ8aJEHAQE-0nsevyYTP98rBbGJUrTj5an-pCmwrK", + "br": [], + "ba": [] + }, + "di": "" + } + ]"""; + + public static final String MOCK_KEY_EVENT = """ + { + "v": "KERI10JSON00012b_", + "t": "icp", + "d": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "i": "EP10ooRj0DJF0HWZePEYMLPl-arMV-MAoTKK-o3DXbgX", + "s": "0", + "kt": "1", + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": "1", + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "a": [] + }"""; + public static final String MOCK_CREDENTIAL = """ { "sad": { @@ -253,9 +348,19 @@ public MockResponse mockAllRequests(RecordedRequest req) throws LibsodiumExcepti null ); - String body = reqUrl.startsWith(url + "/identifiers/aid1/credentials") - ? MOCK_CREDENTIAL - : MOCK_GET_AID; + String body; + if (reqUrl.startsWith(url + "/identifiers/aid1/credentials")) { + body = MOCK_CREDENTIAL; + } else if (reqUrl.startsWith(url + "/events")) { + body = MOCK_KEY_EVENT; + } else if (reqUrl.startsWith(url + "/states")) { + // Return array if multiple prefixes in query params, single object otherwise + String query = req.getRequestUrl().query(); + long preCount = query != null ? query.split("pre=").length - 1 : 0; + body = preCount > 1 ? MOCK_KEY_STATES_ARRAY : MOCK_KEY_STATE; + } else { + body = MOCK_GET_AID; + } MockResponse mockResponse = new MockResponse() .setResponseCode(202) diff --git a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java index 67b4996b..9d71032b 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/utils/TestUtils.java @@ -30,6 +30,8 @@ import java.util.concurrent.*; import java.util.function.Supplier; import java.util.stream.Collectors; + +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.cardanofoundation.signify.generated.keria.model.Tier; import static org.cardanofoundation.signify.app.coring.Coring.randomPasscode; @@ -369,23 +371,8 @@ public static Object getOrIssueCredential( return credential; } - public static List getStates(SignifyClient client, List prefixes) { - List participantStates = prefixes.stream().map(p -> { - try { - return client.keyStates().get(p).get(); - } catch (Exception e) { - throw new RuntimeException("Error fetching key states for prefix: " + p, e); - } - }).toList(); - return participantStates.stream().map(s -> { - if (s instanceof List) { - return ((List) s).get(0); - } else if (s instanceof Object) { - return ((Object[]) s)[0]; - } else { - throw new IllegalArgumentException("Unexpected type: " + s.getClass()); - } - }).collect(Collectors.toList()); + public static List getStates(SignifyClient client, List prefixes) throws IOException, InterruptedException { + return client.keyStates().list(prefixes); } public static Boolean hasEndRole(SignifyClient client, String alias, String role, String eid) throws Exception { From b00ea03c26132156b6c743186bd7d9a8b6f81be2 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Sun, 14 Dec 2025 19:42:11 +0700 Subject: [PATCH 21/24] feat: update KeyStateRecordDeserializer --- .../aiding/KeyStateRecordDeserializer.java | 14 +- .../KeyStateRecordDeserializerTest.java | 148 ++++++++++++++++++ 2 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializerTest.java diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java index f9e20428..70c8f703 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializer.java @@ -38,8 +38,18 @@ private void coerceToString(ObjectNode node, String field) { if (value == null) { return; } - // Leave arrays (kt/nt can be arrays of strings); fail fast otherwise. - if (value.isTextual() || value.isArray()) { + // If already a string, leave it + if (value.isTextual()) { + return; + } + // If it's an array, convert to JSON string representation + if (value.isArray()) { + node.put(field, value.toString()); + return; + } + // If it's a number, convert to string + if (value.isNumber()) { + node.put(field, value.asText()); return; } throw new IllegalArgumentException("Unexpected type for field '" + field + "': " + value.getNodeType()); diff --git a/src/test/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializerTest.java b/src/test/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializerTest.java new file mode 100644 index 00000000..e7567301 --- /dev/null +++ b/src/test/java/org/cardanofoundation/signify/app/aiding/KeyStateRecordDeserializerTest.java @@ -0,0 +1,148 @@ +package org.cardanofoundation.signify.app.aiding; + +import org.cardanofoundation.signify.cesr.util.Utils; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Test KeyStateRecordDeserializer handles kt/nt fields in various formats + */ +class KeyStateRecordDeserializerTest { + + @Test + @DisplayName("Deserialize kt as string") + void testKtAsString() { + String json = """ + { + "vn": [1, 0], + "i": "EK3", + "s": "0", + "p": "", + "d": "EK3", + "f": "0", + "dt": "2023-08-23T15:16:07.553000+00:00", + "et": "icp", + "kt": "1", + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": "1", + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "ee": { "s": "0", "d": "EK3", "br": [], "ba": [] }, + "di": "" + } + """; + + KeyStateRecord record = Utils.fromJson(json, KeyStateRecord.class); + + assertNotNull(record); + assertEquals("EK3", record.getI()); + assertEquals("1", record.getKt()); + assertEquals("1", record.getNt()); + } + + @Test + @DisplayName("Deserialize kt as array") + void testKtAsArray() { + String json = """ + { + "vn": [1, 0], + "i": "EK3", + "s": "0", + "p": "", + "d": "EK3", + "f": "0", + "dt": "2023-08-23T15:16:07.553000+00:00", + "et": "icp", + "kt": ["1/2", "1/2", "1/2"], + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": ["1/2", "1/2"], + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "ee": { "s": "0", "d": "EK3", "br": [], "ba": [] }, + "di": "" + } + """; + + KeyStateRecord record = Utils.fromJson(json, KeyStateRecord.class); + + assertNotNull(record); + assertEquals("EK3", record.getI()); + // Arrays should be converted to JSON string representation + assertTrue(record.getKt().contains("1/2")); + assertTrue(record.getNt().contains("1/2")); + } + + @Test + @DisplayName("Deserialize kt as number") + void testKtAsNumber() { + String json = """ + { + "vn": [1, 0], + "i": "EK3", + "s": "0", + "p": "", + "d": "EK3", + "f": "0", + "dt": "2023-08-23T15:16:07.553000+00:00", + "et": "icp", + "kt": 2, + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": 3, + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "ee": { "s": "0", "d": "EK3", "br": [], "ba": [] }, + "di": "" + } + """; + + KeyStateRecord record = Utils.fromJson(json, KeyStateRecord.class); + + assertNotNull(record); + assertEquals("EK3", record.getI()); + assertEquals("2", record.getKt()); + assertEquals("3", record.getNt()); + } + + @Test + @DisplayName("Deserialize with mixed kt string and nt array") + void testMixedTypes() { + String json = """ + { + "vn": [1, 0], + "i": "EK3", + "s": "0", + "p": "", + "d": "EK3", + "f": "0", + "dt": "2023-08-23T15:16:07.553000+00:00", + "et": "icp", + "kt": "1", + "k": ["DPmhSfdhCPxr3EqjxzEtF8TVy0YX7ATo0Uc8oo2cnmY9"], + "nt": ["1/2", "1/2"], + "n": ["EAORnRtObOgNiOlMolji-KijC_isa3lRDpHCsol79cOc"], + "bt": "0", + "b": [], + "c": [], + "ee": { "s": "0", "d": "EK3", "br": [], "ba": [] }, + "di": "" + } + """; + + KeyStateRecord record = Utils.fromJson(json, KeyStateRecord.class); + + assertNotNull(record); + assertEquals("EK3", record.getI()); + assertEquals("1", record.getKt()); + assertTrue(record.getNt().contains("1/2")); + } +} + From 3970072dc01a4b36bbafd9e28d22dbf634be2398 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Sun, 14 Dec 2025 20:35:59 +0700 Subject: [PATCH 22/24] feat: handle logic KeyStates get method return an array --- .../signify/app/coring/KeyStates.java | 23 ++++++-- .../signify/e2e/SinglesigIXNTest.java | 33 ++++++------ .../signify/e2e/SinglesigROTTest.java | 54 ++++++++----------- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java b/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java index 66f2abdd..9e219d41 100644 --- a/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java +++ b/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java @@ -1,10 +1,7 @@ package org.cardanofoundation.signify.app.coring; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; -import org.cardanofoundation.signify.cesr.exceptions.serialize.SerializeException; import org.cardanofoundation.signify.cesr.util.Utils; import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; @@ -41,8 +38,24 @@ public Optional get(String pre) throws LibsodiumException, IOExc if (res.statusCode() == HttpURLConnection.HTTP_NOT_FOUND) { return Optional.empty(); } - - return Optional.of(Utils.fromJson(res.body(), KeyStateRecord.class)); + + String body = res.body(); + if (body == null || body.isBlank()) { + return Optional.empty(); + } + + // Note: KERIA can return either a single object or an array + // Check if response is an array or single object + String trimmed = body.trim(); + if (trimmed.startsWith("[")) { + KeyStateRecord[] records = Utils.fromJson(body, KeyStateRecord[].class); + if (records == null || records.length == 0) { + return Optional.empty(); + } + return Optional.of(records[0]); + } else { + return Optional.of(Utils.fromJson(body, KeyStateRecord.class)); + } } /** diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigIXNTest.java b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigIXNTest.java index d2dab0b2..61300c9f 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigIXNTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigIXNTest.java @@ -5,6 +5,7 @@ import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; import org.cardanofoundation.signify.e2e.utils.TestUtils; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -12,7 +13,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; -import java.util.Map; import static org.cardanofoundation.signify.e2e.utils.TestUtils.*; import static org.junit.jupiter.api.Assertions.*; @@ -54,40 +54,40 @@ public void getContact() throws IOException, InterruptedException, LibsodiumExce public void singlesig_ixn_step1() throws Exception { assertEquals(name1_id, contact1_id); - List> keyState1List = (List>) client1.keyStates().get(name1_id).get(); - assertEquals(1, keyState1List.size()); - List> keyState2List = (List>) client1.keyStates().get(contact1_id).get(); - assertEquals(keyState2List.getFirst().get("s"), keyState1List.getFirst().get("s")); + KeyStateRecord keyState1 = client1.keyStates().get(name1_id).get(); + KeyStateRecord keyState2 = client1.keyStates().get(contact1_id).get(); + assertEquals(keyState1.getS(), keyState2.getS()); } @Test public void singlesig_ixn_ixn1() throws Exception { // local keystate before rot - List> listKeyState0 = (List>) client1.keyStates().get(name1_id).get(); - assertNotNull(listKeyState0); + KeyStateRecord keyStateRecord0 = client1.keyStates().get(name1_id).get(); + assertNotNull(keyStateRecord0); // ixn EventResult result = client1.identifiers().interact("name1", null); waitOperation(client1, result.op()); // local keystate after rot - List> listKeyState1 = (List>) client1.keyStates().get(name1_id).get(); - assertTrue(parseInteger(listKeyState1.getFirst().get("s").toString()) > 0); + KeyStateRecord keyStateRecord1 = client1.keyStates().get(name1_id).get(); + + assertTrue(parseInteger(keyStateRecord1.getS()) > 0); // sequence has incremented - assertEquals(parseInteger(listKeyState1.getFirst().get("s").toString()), - parseInteger(listKeyState0.getFirst().get("s").toString()) + 1 + assertEquals(parseInteger(keyStateRecord1.getS()), + parseInteger(keyStateRecord0.getS()) + 1 ); // remote keystate after ixn - List> listKeyState2 = (List>) client2.keyStates().get(contact1_id).get(); + KeyStateRecord keyStateRecord2 = client2.keyStates().get(contact1_id).get(); // remote keystate is one behind - assertEquals(parseInteger(listKeyState2.getFirst().get("s").toString()), - parseInteger(listKeyState1.getFirst().get("s").toString()) - 1 + assertEquals(parseInteger(keyStateRecord2.getS()), + parseInteger(keyStateRecord1.getS()) - 1 ); // refresh remote keystate - String sn = listKeyState1.getFirst().get("s").toString(); + String sn = keyStateRecord1.getS(); Object op = client2.keyStates().query(contact1_id, sn, null); op = waitOperation(client2, op); @@ -96,7 +96,6 @@ public void singlesig_ixn_ixn1() throws Exception { // local and remote keystate match assertEquals(keyState3.get("s"), - listKeyState1.getFirst().get("s") - ); + keyStateRecord1.getS()); } } diff --git a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigROTTest.java b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigROTTest.java index cf29c298..05f5923e 100644 --- a/src/test/java/org/cardanofoundation/signify/e2e/SinglesigROTTest.java +++ b/src/test/java/org/cardanofoundation/signify/e2e/SinglesigROTTest.java @@ -5,6 +5,7 @@ import org.cardanofoundation.signify.app.clienting.SignifyClient; import org.cardanofoundation.signify.app.coring.Operation; import org.cardanofoundation.signify.cesr.exceptions.LibsodiumException; +import org.cardanofoundation.signify.generated.keria.model.KeyStateRecord; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -55,27 +56,23 @@ public void getContact() throws IOException, InterruptedException, LibsodiumExce public void singlesig_rot_step1() throws Exception { assertEquals(name1_id, contact1_id); - List> keyState1List = (List>) client1.keyStates().get(name1_id).get(); - assertEquals(1, keyState1List.size()); - - List> keyState2List = (List>) client1.keyStates().get(contact1_id).get(); - assertEquals(1, keyState2List.size()); + KeyStateRecord keyState1 = client1.keyStates().get(name1_id).get(); + KeyStateRecord keyState2 = client1.keyStates().get(contact1_id).get(); // local and remote keystate sequence match - assertEquals(keyState1List.getFirst().get("s"), keyState2List.getFirst().get("s")); + assertEquals(keyState1.getS(), keyState2.getS()); } @Test public void singlesig_rot_rot1() throws Exception { // local keystate before rot - List> listKeyState0 = (List>) client1.keyStates().get(name1_id).get(); - assertNotNull(listKeyState0); + KeyStateRecord keyStateRecord0 = client1.keyStates().get(name1_id).get(); - ArrayList responseList = (ArrayList) listKeyState0.getFirst().get("k"); + List responseList = keyStateRecord0.getK(); assertEquals(1, responseList.size()); responseList.get(0); - responseList = (ArrayList) listKeyState0.getFirst().get("n"); + responseList = keyStateRecord0.getN(); assertEquals(1, responseList.size()); // rot @@ -84,44 +81,35 @@ public void singlesig_rot_rot1() throws Exception { waitOperation(client1, result.op()); // local keystate after rot - List> listKeyState1 = (List>) client1.keyStates().get(name1_id).get(); - assertTrue(parseInteger(listKeyState1.getFirst().get("s").toString()) > 0); + KeyStateRecord keyStateRecord1 = client1.keyStates().get(name1_id).get(); + assertTrue(parseInteger(keyStateRecord1.getS()) > 0); // sequence has incremented - assertEquals(parseInteger(listKeyState1.getFirst().get("s").toString()), - parseInteger(listKeyState0.getFirst().get("s").toString()) + 1 + assertEquals(parseInteger(keyStateRecord1.getS()), + parseInteger(keyStateRecord0.getS()) + 1 ); // current keys changed - assertNotEquals(listKeyState1.getFirst().get("k"), - listKeyState0.getFirst().get("k") - ); + assertNotEquals(keyStateRecord1.getK(), keyStateRecord0.getK()); // next key hashes changed - assertNotEquals(listKeyState1.getFirst().get("n"), - listKeyState0.getFirst().get("n") - ); + assertNotEquals(keyStateRecord1.getN(), keyStateRecord0.getN()); // remote keystate after rot - List> listKeyState2 = (List>) client2.keyStates().get(contact1_id).get(); - assertEquals(parseInteger(listKeyState2.getFirst().get("s").toString()), - parseInteger(listKeyState1.getFirst().get("s").toString()) - 1 + KeyStateRecord keyStateRecord2 = client2.keyStates().get(contact1_id).get(); + + assertEquals(parseInteger(keyStateRecord2.getS()), + parseInteger(keyStateRecord1.getS()) - 1 ); // refresh remote keystate - String sn = listKeyState1.getFirst().get("s").toString(); + String sn = keyStateRecord1.getS(); Operation op = Operation.fromObject(client2.keyStates().query(contact1_id, sn, null)); op = waitOperation(client2, op); response = (HashMap) op.getResponse(); HashMap keyState3 = response; // local and remote keystate match - assertEquals(keyState3.get("s"), - listKeyState1.getFirst().get("s") - ); - assertEquals(keyState3.get("k"), - listKeyState1.getFirst().get("k") - ); - assertEquals(keyState3.get("n"), - listKeyState1.getFirst().get("n") - ); + assertEquals(keyState3.get("s"), keyStateRecord1.getS()); + assertEquals(keyState3.get("k"), keyStateRecord1.getK()); + assertEquals(keyState3.get("n"), keyStateRecord1.getN()); } } From bcffb6af06af7db405854f3e29baf20628f008e0 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Tue, 16 Dec 2025 17:53:54 +0700 Subject: [PATCH 23/24] feat: add TODO for using generated model request IdentifiersPostRequest --- .../signify/app/aiding/IdentifierController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java index dcb2d8fe..75e55915 100644 --- a/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java +++ b/src/main/java/org/cardanofoundation/signify/app/aiding/IdentifierController.java @@ -259,6 +259,7 @@ public EventResult create(String name, CreateIdentifierArgs kargs) throws Interr rmids = rstateDeserialized.stream().map(KeyStateRecord::getI).toList(); } + // TODO use generated model request IdentifiersPostRequest, when it supports dynamic fields (proxy, smids, rmids) Map jsondata = new LinkedHashMap<>(); jsondata.put("name", name); jsondata.put("icp", serder.getKed()); From fc304fea0a52d8fa09baecbe0b768b24d7b28ba9 Mon Sep 17 00:00:00 2001 From: Sotatek-DucPhung Date: Wed, 24 Dec 2025 00:55:40 +0700 Subject: [PATCH 24/24] feat: simplify KeyStates response handling to always return first KeyStateRecord --- .../signify/app/coring/KeyStates.java | 19 ++++--------------- .../signify/app/BaseMockServerTest.java | 4 ++-- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java b/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java index 9e219d41..8666931e 100644 --- a/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java +++ b/src/main/java/org/cardanofoundation/signify/app/coring/KeyStates.java @@ -39,23 +39,12 @@ public Optional get(String pre) throws LibsodiumException, IOExc return Optional.empty(); } - String body = res.body(); - if (body == null || body.isBlank()) { + // Note: KERIA always returns an array (at least empty array, or array with length 1 for single identifier) + KeyStateRecord[] records = Utils.fromJson(res.body(), KeyStateRecord[].class); + if (records.length == 0) { return Optional.empty(); } - - // Note: KERIA can return either a single object or an array - // Check if response is an array or single object - String trimmed = body.trim(); - if (trimmed.startsWith("[")) { - KeyStateRecord[] records = Utils.fromJson(body, KeyStateRecord[].class); - if (records == null || records.length == 0) { - return Optional.empty(); - } - return Optional.of(records[0]); - } else { - return Optional.of(Utils.fromJson(body, KeyStateRecord.class)); - } + return Optional.of(records[0]); } /** diff --git a/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java b/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java index 41048712..7de29798 100644 --- a/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java +++ b/src/test/java/org/cardanofoundation/signify/app/BaseMockServerTest.java @@ -354,10 +354,10 @@ public MockResponse mockAllRequests(RecordedRequest req) throws LibsodiumExcepti } else if (reqUrl.startsWith(url + "/events")) { body = MOCK_KEY_EVENT; } else if (reqUrl.startsWith(url + "/states")) { - // Return array if multiple prefixes in query params, single object otherwise + // KERIA always returns an array (at least empty array, or array with items) String query = req.getRequestUrl().query(); long preCount = query != null ? query.split("pre=").length - 1 : 0; - body = preCount > 1 ? MOCK_KEY_STATES_ARRAY : MOCK_KEY_STATE; + body = preCount > 1 ? MOCK_KEY_STATES_ARRAY : "[" + MOCK_KEY_STATE + "]"; } else { body = MOCK_GET_AID; }