From 88b1d36ee50c6f28e3758ed49cd74113ea9b1f72 Mon Sep 17 00:00:00 2001 From: Benjamin Voiturier Date: Thu, 12 Oct 2023 09:26:10 +0200 Subject: [PATCH 1/4] fix(prism-agent): return relevant error when an invalid 'connectionId' is provided in offer/presentation creation Signed-off-by: Benjamin Voiturier --- .../io/iohk/atala/agent/server/ControllerHelper.scala | 7 +++---- .../http/CreateIssueCredentialRecordRequest.scala | 6 +++--- .../controller/PresentProofControllerImpl.scala | 2 +- .../presentproof/controller/PresentProofEndpoints.scala | 2 +- .../controller/http/RequestPresentationInput.scala | 8 +++++--- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/ControllerHelper.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/ControllerHelper.scala index f617bb6657..353967fa9a 100644 --- a/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/ControllerHelper.scala +++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/agent/server/ControllerHelper.scala @@ -34,12 +34,11 @@ trait ControllerHelper { } protected def getPairwiseDIDs( - connectionId: String + connectionId: UUID ): ZIO[WalletAccessContext & ConnectionService, ConnectionServiceError, DidIdPair] = { - val lookupId = UUID.fromString(connectionId) for { connectionService <- ZIO.service[ConnectionService] - maybeConnection <- connectionService.getConnectionRecord(lookupId) + maybeConnection <- connectionService.getConnectionRecord(connectionId) didIdPair <- maybeConnection match case Some(connRecord: ConnectionRecord) => extractDidIdPairFromValidConnection(connRecord) match { @@ -47,7 +46,7 @@ trait ControllerHelper { case None => ZIO.fail(ConnectionServiceError.UnexpectedError("Invalid connection record state for operation")) } - case _ => ZIO.fail(ConnectionServiceError.RecordIdNotFound(lookupId)) + case _ => ZIO.fail(ConnectionServiceError.RecordIdNotFound(connectionId)) } yield didIdPair } diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/CreateIssueCredentialRecordRequest.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/CreateIssueCredentialRecordRequest.scala index 02656f8e8b..db7bc105c2 100644 --- a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/CreateIssueCredentialRecordRequest.scala +++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/http/CreateIssueCredentialRecordRequest.scala @@ -50,7 +50,7 @@ final case class CreateIssueCredentialRecordRequest( issuingDID: Option[String], @description(annotations.connectionId.description) @encodedExample(annotations.connectionId.example) - connectionId: String + connectionId: UUID ) object CreateIssueCredentialRecordRequest { @@ -112,10 +112,10 @@ object CreateIssueCredentialRecordRequest { ) object connectionId - extends Annotation[String]( + extends Annotation[UUID]( description = "The unique identifier of a DIDComm connection that already exists between the issuer and the holder, and that will be used to execute the issue credential protocol.", - example = "null" + example = UUID.fromString("d9569cec-c81e-4779-aa86-0d5994d82676") ) } diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofControllerImpl.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofControllerImpl.scala index 9dc6db9ddc..77d478c648 100644 --- a/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofControllerImpl.scala +++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofControllerImpl.scala @@ -35,7 +35,7 @@ class PresentProofControllerImpl( pairwiseVerifierDID = didIdPair.myDID, pairwiseProverDID = didIdPair.theirDid, thid = DidCommID(), - connectionId = Some(request.connectionId), + connectionId = Some(request.connectionId.toString), proofTypes = request.proofs.map { e => ProofType( schema = e.schemaId, // TODO rename field to schemaId diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofEndpoints.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofEndpoints.scala index a43df18c2c..2f1836ff16 100644 --- a/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofEndpoints.scala +++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/PresentProofEndpoints.scala @@ -38,7 +38,7 @@ object PresentProofEndpoints { ) ) .out(jsonBody[PresentationStatus]) - .errorOut(basicFailuresAndForbidden) + .errorOut(basicFailureAndNotFoundAndForbidden) val getAllPresentations: Endpoint[ ApiKeyCredentials, diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/http/RequestPresentationInput.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/http/RequestPresentationInput.scala index bac163417a..fd146ac010 100644 --- a/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/http/RequestPresentationInput.scala +++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/presentproof/controller/http/RequestPresentationInput.scala @@ -6,10 +6,12 @@ import sttp.tapir.{Schema, Validator} import sttp.tapir.Schema.annotations.{description, encodedExample} import zio.json.{DeriveJsonDecoder, DeriveJsonEncoder, JsonDecoder, JsonEncoder} +import java.util.UUID + final case class RequestPresentationInput( @description(annotations.connectionId.description) @encodedExample(annotations.connectionId.example) - connectionId: String, + connectionId: UUID, @description(annotations.options.description) @encodedExample(annotations.options.example) options: Option[Options] = None, @@ -24,9 +26,9 @@ final case class RequestPresentationInput( object RequestPresentationInput { object annotations { object connectionId - extends Annotation[String]( + extends Annotation[UUID]( description = "The unique identifier of an established connection between the verifier and the prover.", - example = "bc528dc8-69f1-4c5a-a508-5f8019047900" + example = UUID.fromString("bc528dc8-69f1-4c5a-a508-5f8019047900") ) object options extends Annotation[Option[Options]]( From 30f5004fdf48f378a719d8640a080224e8818cb7 Mon Sep 17 00:00:00 2001 From: Benjamin Voiturier Date: Thu, 12 Oct 2023 09:36:17 +0200 Subject: [PATCH 2/4] =?UTF-8?q?fix(prism-agent):=20return=20relevant=20err?= =?UTF-8?q?or=20when=20an=20invalid=20=C3=ACssuing=20DID=20is=20provided?= =?UTF-8?q?=20at=20offer=20creation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Benjamin Voiturier --- .../io/iohk/atala/issue/controller/IssueControllerImpl.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueControllerImpl.scala b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueControllerImpl.scala index 0830806f74..32572456ff 100644 --- a/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueControllerImpl.scala +++ b/prism-agent/service/server/src/main/scala/io/iohk/atala/issue/controller/IssueControllerImpl.scala @@ -54,8 +54,8 @@ class IssueControllerImpl( for { issuingDID <- ZIO .fromOption(request.issuingDID) - .flatMap(extractPrismDIDFromString) .mapError(_ => ErrorResponse.badRequest(detail = Some("Missing request parameter: issuingDID"))) + .flatMap(extractPrismDIDFromString) _ <- validatePrismDID(issuingDID, allowUnpublished = true) record <- credentialService .createJWTIssueCredentialRecord( From 8ea5163e8bd868c7790b750fdaeee053c32abe1a Mon Sep 17 00:00:00 2001 From: Benjamin Voiturier Date: Thu, 12 Oct 2023 09:49:45 +0200 Subject: [PATCH 3/4] test(prism-agent): fix issue controller unit test Signed-off-by: Benjamin Voiturier --- .../issue/controller/IssueControllerTestTools.scala | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala index 1f516f8b58..eb8fa0bff5 100644 --- a/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala +++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala @@ -11,11 +11,7 @@ import io.iohk.atala.connect.core.repository.ConnectionRepositoryInMemory import io.iohk.atala.connect.core.service.ConnectionServiceImpl import io.iohk.atala.iam.authentication.{Authenticator, DefaultEntityAuthenticator} import io.iohk.atala.iris.proto.service.IrisServiceGrpc -import io.iohk.atala.issue.controller.http.{ - CreateIssueCredentialRecordRequest, - IssueCredentialRecord, - IssueCredentialRecordPage -} +import io.iohk.atala.issue.controller.http.{CreateIssueCredentialRecordRequest, IssueCredentialRecord, IssueCredentialRecordPage} import io.iohk.atala.pollux.anoncreds.LinkSecretWithId import io.iohk.atala.pollux.core.model.CredentialFormat import io.iohk.atala.pollux.core.repository.{CredentialDefinitionRepositoryInMemory, CredentialRepositoryInMemory} @@ -36,6 +32,8 @@ import zio.json.ast.Json import zio.json.ast.Json.* import zio.test.* +import java.util.UUID + trait IssueControllerTestTools extends PostgresTestContainerSupport { self: ZIOSpecDefault => @@ -143,7 +141,7 @@ trait IssueGen { val gValidityPeriod: Gen[Any, Double] = Gen.double val gAutomaticIssuance: Gen[Any, Boolean] = Gen.boolean val gIssuingDID: Gen[Any, String] = Gen.alphaNumericStringBounded(5, 20) // TODO Make a DID generator - val gConnectionId: Gen[Any, String] = Gen.alphaNumericStringBounded(5, 20) + val gConnectionId: Gen[Any, UUID] = Gen.uuid val claims = Json.Obj( "key1" -> Json.Str("value1"), From 1065f6cb9bf9de819ae9baf08376a3cc73adc583 Mon Sep 17 00:00:00 2001 From: Benjamin Voiturier Date: Thu, 12 Oct 2023 10:03:04 +0200 Subject: [PATCH 4/4] chore(prism-agent): scalafmtAll Signed-off-by: Benjamin Voiturier --- .../atala/issue/controller/IssueControllerTestTools.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala b/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala index eb8fa0bff5..20c8f4f545 100644 --- a/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala +++ b/prism-agent/service/server/src/test/scala/io/iohk/atala/issue/controller/IssueControllerTestTools.scala @@ -11,7 +11,11 @@ import io.iohk.atala.connect.core.repository.ConnectionRepositoryInMemory import io.iohk.atala.connect.core.service.ConnectionServiceImpl import io.iohk.atala.iam.authentication.{Authenticator, DefaultEntityAuthenticator} import io.iohk.atala.iris.proto.service.IrisServiceGrpc -import io.iohk.atala.issue.controller.http.{CreateIssueCredentialRecordRequest, IssueCredentialRecord, IssueCredentialRecordPage} +import io.iohk.atala.issue.controller.http.{ + CreateIssueCredentialRecordRequest, + IssueCredentialRecord, + IssueCredentialRecordPage +} import io.iohk.atala.pollux.anoncreds.LinkSecretWithId import io.iohk.atala.pollux.core.model.CredentialFormat import io.iohk.atala.pollux.core.repository.{CredentialDefinitionRepositoryInMemory, CredentialRepositoryInMemory}