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

Fixed attestation not working #289

Merged
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 @@ -74,6 +74,36 @@ public boolean hasCredential(String signatureProvider, JsonNode node) {
return node.get(property) != null && !node.get(property).asText().isEmpty();
}
},
attestation {
private String getCredentialPropertyName(String signatureProvider) {
String signatureProperty = _osAttestedData.name();
if(Objects.equals(signatureProvider, "dev.sunbirdrc.registry.service.impl.SignatureV2ServiceImpl")) {
signatureProperty = _osAttestedData.name();
}
return signatureProperty;
}
@Override
public void setCredential(String signatureProvider, JsonNode node, Object signedCredential) {
if(Objects.equals(signatureProvider, "dev.sunbirdrc.registry.service.impl.SignatureV2ServiceImpl")) {
JSONUtil.addField((ObjectNode) node, String.valueOf(_osAttestedData), ((ObjectNode) signedCredential).get("id").asText());
} else {
JSONUtil.addField((ObjectNode) node, String.valueOf(_osAttestedData), signedCredential.toString());
}
}
@Override
public void removeCredential(String signatureProvider, JsonNode node) {
((ObjectNode) node).put(getCredentialPropertyName(signatureProvider), "");
}
@Override
public JsonNode getCredential(String signatureProvider, JsonNode node) {
return node.get(getCredentialPropertyName(signatureProvider));
}
@Override
public boolean hasCredential(String signatureProvider, JsonNode node) {
String property = getCredentialPropertyName(signatureProvider);
return node.get(property) != null && !node.get(property).asText().isEmpty();
}
},
_osState, _osClaimId, _osAttestedData, _osSignedData, _osCredentialId;

public void createdBy(JsonNode node, String userId){};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import dev.sunbirdrc.registry.middleware.util.OSSystemFields;
import dev.sunbirdrc.registry.service.FileStorageService;
import dev.sunbirdrc.registry.service.ICertificateService;
import dev.sunbirdrc.registry.service.impl.SignatureV2ServiceImpl;
import dev.sunbirdrc.registry.transform.Configuration;
import dev.sunbirdrc.registry.transform.Data;
import dev.sunbirdrc.registry.transform.ITransformer;
Expand Down Expand Up @@ -432,10 +433,13 @@ private String getNotes(JsonNode requestBody) {

private JsonNode getAttestationSignedData(String attestationId, JsonNode node) throws AttestationNotFoundException, JsonProcessingException {
JsonNode attestationNode = getAttestationNode(attestationId, node);
if (attestationNode.get(OSSystemFields._osAttestedData.name()) == null)
if (!OSSystemFields.attestation.hasCredential(GenericConfiguration.getSignatureProvider(), attestationNode))
throw new AttestationNotFoundException();
attestationNode = objectMapper.readTree(attestationNode.get(OSSystemFields._osAttestedData.name()).asText());
return attestationNode;
JsonNode signed = OSSystemFields.attestation.getCredential(GenericConfiguration.getSignatureProvider(), attestationNode);
if(GenericConfiguration.getSignatureProvider().equals(SignatureV2ServiceImpl.class.getName())) {
return signed;
}
return objectMapper.readTree(signed.asText());
}

@Nullable
Expand All @@ -449,9 +453,6 @@ private JsonNode getAttestationNode(String attestationId, JsonNode node) throws
}
}
assert attestationNode != null;
if (attestationNode.get(OSSystemFields._osAttestedData.name()) == null)
throw new AttestationNotFoundException();
attestationNode = objectMapper.readTree(attestationNode.get(OSSystemFields._osAttestedData.name()).asText());
return attestationNode;
}

