From b19f514d3e6bf762fa566dd4f0024e8732778911 Mon Sep 17 00:00:00 2001 From: Bassam Date: Fri, 23 Aug 2024 15:15:20 -0400 Subject: [PATCH] feat: API Supports ValidFrom And ValidTo (#1298) Signed-off-by: Bassam Riman --- .../service/OIDCCredentialIssuerService.scala | 4 ++- .../VcVerificationControllerImplSpec.scala | 2 ++ .../core/service/CredentialServiceImpl.scala | 4 ++- .../VcVerificationServiceImplSpec.scala | 18 +++++++++++ .../vc/jwt/VerifiableCredentialPayload.scala | 30 ++++++++++++++++--- .../vc/jwt/revocation/VCStatusList2021.scala | 4 ++- .../pollux/vc/jwt/JWTVerificationTest.scala | 4 ++- 7 files changed, 58 insertions(+), 8 deletions(-) diff --git a/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala b/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala index bb90856cb0..d54c21dafa 100644 --- a/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala +++ b/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala @@ -201,7 +201,9 @@ case class OIDCCredentialIssuerServiceImpl( maybeCredentialStatus = None, // TODO: Add credential status maybeRefreshService = None, // TODO: Add refresh service maybeEvidence = None, // TODO: Add evidence - maybeTermsOfUse = None // TODO: Add terms of use + maybeTermsOfUse = None, // TODO: Add terms of use, + maybeValidFrom = None, // TODO: Add ValidFrom + maybeValidUntil = None // TODO: Add ValidUntil ) ZIO.succeed(credential) // TODO: there might be other calls to fill the VC claims from the session, etc diff --git a/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala b/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala index 91e4af1d8f..38b7f1385c 100644 --- a/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala +++ b/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala @@ -39,6 +39,8 @@ object VcVerificationControllerImplSpec extends ZIOSpecDefault with VcVerificati issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", diff --git a/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala b/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala index c0af18ac02..b25f7a6ea5 100644 --- a/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala +++ b/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala @@ -1085,7 +1085,9 @@ class CredentialServiceImpl( credentialSubject = claims.add("id", jwtPresentation.iss.asJson).asJson, maybeRefreshService = None, maybeEvidence = None, - maybeTermsOfUse = None + maybeTermsOfUse = None, + maybeValidFrom = None, + maybeValidUntil = None ) signedJwtCredential = W3CCredential.toEncodedJwt(w3Credential, jwtIssuer) issueCredential = IssueCredential.build( diff --git a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala index a182ed5824..b85ab949b3 100644 --- a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala +++ b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala @@ -30,6 +30,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -94,6 +96,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -157,6 +161,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -220,6 +226,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -288,6 +296,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -356,6 +366,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -420,6 +432,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -484,6 +498,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", @@ -548,6 +564,8 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS issuer = issuer.did, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), + maybeValidUntil = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeCredentialSchema = Some( CredentialSchema( id = "did:work:MDP8AsFhHzhwUvGNuYkX7T;id=06e126d1-fa44-4882-a243-1e326fbe21db;version=1.0", diff --git a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala index e6c894ce23..2c1f39d8c9 100644 --- a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala +++ b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala @@ -83,6 +83,10 @@ sealed trait CredentialPayload { def maybeExp: Option[Instant] + def maybeValidFrom: Option[Instant] + + def maybeValidUntil: Option[Instant] + def iss: String def maybeCredentialStatus: Option[CredentialStatus] @@ -109,7 +113,9 @@ sealed trait CredentialPayload { maybeCredentialStatus = maybeCredentialStatus, maybeRefreshService = maybeRefreshService, maybeEvidence = maybeEvidence, - maybeTermsOfUse = maybeTermsOfUse + maybeTermsOfUse = maybeTermsOfUse, + maybeValidFrom = maybeValidFrom, + maybeValidUntil = maybeValidUntil ), nbf = nbf, aud = aud, @@ -131,7 +137,9 @@ sealed trait CredentialPayload { maybeRefreshService = maybeRefreshService, maybeEvidence = maybeEvidence, maybeTermsOfUse = maybeTermsOfUse, - aud = aud + aud = aud, + maybeValidFrom = maybeValidFrom, + maybeValidUntil = maybeValidUntil ) } @@ -176,6 +184,8 @@ case class JwtVc( `type`: Set[String], maybeCredentialSchema: Option[CredentialSchema], credentialSubject: Json, + maybeValidFrom: Option[Instant], + maybeValidUntil: Option[Instant], maybeCredentialStatus: Option[CredentialStatus], maybeRefreshService: Option[RefreshService], maybeEvidence: Option[Json], @@ -199,6 +209,8 @@ case class JwtCredentialPayload( override val maybeTermsOfUse = vc.maybeTermsOfUse override val maybeCredentialSchema = vc.maybeCredentialSchema override val credentialSubject = vc.credentialSubject + override val maybeValidFrom = vc.maybeValidFrom + override val maybeValidUntil = vc.maybeValidUntil } case class W3cCredentialPayload( @@ -214,7 +226,9 @@ case class W3cCredentialPayload( override val maybeRefreshService: Option[RefreshService], override val maybeEvidence: Option[Json], override val maybeTermsOfUse: Option[Json], - override val aud: Set[String] = Set.empty + override val aud: Set[String] = Set.empty, + override val maybeValidFrom: Option[Instant], + override val maybeValidUntil: Option[Instant] ) extends CredentialPayload { override val maybeSub = credentialSubject.hcursor.downField("id").as[String].toOption override val maybeJti = maybeId @@ -384,6 +398,8 @@ object CredentialPayload { issuer <- c.downField("issuer").as[String] issuanceDate <- c.downField("issuanceDate").as[Instant] maybeExpirationDate <- c.downField("expirationDate").as[Option[Instant]] + maybeValidFrom <- c.downField("maybeValidFrom").as[Option[Instant]] + maybeValidUntil <- c.downField("maybeValidUntil").as[Option[Instant]] maybeCredentialSchema <- c.downField("credentialSchema").as[Option[CredentialSchema]] credentialSubject <- c.downField("credentialSubject").as[Json] maybeCredentialStatus <- c.downField("credentialStatus").as[Option[CredentialStatus]] @@ -398,6 +414,8 @@ object CredentialPayload { issuer = DID(issuer), issuanceDate = issuanceDate, maybeExpirationDate = maybeExpirationDate, + maybeValidFrom = maybeValidFrom, + maybeValidUntil = maybeValidUntil, maybeCredentialSchema = maybeCredentialSchema, credentialSubject = credentialSubject, maybeCredentialStatus = maybeCredentialStatus, @@ -425,6 +443,8 @@ object CredentialPayload { maybeRefreshService <- c.downField("refreshService").as[Option[RefreshService]] maybeEvidence <- c.downField("evidence").as[Option[Json]] maybeTermsOfUse <- c.downField("termsOfUse").as[Option[Json]] + maybeValidFrom <- c.downField("maybeValidFrom").as[Option[Instant]] + maybeValidUntil <- c.downField("maybeValidUntil").as[Option[Instant]] } yield { JwtVc( `@context` = `@context`, @@ -434,7 +454,9 @@ object CredentialPayload { maybeCredentialStatus = maybeCredentialStatus, maybeRefreshService = maybeRefreshService, maybeEvidence = maybeEvidence, - maybeTermsOfUse = maybeTermsOfUse + maybeTermsOfUse = maybeTermsOfUse, + maybeValidFrom = maybeValidFrom, + maybeValidUntil = maybeValidUntil, ) } diff --git a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala index b13f032950..9146320c44 100644 --- a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala +++ b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala @@ -69,7 +69,9 @@ object VCStatusList2021 { maybeCredentialStatus = None, maybeRefreshService = None, maybeEvidence = None, - maybeTermsOfUse = None + maybeTermsOfUse = None, + maybeValidFrom = None, + maybeValidUntil = None ) VCStatusList2021(w3Credential, jwtIssuer) } diff --git a/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala b/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala index de701750eb..da506bbff2 100644 --- a/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala +++ b/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala @@ -75,7 +75,9 @@ object JWTVerificationTest extends ZIOSpecDefault { maybeCredentialStatus = None, maybeRefreshService = None, maybeEvidence = None, - maybeTermsOfUse = None + maybeTermsOfUse = None, + maybeValidFrom = None, + maybeValidUntil = None ), nbf = jwtCredentialNbf, // ISSUANCE DATE aud = Set.empty,