diff --git a/.env-issuer.sample b/.env-issuer.sample index d2b3b9a9..cf340c54 100644 --- a/.env-issuer.sample +++ b/.env-issuer.sample @@ -46,4 +46,8 @@ ISSUER_CREDENTIAL_STATUS_ONCHAIN_TREE_STORE_SUPPORTED_CONTRACT=0x3d3763eC0a50CE1 ISSUER_CREDENTIAL_STATUS_RHS_URL=http://localhost:3001 ISSUER_CREDENTIAL_STATUS_PUBLISHING_KEY_PATH=pbkey ISSUER_CREDENTIAL_STATUS_RHS_MODE=None -ISSUER_CREDENTIAL_STATUS_RHS_CHAIN_ID=<80002 | 80001 | 137> \ No newline at end of file +ISSUER_CREDENTIAL_STATUS_RHS_CHAIN_ID=<80002 | 80001 | 137> + +ISSUER_MEDIA_TYPE_MANAGER_ENABLED=true + +ISSUER_AUTO_PUBLISHING_TO_ON_CHAIN_RHS=true diff --git a/cmd/notifications/main.go b/cmd/notifications/main.go index 69393535..d55ada7c 100644 --- a/cmd/notifications/main.go +++ b/cmd/notifications/main.go @@ -12,6 +12,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" vault "github.com/hashicorp/vault/api" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" + "github.com/iden3/iden3comm/v2/protocol" "github.com/polygonid/sh-id-platform/internal/buildinfo" "github.com/polygonid/sh-id-platform/internal/config" @@ -179,8 +182,16 @@ func newCredentialsService(ctx context.Context, cfg *config.Configuration, stora mtService := services.NewIdentityMerkleTrees(mtRepository) qrService := services.NewQrStoreService(cachex) + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + *cfg.MediaTypeManager.Enabled, + ) + identityService := services.NewIdentity(keyStore, identityRepository, mtRepository, identityStateRepository, mtService, qrService, claimsRepository, revocationRepository, nil, storage, nil, nil, ps, cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepository, identityService, qrService, mtService, identityStateRepository, schemaLoader, storage, cfg.APIUI.ServerURL, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + claimsService := services.NewClaim(claimsRepository, identityService, qrService, mtService, identityStateRepository, schemaLoader, storage, cfg.APIUI.ServerURL, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, mediaTypeManager) return claimsService, nil } diff --git a/cmd/pending_publisher/main.go b/cmd/pending_publisher/main.go index 6799d4d6..2490b5a2 100644 --- a/cmd/pending_publisher/main.go +++ b/cmd/pending_publisher/main.go @@ -12,6 +12,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" vault "github.com/hashicorp/vault/api" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" + "github.com/iden3/iden3comm/v2/protocol" "github.com/polygonid/sh-id-platform/internal/buildinfo" "github.com/polygonid/sh-id-platform/internal/config" @@ -160,8 +163,16 @@ func main() { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.GetURL(), cl, common.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + *cfg.MediaTypeManager.Enabled, + ) + identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, qrService, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, qrService, mtService, identityStateRepo, schemaLoader, storage, cfg.APIUI.ServerURL, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + claimsService := services.NewClaim(claimsRepo, identityService, qrService, mtService, identityStateRepo, schemaLoader, storage, cfg.APIUI.ServerURL, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, mediaTypeManager) circuitsLoaderService := circuitLoaders.NewCircuits(cfg.Circuit.Path) proofService := initProofService(ctx, cfg, circuitsLoaderService) diff --git a/cmd/platform/main.go b/cmd/platform/main.go index 88942b01..ed432fc1 100644 --- a/cmd/platform/main.go +++ b/cmd/platform/main.go @@ -14,6 +14,9 @@ import ( "github.com/go-chi/cors" redis2 "github.com/go-redis/redis/v8" vault "github.com/hashicorp/vault/api" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" + iden3commProtocol "github.com/iden3/iden3comm/v2/protocol" "github.com/polygonid/sh-id-platform/internal/api" "github.com/polygonid/sh-id-platform/internal/buildinfo" @@ -141,9 +144,18 @@ func main() { qrService := services.NewQrStoreService(cachex) cfg.CredentialStatus.SingleIssuer = false + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + iden3commProtocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + iden3commProtocol.RevocationStatusRequestMessageType: {"*"}, + }, + *cfg.MediaTypeManager.Enabled, + ) + revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(keyStore, identityRepository, mtRepository, identityStateRepository, mtService, qrService, claimsRepository, revocationRepository, nil, storage, nil, nil, ps, cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepository, identityService, qrService, mtService, identityStateRepository, schemaLoader, storage, cfg.ServerUrl, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + claimsService := services.NewClaim(claimsRepository, identityService, qrService, mtService, identityStateRepository, schemaLoader, storage, cfg.ServerUrl, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, mediaTypeManager) proofService := gateways.NewProver(ctx, cfg, circuitsLoaderService) transactionService, err := gateways.NewTransaction(ethereumClient, cfg.Ethereum.ConfirmationBlockCount) diff --git a/cmd/platform_ui/main.go b/cmd/platform_ui/main.go index 5f41eef4..1f1a91c8 100644 --- a/cmd/platform_ui/main.go +++ b/cmd/platform_ui/main.go @@ -20,6 +20,9 @@ import ( "github.com/iden3/go-iden3-auth/v2/pubsignals" "github.com/iden3/go-iden3-auth/v2/state" "github.com/iden3/go-iden3-core/v2/w3c" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" + iden3commProtocol "github.com/iden3/iden3comm/v2/protocol" "github.com/polygonid/sh-id-platform/internal/api_ui" "github.com/polygonid/sh-id-platform/internal/buildinfo" @@ -173,10 +176,19 @@ func main() { qrService := services.NewQrStoreService(cachex) cfg.CredentialStatus.SingleIssuer = true + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + iden3commProtocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + iden3commProtocol.RevocationStatusRequestMessageType: {"*"}, + }, + *cfg.MediaTypeManager.Enabled, + ) + revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(keyStore, identityRepository, mtRepository, identityStateRepository, mtService, qrService, claimsRepository, revocationRepository, connectionsRepository, storage, verifier, sessionRepository, ps, cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) schemaService := services.NewSchema(schemaRepository, schemaLoader) - claimsService := services.NewClaim(claimsRepository, identityService, qrService, mtService, identityStateRepository, schemaLoader, storage, cfg.APIUI.ServerURL, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + claimsService := services.NewClaim(claimsRepository, identityService, qrService, mtService, identityStateRepository, schemaLoader, storage, cfg.APIUI.ServerURL, ps, cfg.IPFS.GatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepository, storage) linkService := services.NewLinkService(storage, claimsService, qrService, claimsRepository, linkRepository, schemaRepository, schemaLoader, sessionRepository, ps, cfg.IPFS.GatewayURL) diff --git a/internal/api/server_test.go b/internal/api/server_test.go index 73642a47..29243219 100644 --- a/internal/api/server_test.go +++ b/internal/api/server_test.go @@ -16,6 +16,7 @@ import ( core "github.com/iden3/go-iden3-core/v2" "github.com/iden3/go-iden3-core/v2/w3c" "github.com/iden3/go-schema-processor/v2/verifiable" + "github.com/iden3/iden3comm/v2" "github.com/iden3/iden3comm/v2/packers" "github.com/iden3/iden3comm/v2/protocol" "github.com/mitchellh/mapstructure" @@ -54,7 +55,14 @@ func TestServer_CreateIdentity(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) accountService := services.NewAccountService(cfg.Ethereum, keyStore) server := NewServer(&cfg, identityService, accountService, claimsService, nil, NewPublisherMock(), NewPackageManagerMock(), nil) handler := getHandler(context.Background(), server) @@ -251,7 +259,14 @@ func TestServer_RevokeClaim(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.GetURL(), nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(&KMSMock{}, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) accountService := services.NewAccountService(cfg.Ethereum, keyStore) server := NewServer(&cfg, identityService, accountService, claimsService, nil, NewPublisherMock(), NewPackageManagerMock(), nil) @@ -398,11 +413,19 @@ func TestServer_CreateClaim(t *testing.T) { revocationRepository := repositories.NewRevocation() connectionsRepository := repositories.NewConnections() + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.GetURL(), nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, qrService, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) pubSub := pubsub.NewMock() - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) accountService := services.NewAccountService(cfg.Ethereum, keyStore) server := NewServer(&cfg, identityService, accountService, claimsService, nil, NewPublisherMock(), NewPackageManagerMock(), nil) handler := getHandler(ctx, server) @@ -580,7 +603,15 @@ func TestServer_GetIdentities(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(&KMSMock{}, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) accountService := services.NewAccountService(cfg.Ethereum, keyStore) server := NewServer(&cfg, identityService, accountService, claimsService, nil, NewPublisherMock(), NewPackageManagerMock(), nil) handler := getHandler(context.Background(), server) @@ -655,7 +686,16 @@ func TestServer_GetClaimQrCode(t *testing.T) { idStr := "did:polygonid:polygon:mumbai:2qPrv5Yx8s1qAmEnPym68LfT7gTbASGampiGU7TseL" idNoClaims := "did:polygonid:polygon:mumbai:2qGjTUuxZKqKS4Q8UmxHUPw55g15QgEVGnj6Wkq8Vk" accountService := services.NewAccountService(cfg.Ethereum, keyStore) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) identity := &domain.Identity{ Identifier: idStr, @@ -795,7 +835,16 @@ func TestServer_GetClaim(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.GetURL(), nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(&KMSMock{}, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) accountService := services.NewAccountService(cfg.Ethereum, keyStore) server := NewServer(&cfg, identityService, accountService, claimsService, nil, NewPublisherMock(), NewPackageManagerMock(), nil) @@ -969,7 +1018,16 @@ func TestServer_GetClaims(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.GetURL(), nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) fixture := tests.NewFixture(storage) @@ -1318,7 +1376,16 @@ func TestServer_GetRevocationStatus(t *testing.T) { identity, err := identityService.Create(ctx, "http://localhost:3001", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) assert.NoError(t, err) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) accountService := services.NewAccountService(cfg.Ethereum, keyStore) server := NewServer(&cfg, identityService, accountService, claimsService, nil, NewPublisherMock(), NewPackageManagerMock(), nil) handler := getHandler(context.Background(), server) diff --git a/internal/api_ui/server_test.go b/internal/api_ui/server_test.go index 31a52cd6..43162084 100644 --- a/internal/api_ui/server_test.go +++ b/internal/api_ui/server_test.go @@ -17,6 +17,8 @@ import ( "github.com/google/uuid" "github.com/iden3/go-iden3-core/v2/w3c" "github.com/iden3/go-schema-processor/v2/verifiable" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" "github.com/iden3/iden3comm/v2/protocol" "github.com/mitchellh/mapstructure" "github.com/stretchr/testify/assert" @@ -49,7 +51,16 @@ func TestServer_CheckStatus(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(&KMSMock{}, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) schemaService := services.NewSchema(repositories.NewSchema(*storage), schemaLoader) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, "http://localhost", pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, "http://localhost", pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) server := NewServer(&cfg, identityService, claimsService, schemaService, NewConnectionsMock(), NewLinkMock(), nil, NewPublisherMock(), NewPackageManagerMock(), &health.Status{}) handler := getHandler(context.Background(), server) @@ -806,7 +817,15 @@ func TestServer_DeleteConnection(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -1056,7 +1075,16 @@ func TestServer_RevokeConnectionCredentials(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, "http://localhost", pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, "http://localhost", pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -1168,7 +1196,16 @@ func TestServer_CreateCredential(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) pubSub := pubsub.NewMock() - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) require.NoError(t, err) @@ -1344,7 +1381,16 @@ func TestServer_DeleteCredential(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, "http://localhost", pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, "http://localhost", pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) server := NewServer(&cfg, NewIdentityMock(), claimsService, NewSchemaMock(), NewConnectionsMock(), NewLinkMock(), nil, NewPublisherMock(), NewPackageManagerMock(), nil) handler := getHandler(context.Background(), server) @@ -1447,7 +1493,16 @@ func TestServer_GetCredential(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) require.NoError(t, err) @@ -1640,7 +1695,15 @@ func TestServer_GetCredentials(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) schemaService := services.NewSchema(schemaRepository, schemaLoader) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -2108,7 +2171,16 @@ func TestServer_GetCredentialQrCode(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, qrService, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, qrService, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, qrService, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) require.NoError(t, err) @@ -2262,7 +2334,16 @@ func TestServer_GetConnection(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -2447,7 +2528,16 @@ func TestServer_GetConnections(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -3125,7 +3215,16 @@ func TestServer_RevokeCredential(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(&KMSMock{}, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) fixture := tests.NewFixture(storage) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) @@ -3266,7 +3365,16 @@ func TestServer_CreateLink(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) pubSub := pubsub.NewMock() - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, nil, claimsRepo, linkRepository, schemaRespository, schemaLoader, sessionRepository, pubSub, ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -3491,7 +3599,16 @@ func TestServer_ActivateLink(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, nil, claimsRepo, linkRepository, schemaRepository, schemaLoader, sessionRepository, pubsub.NewMock(), ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -3640,7 +3757,16 @@ func TestServer_GetLink(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, nil, claimsRepo, linkRepository, schemaRepository, schemaLoader, sessionRepository, pubsub.NewMock(), ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -3816,7 +3942,16 @@ func TestServer_GetAllLinks(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, nil, claimsRepo, linkRepository, schemaRepository, schemaLoader, sessionRepository, pubsub.NewMock(), ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -4050,7 +4185,16 @@ func TestServer_DeleteLink(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, nil, claimsRepo, linkRepository, schemaRepository, schemaLoader, sessionRepository, pubsub.NewMock(), ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -4165,7 +4309,16 @@ func TestServer_DeleteLinkForDifferentDID(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, nil, claimsRepo, linkRepository, schemaRepository, schemaLoader, sessionRepository, pubsub.NewMock(), ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -4278,7 +4431,16 @@ func TestServer_CreateLinkQRCode(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, qrService, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, qrService, claimsRepo, linkRepository, schemaRepository, schemaLoader, sessionRepository, pubsub.NewMock(), ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -4431,7 +4593,16 @@ func TestServer_GetLinkQRCode(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) qrService := services.NewQrStoreService(cachex) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, qrService, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, qrService, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, qrService, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) linkService := services.NewLinkService(storage, claimsService, qrService, claimsRepo, linkRepository, schemaRepository, schemaLoader, sessionRepository, pubsub.NewMock(), ipfsGatewayURL) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) @@ -4612,7 +4783,16 @@ func TestServer_GetStateStatus(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) schema := "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json" credentialSubject := map[string]any{ @@ -4761,7 +4941,16 @@ func TestServer_GetStateTransactions(t *testing.T) { revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) require.NoError(t, err) @@ -4848,7 +5037,16 @@ func TestServer_GetRevocationStatus(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) pubSub := pubsub.NewMock() - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, schemaLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubSub, ipfsGatewayURL, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) require.NoError(t, err) diff --git a/internal/config/config.go b/internal/config/config.go index 96b713e5..700f73bf 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -51,6 +51,7 @@ type Configuration struct { CredentialStatus CredentialStatus `mapstructure:"CredentialStatus"` CustomDIDMethods []CustomDIDMethods `mapstructure:"-"` AutoPublishingToOnChainRHS *bool `mapstructure:"AutoPublishingToOnChainRHS"` + MediaTypeManager MediaTypeManager `mapstructure:"MediaTypeManager"` } // Database has the database configuration @@ -201,6 +202,11 @@ type APIUIAuth struct { Password string `mapstructure:"Password" tip:"Server UI API Basic auth password"` } +// MediaTypeManager enables or disables the media types manager +type MediaTypeManager struct { + Enabled *bool `mapstructure:"Enabled" tip:"Enable or disable the media type manager"` +} + // Sanitize perform some basic checks and sanitizations in the configuration. // Returns true if config is acceptable, error otherwise. func (c *Configuration) Sanitize(ctx context.Context) error { @@ -510,6 +516,8 @@ func bindEnv() { _ = viper.BindEnv("AutoPublishingToOnChainRHS", "ISSUER_AUTO_PUBLISHING_TO_ON_CHAIN_RHS") + _ = viper.BindEnv("MediaTypeManager.Enabled", "ISSUER_MEDIA_TYPE_MANAGER_ENABLED") + viper.AutomaticEnv() } @@ -634,6 +642,11 @@ func checkEnvVars(ctx context.Context, cfg *Configuration) { cfg.AutoPublishingToOnChainRHS = common.ToPointer(true) } + if cfg.MediaTypeManager.Enabled == nil { + log.Info(ctx, "ISSUER_MEDIA_TYPE_MANAGER_ENABLED is missing and the server set up it as true") + cfg.MediaTypeManager.Enabled = common.ToPointer(true) + } + if cfg.CredentialStatus.RHSMode == "" { log.Info(ctx, "ISSUER_CREDENTIAL_STATUS_RHS_MODE value is missing and the server set up it as None") cfg.CredentialStatus.RHSMode = "None" diff --git a/internal/core/services/claims.go b/internal/core/services/claims.go index 5a044a30..24397037 100644 --- a/internal/core/services/claims.go +++ b/internal/core/services/claims.go @@ -370,7 +370,7 @@ func (c *claim) GetCredentialQrCode(ctx context.Context, issID *w3c.DID, id uuid func (c *claim) Agent(ctx context.Context, req *ports.AgentRequest, mediatype iden3comm.MediaType) (*domain.Agent, error) { if !c.mediatypeManager.AllowMediaType(req.Type, mediatype) { - err := fmt.Errorf("unsupported media type '%s' for message type '%s'", req.Typ, req.Type) + err := fmt.Errorf("unsupported media type '%s' for message type '%s'", mediatype, req.Type) log.Error(ctx, "agent: unsupported media type", "err", err) return nil, err } diff --git a/internal/core/services/identity.go b/internal/core/services/identity.go index c15d8502..bbfde530 100644 --- a/internal/core/services/identity.go +++ b/internal/core/services/identity.go @@ -749,32 +749,22 @@ func (i *identity) createIdentity(ctx context.Context, tx db.Querier, hostURL st return nil, nil, fmt.Errorf("can't create RHS publisher: %w", err) } - if len(rhsPublishers) > 0 { - if rhsMode == reverse_hash.RHSModeOnChain && !i.autoPublishingToOnChainRHS { - log.Info(ctx, - "state info (bigints):", - "root:", identity.State.TreeState().State.BigInt().String(), - "claimsTreeRoot:", claimsTree.Root().BigInt().String(), - "revocationsTreeRoot:", merkletree.HashZero.BigInt().String(), - "rootOfRootsTreeRoot:", merkletree.HashZero.BigInt().String(), - ) - } else { - log.Info(ctx, "publishing state to RHS", "publishers", len(rhsPublishers)) - for _, rhsPublisher := range rhsPublishers { - err := rhsPublisher.PublishNodesToRHS(ctx, []mtproof.Node{ - { - Hash: identity.State.TreeState().State, - Children: []*merkletree.Hash{ - claimsTree.Root(), - &merkletree.HashZero, - &merkletree.HashZero, - }, + if len(rhsPublishers) > 0 && !(rhsMode == reverse_hash.RHSModeOnChain && !i.autoPublishingToOnChainRHS) { + log.Info(ctx, "publishing state to RHS", "publishers", len(rhsPublishers)) + for _, rhsPublisher := range rhsPublishers { + err := rhsPublisher.PublishNodesToRHS(ctx, []mtproof.Node{ + { + Hash: identity.State.TreeState().State, + Children: []*merkletree.Hash{ + claimsTree.Root(), + &merkletree.HashZero, + &merkletree.HashZero, }, - }) - if err != nil { - log.Error(ctx, "publishing state to RHS", "err", err) - return nil, nil, err - } + }, + }) + if err != nil { + log.Error(ctx, "publishing state to RHS", "err", err) + return nil, nil, err } } } diff --git a/internal/core/services/mediatype_manager.go b/internal/core/services/mediatype_manager.go index 4e19157d..975f5ee0 100644 --- a/internal/core/services/mediatype_manager.go +++ b/internal/core/services/mediatype_manager.go @@ -2,39 +2,32 @@ package services import ( "github.com/iden3/iden3comm/v2" - "github.com/iden3/iden3comm/v2/packers" - "github.com/iden3/iden3comm/v2/protocol" -) - -// DefaultMediaTypeManager default media type manager -var DefaultMediaTypeManager = NewMediaTypeManager( - map[iden3comm.ProtocolMessage][]string{ - protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, - protocol.RevocationStatusRequestMessageType: {"*"}, - }, - true, ) // MediaTypeManager manages the list of allowed media types for the protocol message type // if strictMode is true, then all messages that do not exist in the allowed list will be rejected type MediaTypeManager struct { - strictMode bool - allowList map[iden3comm.ProtocolMessage][]string + enabled bool + allowList map[iden3comm.ProtocolMessage][]string } // NewMediaTypeManager create instance of MediaTypeManager -func NewMediaTypeManager(allowList map[iden3comm.ProtocolMessage][]string, strictMode bool) MediaTypeManager { - return MediaTypeManager{ - strictMode: strictMode, - allowList: allowList, +func NewMediaTypeManager(allowList map[iden3comm.ProtocolMessage][]string, enabled bool) *MediaTypeManager { + return &MediaTypeManager{ + enabled: enabled, + allowList: allowList, } } // AllowMediaType check if the protocol message supports the mediaType type func (m *MediaTypeManager) AllowMediaType(protoclMessage iden3comm.ProtocolMessage, mediaType iden3comm.MediaType) bool { + if !m.enabled { + return true + } + al, ok := m.allowList[protoclMessage] if !ok { - return !m.strictMode + return false } for _, v := range al { if v == "*" || v == string(mediaType) { diff --git a/internal/core/services/mediatype_manager_test.go b/internal/core/services/mediatype_manager_test.go index 0de4305a..5c8dac90 100644 --- a/internal/core/services/mediatype_manager_test.go +++ b/internal/core/services/mediatype_manager_test.go @@ -18,81 +18,65 @@ func TestMediatypeManager_AllowList(t *testing.T) { targetProtocolMessage iden3comm.ProtocolMessage targetMediatype iden3comm.MediaType expected bool - strictMode bool + enabled bool } testcases := []testcase{ { - name: "strictMode = true. Protocol message not in the allow list", + name: "AllowList enabled. Type in the list", allowList: map[iden3comm.ProtocolMessage][]string{ - protocol.RevocationStatusRequestMessageType: {"*"}, - }, - targetProtocolMessage: protocol.CredentialFetchRequestMessageType, - targetMediatype: packers.MediaTypeZKPMessage, - expected: false, - strictMode: true, - }, - { - name: "strictMode = false. Protocol message not in the allow list", - allowList: map[iden3comm.ProtocolMessage][]string{ - protocol.RevocationStatusRequestMessageType: {"*"}, + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, }, targetProtocolMessage: protocol.CredentialFetchRequestMessageType, targetMediatype: packers.MediaTypeZKPMessage, expected: true, - strictMode: false, + enabled: true, }, { - name: "Protocol message on the allow list with '*'", + name: "AllowList enabled. Type in the list with wildcard", allowList: map[iden3comm.ProtocolMessage][]string{ protocol.CredentialFetchRequestMessageType: {"*"}, }, targetProtocolMessage: protocol.CredentialFetchRequestMessageType, - targetMediatype: packers.MediaTypePlainMessage, + targetMediatype: packers.MediaTypeZKPMessage, expected: true, - strictMode: true, + enabled: true, }, { - name: "Protocol message on the allow list with allow media type", + name: "AllowList enabled. Type not in the list", allowList: map[iden3comm.ProtocolMessage][]string{ - protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, }, targetProtocolMessage: protocol.CredentialFetchRequestMessageType, targetMediatype: packers.MediaTypeZKPMessage, - expected: true, - strictMode: true, + expected: false, + enabled: true, }, { - name: "Protocol message on the allow list with NOT allow media type", + name: "AllowList enabled. Type does not exist", allowList: map[iden3comm.ProtocolMessage][]string{ - protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypePlainMessage)}, }, targetProtocolMessage: protocol.CredentialFetchRequestMessageType, - targetMediatype: packers.MediaTypePlainMessage, - expected: false, - strictMode: true, - }, - { - name: "strictMode = true. Empty allow list", - allowList: map[iden3comm.ProtocolMessage][]string{}, - targetProtocolMessage: protocol.CredentialFetchRequestMessageType, - targetMediatype: packers.MediaTypePlainMessage, + targetMediatype: packers.MediaTypeZKPMessage, expected: false, - strictMode: true, + enabled: true, }, { - name: "strictMode = false. Empty allow list", - allowList: map[iden3comm.ProtocolMessage][]string{}, + name: "AllowList disabled. Type does not exist", + allowList: map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypePlainMessage)}, + }, targetProtocolMessage: protocol.CredentialFetchRequestMessageType, - targetMediatype: packers.MediaTypePlainMessage, + targetMediatype: packers.MediaTypeZKPMessage, expected: true, - strictMode: false, + enabled: false, }, } for _, tt := range testcases { t.Run(tt.name, func(t *testing.T) { mdm := services.NewMediaTypeManager( - tt.allowList, tt.strictMode, + tt.allowList, tt.enabled, ) actual := mdm.AllowMediaType( tt.targetProtocolMessage, tt.targetMediatype, @@ -101,45 +85,3 @@ func TestMediatypeManager_AllowList(t *testing.T) { }) } } - -func TestMediatypeManager_DefaultPacker(t *testing.T) { - type testcase struct { - name string - targetProtocolMessage iden3comm.ProtocolMessage - targetMediatype iden3comm.MediaType - expected bool - } - testcases := []testcase{ - { - name: "call CredentialFetchRequestMessageType with MediaTypePlainMessage", - targetProtocolMessage: protocol.CredentialFetchRequestMessageType, - targetMediatype: packers.MediaTypePlainMessage, - expected: false, - }, - { - name: "call CredentialFetchRequestMessageType with MediaTypeZKPMessage", - targetProtocolMessage: protocol.CredentialFetchRequestMessageType, - targetMediatype: packers.MediaTypeZKPMessage, - expected: true, - }, - { - name: "call RevocationStatusRequestMessageType with MediaTypePlainMessage", - targetProtocolMessage: protocol.RevocationStatusRequestMessageType, - targetMediatype: packers.MediaTypePlainMessage, - expected: true, - }, - { - name: "call RevocationStatusRequestMessageType with MediaTypeZKPMessage", - targetProtocolMessage: protocol.RevocationStatusRequestMessageType, - targetMediatype: packers.MediaTypeZKPMessage, - expected: true, - }, - } - - for _, tt := range testcases { - t.Run(tt.name, func(t *testing.T) { - actual := services.DefaultMediaTypeManager.AllowMediaType(tt.targetProtocolMessage, tt.targetMediatype) - require.Equal(t, tt.expected, actual) - }) - } -} diff --git a/internal/core/services/tests/identity_test.go b/internal/core/services/tests/identity_test.go index 5a63e2e6..011f3f0e 100644 --- a/internal/core/services/tests/identity_test.go +++ b/internal/core/services/tests/identity_test.go @@ -8,6 +8,9 @@ import ( commonEth "github.com/ethereum/go-ethereum/common" "github.com/iden3/go-iden3-core/v2/w3c" "github.com/iden3/go-schema-processor/v2/verifiable" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" + "github.com/iden3/iden3comm/v2/protocol" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,7 +44,16 @@ func Test_identity_UpdateState(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, docLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGateway, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, docLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGateway, revocationStatusResolver, mediaTypeManager) identity, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) require.NoError(t, err) diff --git a/internal/core/services/tests/link_test.go b/internal/core/services/tests/link_test.go index 0b110f76..3a7c5adb 100644 --- a/internal/core/services/tests/link_test.go +++ b/internal/core/services/tests/link_test.go @@ -10,6 +10,9 @@ import ( "github.com/google/uuid" "github.com/iden3/go-iden3-core/v2/w3c" "github.com/iden3/go-schema-processor/v2/verifiable" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" + "github.com/iden3/iden3comm/v2/protocol" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -39,7 +42,16 @@ func Test_link_issueClaim(t *testing.T) { identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) sessionRepository := repositories.NewSessionCached(cachex) schemaService := services.NewSchema(schemaRepository, docLoader) - claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, docLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGateway, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + claimsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, docLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGateway, revocationStatusResolver, mediaTypeManager) identity, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) assert.NoError(t, err) diff --git a/internal/core/services/tests/notification_test.go b/internal/core/services/tests/notification_test.go index 78e2aec3..a128c445 100644 --- a/internal/core/services/tests/notification_test.go +++ b/internal/core/services/tests/notification_test.go @@ -7,6 +7,9 @@ import ( commonEth "github.com/ethereum/go-ethereum/common" "github.com/google/uuid" "github.com/iden3/go-iden3-core/v2/w3c" + "github.com/iden3/iden3comm/v2" + "github.com/iden3/iden3comm/v2/packers" + "github.com/iden3/iden3comm/v2/protocol" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,7 +44,16 @@ func TestNotification_SendNotification(t *testing.T) { rhsFactory := reverse_hash.NewFactory(cfg.CredentialStatus.RHS.URL, nil, commonEth.HexToAddress(cfg.CredentialStatus.OnchainTreeStore.SupportedTreeStoreContract), reverse_hash.DefaultRHSTimeOut) revocationStatusResolver := revocation_status.NewRevocationStatusResolver(cfg.CredentialStatus) identityService := services.NewIdentity(keyStore, identityRepo, mtRepo, identityStateRepo, mtService, nil, claimsRepo, revocationRepository, connectionsRepository, storage, nil, nil, pubsub.NewMock(), cfg.CredentialStatus, rhsFactory, revocationStatusResolver, *cfg.AutoPublishingToOnChainRHS) - credentialsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, docLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGateway, revocationStatusResolver, &services.DefaultMediaTypeManager) + + mediaTypeManager := services.NewMediaTypeManager( + map[iden3comm.ProtocolMessage][]string{ + protocol.CredentialFetchRequestMessageType: {string(packers.MediaTypeZKPMessage)}, + protocol.RevocationStatusRequestMessageType: {"*"}, + }, + true, + ) + + credentialsService := services.NewClaim(claimsRepo, identityService, nil, mtService, identityStateRepo, docLoader, storage, cfg.CredentialStatus.Iden3CommAgentStatus.GetURL(), pubsub.NewMock(), ipfsGateway, revocationStatusResolver, mediaTypeManager) connectionsService := services.NewConnection(connectionsRepository, claimsRepo, storage) iden, err := identityService.Create(ctx, "polygon-test", &ports.DIDCreationOptions{Method: method, Blockchain: blockchain, Network: network, KeyType: BJJ}) require.NoError(t, err)