Expand Down Expand Up @@ -835,7 +836,7 @@ public ResponseEntity<Object> getSignedEntityByToken(@PathVariable String entity
JsonNode result = registryHelper.getRequestedUserDetails(request, entityName);
if (result.get(entityName).size() > 0) {
Object credentialTemplate = definitionsManager.getCredentialTemplate(entityName);
Object signedCredentials = registryHelper.getSignedDoc(result.get(entityName).get(0), credentialTemplate);
Object signedCredentials = registryHelper.getSignedDoc(entityName, result.get(entityName).get(0), credentialTemplate);
return new ResponseEntity<>(signedCredentials, HttpStatus.OK);
} else {
responseParams.setErrmsg("Entity not found");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import dev.sunbirdrc.registry.model.attestation.EntityPropertyURI;
import dev.sunbirdrc.registry.model.dto.AttestationRequest;
import dev.sunbirdrc.registry.service.*;
import dev.sunbirdrc.registry.service.impl.SignatureV2ServiceImpl;
import dev.sunbirdrc.registry.sink.shard.Shard;
import dev.sunbirdrc.registry.sink.shard.ShardManager;
import dev.sunbirdrc.registry.util.*;
Expand Down Expand Up @@ -604,10 +605,15 @@ public void updateState(PluginResponseMessage pluginResponseMessage) throws Exce
if (!signatureEnabled) {
throw new UnreachableException("Signature service not enabled!");
}
Object signedData = getSignedDoc(response, credentialTemplate);
String title = String.format("%s_%s", pluginResponseMessage.getSourceEntity(), pluginResponseMessage.getPolicyName());
Object signedData = getSignedDoc(title, response, credentialTemplate);
String value = signedData.toString();
if(GenericConfiguration.getSignatureProvider().equals(SignatureV2ServiceImpl.class.getName())) {
value = ((ObjectNode) signedData).get("id").asText();
}
metaData.put(
ATTESTED_DATA,
signedData.toString()
value
);
} else {
metaData.put(
Expand Down Expand Up @@ -1032,9 +1038,10 @@ private void updateAttestation(ArrayNode attestations,String propertyToUpdate) {
}
}

public Object getSignedDoc(JsonNode result, Object credentialTemplate) throws
public Object getSignedDoc(String title, JsonNode result, Object credentialTemplate) throws
SignatureException.CreationException, SignatureException.UnreachableException {
Map<String, Object> requestBodyMap = new HashMap<>();
requestBodyMap.put("title", title);
requestBodyMap.put("data", result);
requestBodyMap.put(CREDENTIAL_TEMPLATE, credentialTemplate);
return signatureHelper.sign(requestBodyMap);
Expand All @@ -1049,7 +1056,7 @@ public void signDocument(String entityName, String entityId, String userId) thro
if (credentialTemplate != null) {
ObjectNode updatedNode = (ObjectNode) readEntity(userId, entityName, entityId, false, null, false)
.get(entityName);
Object signedCredentials = getSignedDoc(updatedNode, credentialTemplate);
Object signedCredentials = getSignedDoc(entityId, updatedNode, credentialTemplate);
OSSystemFields.credentials.setCredential(GenericConfiguration.getSignatureProvider(), updatedNode, signedCredentials);
ObjectNode updatedNodeParent = JsonNodeFactory.instance.objectNode();
updatedNodeParent.set(entityName, updatedNode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public class CredentialSchemaService implements HealthIndicator {
private RetryRestTemplate retryRestTemplate;

public JsonNode convertCredentialTemplateToSchema(String title, Object credTemplate) throws IOException {
logger.debug("Converting credential template to credential schema for {}", title);
String name = "Proof of " + title + " Credential";
String schemaId = "Proof-of-" + title + "-Credential";
String templateJsonString = null;
Expand All @@ -77,27 +78,37 @@ public JsonNode convertCredentialTemplateToSchema(String title, Object credTempl
value.put("type", "string");
((ObjectNode) schemaProperties).set(key, value);
});
logger.debug("Successfully converted credential template to credential schema for {}", title);
return credSchema;
}

public void ensureCredentialSchemas() {
this.definitionsManager.getAllDefinitions()
.forEach(definition -> {
Map<String, Object> credTemplates = new HashMap<>();
this.definitionsManager.getAllDefinitions().forEach(definition -> {
Object credTemplate = definition.getOsSchemaConfiguration().getCredentialTemplate();
if(credTemplate != null) credTemplates.put(definition.getTitle(), credTemplate);
definition.getOsSchemaConfiguration().getAttestationPolicies().forEach(attestationPolicy -> {
if(attestationPolicy.getCredentialTemplate() != null) {
String name = String.format("%s_%s", definition.getTitle(), attestationPolicy.getName());
credTemplates.put(name, attestationPolicy.getCredentialTemplate());
}
});
});
credTemplates.forEach((key, value) -> {
try {
Object credTemplate = definition.getOsSchemaConfiguration().getCredentialTemplate();
if(credTemplate != null) {
this.ensureCredentialSchema(
definition.getTitle(),
credTemplate, null);
logger.info("Ensured credential schema for definition: {}", definition.getTitle());
}
this.ensureCredentialSchema(
key,
value, null);
logger.info("Ensured credential schema for : {}", key);
} catch (Exception e) {
logger.error("Exception occurred while ensuring credential Schema for {} : {}", key, ExceptionUtils.getStackTrace(e));
throw new RuntimeException(e);
}
});
}

public void ensureCredentialSchema(String title, Object credTemplate, String status) throws Exception {
logger.debug("Ensuring credential schema for {}", title);
JsonNode schema = convertCredentialTemplateToSchema(title, credTemplate);
ObjectNode prevSchema = (ObjectNode) getLatestSchemaByTags(Collections.singletonList(title));
String author = DIDService.ensureDidForName(authorName, authorDidMethod);
Expand All @@ -106,6 +117,7 @@ public void ensureCredentialSchema(String title, Object credTemplate, String sta
((ObjectNode) schema).set("authored", JsonNodeFactory.instance.textNode(authored));
if (prevSchema == null) {
createSchema(title, schema, status);
logger.debug("Created credential schema for {}", title);
} else {
ObjectNode prevProps = (ObjectNode) prevSchema.get("schema").get("schema").get("properties");
ObjectNode currProps = (ObjectNode) schema.get("schema").get("properties");
Expand All @@ -118,6 +130,7 @@ public void ensureCredentialSchema(String title, Object credTemplate, String sta
if(updateRequired.get()) {
if(status == null) status = prevSchema.get("status").asText();
updateSchema(did, version, schema, status);
logger.debug("Updated credential schema for {}", title);
}
}
}
Expand Down

This file was deleted.

Loading