diff --git a/.github/workflows/sonar-merge-main.yml b/.github/workflows/sonar-merge-main.yml index 123cbffba3..d8390b56e6 100644 --- a/.github/workflows/sonar-merge-main.yml +++ b/.github/workflows/sonar-merge-main.yml @@ -1,4 +1,4 @@ -name: Sonar Scan and Coverage +name: Sonar Scan and Coverage on merge to main on: push: branches: @@ -19,12 +19,8 @@ jobs: python-version: "3.12" os: "ubuntu-latest" is_pr: "false" - - name: Adjust Test Coverage Source - run: | - # Need to change source in coverage report because it was generated from another context - sed -i 's/\/home\/runner\/work\/acapy\/acapy\//\/github\/workspace\//g' test-reports/coverage.xml - name: SonarCloud Scan - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -33,4 +29,4 @@ jobs: -Dsonar.python.coverage.reportPaths=test-reports/coverage.xml -Dsonar.coverage.exclusions=**/tests/**,**/demo/**,**/docs/**,**/docker/**,**/scripts/**,**/scenarios/** -Dsonar.cpd.exclusions=**/tests/**,**/demo/**,**/docs/**,**/docker/**,**/scripts/**,**/scenarios/** - -Dsonar.sources=./ \ No newline at end of file + -Dsonar.sources=./ diff --git a/.github/workflows/sonar-pr.yml b/.github/workflows/sonar-pr.yml index 51558d2ad6..5f763e8cc4 100644 --- a/.github/workflows/sonar-pr.yml +++ b/.github/workflows/sonar-pr.yml @@ -1,4 +1,4 @@ -name: Sonar Scan and Coverage +name: Sonar Scan and Coverage on PRs on: workflow_run: @@ -15,7 +15,7 @@ jobs: with: fetch-depth: 0 - name: Download PR number artifact - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v7 with: workflow: Tests run_id: ${{ github.event.workflow_run.id }} @@ -26,7 +26,7 @@ jobs: with: path: ./PR_NUMBER - name: Download Test Coverage - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v7 with: workflow: Tests run_id: ${{ github.event.workflow_run.id }} @@ -58,7 +58,7 @@ jobs: # Need to change source in coverage report because it was generated from another context sed -i 's/\/home\/runner\/work\/acapy\/acapy\//\/github\/workspace\//g' test-reports/coverage.xml - name: SonarCloud Scan - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -71,4 +71,4 @@ jobs: -Dsonar.coverage.exclusions=**/tests/**,**/demo/**,**/docs/**,**/docker/**,**/scripts/**,**/scenarios/** -Dsonar.cpd.exclusions=**/tests/**,**/demo/**,**/docs/**,**/docker/**,**/scripts/**,**/scenarios/** -Dsonar.python.coverage.reportPaths=test-reports/coverage.xml - -Dsonar.sources=./ \ No newline at end of file + -Dsonar.sources=./ diff --git a/CHANGELOG.md b/CHANGELOG.md index f4be55b250..a418c79077 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,79 @@ # Aries Cloud Agent Python Changelog +## 1.1.1rc0 + +### December 3, 2024 + +Release 1.1.1 is a patch update to ACA-Py that contains a lengthy list of adjustments, improvements and fixes, with a focus on removing Technical Debt. The most visible change is the removal of the "in-memory wallet" implementation in favour of using the SQLite in-memory wallet (`sqlite://:memory:`), including removing the logic for handling that extra wallet type. While arguably a breaking change (and we mention it below), we're confident no one is using the in-memory wallet (right?!?) any where other than in tests. In removing the in-memory wallet, all of the unit and integration tests that used the in-memory wallet were updated to use SQLite's in-memory wallet. + +The first step to full support of [did:tdw](https://identity.foundation/trustdidweb/) (soon to be renamed to `did:webvh` for "`did:web` + Verifiable History") has been added to ACA-Py -- a resolver. We're working on adding new DID Registration for it and other DID Methods, enabling ACA-Py to be used easily with a variety of DID Methods. + +The move to the [OpenWallet Foundation](https://openwallet.foundation/) is now complete. For up to date details on what the repo move means for ACA-Py users, including steps for updating deployments, please see latest in [GitHub Issue #3250]. + +[GitHub Issue #3250]: https://github.com/hyperledger/aries-cloudagent-python/issues/3250 + +### 1.1.1 Deprecation Notices + +The same **[deprecation notices](#101-deprecation-notices)** from the [1.1.0](#110) release about AIP 1.0 protocols still apply. The protocols remain in the 1.1.1 release, but will be moved out of the core and into plugins soon. Please review these notifications carefully! + +### 1.1.1 Breaking Changes + +While there are no breaking changes in this release that might impact production deployments, the removal of the "in-memory" wallet implementation might be break some test scripts. Rather than using the in-memory wallet, tests should be updated to use SQLite's special `sqlite://:memory:` database instead. This results in a better alignment between tests and a production environment. + + +#### 1.1.1 Categorized List of Pull Requests + +- AnonCreds VC Issuance and Presentation Enhancement / Fixes + - Repair release bdd tests [\#3376](https://github.com/openwallet-foundation/acapy/pull/3376) [jamshale](https://github.com/jamshale) + - Fix tails upload for anoncreds multitenancy [\#3346](https://github.com/openwallet-foundation/acapy/pull/3346) [jamshale](https://github.com/jamshale) + - Fix subwallet anoncreds upgrade check [\#3345](https://github.com/openwallet-foundation/acapy/pull/3345) [jamshale](https://github.com/jamshale) + - Add anoncreds issuance and presentation format [\#3331](https://github.com/openwallet-foundation/acapy/pull/3331) [jamshale](https://github.com/jamshale) + - Fix endorsement setup with existing connection [\#3309](https://github.com/openwallet-foundation/acapy/pull/3309) [jamshale](https://github.com/jamshale) + - Update accumulator value in wallet on repair [\#3299](https://github.com/openwallet-foundation/acapy/pull/3299) [jamshale](https://github.com/jamshale) + +- Middleware Handling and Multi-tenancy + - Restore `--base-wallet-routes` flag functionality [\#3344](https://github.com/openwallet-foundation/acapy/pull/3344) [esune](https://github.com/esune) + - :white_check_mark: Re-add ready_middleware unit tests [\#3330](https://github.com/openwallet-foundation/acapy/pull/3330) [ff137](https://github.com/ff137) + - :sparkles: Handle NotFound and UnprocessableEntity errors in middleware [\#3327](https://github.com/openwallet-foundation/acapy/pull/3327) [ff137](https://github.com/ff137) + - :art: Refactor Multitenant Manager errors and exception handling [\#3323](https://github.com/openwallet-foundation/acapy/pull/3323) [ff137](https://github.com/ff137) + - Don't pass rekey to sub_wallet_profile [\#3312](https://github.com/openwallet-foundation/acapy/pull/3312) [jamshale](https://github.com/jamshale) + +- DID Registration and Resolution + - fix: check routing keys on indy_vdr endpoint refresh [\#3371](https://github.com/openwallet-foundation/acapy/pull/3371) [dbluhm](https://github.com/dbluhm) + - Fix/universal resolver [\#3354](https://github.com/openwallet-foundation/acapy/pull/3354) [jamshale](https://github.com/jamshale) + - More robust verification method selection by did [\#3279](https://github.com/openwallet-foundation/acapy/pull/3279) [dbluhm](https://github.com/dbluhm) + - did:tdw resolver [\#3237](https://github.com/openwallet-foundation/acapy/pull/3237) [jamshale](https://github.com/jamshale) + +- DIDComm Updates and Enhancements + - :bug: Rearrange connection record deletion after hangup [\#3310](https://github.com/openwallet-foundation/acapy/pull/3310) [ff137](https://github.com/ff137) + - :bug: Handle failure to resolve DIDComm services in DIDXManager [\#3298](https://github.com/openwallet-foundation/acapy/pull/3298) [ff137](https://github.com/ff137) + +- Test Suite Updates and Artifact Publishing + - Add test wallet config option [\#3355](https://github.com/openwallet-foundation/acapy/pull/3355) [jamshale](https://github.com/jamshale) + - :art: Fix current test warnings [\#3338](https://github.com/openwallet-foundation/acapy/pull/3338) [ff137](https://github.com/ff137) + - :construction_worker: Fix Nightly Publish to not run on forks [\#3333](https://github.com/openwallet-foundation/acapy/pull/3333) [ff137](https://github.com/ff137) + +- Internal Improvements / Cleanups / Tech Debt Updates + - :zap: Add class caching to DeferLoad [\#3361](https://github.com/openwallet-foundation/acapy/pull/3361) [ff137](https://github.com/ff137 + - :art: Sync Ruff version in configs and apply formatting [\#3358](https://github.com/openwallet-foundation/acapy/pull/3358) [ff137](https://github.com/ff137) + - :art: Replace deprecated ABC decorators [\#3357](https://github.com/openwallet-foundation/acapy/pull/3357) [ff137](https://github.com/ff137) + - :art: Refactor the logging module monolith [\#3319](https://github.com/openwallet-foundation/acapy/pull/3319) [ff137](https://github.com/ff137) + - :wrench: set default fixture scope for pytest-asyncio [\#3318](https://github.com/openwallet-foundation/acapy/pull/3318) [ff137](https://github.com/ff137) + - Docs (devcontainer) Change folder names [\#3317](https://github.com/openwallet-foundation/acapy/pull/3317) [loneil](https://github.com/loneil) + - :art: Refactor string concatenation in model descriptions [\#3313](https://github.com/openwallet-foundation/acapy/pull/3313) [ff137](https://github.com/ff137) + - Remove in memory wallet [\#3311](https://github.com/openwallet-foundation/acapy/pull/3311) [jamshale](https://github.com/jamshale) + +- Consolidate Dependabot updates and other library/dependency updates + - Week 49 Library upgrades [\#3368](https://github.com/openwallet-foundation/acapy/pull/3368) [jamshale](https://github.com/jamshale) + - :arrow_up: Update lock file [\#3296](https://github.com/openwallet-foundation/acapy/pull/3296) [ff137](https://github.com/ff137) + +- Release management pull requests: + - 1.1.1rc0 [\#3372](https://github.com/openwallet-foundation/acapy/pull/3372) [swcurran](https://github.com/swcurran) + +- Dependabot PRs + - [Link to list of Dependabot PRs in this release](https://github.com/openwallet-foundation/acapy/pulls?q=is%3Apr+is%3Amerged+merged%3A2024-10-15..2024-12-03+author%3Aapp%2Fdependabot+) + + ## 1.1.0 ### October 15, 2024 diff --git a/Managing-ACA-Py-Doc-Site.md b/Managing-ACA-Py-Doc-Site.md index 8d6902bd9d..5bafc5ad87 100644 --- a/Managing-ACA-Py-Doc-Site.md +++ b/Managing-ACA-Py-Doc-Site.md @@ -20,7 +20,7 @@ and mkdocs configuration. When the GitHub Action fires, it runs a container that carries out the following steps: -- Checks out the triggering branch, either `main` or `docs-v` (e.g `docs-v1.1.0`). +- Checks out the triggering branch, either `main` or `docs-v` (e.g `docs-v1.1.1`). - Runs the script [scripts/prepmkdocs.sh], which moves and updates some of the markdown files so that they fit into the generated site. See the comments in the scripts for details about the copying and editing done via the script. In @@ -97,7 +97,7 @@ To delete the documentation version, do the following: - Check your `git status` and make sure there are no changes in the branch -- e.g., new files that shouldn't be added to the `gh-pages` branch. If there are any -- delete the files so they are not added. -- Remove the folder for the RC. For example `rm -rf 1.1.0` +- Remove the folder for the RC. For example `rm -rf 1.1.1rc0` - Edit the `versions.json` file and remove the reference to the RC release in the file. - Push the changes via a PR to the ACA-Py `gh-pages` branch (don't PR them into diff --git a/PUBLISHING.md b/PUBLISHING.md index 726557bedf..e7bd48af07 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -6,7 +6,7 @@ a major, minor or patch release, per [semver](https://semver.org/) rules. Once ready to do a release, create a local branch that includes the following updates: -1. Create a local PR branch from an updated `main` branch, e.g. "1.1.0". +1. Create a local PR branch from an updated `main` branch, e.g. "1.1.1". 2. See if there are any Document Site `mkdocs` changes needed. Run the script `./scripts/prepmkdocs.sh; mkdocs`. Watch the log, noting particularly if @@ -27,7 +27,7 @@ Once ready to do a release, create a local branch that includes the following up github account. Do not include `dependabot` PRs. For those, we put a live link for the date range of the release (guidance below). - To generate the list, run the script `genChangeLog.sh` command (requires you + To generate the list, run the `./scripts/genChangeLog.sh` scripts (requires you have [gh] and [jq] installed), with the date of the day before the last release. The day before is picked to make sure you get all of the changes. The script generates the list of all PRs, minus the dependabot ones, merged since @@ -78,9 +78,9 @@ Once you have the list of PRs: - Check the dates in the `dependabot` URL to make sure the full period between the previous non-RC release to the date of the non-RC release you are preparing. - Include a PR in the list for this soon-to-be PR, initially with the "next to be issued" number for PRs/Issues. At the end output of the script is the highest numbered PR and issue. Your PR will be one higher than the highest of those two numbers. Note that you still might have to correct the number after you create the PR if someone sneaks an issue or PR in before you submit your PR. -5. Check to see if there are any other PRs that should be included in the release. +1. Check to see if there are any other PRs that should be included in the release. -6. Update the ReadTheDocs in the `/docs` folder by following the instructions in +2. Update the ReadTheDocs in the `/docs` folder by following the instructions in the `docs/UpdateRTD.md` file. That will likely add a number of new and modified files to the PR. Eliminate all of the errors in the generation process, either by mocking external dependencies or by fixing ACA-Py code. If @@ -88,7 +88,7 @@ Once you have the list of PRs: developer. Experience has demonstrated to use that documentation generation errors should be fixed in the code. -7. Search across the repository for the previous version number and update it +3. Search across the repository for the previous version number and update it everywhere that makes sense. The CHANGELOG.md entry for the previous release is a likely exception, and the `pyproject.toml` in the root **MUST** be updated. You can skip (although it won't hurt) to update the files in the @@ -101,28 +101,28 @@ Once you have the list of PRs: have dropped the previously used `-` in the release candidate version string to better follow the semver rules. -8. Regenerate openapi.json and swagger.json by running +4. Regenerate openapi.json and swagger.json by running `scripts/generate-open-api-spec` from within the `acapy_agent` folder. Command: `cd acapy_agent;../scripts/generate-open-api-spec;cd ..` Folders may not be cleaned up by the script, so the following can be run, likely with `sudo` -- `rm -rf open-api/.build`. The folder is `.gitignore`d, so there is not a danger they will be pushed, even if they are not deleted. -9. Double check all of these steps above, and then submit a PR from the branch. +5. Double check all of these steps above, and then submit a PR from the branch. Add this new PR to CHANGELOG.md so that all the PRs are included. If there are still further changes to be merged, mark the PR as "Draft", repeat **ALL** of the steps again, and then mark this PR as ready and then wait until it is merged. It's embarrassing when you have to do a whole new release just because you missed something silly...I know! -10. Immediately after it is merged, create a new GitHub tag representing the +6. Immediately after it is merged, create a new GitHub tag representing the version. The tag name and title of the release should be the same as the version in [pyproject.toml](https://github.com/openwallet-foundation/acapy/tree/main/pyproject.toml). Use the "Generate Release Notes" capability to get a sequential listing of the PRs in the release, to complement the manually curated Changelog. Verify on PyPi that the version is published. -11. New images for the release are automatically published by the GitHubAction +7. New images for the release are automatically published by the GitHubAction Workflows: [publish.yml] and [publish-indy.yml]. The actions are triggered when a release is tagged, so no manual action is needed. The images are published in the [OpenWallet Foundation Package Repository under @@ -140,7 +140,7 @@ Once you have the list of PRs: [publish-indy.yml]: https://github.com/openwallet-foundation/acapy/blob/main/.github/workflows/publish-indy.yml 1. When a new release is tagged, create a new branch at the same commit with - the branch name in the format `docs-v`, for example, `docs-v1.1.0`. + the branch name in the format `docs-v`, for example, `docs-v1.1.1`. The creation of the branch triggers the execution of the [publish-docs] GitHub Action which generates the documentation for the new release, publishing it at [https://aca-py.org]. The GitHub Action also executes when diff --git a/acapy_agent/anoncreds/models/presentation_request.py b/acapy_agent/anoncreds/models/presentation_request.py index 05881dfdc8..12855e1ee6 100644 --- a/acapy_agent/anoncreds/models/presentation_request.py +++ b/acapy_agent/anoncreds/models/presentation_request.py @@ -299,7 +299,7 @@ class Meta: }, ), }, - name="AnoncredPresentationRequestNonRevokedSchema", + name="AnoncredsPresentationRequestNonRevokedSchema", ), allow_none=True, required=False, diff --git a/acapy_agent/askar/profile.py b/acapy_agent/askar/profile.py index 313c026bf3..2b5c8bfe62 100644 --- a/acapy_agent/askar/profile.py +++ b/acapy_agent/askar/profile.py @@ -123,7 +123,7 @@ def bind_providers(self): VCHolder, ClassProvider( "acapy_agent.storage.vc_holder.askar.AskarVCHolder", - ref(self), + ClassProvider.Inject(Profile), ), ) if ( diff --git a/acapy_agent/protocols/issue_credential/v2_0/message_types.py b/acapy_agent/protocols/issue_credential/v2_0/message_types.py index e34ce0385d..80e56d2309 100644 --- a/acapy_agent/protocols/issue_credential/v2_0/message_types.py +++ b/acapy_agent/protocols/issue_credential/v2_0/message_types.py @@ -37,25 +37,25 @@ # Format specifications ATTACHMENT_FORMAT = { CRED_20_PROPOSAL: { - V20CredFormat.Format.ANONCREDS.api: "anoncreds/cred-filter@v2.0", + V20CredFormat.Format.ANONCREDS.api: "anoncreds/credential-filter@v1.0", V20CredFormat.Format.INDY.api: "hlindy/cred-filter@v2.0", V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc-detail@v1.0", V20CredFormat.Format.VC_DI.api: "didcomm/w3c-di-vc@v0.1", }, CRED_20_OFFER: { - V20CredFormat.Format.ANONCREDS.api: "anoncreds/cred-abstract@v2.0", + V20CredFormat.Format.ANONCREDS.api: "anoncreds/credential-offer@v1.0", V20CredFormat.Format.INDY.api: "hlindy/cred-abstract@v2.0", V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc-detail@v1.0", V20CredFormat.Format.VC_DI.api: "didcomm/w3c-di-vc-offer@v0.1", }, CRED_20_REQUEST: { - V20CredFormat.Format.ANONCREDS.api: "anoncreds/cred-req@v2.0", + V20CredFormat.Format.ANONCREDS.api: "anoncreds/credential-request@v1.0", V20CredFormat.Format.INDY.api: "hlindy/cred-req@v2.0", V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc-detail@v1.0", V20CredFormat.Format.VC_DI.api: "didcomm/w3c-di-vc-request@v0.1", }, CRED_20_ISSUE: { - V20CredFormat.Format.ANONCREDS.api: "anoncreds/cred@v2.0", + V20CredFormat.Format.ANONCREDS.api: "anoncreds/credential@v1.0", V20CredFormat.Format.INDY.api: "hlindy/cred@v2.0", V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc@v1.0", V20CredFormat.Format.VC_DI.api: "didcomm/w3c-di-vc@v0.1", diff --git a/acapy_agent/protocols/issue_credential/v2_0/routes.py b/acapy_agent/protocols/issue_credential/v2_0/routes.py index 9128f7aeac..de7c61f2e0 100644 --- a/acapy_agent/protocols/issue_credential/v2_0/routes.py +++ b/acapy_agent/protocols/issue_credential/v2_0/routes.py @@ -28,6 +28,7 @@ from ....messaging.models.openapi import OpenAPISchema from ....messaging.models.paginated_query import PaginatedQuerySchema, get_limit_offset from ....messaging.valid import ( + ANONCREDS_CRED_DEF_ID_EXAMPLE, ANONCREDS_DID_EXAMPLE, ANONCREDS_SCHEMA_ID_EXAMPLE, INDY_CRED_DEF_ID_EXAMPLE, @@ -137,13 +138,24 @@ class V20CredStoreRequestSchema(OpenAPISchema): class V20CredFilterAnoncredsSchema(OpenAPISchema): """Anoncreds credential filtration criteria.""" - cred_def_id = fields.Str( + schema_issuer_id = fields.Str( required=False, metadata={ - "description": "Credential definition identifier", + "description": "Schema issuer ID", "example": ANONCREDS_DID_EXAMPLE, }, ) + schema_name = fields.Str( + required=False, + metadata={"description": "Schema name", "example": "preferences"}, + ) + schema_version = fields.Str( + required=False, + metadata={ + "description": "Schema version", + "example": MAJOR_MINOR_VERSION_EXAMPLE, + }, + ) schema_id = fields.Str( required=False, metadata={ @@ -154,13 +166,16 @@ class V20CredFilterAnoncredsSchema(OpenAPISchema): issuer_id = fields.Str( required=False, metadata={ - "description": "Credential issuer DID", + "description": "Credential issuer ID", "example": ANONCREDS_DID_EXAMPLE, }, ) - epoch = fields.Str( + cred_def_id = fields.Str( required=False, - metadata={"description": "Credential epoch time", "example": "2021-08-24"}, + metadata={ + "description": "Credential definition identifier", + "example": ANONCREDS_CRED_DEF_ID_EXAMPLE, + }, ) diff --git a/acapy_agent/protocols/issue_credential/v2_0/tests/test_routes.py b/acapy_agent/protocols/issue_credential/v2_0/tests/test_routes.py index 9e3663d5ed..8691862f0d 100644 --- a/acapy_agent/protocols/issue_credential/v2_0/tests/test_routes.py +++ b/acapy_agent/protocols/issue_credential/v2_0/tests/test_routes.py @@ -61,6 +61,29 @@ async def test_validate_cred_filter_schema(self): with self.assertRaises(test_module.ValidationError): schema.validate_fields({"veres-one": {"no": "support"}}) + async def test_validate_cred_filter_anoncreds_schema(self): + schema = test_module.V20CredFilterSchema() + schema.validate_fields({"anoncreds": {"issuer_id": TEST_DID}}) + schema.validate_fields( + {"anoncreds": {"issuer_id": TEST_DID, "schema_version": "1.0"}} + ) + schema.validate_fields( + { + "anoncreds": {"issuer_id": TEST_DID}, + } + ) + schema.validate_fields( + { + "anoncreds": {}, + } + ) + with self.assertRaises(test_module.ValidationError): + schema.validate_fields({}) + with self.assertRaises(test_module.ValidationError): + schema.validate_fields(["hopeless", "stop"]) + with self.assertRaises(test_module.ValidationError): + schema.validate_fields({"veres-one": {"no": "support"}}) + async def test_validate_create_schema(self): schema = test_module.V20IssueCredSchemaCore() schema.validate( diff --git a/acapy_agent/protocols/present_proof/v2_0/message_types.py b/acapy_agent/protocols/present_proof/v2_0/message_types.py index 5654ef7d42..3c24ef7d72 100644 --- a/acapy_agent/protocols/present_proof/v2_0/message_types.py +++ b/acapy_agent/protocols/present_proof/v2_0/message_types.py @@ -32,17 +32,17 @@ # Format specifications ATTACHMENT_FORMAT = { PRES_20_PROPOSAL: { - V20PresFormat.Format.ANONCREDS.api: "anoncreds/proof-req@v2.0", + V20PresFormat.Format.ANONCREDS.api: "anoncreds/proof-proposal@v1.0", V20PresFormat.Format.INDY.api: "hlindy/proof-req@v2.0", V20PresFormat.Format.DIF.api: "dif/presentation-exchange/definitions@v1.0", }, PRES_20_REQUEST: { - V20PresFormat.Format.ANONCREDS.api: "anoncreds/proof-req@v2.0", + V20PresFormat.Format.ANONCREDS.api: "anoncreds/proof-request@v1.0", V20PresFormat.Format.INDY.api: "hlindy/proof-req@v2.0", V20PresFormat.Format.DIF.api: "dif/presentation-exchange/definitions@v1.0", }, PRES_20: { - V20PresFormat.Format.ANONCREDS.api: "anoncreds/proof@v2.0", + V20PresFormat.Format.ANONCREDS.api: "anoncreds/proof@v1.0", V20PresFormat.Format.INDY.api: "hlindy/proof@v2.0", V20PresFormat.Format.DIF.api: "dif/presentation-exchange/submission@v1.0", }, diff --git a/acapy_agent/vc/routes.py b/acapy_agent/vc/routes.py index 47e7d1b8f6..e2d14e80fe 100644 --- a/acapy_agent/vc/routes.py +++ b/acapy_agent/vc/routes.py @@ -34,7 +34,11 @@ async def list_credentials_route(request: web.BaseRequest): holder = context.inject(VCHolder) try: search = holder.search_credentials() - records = [record.serialize()["cred_value"] for record in await search.fetch()] + records = { + "results": [ + record.serialize()["cred_value"] for record in await search.fetch() + ] + } return web.json_response(records, status=200) except (StorageError, StorageNotFoundError) as err: return web.json_response({"message": err.roll_up}, status=400) @@ -133,6 +137,9 @@ async def verify_credential_route(request: web.BaseRequest): @docs(tags=["vc-api"], summary="Store a credential") +@request_schema(web_schemas.StoreCredentialRequest()) +@response_schema(web_schemas.StoreCredentialResponse(), 200, description="") +@tenant_authentication async def store_credential_route(request: web.BaseRequest): """Request handler for storing a credential. @@ -153,7 +160,7 @@ async def store_credential_route(request: web.BaseRequest): options = LDProofVCOptions.deserialize(options) await manager.verify_credential(vc) - await manager.store_credential(vc, options, cred_id) + await manager.store_credential(vc, cred_id) return web.json_response({"credentialId": cred_id}, status=200) diff --git a/acapy_agent/vc/vc_ld/manager.py b/acapy_agent/vc/vc_ld/manager.py index d6d4b6809c..bf3fa83bc4 100644 --- a/acapy_agent/vc/vc_ld/manager.py +++ b/acapy_agent/vc/vc_ld/manager.py @@ -405,9 +405,8 @@ async def issue( async def store_credential( self, vc: VerifiableCredential, - options: LDProofVCOptions, cred_id: Optional[str] = None, - ) -> VerifiableCredential: + ) -> VCRecord: """Store a verifiable credential.""" # Saving expanded type as a cred_tag @@ -437,6 +436,8 @@ async def store_credential( await vc_holder.store_credential(vc_record) + return vc_record + async def verify_credential( self, vc: VerifiableCredential ) -> DocumentVerificationResult: diff --git a/acapy_agent/vc/vc_ld/models/web_schemas.py b/acapy_agent/vc/vc_ld/models/web_schemas.py index 6bd6a93035..277c04e872 100644 --- a/acapy_agent/vc/vc_ld/models/web_schemas.py +++ b/acapy_agent/vc/vc_ld/models/web_schemas.py @@ -12,7 +12,7 @@ class ListCredentialsResponse(OpenAPISchema): """Response schema for listing credentials.""" - results = [fields.Nested(VerifiableCredentialSchema)] + results = fields.List(fields.Nested(VerifiableCredentialSchema)) class FetchCredentialResponse(OpenAPISchema): @@ -47,6 +47,18 @@ class VerifyCredentialResponse(OpenAPISchema): results = fields.Nested(PresentationVerificationResultSchema) +class StoreCredentialRequest(OpenAPISchema): + """Request schema for verifying an LDP VP.""" + + verifiableCredential = fields.Nested(VerifiableCredentialSchema) + + +class StoreCredentialResponse(OpenAPISchema): + """Request schema for verifying an LDP VP.""" + + credentialId = fields.Str() + + class ProvePresentationRequest(OpenAPISchema): """Request schema for proving a presentation.""" diff --git a/acapy_agent/vc/vc_ld/tests/test_manager.py b/acapy_agent/vc/vc_ld/tests/test_manager.py index bc6a5b3d4b..24182f5eda 100644 --- a/acapy_agent/vc/vc_ld/tests/test_manager.py +++ b/acapy_agent/vc/vc_ld/tests/test_manager.py @@ -331,7 +331,7 @@ async def test_store( self.vc.issuer = did.did self.options.proof_type = Ed25519Signature2018.signature_type cred = await self.manager.issue(self.vc, self.options) - await self.manager.store_credential(cred, self.options, TEST_UUID) + await self.manager.store_credential(cred, TEST_UUID) async with self.profile.session() as session: holder = session.inject(VCHolder) record = await holder.retrieve_credential_by_id(record_id=TEST_UUID) diff --git a/demo/features/steps/0453-issue-credential.py b/demo/features/steps/0453-issue-credential.py index d96fdae10a..b85e5b6ef3 100644 --- a/demo/features/steps/0453-issue-credential.py +++ b/demo/features/steps/0453-issue-credential.py @@ -170,8 +170,9 @@ def step_impl(context, holder): agent["agent"], "/issue-credential-2.0/records/" + cred_ex_id ) context.cred_exchange = cred_exchange - print("rev_reg_id:", cred_exchange["indy"]["rev_reg_id"]) - print("cred_rev_id:", cred_exchange["indy"]["cred_rev_id"]) + _format = "indy" if cred_exchange.get("indy") else "anoncreds" + print("rev_reg_id:", cred_exchange[_format]["rev_reg_id"]) + print("cred_rev_id:", cred_exchange[_format]["cred_rev_id"]) print("connection_id:", cred_exchange["cred_ex_record"]["connection_id"]) # revoke the credential @@ -184,8 +185,8 @@ def step_impl(context, holder): agent["agent"], endpoint, data={ - "rev_reg_id": cred_exchange["indy"]["rev_reg_id"], - "cred_rev_id": cred_exchange["indy"]["cred_rev_id"], + "rev_reg_id": cred_exchange[_format]["rev_reg_id"], + "cred_rev_id": cred_exchange[_format]["cred_rev_id"], "publish": "Y", "connection_id": cred_exchange["cred_ex_record"]["connection_id"], }, @@ -208,19 +209,22 @@ def step_impl(context, holder): # get the required revocation info from the last credential exchange cred_exchange = context.cred_exchange - print("rev_reg_id:", cred_exchange["indy"]["rev_reg_id"]) - print("cred_rev_id:", cred_exchange["indy"]["cred_rev_id"]) + _format = "indy" if cred_exchange.get("indy") else "anoncreds" + print("rev_reg_id:", cred_exchange[_format]["rev_reg_id"]) + print("cred_rev_id:", cred_exchange[_format]["cred_rev_id"]) print("connection_id:", cred_exchange["cred_ex_record"]["connection_id"]) # check wallet status wallet_revoked_creds = agent_container_GET( agent["agent"], - "/revocation/registry/" + cred_exchange["indy"]["rev_reg_id"] + "/issued/details", + "/revocation/registry/" + + cred_exchange[_format]["rev_reg_id"] + + "/issued/details", ) print("wallet_revoked_creds:", wallet_revoked_creds) matched = False for rec in wallet_revoked_creds: - if rec["cred_rev_id"] == cred_exchange["indy"]["cred_rev_id"]: + if rec["cred_rev_id"] == cred_exchange[_format]["cred_rev_id"]: matched = True assert rec["state"] == "revoked" assert matched @@ -229,18 +233,18 @@ def step_impl(context, holder): ledger_revoked_creds = agent_container_GET( agent["agent"], "/revocation/registry/" - + cred_exchange["indy"]["rev_reg_id"] + + cred_exchange[_format]["rev_reg_id"] + "/issued/indy_recs", ) print("ledger_revoked_creds:", ledger_revoked_creds) print( "assert", - cred_exchange["indy"]["cred_rev_id"], + cred_exchange[_format]["cred_rev_id"], "in", ledger_revoked_creds["rev_reg_delta"]["value"]["revoked"], ) assert ( - int(cred_exchange["indy"]["cred_rev_id"]) + int(cred_exchange[_format]["cred_rev_id"]) in ledger_revoked_creds["rev_reg_delta"]["value"]["revoked"] ) @@ -265,8 +269,9 @@ def step_impl(context, holder): agent["agent"], "/issue-credential-2.0/records/" + cred_ex_id ) context.cred_exchange = cred_exchange - print("rev_reg_id:", cred_exchange["indy"]["rev_reg_id"]) - print("cred_rev_id:", cred_exchange["indy"]["cred_rev_id"]) + _format = "indy" if cred_exchange.get("indy") else "anoncreds" + print("rev_reg_id:", cred_exchange[_format]["rev_reg_id"]) + print("cred_rev_id:", cred_exchange[_format]["cred_rev_id"]) print("connection_id:", cred_exchange["cred_ex_record"]["connection_id"]) # revoke the credential @@ -275,8 +280,8 @@ def step_impl(context, holder): agent["agent"], "/revocation/revoke", data={ - "rev_reg_id": cred_exchange["indy"]["rev_reg_id"], - "cred_rev_id": cred_exchange["indy"]["cred_rev_id"], + "rev_reg_id": cred_exchange[_format]["rev_reg_id"], + "cred_rev_id": cred_exchange[_format]["cred_rev_id"], "publish": "Y", "connection_id": cred_exchange["cred_ex_record"]["connection_id"], }, @@ -297,18 +302,21 @@ def step_impl(context, holder): # get the required revocation info from the last credential exchange cred_exchange = context.cred_exchange - print("rev_reg_id:", cred_exchange["indy"]["rev_reg_id"]) - print("cred_rev_id:", cred_exchange["indy"]["cred_rev_id"]) + _format = "indy" if cred_exchange.get("indy") else "anoncreds" + print("rev_reg_id:", cred_exchange[_format]["rev_reg_id"]) + print("cred_rev_id:", cred_exchange[_format]["cred_rev_id"]) print("connection_id:", cred_exchange["cred_ex_record"]["connection_id"]) # check wallet status wallet_revoked_creds = agent_container_GET( agent["agent"], - "/revocation/registry/" + cred_exchange["indy"]["rev_reg_id"] + "/issued/details", + "/revocation/registry/" + + cred_exchange[_format]["rev_reg_id"] + + "/issued/details", ) matched = False for rec in wallet_revoked_creds: - if rec["cred_rev_id"] == cred_exchange["indy"]["cred_rev_id"]: + if rec["cred_rev_id"] == cred_exchange[_format]["cred_rev_id"]: matched = True assert rec["state"] == "revoked" assert matched @@ -317,12 +325,12 @@ def step_impl(context, holder): ledger_revoked_creds = agent_container_GET( agent["agent"], "/revocation/registry/" - + cred_exchange["indy"]["rev_reg_id"] + + cred_exchange[_format]["rev_reg_id"] + "/issued/indy_recs", ) print("ledger_revoked_creds:", ledger_revoked_creds) assert ( - int(cred_exchange["indy"]["cred_rev_id"]) + int(cred_exchange[_format]["cred_rev_id"]) not in ledger_revoked_creds["rev_reg_delta"]["value"]["revoked"] ) diff --git a/demo/features/steps/0454-present-proof.py b/demo/features/steps/0454-present-proof.py index 31e91930f5..166712f4e0 100644 --- a/demo/features/steps/0454-present-proof.py +++ b/demo/features/steps/0454-present-proof.py @@ -37,7 +37,7 @@ def step_impl(context, verifier, request_for_proof, prover): proof_exchange = aries_container_request_proof( agent["agent"], proof_request_info, - agent["agent"].wallet_type == "askar-anoncreds", + is_anoncreds=agent["agent"].wallet_type == "askar-anoncreds", ) context.proof_request = proof_request_info diff --git a/demo/runners/agent_container.py b/demo/runners/agent_container.py index 61b07f4ef7..e529e6aefe 100644 --- a/demo/runners/agent_container.py +++ b/demo/runners/agent_container.py @@ -1366,7 +1366,7 @@ def arg_parser(ident: str = None, port: int = 8020): type=str, default=CRED_FORMAT_INDY, metavar=(""), - help="Credential type (indy, json-ld)", + help="Credential type (indy, json-ld, vc_di)", ) parser.add_argument( "--aip", @@ -1571,7 +1571,7 @@ async def create_agent_with_args(args, ident: str = None, extra_args: list = Non # Set anoncreds agent to use anoncreds credential format wallet_type = arg_file_dict.get("wallet-type") or args.wallet_type - if wallet_type == "askar-anoncreds": + if wallet_type == "askar-anoncreds" and cred_type == CRED_FORMAT_INDY: cred_type = CRED_FORMAT_ANONCREDS log_msg( diff --git a/docker/Dockerfile b/docker/Dockerfile index 8917d6ce7e..89e2e3da54 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,7 +3,7 @@ FROM python:${python_version}-slim-bullseye AS build WORKDIR /src -ADD . . +COPY . . RUN pip install --no-cache-dir poetry RUN poetry build diff --git a/docker/Dockerfile.bdd b/docker/Dockerfile.bdd index d2e6c2098a..afbd779fa4 100644 --- a/docker/Dockerfile.bdd +++ b/docker/Dockerfile.bdd @@ -4,6 +4,6 @@ FROM faber-alice-demo RUN pip3 install --no-cache-dir -r demo/requirements.behave.txt WORKDIR ./demo -ADD demo/multi_ledger_config_bdd.yml ./demo/multi_ledger_config.yml +COPY demo/multi_ledger_config_bdd.yml ./demo/multi_ledger_config.yml RUN chmod a+w . ENTRYPOINT ["behave"] diff --git a/docker/Dockerfile.demo b/docker/Dockerfile.demo index db63f2cb28..766dde0a64 100644 --- a/docker/Dockerfile.demo +++ b/docker/Dockerfile.demo @@ -9,25 +9,25 @@ RUN mkdir -p bin && curl -L -o bin/jq \ https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && \ chmod ug+x bin/jq -# Add and install Aries Agent code +# Copy and install Aries Agent code RUN pip install --no-cache-dir poetry -ADD README.md pyproject.toml poetry.lock ./ +COPY README.md pyproject.toml poetry.lock ./ ARG all_extras=0 RUN if ! [ -z ${all_extras} ]; then poetry install --no-root --no-directory --all-extras; else poetry install --no-root --no-directory -E "didcommv2"; fi -ADD acapy_agent ./acapy_agent -ADD scripts ./scripts +COPY acapy_agent ./acapy_agent +COPY scripts ./scripts RUN pip3 install --no-cache-dir -e . RUN mkdir demo && chown -R aries:aries demo && chmod -R ug+rw demo -# Add and install demo code -ADD demo/requirements.txt ./demo/requirements.txt +# Copy and install demo code +COPY demo/requirements.txt ./demo/requirements.txt RUN pip3 install --no-cache-dir -r demo/requirements.txt -ADD demo ./demo +COPY demo ./demo ENTRYPOINT ["bash", "-c", "demo/ngrok-wait.sh \"$@\"", "--"] diff --git a/docker/Dockerfile.run b/docker/Dockerfile.run index 90bfb05ad9..706588d0b5 100644 --- a/docker/Dockerfile.run +++ b/docker/Dockerfile.run @@ -15,12 +15,12 @@ RUN apt-get update && apt-get install -y curl && apt-get clean RUN pip install --no-cache-dir poetry RUN mkdir -p acapy_agent && touch acapy_agent/__init__.py -ADD pyproject.toml poetry.lock README.md ./ +COPY pyproject.toml poetry.lock README.md ./ RUN mkdir -p log && chmod -R ug+rw log ARG all_extras=0 RUN if ! [ -z ${all_extras} ]; then poetry install --all-extras; else poetry install -E "didcommv2"; fi -ADD . . +COPY . . ENTRYPOINT ["/bin/bash", "-c", "poetry run aca-py \"$@\"", "--"] diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 5351bccdcd..fb4e9e98f1 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -11,12 +11,12 @@ WORKDIR /usr/src/app RUN pip install --no-cache-dir poetry -ADD ./README.md pyproject.toml ./poetry.lock ./ +COPY ./README.md pyproject.toml ./poetry.lock ./ RUN mkdir acapy_agent && touch acapy_agent/__init__.py ARG all_extras=0 RUN if ! [ -z ${all_extras} ]; then poetry install --no-directory --all-extras --with=dev; else poetry install --no-directory -E "didcommv2" --with=dev; fi -ADD . . +COPY . . ENTRYPOINT ["/bin/bash", "-c", "poetry run pytest \"$@\"", "--"] diff --git a/docs/UpdateRTD.md b/docs/UpdateRTD.md index b37e028992..c9307936b2 100644 --- a/docs/UpdateRTD.md +++ b/docs/UpdateRTD.md @@ -17,7 +17,7 @@ and verify the installation on your system. To rebuild the project and settings from scratch: ``` bash -cd docs; rm -rf generated; sphinx-apidoc -f -M -o ./generated ../acapy_agent/ $(find ../acapy_agent/ -name '*tests*', cd ..) +cd docs; rm -rf generated; sphinx-apidoc -f -M -o ./generated ../acapy_agent/ $(find ../acapy_agent/ -name '*tests*'); cd .. ``` Note that the `find` command that is used to exclude any of the `test` python files from the RTD documentation. diff --git a/docs/features/SupportedRFCs.md b/docs/features/SupportedRFCs.md index 23b370c03b..8118b283c7 100644 --- a/docs/features/SupportedRFCs.md +++ b/docs/features/SupportedRFCs.md @@ -8,7 +8,7 @@ ACA-Py or the repository `main` branch. Reminders (and PRs!) to update this page welcome! If you have any questions, please contact us on the #aries channel on [OpenWallet Foundation Discord](https://discord.gg/openwallet-foundation) or through an issue in this repo. -**Last Update**: 2024-10-15, Release 1.1.0 +**Last Update**: 2024-12-02, Release 1.1.1 > The checklist version of this document was created as a joint effort > between [Northern Block](https://northernblock.io/), [Animo Solutions](https://animo.id/) and the Ontario government, on behalf of the Ontario government. diff --git a/docs/features/W3cCredentials.md b/docs/features/W3cCredentials.md index 72d871b7d9..02ddaa7d0c 100644 --- a/docs/features/W3cCredentials.md +++ b/docs/features/W3cCredentials.md @@ -1,62 +1,60 @@ -## Verifiable Credential Data Integrity (VC-DI) Credentials in ACA-Py +# Verifiable Credential Data Integrity (VC-DI) Credentials in ACA-Py This document outlines a new functionality within Aries Agent that facilitates the issuance of credentials and presentations in compliance with the W3C standard. -### Table of Contents - -- [Verifiable Credential Data Integrity (VC-DI) Credentials in ACA-Py](#verifiable-credential-data-integrity-vc-di-credentials-in-aca-py) - - [Table of Contents](#table-of-contents) - - [General Concept](#general-concept) - - [Prerequisites](#prerequisites) - - [Verifiable Credentials Data Model](#verifiable-credentials-data-model) - - [Verifiable Presentations Data Model](#verifiable-presentations-data-model) - - [DIF Presentation Format](#dif-presentation-format) - - [Preparing to Issue a Credential](#preparing-to-issue-a-credential) - - [VC-DI Context](#vc-di-context) - - [Signature Suite](#signature-suite) - - [DID Method](#did-method) - - [`did:key`](#didkey) - - [Issue a Credential](#issue-a-credential) - - [Verify a Credential](#verify-a-credential) - - [Present Proof](#present-proof) - - [Requesting Proof](#requesting-proof) - - [Presenting Proof](#presenting-proof) - - [Verifying Proof](#verifying-proof) - - [Appendix](#appendix) - - [Glossary of Terms](#glossary-of-terms) - - [References and Resources](#references-and-resources) - -### General Concept +## Table of Contents + +- [General Concept](#general-concept) +- [Prerequisites](#prerequisites) + - [Verifiable Credentials Data Model](#verifiable-credentials-data-model) + - [Verifiable Presentations Data Model](#verifiable-presentations-data-model) + - [DIF Presentation Format](#dif-presentation-format) +- [Preparing to Issue a Credential](#preparing-to-issue-a-credential) + - [VC-DI Context](#vc-di-context) + - [Signature Suite](#signature-suite) + - [DID Method](#did-method) + - [`did:key`](#didkey) +- [Issue a Credential](#issue-a-credential) +- [Verify a Credential](#verify-a-credential) +- [Present Proof](#present-proof) + - [Requesting Proof](#requesting-proof) + - [Presenting Proof](#presenting-proof) + - [Verifying Proof](#verifying-proof) +- [Appendix](#appendix) + - [Glossary of Terms](#glossary-of-terms) + - [References and Resources](#references-and-resources) + +## General Concept The introduction of VC-DI credentials in ACA-Py facilitates the issuance of credentials and presentations in adherence to the W3C standard. -### Prerequisites +## Prerequisites Before utilizing this feature, it is essential to have the following: -#### Verifiable Credentials Data Model +### Verifiable Credentials Data Model A basic understanding of the Verifiable Credentials Data Model is required. Resources for reference include: - [Verifiable Credentials Data Model](https://www.w3.org/TR/vc-data-model/) -#### Verifiable Presentations Data Model +### Verifiable Presentations Data Model Familiarity with the Verifiable Presentations Data Model is necessary. Relevant resources can be found at: - [Verifiable Presentations Data Model](https://www.w3.org/TR/vc-data-model/#presentations) -#### DIF Presentation Format +### DIF Presentation Format Understanding the DIF Presentation Format is recommended. Access resources at: - [DIF Presentation Format](https://identity.foundation/presentation-exchange/) -### Preparing to Issue a Credential +## Preparing to Issue a Credential To prepare for credential issuance, the following steps must be taken: -#### VC-DI Context +### VC-DI Context Ensure that every property key in the document is mappable to an IRI. This requires either the property key to be an IRI by default or to have the shorthand property mapped in the `@context` of the document. @@ -72,17 +70,17 @@ Ensure that every property key in the document is mappable to an IRI. This requi } ``` -#### Signature Suite +### Signature Suite Select a signature suite for use. VC-DI format currently supports EdDSA signature suites for issuing credentials. - [`Ed25519Signature2020`](https://w3c.github.io/vc-di-eddsa/#ed25519signature2020-0) -#### DID Method +### DID Method Choose a DID method for issuing the credential. VC-DI format currently supports the `did:key` method. -##### `did:key` +#### `did:key` A `did:key` did is not anchored to a ledger, but embeds the key directly in the identifier part of the did. See the [did:key Method Specification](https://w3c-ccg.github.io/did-method-key/) for more information. @@ -97,7 +95,7 @@ You can create a `did:key` using the `/wallet/did/create` endpoint with the foll } ``` -### Issue a Credential +## Issue a Credential The issuance of W3C credentials is facilitated through the `/issue-credential-2.0/send` endpoint. This process adheres to the formats described in [RFC 0809 VC-DI](https://github.com/hyperledger/aries-rfcs/blob/main/features/0809-w3c-data-integrity-credential-attachment/README.md) and utilizes `didcomm` for communication between agents. @@ -184,7 +182,7 @@ The response should confirm the credential issuance. ``` -### Verify a Credential +## Verify a Credential To verify a credential, follow these steps: @@ -303,9 +301,9 @@ The response should confirm the credential verification. ``` -### Present Proof +## Present Proof -#### Requesting Proof +### Requesting Proof To request proof, follow these steps: @@ -399,7 +397,7 @@ To request proof, follow these steps: ``` -#### Presenting Proof +### Presenting Proof To present proof, follow these steps: @@ -499,7 +497,7 @@ To present proof, follow these steps: ``` -#### Verifying Proof +### Verifying Proof To verify presented proof, follow these steps: @@ -621,9 +619,9 @@ To verify presented proof, follow these steps: ``` -### Appendix +## Appendix -#### Glossary of Terms +### Glossary of Terms - **VC-DI:** Verifiable Credential Data Integrity - **W3C:** World Wide Web Consortium @@ -631,7 +629,7 @@ To verify presented proof, follow these steps: - **EdDSA:** Edwards-curve Digital Signature Algorithm - **DIF:** Decentralized Identity Foundation -#### References and Resources +### References and Resources - [ACA-Py Documentation](https://aca-py.org) - [Verifiable Credentials Data Model](https://www.w3.org/TR/vc-data-model/) diff --git a/docs/generated/acapy_agent.anoncreds.models.rst b/docs/generated/acapy_agent.anoncreds.models.rst index 0539f9285a..58f7a28113 100644 --- a/docs/generated/acapy_agent.anoncreds.models.rst +++ b/docs/generated/acapy_agent.anoncreds.models.rst @@ -9,26 +9,106 @@ acapy\_agent.anoncreds.models package Submodules ---------- -acapy\_agent.anoncreds.models.anoncreds\_cred\_def module +acapy\_agent.anoncreds.models.credential module +----------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.credential + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.credential\_definition module +----------------------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.credential_definition + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.credential\_offer module +------------------------------------------------------ + +.. automodule:: acapy_agent.anoncreds.models.credential_offer + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.credential\_proposal module --------------------------------------------------------- -.. automodule:: acapy_agent.anoncreds.models.anoncreds_cred_def +.. automodule:: acapy_agent.anoncreds.models.credential_proposal + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.credential\_request module +-------------------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.credential_request + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.non\_rev\_interval module +------------------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.non_rev_interval :members: :undoc-members: :show-inheritance: -acapy\_agent.anoncreds.models.anoncreds\_revocation module +acapy\_agent.anoncreds.models.predicate module +---------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.predicate + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.presentation\_request module ---------------------------------------------------------- -.. automodule:: acapy_agent.anoncreds.models.anoncreds_revocation +.. automodule:: acapy_agent.anoncreds.models.presentation_request :members: :undoc-members: :show-inheritance: -acapy\_agent.anoncreds.models.anoncreds\_schema module ------------------------------------------------------- +acapy\_agent.anoncreds.models.proof module +------------------------------------------ + +.. automodule:: acapy_agent.anoncreds.models.proof + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.requested\_credentials module +----------------------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.requested_credentials + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.revocation module +----------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.revocation + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.schema module +------------------------------------------- + +.. automodule:: acapy_agent.anoncreds.models.schema + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.anoncreds.models.utils module +------------------------------------------ -.. automodule:: acapy_agent.anoncreds.models.anoncreds_schema +.. automodule:: acapy_agent.anoncreds.models.utils :members: :undoc-members: :show-inheritance: diff --git a/docs/generated/acapy_agent.config.logging.rst b/docs/generated/acapy_agent.config.logging.rst new file mode 100644 index 0000000000..3db38f2b8b --- /dev/null +++ b/docs/generated/acapy_agent.config.logging.rst @@ -0,0 +1,42 @@ +acapy\_agent.config.logging package +=================================== + +.. automodule:: acapy_agent.config.logging + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +acapy\_agent.config.logging.base module +--------------------------------------- + +.. automodule:: acapy_agent.config.logging.base + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.config.logging.configurator module +----------------------------------------------- + +.. automodule:: acapy_agent.config.logging.configurator + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.config.logging.filters module +------------------------------------------ + +.. automodule:: acapy_agent.config.logging.filters + :members: + :undoc-members: + :show-inheritance: + +acapy\_agent.config.logging.timed\_rotating\_file\_multi\_process\_handler module +--------------------------------------------------------------------------------- + +.. automodule:: acapy_agent.config.logging.timed_rotating_file_multi_process_handler + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/generated/acapy_agent.config.rst b/docs/generated/acapy_agent.config.rst index ad606129b8..51d632e56b 100644 --- a/docs/generated/acapy_agent.config.rst +++ b/docs/generated/acapy_agent.config.rst @@ -6,6 +6,14 @@ acapy\_agent.config package :undoc-members: :show-inheritance: +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + acapy_agent.config.logging + Submodules ---------- @@ -81,14 +89,6 @@ acapy\_agent.config.ledger module :undoc-members: :show-inheritance: -acapy\_agent.config.logging module ----------------------------------- - -.. automodule:: acapy_agent.config.logging - :members: - :undoc-members: - :show-inheritance: - acapy\_agent.config.plugin\_settings module ------------------------------------------- diff --git a/docs/generated/acapy_agent.core.in_memory.didcomm.rst b/docs/generated/acapy_agent.core.in_memory.didcomm.rst deleted file mode 100644 index 3842f254f3..0000000000 --- a/docs/generated/acapy_agent.core.in_memory.didcomm.rst +++ /dev/null @@ -1,26 +0,0 @@ -acapy\_agent.core.in\_memory.didcomm package -============================================ - -.. automodule:: acapy_agent.core.in_memory.didcomm - :members: - :undoc-members: - :show-inheritance: - -Submodules ----------- - -acapy\_agent.core.in\_memory.didcomm.derive\_1pu module -------------------------------------------------------- - -.. automodule:: acapy_agent.core.in_memory.didcomm.derive_1pu - :members: - :undoc-members: - :show-inheritance: - -acapy\_agent.core.in\_memory.didcomm.derive\_ecdh module --------------------------------------------------------- - -.. automodule:: acapy_agent.core.in_memory.didcomm.derive_ecdh - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/generated/acapy_agent.core.in_memory.rst b/docs/generated/acapy_agent.core.in_memory.rst deleted file mode 100644 index ea101cb0b9..0000000000 --- a/docs/generated/acapy_agent.core.in_memory.rst +++ /dev/null @@ -1,26 +0,0 @@ -acapy\_agent.core.in\_memory package -==================================== - -.. automodule:: acapy_agent.core.in_memory - :members: - :undoc-members: - :show-inheritance: - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - acapy_agent.core.in_memory.didcomm - -Submodules ----------- - -acapy\_agent.core.in\_memory.profile module -------------------------------------------- - -.. automodule:: acapy_agent.core.in_memory.profile - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/generated/acapy_agent.core.rst b/docs/generated/acapy_agent.core.rst index 6dbd9e3fb6..aea168d472 100644 --- a/docs/generated/acapy_agent.core.rst +++ b/docs/generated/acapy_agent.core.rst @@ -6,14 +6,6 @@ acapy\_agent.core package :undoc-members: :show-inheritance: -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - acapy_agent.core.in_memory - Submodules ---------- diff --git a/docs/generated/acapy_agent.protocols.issue_credential.v2_0.models.detail.rst b/docs/generated/acapy_agent.protocols.issue_credential.v2_0.models.detail.rst index 52d5cd892d..464c0f5161 100644 --- a/docs/generated/acapy_agent.protocols.issue_credential.v2_0.models.detail.rst +++ b/docs/generated/acapy_agent.protocols.issue_credential.v2_0.models.detail.rst @@ -9,6 +9,14 @@ acapy\_agent.protocols.issue\_credential.v2\_0.models.detail package Submodules ---------- +acapy\_agent.protocols.issue\_credential.v2\_0.models.detail.anoncreds module +----------------------------------------------------------------------------- + +.. automodule:: acapy_agent.protocols.issue_credential.v2_0.models.detail.anoncreds + :members: + :undoc-members: + :show-inheritance: + acapy\_agent.protocols.issue\_credential.v2\_0.models.detail.indy module ------------------------------------------------------------------------ diff --git a/docs/generated/acapy_agent.resolver.default.rst b/docs/generated/acapy_agent.resolver.default.rst index 78165b9692..32a0f44cc9 100644 --- a/docs/generated/acapy_agent.resolver.default.rst +++ b/docs/generated/acapy_agent.resolver.default.rst @@ -73,6 +73,14 @@ acapy\_agent.resolver.default.peer4 module :undoc-members: :show-inheritance: +acapy\_agent.resolver.default.tdw module +---------------------------------------- + +.. automodule:: acapy_agent.resolver.default.tdw + :members: + :undoc-members: + :show-inheritance: + acapy\_agent.resolver.default.universal module ---------------------------------------------- diff --git a/docs/generated/acapy_agent.storage.rst b/docs/generated/acapy_agent.storage.rst index 95998a741d..8eda05694e 100644 --- a/docs/generated/acapy_agent.storage.rst +++ b/docs/generated/acapy_agent.storage.rst @@ -41,14 +41,6 @@ acapy\_agent.storage.error module :undoc-members: :show-inheritance: -acapy\_agent.storage.in\_memory module --------------------------------------- - -.. automodule:: acapy_agent.storage.in_memory - :members: - :undoc-members: - :show-inheritance: - acapy\_agent.storage.record module ---------------------------------- diff --git a/docs/generated/acapy_agent.storage.vc_holder.rst b/docs/generated/acapy_agent.storage.vc_holder.rst index ca74bd8aed..3a1b74eff5 100644 --- a/docs/generated/acapy_agent.storage.vc_holder.rst +++ b/docs/generated/acapy_agent.storage.vc_holder.rst @@ -25,14 +25,6 @@ acapy\_agent.storage.vc\_holder.base module :undoc-members: :show-inheritance: -acapy\_agent.storage.vc\_holder.in\_memory module -------------------------------------------------- - -.. automodule:: acapy_agent.storage.vc_holder.in_memory - :members: - :undoc-members: - :show-inheritance: - acapy\_agent.storage.vc\_holder.vc\_record module ------------------------------------------------- diff --git a/docs/generated/acapy_agent.utils.rst b/docs/generated/acapy_agent.utils.rst index 70c61f2d1a..4a8fd038e3 100644 --- a/docs/generated/acapy_agent.utils.rst +++ b/docs/generated/acapy_agent.utils.rst @@ -49,6 +49,14 @@ acapy\_agent.utils.env module :undoc-members: :show-inheritance: +acapy\_agent.utils.extract\_validation\_error module +---------------------------------------------------- + +.. automodule:: acapy_agent.utils.extract_validation_error + :members: + :undoc-members: + :show-inheritance: + acapy\_agent.utils.general module --------------------------------- @@ -121,6 +129,14 @@ acapy\_agent.utils.task\_queue module :undoc-members: :show-inheritance: +acapy\_agent.utils.testing module +--------------------------------- + +.. automodule:: acapy_agent.utils.testing + :members: + :undoc-members: + :show-inheritance: + acapy\_agent.utils.tracing module --------------------------------- diff --git a/docs/generated/acapy_agent.wallet.rst b/docs/generated/acapy_agent.wallet.rst index 9f075046ae..d09130188d 100644 --- a/docs/generated/acapy_agent.wallet.rst +++ b/docs/generated/acapy_agent.wallet.rst @@ -106,14 +106,6 @@ acapy\_agent.wallet.error module :undoc-members: :show-inheritance: -acapy\_agent.wallet.in\_memory module -------------------------------------- - -.. automodule:: acapy_agent.wallet.in_memory - :members: - :undoc-members: - :show-inheritance: - acapy\_agent.wallet.jwt module ------------------------------ diff --git a/mkdocs-requirements.txt b/mkdocs-requirements.txt index a3290d9569..34185c859a 100644 --- a/mkdocs-requirements.txt +++ b/mkdocs-requirements.txt @@ -1,3 +1,3 @@ -mkdocs-material==9.5.47 +mkdocs-material==9.5.48 mike==2.1.3 diff --git a/mkdocs.yml b/mkdocs.yml index 0f8593cb94..cebeffcc7e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -97,6 +97,7 @@ nav: - Configuring Multiple Indy Ledgers: features/Multiledger.md - Automatically Endorsing Indy Transations: features/Endorser.md - Using W3C JSON-LD Signed Credentials: features/JsonLdCredentials.md + - Issuing and Presenting W3C Data Integrity VCs: features/W3cCredentials.md - Using SD-JWTs: features/SelectiveDisclosureJWTs.md - AnonCreds Presentation Validation: features/AnoncredsProofValidation.md - Multiple Credential Types: features/Multicredentials.md diff --git a/open-api/openapi.json b/open-api/openapi.json index 444c97fbbe..07c228d3a8 100644 --- a/open-api/openapi.json +++ b/open-api/openapi.json @@ -2,7 +2,7 @@ "openapi" : "3.0.1", "info" : { "title" : "Aries Cloud Agent", - "version" : "v1.1.0" + "version" : "v1.1.1" }, "servers" : [ { "url" : "/" @@ -390,7 +390,7 @@ "description" : "" } }, - "summary" : "Create a credential definition on the connected ledger", + "summary" : "Create a credential definition on the connected datastore", "tags" : [ "anoncreds - credential definitions" ], "x-codegen-request-body-name" : "body" } @@ -549,7 +549,7 @@ "description" : "" } }, - "summary" : "Create and publish a revocation status list on the connected ledger", + "summary" : "Create and publish a revocation status list on the connected datastore", "tags" : [ "anoncreds - revocation" ], "x-codegen-request-body-name" : "body" } @@ -578,7 +578,7 @@ "description" : "" } }, - "summary" : "Create and publish a registration revocation on the connected ledger", + "summary" : "Create and publish a registration revocation on the connected datastore", "tags" : [ "anoncreds - revocation" ], "x-codegen-request-body-name" : "body" } @@ -1012,7 +1012,7 @@ "description" : "" } }, - "summary" : "Create a schema on the connected ledger", + "summary" : "Create a schema on the connected datastore", "tags" : [ "anoncreds - schemas" ], "x-codegen-request-body-name" : "body" } @@ -7747,7 +7747,7 @@ }, "issuerId" : { "description" : "Issuer Identifier of the credential definition or schema", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "type" : "string" }, "name" : { @@ -7763,6 +7763,170 @@ }, "type" : "object" }, + "AnoncredsPresentationRequestNonRevoked" : { + "properties" : { + "from" : { + "description" : "Earliest time of interest in non-revocation interval", + "example" : 1640995199, + "maximum" : 18446744073709551615, + "minimum" : 0, + "type" : "integer" + }, + "to" : { + "description" : "Latest time of interest in non-revocation interval", + "example" : 1640995199, + "maximum" : 18446744073709551615, + "minimum" : 0, + "type" : "integer" + } + }, + "type" : "object" + }, + "AnoncredsPresentationReqAttrSpec" : { + "properties" : { + "name" : { + "description" : "Attribute name", + "example" : "favouriteDrink", + "type" : "string" + }, + "names" : { + "description" : "Attribute name group", + "items" : { + "example" : "age", + "type" : "string" + }, + "type" : "array" + }, + "non_revoked" : { + "$ref" : "#/components/schemas/AnoncredsPresentationReqAttrSpecNonRevoked" + }, + "restrictions" : { + "description" : "If present, credential must satisfy one of given restrictions: specify schema_id, schema_issuer_did, schema_name, schema_version, issuer_did, cred_def_id, and/or attr::::value where represents a credential attribute name", + "items" : { + "additionalProperties" : { + "example" : "did:(method):3:CL:20:tag", + "type" : "string" + }, + "type" : "object" + }, + "type" : "array" + } + }, + "type" : "object" + }, + "AnoncredsPresentationReqAttrSpecNonRevoked" : { + "properties" : { + "from" : { + "description" : "Earliest time of interest in non-revocation interval", + "example" : 1640995199, + "maximum" : 18446744073709551615, + "minimum" : 0, + "type" : "integer" + }, + "to" : { + "description" : "Latest time of interest in non-revocation interval", + "example" : 1640995199, + "maximum" : 18446744073709551615, + "minimum" : 0, + "type" : "integer" + } + }, + "type" : "object" + }, + "AnoncredsPresentationReqPredSpec" : { + "properties" : { + "name" : { + "description" : "Attribute name", + "example" : "index", + "type" : "string" + }, + "non_revoked" : { + "$ref" : "#/components/schemas/AnoncredsPresentationReqPredSpecNonRevoked" + }, + "p_type" : { + "description" : "Predicate type ('<', '<=', '>=', or '>')", + "enum" : [ "<", "<=", ">=", ">" ], + "example" : ">=", + "type" : "string" + }, + "p_value" : { + "description" : "Threshold value", + "type" : "integer" + }, + "restrictions" : { + "description" : "If present, credential must satisfy one of given restrictions: specify schema_id, schema_issuer_did, schema_name, schema_version, issuer_did, cred_def_id, and/or attr::::value where represents a credential attribute name", + "items" : { + "additionalProperties" : { + "example" : "did:(method):3:CL:20:tag", + "type" : "string" + }, + "type" : "object" + }, + "type" : "array" + } + }, + "required" : [ "name", "p_type", "p_value" ], + "type" : "object" + }, + "AnoncredsPresentationReqPredSpecNonRevoked" : { + "properties" : { + "from" : { + "description" : "Earliest time of interest in non-revocation interval", + "example" : 1640995199, + "maximum" : 18446744073709551615, + "minimum" : 0, + "type" : "integer" + }, + "to" : { + "description" : "Latest time of interest in non-revocation interval", + "example" : 1640995199, + "maximum" : 18446744073709551615, + "minimum" : 0, + "type" : "integer" + } + }, + "type" : "object" + }, + "AnoncredsPresentationRequest" : { + "properties" : { + "name" : { + "description" : "Proof request name", + "example" : "Proof request", + "type" : "string" + }, + "non_revoked" : { + "$ref" : "#/components/schemas/AnoncredsPresentationRequestNonRevoked" + }, + "nonce" : { + "description" : "Nonce", + "example" : "1", + "pattern" : "^[1-9][0-9]*$", + "type" : "string" + }, + "requested_attributes" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/AnoncredsPresentationReqAttrSpec" + }, + "description" : "Requested attribute specifications of proof request", + "type" : "object" + }, + "requested_predicates" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/AnoncredsPresentationReqPredSpec" + }, + "description" : "Requested predicate specifications of proof request", + "type" : "object" + }, + "version" : { + "description" : "Proof request version", + "example" : "1.0", + "pattern" : "^[0-9.]+$", + "type" : "string" + } + }, + "required" : [ "requested_attributes", "requested_predicates" ], + "type" : "object" + }, "AttachDecorator" : { "properties" : { "@id" : { @@ -8376,12 +8540,12 @@ "type" : "string" }, "kid" : { - "description" : "Optional kid to bind to the keypair, such as a verificationMethod.", + "description" : "Optional kid to bind to the keypair, such as a verificationMethod.", "example" : "did:web:example.com#key-01", "type" : "string" }, "seed" : { - "description" : "Optional seed to generate the key pair. Must enable insecure wallet mode.", + "description" : "Optional seed to generate the key pair. Must enable insecure wallet mode.", "example" : "00000000000000000000000000000000", "type" : "string" } @@ -8450,7 +8614,7 @@ }, "wallet_type" : { "description" : "Type of the wallet to create. Must be same as base wallet.", - "enum" : [ "askar", "askar-anoncreds", "in_memory" ], + "enum" : [ "askar", "askar-anoncreds" ], "example" : "askar", "type" : "string" }, @@ -8555,12 +8719,12 @@ "properties" : { "issuerId" : { "description" : "Issuer Identifier of the credential definition or schema", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "type" : "string" }, "schemaId" : { "description" : "Schema identifier", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "type" : "string" }, "tag" : { @@ -8643,7 +8807,7 @@ }, "credential_definition_id" : { "description" : "credential definition id", - "example" : "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag", + "example" : "did:(method):3:CL:20:tag", "nullable" : true, "type" : "string" }, @@ -9322,7 +9486,7 @@ "type" : "string" }, "mediation_id" : { - "description" : "Medation ID to use for endpoint information.", + "description" : "Mediation ID to use for endpoint information.", "example" : "3fa85f64-5717-4562-b3fc-2c963f66afa6", "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}", "type" : "string" @@ -9553,47 +9717,47 @@ "additionalProperties" : true, "properties" : { "challenge" : { - "description" : "The value is used once for a particular domain and window of time. This value is used to mitigate replay attacks.", + "description" : "The value is used once for a particular domain and window of time. This value is used to mitigate replay attacks.", "example" : "3fa85f64-5717-4562-b3fc-2c963f66afa6", "type" : "string" }, "created" : { - "description" : "The date and time the proof was created is OPTIONAL and, if included, MUST be specified as an [XMLSCHEMA11-2] dateTimeStamp string", + "description" : "The date and time the proof was created is OPTIONAL and, if included, MUST be specified as an [XMLSCHEMA11-2] dateTimeStamp string", "example" : "2010-01-01T19:23:24Z", "type" : "string" }, "cryptosuite" : { - "description" : "An identifier for the cryptographic suite that can be used to verify the proof.", + "description" : "An identifier for the cryptographic suite that can be used to verify the proof.", "example" : "eddsa-jcs-2022", "type" : "string" }, "domain" : { - "description" : "It conveys one or more security domains in which the proof is meant to be used.", + "description" : "It conveys one or more security domains in which the proof is meant to be used.", "example" : "example.com", "type" : "string" }, "expires" : { - "description" : "The expires property is OPTIONAL and, if present, specifies when the proof expires. If present, it MUST be an [XMLSCHEMA11-2] dateTimeStamp string", + "description" : "The expires property is OPTIONAL and, if present, specifies when the proof expires. If present, it MUST be an [XMLSCHEMA11-2] dateTimeStamp string", "example" : "2010-01-01T19:23:24Z", "type" : "string" }, "id" : { - "description" : "An optional identifier for the proof, which MUST be a URL [URL], such as a UUID as a URN", + "description" : "An optional identifier for the proof, which MUST be a URL [URL], such as a UUID as a URN", "example" : "urn:uuid:6a1676b8-b51f-11ed-937b-d76685a20ff5", "type" : "string" }, "nonce" : { - "description" : "One use of this field is to increase privacy by decreasing linkability that is the result of deterministically generated signatures.", + "description" : "One use of this field is to increase privacy by decreasing linkability that is the result of deterministically generated signatures.", "example" : "CF69iO3nfvqRsRBNElE8b4wO39SyJHPM7Gg1nExltW5vSfQA1lvDCR/zXX1To0/4NLo==", "type" : "string" }, "previousProof" : { - "description" : "Each value identifies another data integrity proof that MUST verify before the current proof is processed.", + "description" : "Each value identifies another data integrity proof that MUST verify before the current proof is processed.", "example" : "urn:uuid:6a1676b8-b51f-11ed-937b-d76685a20ff5", "type" : "string" }, "proofPurpose" : { - "description" : "The proof purpose acts as a safeguard to prevent the proof from being misused by being applied to a purpose other than the one that was intended.", + "description" : "The proof purpose acts as a safeguard to prevent the proof from being misused by being applied to a purpose other than the one that was intended.", "example" : "assertionMethod", "type" : "string" }, @@ -9603,12 +9767,12 @@ "type" : "string" }, "type" : { - "description" : "The specific type of proof MUST be specified as a string that maps to a URL [URL].", + "description" : "The specific type of proof MUST be specified as a string that maps to a URL [URL].", "example" : "DataIntegrityProof", "type" : "string" }, "verificationMethod" : { - "description" : "A verification method is the means and information needed to verify the proof. ", + "description" : "A verification method is the means and information needed to verify the proof.", "example" : "did:key:z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL#z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL", "pattern" : "\\w+:(\\/?\\/?)[^\\s]+", "type" : "string" @@ -9862,7 +10026,7 @@ }, "credential_definition_id" : { "description" : "credential definition id", - "example" : "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag", + "example" : "did:(method):3:CL:20:tag", "type" : "string" }, "credential_definitions_metadata" : { @@ -9935,7 +10099,7 @@ }, "schema_id" : { "description" : "Schema identifier", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "type" : "string" }, "schema_metadata" : { @@ -9950,7 +10114,7 @@ "schema_ids" : { "items" : { "description" : "Schema identifiers", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "type" : "string" }, "type" : "array" @@ -11015,12 +11179,12 @@ "properties" : { "issuerId" : { "description" : "Issuer Identifier of the credential definition", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "type" : "string" }, "schemaId" : { "description" : "Schema identifier", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "type" : "string" }, "tag" : { @@ -11036,12 +11200,12 @@ "properties" : { "credDefId" : { "description" : "Credential definition identifier", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "type" : "string" }, "issuerId" : { "description" : "Issuer Identifier of the credential definition or schema", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "type" : "string" }, "maxCredNum" : { @@ -12813,12 +12977,12 @@ }, "issuerId" : { "description" : "Issuer Identifier of the credential definition or schema", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "type" : "string" }, "revRegDefId" : { "description" : "The ID of the revocation registry definition", - "example" : "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0", + "example" : "did:(method):4:did::3:CL:20:tag:CL_ACCUM:0", "type" : "string" }, "revocationList" : { @@ -12843,7 +13007,7 @@ }, "rev_reg_def_id" : { "description" : "Revocation registry definition identifier", - "example" : "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0", + "example" : "did:(method):4:did::3:CL:20:tag:CL_ACCUM:0", "type" : "string" } }, @@ -12932,12 +13096,12 @@ "properties" : { "credDefId" : { "description" : "Credential definition identifier", - "example" : "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag", + "example" : "did:(method):3:CL:20:tag", "type" : "string" }, "issuerId" : { "description" : "Issuer Identifier of the credential definition or schema", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "type" : "string" }, "revocDefType" : { @@ -12999,7 +13163,7 @@ }, "revocation_registry_definition_id" : { "description" : "revocation registry definition id", - "example" : "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0", + "example" : "did:(method):4:did::3:CL:20:tag:CL_ACCUM:0", "type" : "string" }, "state" : { @@ -13559,7 +13723,7 @@ }, "schema_id" : { "description" : "Schema identifier", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "type" : "string" }, "state" : { @@ -14085,7 +14249,7 @@ "UpdateKeyRequest" : { "properties" : { "kid" : { - "description" : "New kid to bind to the key pair, such as a verificationMethod.", + "description" : "New kid to bind to the key pair, such as a verificationMethod.", "example" : "did:web:example.com#key-02", "type" : "string" }, @@ -15335,6 +15499,13 @@ }, "V20CredFilter" : { "properties" : { + "anoncreds" : { + "allOf" : [ { + "$ref" : "#/components/schemas/V20CredFilterAnoncreds" + } ], + "description" : "Credential filter for anoncreds", + "type" : "object" + }, "indy" : { "allOf" : [ { "$ref" : "#/components/schemas/V20CredFilterIndy" @@ -15359,6 +15530,31 @@ }, "type" : "object" }, + "V20CredFilterAnoncreds" : { + "properties" : { + "cred_def_id" : { + "description" : "Credential definition identifier", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", + "type" : "string" + }, + "epoch" : { + "description" : "Credential epoch time", + "example" : "2021-08-24", + "type" : "string" + }, + "issuer_id" : { + "description" : "Credential issuer DID", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", + "type" : "string" + }, + "schema_id" : { + "description" : "Schema identifier", + "example" : "did:(method):2:schema_name:1.0", + "type" : "string" + } + }, + "type" : "object" + }, "V20CredFilterIndy" : { "properties" : { "cred_def_id" : { @@ -16192,6 +16388,13 @@ }, "V20PresProposalByFormat" : { "properties" : { + "anoncreds" : { + "allOf" : [ { + "$ref" : "#/components/schemas/AnoncredsPresentationRequest" + } ], + "description" : "Presentation proposal for anoncreds", + "type" : "object" + }, "dif" : { "allOf" : [ { "$ref" : "#/components/schemas/DIFProofProposal" @@ -16281,6 +16484,13 @@ }, "V20PresRequestByFormat" : { "properties" : { + "anoncreds" : { + "allOf" : [ { + "$ref" : "#/components/schemas/AnoncredsPresentationRequest" + } ], + "description" : "Presentation proposal for anoncreds", + "type" : "object" + }, "dif" : { "allOf" : [ { "$ref" : "#/components/schemas/DIFProofRequest" @@ -16332,6 +16542,13 @@ }, "V20PresSpecByFormatRequest" : { "properties" : { + "anoncreds" : { + "allOf" : [ { + "$ref" : "#/components/schemas/IndyPresSpec" + } ], + "description" : "Presentation specification for anoncreds", + "type" : "object" + }, "auto_remove" : { "description" : "Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)", "type" : "boolean" diff --git a/open-api/swagger.json b/open-api/swagger.json index 3267ac846e..c49ae1134d 100644 --- a/open-api/swagger.json +++ b/open-api/swagger.json @@ -1,7 +1,7 @@ { "swagger" : "2.0", "info" : { - "version" : "v1.1.0", + "version" : "v1.1.1", "title" : "Aries Cloud Agent" }, "tags" : [ { @@ -333,7 +333,7 @@ "/anoncreds/credential-definition" : { "post" : { "tags" : [ "anoncreds - credential definitions" ], - "summary" : "Create a credential definition on the connected ledger", + "summary" : "Create a credential definition on the connected datastore", "produces" : [ "application/json" ], "parameters" : [ { "in" : "body", @@ -464,7 +464,7 @@ "/anoncreds/revocation-list" : { "post" : { "tags" : [ "anoncreds - revocation" ], - "summary" : "Create and publish a revocation status list on the connected ledger", + "summary" : "Create and publish a revocation status list on the connected datastore", "produces" : [ "application/json" ], "parameters" : [ { "in" : "body", @@ -487,7 +487,7 @@ "/anoncreds/revocation-registry-definition" : { "post" : { "tags" : [ "anoncreds - revocation" ], - "summary" : "Create and publish a registration revocation on the connected ledger", + "summary" : "Create and publish a registration revocation on the connected datastore", "produces" : [ "application/json" ], "parameters" : [ { "in" : "body", @@ -843,7 +843,7 @@ "/anoncreds/schema" : { "post" : { "tags" : [ "anoncreds - schemas" ], - "summary" : "Create a schema on the connected ledger", + "summary" : "Create a schema on the connected datastore", "produces" : [ "application/json" ], "parameters" : [ { "in" : "body", @@ -6381,7 +6381,7 @@ }, "issuerId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "description" : "Issuer Identifier of the credential definition or schema" }, "name" : { @@ -6396,6 +6396,170 @@ } } }, + "AnoncredsPresentationRequestNonRevoked" : { + "type" : "object", + "properties" : { + "from" : { + "type" : "integer", + "example" : 1640995199, + "description" : "Earliest time of interest in non-revocation interval", + "minimum" : 0, + "maximum" : 18446744073709551615 + }, + "to" : { + "type" : "integer", + "example" : 1640995199, + "description" : "Latest time of interest in non-revocation interval", + "minimum" : 0, + "maximum" : 18446744073709551615 + } + } + }, + "AnoncredsPresentationReqAttrSpec" : { + "type" : "object", + "properties" : { + "name" : { + "type" : "string", + "example" : "favouriteDrink", + "description" : "Attribute name" + }, + "names" : { + "type" : "array", + "description" : "Attribute name group", + "items" : { + "type" : "string", + "example" : "age" + } + }, + "non_revoked" : { + "$ref" : "#/definitions/AnoncredsPresentationReqAttrSpecNonRevoked" + }, + "restrictions" : { + "type" : "array", + "description" : "If present, credential must satisfy one of given restrictions: specify schema_id, schema_issuer_did, schema_name, schema_version, issuer_did, cred_def_id, and/or attr::::value where represents a credential attribute name", + "items" : { + "type" : "object", + "additionalProperties" : { + "type" : "string", + "example" : "did:(method):3:CL:20:tag" + } + } + } + } + }, + "AnoncredsPresentationReqAttrSpecNonRevoked" : { + "type" : "object", + "properties" : { + "from" : { + "type" : "integer", + "example" : 1640995199, + "description" : "Earliest time of interest in non-revocation interval", + "minimum" : 0, + "maximum" : 18446744073709551615 + }, + "to" : { + "type" : "integer", + "example" : 1640995199, + "description" : "Latest time of interest in non-revocation interval", + "minimum" : 0, + "maximum" : 18446744073709551615 + } + } + }, + "AnoncredsPresentationReqPredSpec" : { + "type" : "object", + "required" : [ "name", "p_type", "p_value" ], + "properties" : { + "name" : { + "type" : "string", + "example" : "index", + "description" : "Attribute name" + }, + "non_revoked" : { + "$ref" : "#/definitions/AnoncredsPresentationReqPredSpecNonRevoked" + }, + "p_type" : { + "type" : "string", + "example" : ">=", + "description" : "Predicate type ('<', '<=', '>=', or '>')", + "enum" : [ "<", "<=", ">=", ">" ] + }, + "p_value" : { + "type" : "integer", + "description" : "Threshold value" + }, + "restrictions" : { + "type" : "array", + "description" : "If present, credential must satisfy one of given restrictions: specify schema_id, schema_issuer_did, schema_name, schema_version, issuer_did, cred_def_id, and/or attr::::value where represents a credential attribute name", + "items" : { + "type" : "object", + "additionalProperties" : { + "type" : "string", + "example" : "did:(method):3:CL:20:tag" + } + } + } + } + }, + "AnoncredsPresentationReqPredSpecNonRevoked" : { + "type" : "object", + "properties" : { + "from" : { + "type" : "integer", + "example" : 1640995199, + "description" : "Earliest time of interest in non-revocation interval", + "minimum" : 0, + "maximum" : 18446744073709551615 + }, + "to" : { + "type" : "integer", + "example" : 1640995199, + "description" : "Latest time of interest in non-revocation interval", + "minimum" : 0, + "maximum" : 18446744073709551615 + } + } + }, + "AnoncredsPresentationRequest" : { + "type" : "object", + "required" : [ "requested_attributes", "requested_predicates" ], + "properties" : { + "name" : { + "type" : "string", + "example" : "Proof request", + "description" : "Proof request name" + }, + "non_revoked" : { + "$ref" : "#/definitions/AnoncredsPresentationRequestNonRevoked" + }, + "nonce" : { + "type" : "string", + "example" : "1", + "description" : "Nonce", + "pattern" : "^[1-9][0-9]*$" + }, + "requested_attributes" : { + "type" : "object", + "description" : "Requested attribute specifications of proof request", + "additionalProperties" : { + "$ref" : "#/definitions/AnoncredsPresentationReqAttrSpec" + } + }, + "requested_predicates" : { + "type" : "object", + "description" : "Requested predicate specifications of proof request", + "additionalProperties" : { + "$ref" : "#/definitions/AnoncredsPresentationReqPredSpec" + } + }, + "version" : { + "type" : "string", + "example" : "1.0", + "description" : "Proof request version", + "pattern" : "^[0-9.]+$" + } + } + }, "AttachDecorator" : { "type" : "object", "required" : [ "data" ], @@ -7007,12 +7171,12 @@ "kid" : { "type" : "string", "example" : "did:web:example.com#key-01", - "description" : "Optional kid to bind to the keypair, such as a verificationMethod." + "description" : "Optional kid to bind to the keypair, such as a verificationMethod." }, "seed" : { "type" : "string", "example" : "00000000000000000000000000000000", - "description" : "Optional seed to generate the key pair. Must enable insecure wallet mode." + "description" : "Optional seed to generate the key pair. Must enable insecure wallet mode." } } }, @@ -7081,7 +7245,7 @@ "type" : "string", "example" : "askar", "description" : "Type of the wallet to create. Must be same as base wallet.", - "enum" : [ "askar", "askar-anoncreds", "in_memory" ] + "enum" : [ "askar", "askar-anoncreds" ] }, "wallet_webhook_urls" : { "type" : "array", @@ -7184,12 +7348,12 @@ "properties" : { "issuerId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "description" : "Issuer Identifier of the credential definition or schema" }, "schemaId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "description" : "Schema identifier" }, "tag" : { @@ -7268,7 +7432,7 @@ }, "credential_definition_id" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag", + "example" : "did:(method):3:CL:20:tag", "description" : "credential definition id", "x-nullable" : true }, @@ -7909,7 +8073,7 @@ "mediation_id" : { "type" : "string", "example" : "3fa85f64-5717-4562-b3fc-2c963f66afa6", - "description" : "Medation ID to use for endpoint information.", + "description" : "Mediation ID to use for endpoint information.", "pattern" : "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" } } @@ -8135,47 +8299,47 @@ "challenge" : { "type" : "string", "example" : "3fa85f64-5717-4562-b3fc-2c963f66afa6", - "description" : "The value is used once for a particular domain and window of time. This value is used to mitigate replay attacks." + "description" : "The value is used once for a particular domain and window of time. This value is used to mitigate replay attacks." }, "created" : { "type" : "string", "example" : "2010-01-01T19:23:24Z", - "description" : "The date and time the proof was created is OPTIONAL and, if included, MUST be specified as an [XMLSCHEMA11-2] dateTimeStamp string" + "description" : "The date and time the proof was created is OPTIONAL and, if included, MUST be specified as an [XMLSCHEMA11-2] dateTimeStamp string" }, "cryptosuite" : { "type" : "string", "example" : "eddsa-jcs-2022", - "description" : "An identifier for the cryptographic suite that can be used to verify the proof." + "description" : "An identifier for the cryptographic suite that can be used to verify the proof." }, "domain" : { "type" : "string", "example" : "example.com", - "description" : "It conveys one or more security domains in which the proof is meant to be used." + "description" : "It conveys one or more security domains in which the proof is meant to be used." }, "expires" : { "type" : "string", "example" : "2010-01-01T19:23:24Z", - "description" : "The expires property is OPTIONAL and, if present, specifies when the proof expires. If present, it MUST be an [XMLSCHEMA11-2] dateTimeStamp string" + "description" : "The expires property is OPTIONAL and, if present, specifies when the proof expires. If present, it MUST be an [XMLSCHEMA11-2] dateTimeStamp string" }, "id" : { "type" : "string", "example" : "urn:uuid:6a1676b8-b51f-11ed-937b-d76685a20ff5", - "description" : "An optional identifier for the proof, which MUST be a URL [URL], such as a UUID as a URN" + "description" : "An optional identifier for the proof, which MUST be a URL [URL], such as a UUID as a URN" }, "nonce" : { "type" : "string", "example" : "CF69iO3nfvqRsRBNElE8b4wO39SyJHPM7Gg1nExltW5vSfQA1lvDCR/zXX1To0/4NLo==", - "description" : "One use of this field is to increase privacy by decreasing linkability that is the result of deterministically generated signatures." + "description" : "One use of this field is to increase privacy by decreasing linkability that is the result of deterministically generated signatures." }, "previousProof" : { "type" : "string", "example" : "urn:uuid:6a1676b8-b51f-11ed-937b-d76685a20ff5", - "description" : "Each value identifies another data integrity proof that MUST verify before the current proof is processed." + "description" : "Each value identifies another data integrity proof that MUST verify before the current proof is processed." }, "proofPurpose" : { "type" : "string", "example" : "assertionMethod", - "description" : "The proof purpose acts as a safeguard to prevent the proof from being misused by being applied to a purpose other than the one that was intended." + "description" : "The proof purpose acts as a safeguard to prevent the proof from being misused by being applied to a purpose other than the one that was intended." }, "proofValue" : { "type" : "string", @@ -8185,12 +8349,12 @@ "type" : { "type" : "string", "example" : "DataIntegrityProof", - "description" : "The specific type of proof MUST be specified as a string that maps to a URL [URL]." + "description" : "The specific type of proof MUST be specified as a string that maps to a URL [URL]." }, "verificationMethod" : { "type" : "string", "example" : "did:key:z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL#z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL", - "description" : "A verification method is the means and information needed to verify the proof. ", + "description" : "A verification method is the means and information needed to verify the proof.", "pattern" : "\\w+:(\\/?\\/?)[^\\s]+" } }, @@ -8426,7 +8590,7 @@ }, "credential_definition_id" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag", + "example" : "did:(method):3:CL:20:tag", "description" : "credential definition id" }, "credential_definitions_metadata" : { @@ -8499,7 +8663,7 @@ }, "schema_id" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "description" : "Schema identifier" }, "schema_metadata" : { @@ -8515,7 +8679,7 @@ "type" : "array", "items" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "description" : "Schema identifiers" } } @@ -9530,12 +9694,12 @@ "properties" : { "issuerId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "description" : "Issuer Identifier of the credential definition" }, "schemaId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "description" : "Schema identifier" }, "tag" : { @@ -9550,12 +9714,12 @@ "properties" : { "credDefId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "description" : "Credential definition identifier" }, "issuerId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "description" : "Issuer Identifier of the credential definition or schema" }, "maxCredNum" : { @@ -11245,12 +11409,12 @@ }, "issuerId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "description" : "Issuer Identifier of the credential definition or schema" }, "revRegDefId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0", + "example" : "did:(method):4:did::3:CL:20:tag:CL_ACCUM:0", "description" : "The ID of the revocation registry definition" }, "revocationList" : { @@ -11276,7 +11440,7 @@ }, "rev_reg_def_id" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0", + "example" : "did:(method):4:did::3:CL:20:tag:CL_ACCUM:0", "description" : "Revocation registry definition identifier" } } @@ -11361,12 +11525,12 @@ "properties" : { "credDefId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag", + "example" : "did:(method):3:CL:20:tag", "description" : "Credential definition identifier" }, "issuerId" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", "description" : "Issuer Identifier of the credential definition or schema" }, "revocDefType" : { @@ -11424,7 +11588,7 @@ }, "revocation_registry_definition_id" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:20:tag:CL_ACCUM:0", + "example" : "did:(method):4:did::3:CL:20:tag:CL_ACCUM:0", "description" : "revocation registry definition id" }, "state" : { @@ -11978,7 +12142,7 @@ }, "schema_id" : { "type" : "string", - "example" : "WgWxqztrNooG92RXvxSTWv:2:schema_name:1.0", + "example" : "did:(method):2:schema_name:1.0", "description" : "Schema identifier" }, "state" : { @@ -12479,7 +12643,7 @@ "kid" : { "type" : "string", "example" : "did:web:example.com#key-02", - "description" : "New kid to bind to the key pair, such as a verificationMethod." + "description" : "New kid to bind to the key pair, such as a verificationMethod." }, "multikey" : { "type" : "string", @@ -13634,6 +13798,9 @@ "V20CredFilter" : { "type" : "object", "properties" : { + "anoncreds" : { + "$ref" : "#/definitions/V20CredFilter_anoncreds" + }, "indy" : { "$ref" : "#/definitions/V20CredFilter_indy" }, @@ -13645,6 +13812,31 @@ } } }, + "V20CredFilterAnoncreds" : { + "type" : "object", + "properties" : { + "cred_def_id" : { + "type" : "string", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", + "description" : "Credential definition identifier" + }, + "epoch" : { + "type" : "string", + "example" : "2021-08-24", + "description" : "Credential epoch time" + }, + "issuer_id" : { + "type" : "string", + "example" : "did:(method):WgWxqztrNooG92RXvxSTWv", + "description" : "Credential issuer DID" + }, + "schema_id" : { + "type" : "string", + "example" : "did:(method):2:schema_name:1.0", + "description" : "Schema identifier" + } + } + }, "V20CredFilterIndy" : { "type" : "object", "properties" : { @@ -14427,6 +14619,9 @@ "V20PresProposalByFormat" : { "type" : "object", "properties" : { + "anoncreds" : { + "$ref" : "#/definitions/V20PresProposalByFormat_anoncreds" + }, "dif" : { "$ref" : "#/definitions/V20PresProposalByFormat_dif" }, @@ -14508,6 +14703,9 @@ "V20PresRequestByFormat" : { "type" : "object", "properties" : { + "anoncreds" : { + "$ref" : "#/definitions/V20PresProposalByFormat_anoncreds" + }, "dif" : { "$ref" : "#/definitions/V20PresRequestByFormat_dif" }, @@ -14551,6 +14749,9 @@ "V20PresSpecByFormatRequest" : { "type" : "object", "properties" : { + "anoncreds" : { + "$ref" : "#/definitions/V20PresSpecByFormatRequest_anoncreds" + }, "auto_remove" : { "type" : "boolean", "description" : "Whether to remove the presentation exchange record on completion (overrides --preserve-exchange-records configuration setting)" @@ -15245,6 +15446,10 @@ "type" : "object", "description" : "Credential exchange record" }, + "V20CredFilter_anoncreds" : { + "type" : "object", + "description" : "Credential filter for anoncreds" + }, "V20CredFilter_indy" : { "type" : "object", "description" : "Credential filter for indy" @@ -15281,6 +15486,10 @@ "type" : "object", "description" : "Presentation message" }, + "V20PresProposalByFormat_anoncreds" : { + "type" : "object", + "description" : "Presentation proposal for anoncreds" + }, "V20PresProposalByFormat_dif" : { "type" : "object", "description" : "Presentation proposal for DIF" @@ -15297,6 +15506,10 @@ "type" : "object", "description" : "Presentation request for indy" }, + "V20PresSpecByFormatRequest_anoncreds" : { + "type" : "object", + "description" : "Presentation specification for anoncreds" + }, "V20PresSpecByFormatRequest_dif" : { "type" : "object", "description" : "Optional Presentation specification for DIF, overrides the PresentationExchange record's PresRequest" diff --git a/poetry.lock b/poetry.lock index 869ff36e0e..b0c4d8dc3f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -24,87 +24,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.9" +version = "3.11.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ - {file = "aiohttp-3.11.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7"}, - {file = "aiohttp-3.11.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771"}, - {file = "aiohttp-3.11.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b"}, - {file = "aiohttp-3.11.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7"}, - {file = "aiohttp-3.11.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82"}, - {file = "aiohttp-3.11.9-cp310-cp310-win32.whl", hash = "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066"}, - {file = "aiohttp-3.11.9-cp310-cp310-win_amd64.whl", hash = "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa"}, - {file = "aiohttp-3.11.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3"}, - {file = "aiohttp-3.11.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a"}, - {file = "aiohttp-3.11.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7"}, - {file = "aiohttp-3.11.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87"}, - {file = "aiohttp-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b"}, - {file = "aiohttp-3.11.9-cp311-cp311-win32.whl", hash = "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a"}, - {file = "aiohttp-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5"}, - {file = "aiohttp-3.11.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9"}, - {file = "aiohttp-3.11.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938"}, - {file = "aiohttp-3.11.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44"}, - {file = "aiohttp-3.11.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411"}, - {file = "aiohttp-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14"}, - {file = "aiohttp-3.11.9-cp312-cp312-win32.whl", hash = "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e"}, - {file = "aiohttp-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941"}, - {file = "aiohttp-3.11.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66"}, - {file = "aiohttp-3.11.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494"}, - {file = "aiohttp-3.11.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46"}, - {file = "aiohttp-3.11.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868"}, - {file = "aiohttp-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe"}, - {file = "aiohttp-3.11.9-cp313-cp313-win32.whl", hash = "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa"}, - {file = "aiohttp-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff"}, - {file = "aiohttp-3.11.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043"}, - {file = "aiohttp-3.11.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0"}, - {file = "aiohttp-3.11.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0"}, - {file = "aiohttp-3.11.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b"}, - {file = "aiohttp-3.11.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba"}, - {file = "aiohttp-3.11.9-cp39-cp39-win32.whl", hash = "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269"}, - {file = "aiohttp-3.11.9-cp39-cp39-win_amd64.whl", hash = "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361"}, - {file = "aiohttp-3.11.9.tar.gz", hash = "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, + {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, + {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, + {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, + {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, + {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, + {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, + {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, + {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, + {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, + {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, + {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, ] [package.dependencies] @@ -2594,29 +2594,29 @@ test = ["hypothesis (==5.19.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "ruff" -version = "0.8.1" +version = "0.8.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5"}, - {file = "ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087"}, - {file = "ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5"}, - {file = "ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790"}, - {file = "ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6"}, - {file = "ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737"}, - {file = "ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f"}, + {file = "ruff-0.8.2-py3-none-linux_armv6l.whl", hash = "sha256:c49ab4da37e7c457105aadfd2725e24305ff9bc908487a9bf8d548c6dad8bb3d"}, + {file = "ruff-0.8.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ec016beb69ac16be416c435828be702ee694c0d722505f9c1f35e1b9c0cc1bf5"}, + {file = "ruff-0.8.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f05cdf8d050b30e2ba55c9b09330b51f9f97d36d4673213679b965d25a785f3c"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60f578c11feb1d3d257b2fb043ddb47501ab4816e7e221fbb0077f0d5d4e7b6f"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbd5cf9b0ae8f30eebc7b360171bd50f59ab29d39f06a670b3e4501a36ba5897"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b402ddee3d777683de60ff76da801fa7e5e8a71038f57ee53e903afbcefdaa58"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:705832cd7d85605cb7858d8a13d75993c8f3ef1397b0831289109e953d833d29"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32096b41aaf7a5cc095fa45b4167b890e4c8d3fd217603f3634c92a541de7248"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e769083da9439508833cfc7c23e351e1809e67f47c50248250ce1ac52c21fb93"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fe716592ae8a376c2673fdfc1f5c0c193a6d0411f90a496863c99cd9e2ae25d"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:81c148825277e737493242b44c5388a300584d73d5774defa9245aaef55448b0"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d261d7850c8367704874847d95febc698a950bf061c9475d4a8b7689adc4f7fa"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1ca4e3a87496dc07d2427b7dd7ffa88a1e597c28dad65ae6433ecb9f2e4f022f"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:729850feed82ef2440aa27946ab39c18cb4a8889c1128a6d589ffa028ddcfc22"}, + {file = "ruff-0.8.2-py3-none-win32.whl", hash = "sha256:ac42caaa0411d6a7d9594363294416e0e48fc1279e1b0e948391695db2b3d5b1"}, + {file = "ruff-0.8.2-py3-none-win_amd64.whl", hash = "sha256:2aae99ec70abf43372612a838d97bfe77d45146254568d94926e8ed5bbb409ea"}, + {file = "ruff-0.8.2-py3-none-win_arm64.whl", hash = "sha256:fb88e2a506b70cfbc2de6fae6681c4f944f7dd5f2fe87233a7233d888bad73e8"}, + {file = "ruff-0.8.2.tar.gz", hash = "sha256:b84f4f414dda8ac7f75075c1fa0b905ac0ff25361f42e6d5da681a465e0f78e5"}, ] [[package]] @@ -3085,4 +3085,4 @@ didcommv2 = ["didcomm-messaging"] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "6db2eb06e99764e6bd25fd0af73398153a1d6b5da9e2577c5e5772d9969a46ef" +content-hash = "577254263c3af09b462a35e19193279a4d0a5a1e938baf7a013f543787621c15" diff --git a/pyproject.toml b/pyproject.toml index d4a6874cd3..0c1aba05ae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "acapy_agent" -version = "1.1.0" +version = "1.1.1" description = "(ACA-Py) A Cloud Agent Python is a foundation for building decentralized identity applications and services running in non-mobile environments. " authors = [] license = "Apache-2.0" @@ -16,7 +16,7 @@ repository = "https://github.com/openwallet-foundation/acapy" [tool.poetry.dependencies] python = "^3.12" -aiohttp = "~3.11.9" +aiohttp = "~3.11.10" aiohttp-apispec-acapy = "~3.0.2" aiohttp-cors = "~0.7.0" apispec = "^6.6.0" @@ -72,7 +72,7 @@ canonicaljson = "^2.0.0" [tool.poetry.group.dev.dependencies] pre-commit = "~3.8.0" # Sync with version in .pre-commit-config.yaml -ruff = "0.8.1" +ruff = "0.8.2" sphinx = "^5.3.0" sphinx-rtd-theme = ">=0.4.3" diff --git a/scenarios/examples/vc_holder/docker-compose.yml b/scenarios/examples/vc_holder/docker-compose.yml new file mode 100644 index 0000000000..ac9d0ef7a4 --- /dev/null +++ b/scenarios/examples/vc_holder/docker-compose.yml @@ -0,0 +1,45 @@ + services: + agency: + image: acapy-test + ports: + - "3001:3001" + environment: + RUST_LOG: 'aries-askar::log::target=error' + command: > + start + --label Agency + --inbound-transport http 0.0.0.0 3000 + --outbound-transport http + --endpoint http://agency:3000 + --admin 0.0.0.0 3001 + --admin-insecure-mode + --no-ledger + --wallet-type askar + --wallet-name alice + --wallet-key insecure + --auto-provision + --log-level debug + --debug-webhooks + --multitenant + --multitenant-admin + --jwt-secret insecure + --multitenancy-config wallet_type=single-wallet-askar key_derivation_method=RAW + healthcheck: + test: curl -s -o /dev/null -w '%{http_code}' "http://localhost:3001/status/live" | grep "200" > /dev/null + start_period: 30s + interval: 7s + timeout: 5s + retries: 5 + + example: + container_name: controller + build: + context: ../.. + environment: + - AGENCY=http://agency:3001 + volumes: + - ./example.py:/usr/src/app/example.py:ro,z + command: python -m example + depends_on: + agency: + condition: service_healthy diff --git a/scenarios/examples/vc_holder/example.py b/scenarios/examples/vc_holder/example.py new file mode 100644 index 0000000000..1e214419f0 --- /dev/null +++ b/scenarios/examples/vc_holder/example.py @@ -0,0 +1,95 @@ +"""Test VC Holder multi-tenancy isolation.""" + +import asyncio +from os import getenv + +from acapy_controller import Controller +from acapy_controller.logging import logging_to_stdout +from acapy_controller.models import CreateWalletResponse +from acapy_controller.protocols import DIDResult + +AGENCY = getenv("AGENCY", "http://agency:3001") + + +async def main(): + """Test Controller protocols.""" + async with Controller(base_url=AGENCY) as agency: + issuer = await agency.post( + "/multitenancy/wallet", + json={ + "label": "Issuer", + "wallet_type": "askar", + }, + response=CreateWalletResponse, + ) + alice = await agency.post( + "/multitenancy/wallet", + json={ + "label": "Alice", + "wallet_type": "askar", + }, + response=CreateWalletResponse, + ) + bob = await agency.post( + "/multitenancy/wallet", + json={ + "label": "Bob", + "wallet_type": "askar", + }, + response=CreateWalletResponse, + ) + + async with ( + Controller( + base_url=AGENCY, wallet_id=alice.wallet_id, subwallet_token=alice.token + ) as alice, + Controller( + base_url=AGENCY, wallet_id=bob.wallet_id, subwallet_token=bob.token + ) as bob, + Controller( + base_url=AGENCY, wallet_id=issuer.wallet_id, subwallet_token=issuer.token + ) as issuer, + ): + public_did = ( + await issuer.post( + "/wallet/did/create", + json={"method": "key", "options": {"key_type": "ed25519"}}, + response=DIDResult, + ) + ).result + assert public_did + cred = await issuer.post( + "/vc/credentials/issue", + json={ + "credential": { + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://www.w3.org/2018/credentials/examples/v1", + ], + "id": "http://example.edu/credentials/1872", + "credentialSubject": { + "id": "did:example:ebfeb1f712ebc6f1c276e12ec21" + }, + "issuer": public_did.did, + "issuanceDate": "2024-12-10T10:00:00Z", + "type": ["VerifiableCredential", "AlumniCredential"], + }, + "options": { + "challenge": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "domain": "example.com", + "proofPurpose": "assertionMethod", + "proofType": "Ed25519Signature2018", + }, + }, + ) + await alice.post( + "/vc/credentials/store", + json={"verifiableCredential": cred["verifiableCredential"]}, + ) + result = await bob.get("/vc/credentials") + assert len(result["results"]) == 0 + + +if __name__ == "__main__": + logging_to_stdout() + asyncio.run(main())