Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Issue-837]: resolve issue with attestation on entity update #258

Merged
merged 1 commit into from
Apr 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -800,16 +800,19 @@ private JsonNode getUserInfoFromKeyCloak(HttpServletRequest request, String enti
private JsonNode getUserInfoFromRegistry(HttpServletRequest request, String entityName) throws Exception {
String userId = getUserId(request,entityName);
if (userId != null) {
ObjectNode payload = getSearchByOwnerQuery(entityName, userId);

watch.start("RegistryController.searchEntity");
JsonNode result = searchEntity(payload);
watch.stop("RegistryController.searchEntity");
return result;
return getEntityByUserId(entityName, userId);
}
throw new Exception("Forbidden");
}

private JsonNode getEntityByUserId(String entityName, String userId) throws Exception {
ObjectNode payload = getSearchByOwnerQuery(entityName, userId);
watch.start("RegistryController.searchEntity");
JsonNode result = searchEntity(payload);
watch.stop("RegistryController.searchEntity");
return result;
}

@NotNull
private ObjectNode getSearchByOwnerQuery(String entityName, String userId) {
ObjectNode payload = JsonNodeFactory.instance.objectNode();
Expand Down Expand Up @@ -985,7 +988,7 @@ public void invalidateAttestation(String entityName, String entityId, String use
}
if (entity.has(policyName) && entity.get(policyName).isArray()) {
ArrayNode attestations = (ArrayNode) entity.get(policyName);
updateAttestation(attestations, propertyToUpdate);
updateAttestation(attestationPolicy.getAttestorEntity(), userId, entity, attestations, propertyToUpdate);
}
}
if (entity != null) {
Expand All @@ -999,18 +1002,53 @@ public String getPropertyToUpdate(HttpServletRequest request, String entityId){
String propertyURI = getPropertyURI(entityId, request);
return propertyURI.split("/")[0];
}
private void updateAttestation(ArrayNode attestations,String propertyToUpdate) {
private void updateAttestation(String attestorEntity, String userId, JsonNode entity, ArrayNode attestations,String propertyToUpdate) throws Exception {
for (JsonNode attestation : attestations) {
if (attestation.get(_osState.name()).asText().equals(States.PUBLISHED.name())
&& !attestation.get("name").asText().equals(propertyToUpdate)
){
ObjectNode propertiesOSID = attestation.get("propertiesOSID").deepCopy();
JSONUtil.removeNode(propertiesOSID, uuidPropertyName);
((ObjectNode) attestation).set(_osState.name(), JsonNodeFactory.instance.textNode(States.INVALID.name()));
} else if (attestation.get(_osState.name()).asText().equals(States.ATTESTATION_REQUESTED.name())) {
AttestationPolicy attestationPolicy = getAttestationPolicy(attestation.get("entityName").asText(), attestation.get("name").asText());
ObjectNode propertiesOSID = attestation.get("propertiesOSID").deepCopy();
Map<String, List<String>> propertiesOSIDMapper = new HashMap<>();
ObjectReader reader = objectMapper.readerFor(new TypeReference<List<String>>() {
});
for (Iterator<Map.Entry<String, JsonNode>> it = propertiesOSID.fields(); it.hasNext(); ) {
Map.Entry<String, JsonNode> itr = it.next();
if(itr.getValue().isArray() && !itr.getValue().isEmpty() && itr.getValue().get(0).isTextual()) {
List<String> list = reader.readValue(itr.getValue());
propertiesOSIDMapper.put(itr.getKey(), list);
}
}
JsonNode propertyData = JSONUtil.extractPropertyDataFromEntity(entity, attestationPolicy.getAttestationProperties(), propertiesOSIDMapper);
if(!propertyData.equals(JSONUtil.convertStringJsonNode(attestation.get("propertyData").asText()))) {
((ObjectNode) attestation).set(_osState.name(), JsonNodeFactory.instance.textNode(States.DRAFT.name()));
invalidateClaim(attestorEntity, userId, attestation.get(_osClaimId.name()).asText());
}
}
}
}

public void invalidateClaim(String attestorEntityName, String userId, String claimId) throws Exception {
final String attestorPlugin = "did:internal:ClaimPluginActor";
Action action = Action.SET_TO_DRAFT;
ObjectNode additionalInputs = JsonNodeFactory.instance.objectNode();
JsonNode attestorInfo = getEntityByUserId(attestorEntityName, userId).get(attestorEntityName).get(0);
additionalInputs.put("claimId", claimId);
additionalInputs.put("action", action.name());
additionalInputs.put("notes", "Closed due to entity update");
additionalInputs.set("attestorInfo", attestorInfo);
PluginRequestMessage pluginRequestMessage = PluginRequestMessage.builder().build();
pluginRequestMessage.setAttestorPlugin(attestorPlugin);
pluginRequestMessage.setAdditionalInputs(additionalInputs);
pluginRequestMessage.setStatus(action.name());
pluginRequestMessage.setUserId(userId);
PluginRouter.route(pluginRequestMessage);
}

public Object getSignedDoc(JsonNode result, Object credentialTemplate) throws
SignatureException.CreationException, SignatureException.UnreachableException {
Map<String, Object> requestBodyMap = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ protected void onReceive(MessageProtos.Message request) throws Throwable {
case RAISE_CLAIM:
riseClaim(pluginRequestMessage);
break;
case SET_TO_DRAFT:
case GRANT_CLAIM:
case REJECT_CLAIM:
attestClaim(pluginRequestMessage);
Expand Down
Loading