|
1 | 1 | package com.danubetech.verifiablecredentials.validation; |
2 | 2 |
|
3 | 3 | import com.danubetech.verifiablecredentials.VerifiableCredential; |
| 4 | +import com.danubetech.verifiablecredentials.VerifiableCredentialV2; |
4 | 5 | import com.danubetech.verifiablecredentials.VerifiablePresentation; |
| 6 | +import com.danubetech.verifiablecredentials.credentialstatus.CredentialStatus; |
5 | 7 |
|
6 | 8 | import java.net.URI; |
7 | 9 | import java.net.URISyntaxException; |
| 10 | +import java.util.List; |
| 11 | +import java.util.Map; |
8 | 12 |
|
9 | 13 | public class Validation { |
10 | 14 |
|
@@ -70,4 +74,48 @@ public static void validate(VerifiablePresentation verifiablePresentation) throw |
70 | 74 | validateRun(() -> validateTrue(verifiablePresentation.getTypes().contains(VerifiablePresentation.DEFAULT_JSONLD_TYPES[0])), "type must contain VerifiablePresentation: " + verifiablePresentation.getTypes()); |
71 | 75 | validateRun(() -> validateTrue(verifiablePresentation.getVerifiableCredential() != null || verifiablePresentation.getJwtVerifiableCredentialString() != null), "Bad or missing 'verifiableCredential'."); |
72 | 76 | } |
| 77 | + |
| 78 | + |
| 79 | + public static void validate(VerifiableCredentialV2 verifiableCredential) throws IllegalStateException { |
| 80 | + |
| 81 | + foundation.identity.jsonld.validation.Validation.validate(verifiableCredential); |
| 82 | + |
| 83 | + validateRun(() -> validateTrue(verifiableCredential.getJsonObject() != null), "Bad or missing JSON object."); |
| 84 | + validateRun(() -> validateTrue(!verifiableCredential.getContexts().isEmpty()), "Bad or missing '@context'."); |
| 85 | + validateRun(() -> validateUrl(verifiableCredential.getContexts().get(0)), "@context must be a valid URI: " + verifiableCredential.getContexts().get(0)); |
| 86 | + validateRun(() -> validateTrue(VerifiableCredentialV2.DEFAULT_JSONLD_CONTEXTS[0].equals(verifiableCredential.getContexts().get(0))), "First value of @context must be " + VerifiableCredentialV2.DEFAULT_JSONLD_CONTEXTS[0] + ": " + verifiableCredential.getContexts().get(0)); |
| 87 | + validateRun(() -> { if (verifiableCredential.getId() != null) validateUrl(verifiableCredential.getId()); }, "'id' must be a valid URI."); |
| 88 | + |
| 89 | + validateRun(() -> validateTrue(!verifiableCredential.getTypes().isEmpty()), "Bad or missing 'type'."); |
| 90 | + validateRun(() -> validateTrue(verifiableCredential.getTypes().contains(VerifiableCredential.DEFAULT_JSONLD_TYPES[0])), "'type' must contain 'VerifiableCredential': " + verifiableCredential.getTypes()); |
| 91 | + |
| 92 | + |
| 93 | + //Issuer validation |
| 94 | + validateIssuer(verifiableCredential); |
| 95 | + validateRun(() -> validateTrue(verifiableCredential.getValidFrom() != null), "Bad or missing 'validFrom'."); |
| 96 | + validateRun(verifiableCredential::getValidUntil, "Bad 'validUntil'."); |
| 97 | + validateRun(verifiableCredential::getCredentialSubject, "Bad 'credentialSubject'."); |
| 98 | + validateRun(() -> validateTrue(verifiableCredential.getCredentialSubject() != null), "Bad or missing 'credentialSubject'."); |
| 99 | + |
| 100 | + //Validate credential Status : Handle both list and single object of credentialStatus |
| 101 | + validateStatus(verifiableCredential); |
| 102 | + } |
| 103 | + |
| 104 | + private static void validateIssuer(VerifiableCredentialV2 verifiableCredential) throws IllegalStateException { |
| 105 | + |
| 106 | + validateRun(() -> validateTrue(verifiableCredential.getIssuer() != null), "Bad or missing 'issuer'."); |
| 107 | + if(verifiableCredential.getIssuer() instanceof String )validateRun(() -> validateUrl(URI.create(verifiableCredential.getIssuer().toString())), "'issuer' must be a valid URI."); |
| 108 | + else if(verifiableCredential.getIssuer() instanceof Map<?,?>) validateRun(()-> validateUrl(URI.create(((Map<String,Object>)verifiableCredential.getIssuer()).get("id").toString())), "'issuer' must be a valid URI."); |
| 109 | + else validateRun(()-> validateTrue(false),"'issuer' must be a valid URI or object containing an 'id' property."); |
| 110 | + } |
| 111 | + |
| 112 | + private static void validateStatus(VerifiableCredentialV2 verifiableCredential) throws IllegalStateException { |
| 113 | + if(verifiableCredential.getCredentialStatus() == null) return; |
| 114 | + if(verifiableCredential.getCredentialStatus() instanceof CredentialStatus) validateCredentialStatus((CredentialStatus) verifiableCredential.getCredentialStatus()); |
| 115 | + else if (verifiableCredential.getCredentialStatus() instanceof List<?>) ((List<CredentialStatus>)verifiableCredential.getCredentialStatus()).forEach(Validation::validateCredentialStatus); |
| 116 | + } |
| 117 | + |
| 118 | + private static void validateCredentialStatus(CredentialStatus credentialStatus) throws IllegalStateException { |
| 119 | + validateRun(() -> validateTrue(credentialStatus.getType() != null), "Bad or missing 'credentialStatus Type'."); |
| 120 | + } |
73 | 121 | } |
0 commit comments