From 30e9816e908170b139c86104da64fbac652e763b Mon Sep 17 00:00:00 2001 From: jamshale Date: Fri, 20 Dec 2024 19:38:24 +0000 Subject: [PATCH] Fix indy fallback format in presentation from holder Signed-off-by: jamshale --- .../v2_0/formats/anoncreds/handler.py | 7 ++ .../example.py | 28 +++--- .../restart_anoncreds_upgrade/example.py | 88 ++++++++++--------- scenarios/examples/util.py | 25 +++--- 4 files changed, 77 insertions(+), 71 deletions(-) diff --git a/acapy_agent/protocols/present_proof/v2_0/formats/anoncreds/handler.py b/acapy_agent/protocols/present_proof/v2_0/formats/anoncreds/handler.py index 19b3264687..492d0f3c4b 100644 --- a/acapy_agent/protocols/present_proof/v2_0/formats/anoncreds/handler.py +++ b/acapy_agent/protocols/present_proof/v2_0/formats/anoncreds/handler.py @@ -171,6 +171,13 @@ async def create_pres( pres_ex_record=pres_ex_record, requested_credentials=requested_credentials, ) + + # This is used for the fallback to indy format. Should be removed when indy + # format retired + if request_data.get("indy"): + return IndyPresExchangeHandler(self.profile).get_format_data( + PRES_20, presentation_proof + ) return self.get_format_data(PRES_20, presentation_proof) async def receive_pres(self, message: V20Pres, pres_ex_record: V20PresExRecord): diff --git a/scenarios/examples/anoncreds_issuance_and_revocation/example.py b/scenarios/examples/anoncreds_issuance_and_revocation/example.py index 45a4907f52..4489435c4c 100644 --- a/scenarios/examples/anoncreds_issuance_and_revocation/example.py +++ b/scenarios/examples/anoncreds_issuance_and_revocation/example.py @@ -4,18 +4,13 @@ """ import asyncio -import json from os import getenv from secrets import token_hex -from typing import Any, Dict, List, Mapping, Optional, Tuple, Type, Union from acapy_controller import Controller -from acapy_controller.controller import Minimal, MinType from acapy_controller.logging import logging_to_stdout from acapy_controller.models import ( CreateWalletResponse, - V20CredExRecordIndy, - V20PresExRecord, V20PresExRecordList, ) from acapy_controller.protocols import ( @@ -25,17 +20,14 @@ params, ) from aiohttp import ClientSession - from examples.util import ( - SchemaResultAnoncreds, CredDefResultAnoncreds, - anoncreds_presentation_summary, - auto_select_credentials_for_presentation_request, + SchemaResultAnoncreds, anoncreds_issue_credential_v2, anoncreds_present_proof_v2, + anoncreds_presentation_summary, ) - AGENCY = getenv("AGENCY", "http://agency:3001") HOLDER_ANONCREDS = getenv("HOLDER_ANONCREDS", "http://holder_anoncreds:3001") HOLDER_INDY = getenv("HOLDER_INDY", "http://holder_indy:3001") @@ -55,13 +47,15 @@ async def main(): response=CreateWalletResponse, ) - async with Controller( - base_url=AGENCY, - wallet_id=issuer.wallet_id, - subwallet_token=issuer.token, - ) as issuer, Controller(base_url=HOLDER_ANONCREDS) as holder_anoncreds, Controller( - base_url=HOLDER_INDY - ) as holder_indy: + async with ( + Controller( + base_url=AGENCY, + wallet_id=issuer.wallet_id, + subwallet_token=issuer.token, + ) as issuer, + Controller(base_url=HOLDER_ANONCREDS) as holder_anoncreds, + Controller(base_url=HOLDER_INDY) as holder_indy, + ): """ This section of the test script demonstrates the issuance, presentation and revocation of a credential where both the issuer is not anoncreds capable diff --git a/scenarios/examples/restart_anoncreds_upgrade/example.py b/scenarios/examples/restart_anoncreds_upgrade/example.py index 5077090f04..3cda1334eb 100644 --- a/scenarios/examples/restart_anoncreds_upgrade/example.py +++ b/scenarios/examples/restart_anoncreds_upgrade/example.py @@ -4,39 +4,25 @@ """ import asyncio -from os import getenv import json -import time - -import docker -from docker.errors import NotFound -from docker.models.containers import Container +from os import getenv from acapy_controller import Controller from acapy_controller.logging import logging_to_stdout from acapy_controller.protocols import ( - connection, didexchange, indy_anoncred_credential_artifacts, indy_anoncred_onboard, - indy_anoncreds_publish_revocation, - indy_anoncreds_revoke, - indy_issue_credential_v2, - indy_present_proof_v2, ) - from examples.util import ( - healthy, - unhealthy, - wait_until_healthy, - update_wallet_type, - get_wallet_name, - anoncreds_presentation_summary, - auto_select_credentials_for_presentation_request, anoncreds_issue_credential_v2, anoncreds_present_proof_v2, + get_wallet_name, + update_wallet_type, + wait_until_healthy, ) +import docker ALICE = getenv("ALICE", "http://alice:3001") BOB_ASKAR = getenv("BOB_ASKAR", "http://bob-askar:3001") @@ -111,7 +97,7 @@ async def upgrade_wallet_and_shutdown_container( agent_controller, agent_container, ): - agent_command = agent_container.attrs['Config']['Cmd'] + agent_command = agent_container.attrs["Config"]["Cmd"] # command is a List, find the wallet type and replace "askar" with "askar-anoncreds" correct_wallet_type = update_wallet_type(agent_command, "askar-anoncreds") @@ -129,7 +115,7 @@ async def upgrade_wallet_and_shutdown_container( await asyncio.sleep(2) print(">>> waiting for container to exit ...") - agent_id = agent_container.attrs['Id'] + agent_id = agent_container.attrs["Id"] wait_until_healthy(client, agent_id, is_healthy=False) agent_container.remove() @@ -144,17 +130,17 @@ def start_new_container( ): print(">>> start new container ...") new_agent_container = client.containers.run( - 'acapy-test', + "acapy-test", command=agent_command, detach=True, - environment={'RUST_LOG': 'aries-askar::log::target=error'}, - healthcheck=agent_container.attrs['Config']['Healthcheck'], + environment={"RUST_LOG": "aries-askar::log::target=error"}, + healthcheck=agent_container.attrs["Config"]["Healthcheck"], name=agent_label, - network=agent_container.attrs['HostConfig']['NetworkMode'], - ports=agent_container.attrs['NetworkSettings']['Ports'], + network=agent_container.attrs["HostConfig"]["NetworkMode"], + ports=agent_container.attrs["NetworkSettings"]["Ports"], ) print(">>> new container:", agent_label, json.dumps(new_agent_container.attrs)) - new_agent_id = new_agent_container.attrs['Id'] + new_agent_id = new_agent_container.attrs["Id"] wait_until_healthy(client, new_agent_id) print(">>> new container is healthy") @@ -198,7 +184,10 @@ async def main(): alice_conns["askar"] = alice_conn bob_conns["askar"] = bob_conn - async with Controller(base_url=ALICE) as alice, Controller(base_url=BOB_ANONCREDS) as bob: + async with ( + Controller(base_url=ALICE) as alice, + Controller(base_url=BOB_ANONCREDS) as bob, + ): # connect to Bob (Anoncreds wallet) and issue (and revoke) some credentials (alice_conn, bob_conn) = await connect_agents_and_issue_credentials( alice, @@ -210,7 +199,10 @@ async def main(): alice_conns["anoncreds"] = alice_conn bob_conns["anoncreds"] = bob_conn - async with Controller(base_url=ALICE) as alice, Controller(base_url=BOB_ASKAR_ANON) as bob: + async with ( + Controller(base_url=ALICE) as alice, + Controller(base_url=BOB_ASKAR_ANON) as bob, + ): # connect to Bob (Askar wallet which will be upgraded) and issue (and revoke) some credentials (alice_conn, bob_conn) = await connect_agents_and_issue_credentials( alice, @@ -229,15 +221,20 @@ async def main(): containers = client.containers.list(all=True) docker_containers = {} for container in containers: - if 'com.docker.compose.service' in container.attrs['Config']['Labels']: - container_name = container.attrs['Config']['Labels']['com.docker.compose.service'] - container_id = container.attrs['Id'] - container_is_running = container.attrs['State']['Running'] - docker_containers[container_name] = {'Id': container_id, 'Running': container_is_running} + if "com.docker.compose.service" in container.attrs["Config"]["Labels"]: + container_name = container.attrs["Config"]["Labels"][ + "com.docker.compose.service" + ] + container_id = container.attrs["Id"] + container_is_running = container.attrs["State"]["Running"] + docker_containers[container_name] = { + "Id": container_id, + "Running": container_is_running, + } print(">>> container:", container_name, docker_containers[container_name]) - alice_docker_container = docker_containers['alice'] - alice_container = client.containers.get(alice_docker_container['Id']) + alice_docker_container = docker_containers["alice"] + alice_container = client.containers.get(alice_docker_container["Id"]) async with Controller(base_url=ALICE) as alice: alice_command = await upgrade_wallet_and_shutdown_container( client, @@ -245,8 +242,8 @@ async def main(): alice_container, ) - bob_docker_container = docker_containers['bob-askar-anon'] - bob_container = client.containers.get(bob_docker_container['Id']) + bob_docker_container = docker_containers["bob-askar-anon"] + bob_container = client.containers.get(bob_docker_container["Id"]) async with Controller(base_url=BOB_ASKAR_ANON) as bob: bob_command = await upgrade_wallet_and_shutdown_container( client, @@ -274,7 +271,10 @@ async def main(): ) # run some more tests ... alice should still be connected to bob for example ... - async with Controller(base_url=ALICE) as alice, Controller(base_url=BOB_ASKAR) as bob: + async with ( + Controller(base_url=ALICE) as alice, + Controller(base_url=BOB_ASKAR) as bob, + ): # Present the the credential's attributes print(">>> present proof ... again ...") await anoncreds_present_proof_v2( @@ -286,7 +286,10 @@ async def main(): ) print(">>> Done! (again)") - async with Controller(base_url=ALICE) as alice, Controller(base_url=BOB_ANONCREDS) as bob: + async with ( + Controller(base_url=ALICE) as alice, + Controller(base_url=BOB_ANONCREDS) as bob, + ): # Present the the credential's attributes print(">>> present proof ... again ...") await anoncreds_present_proof_v2( @@ -298,7 +301,10 @@ async def main(): ) print(">>> Done! (again)") - async with Controller(base_url=ALICE) as alice, Controller(base_url=BOB_ASKAR_ANON) as bob: + async with ( + Controller(base_url=ALICE) as alice, + Controller(base_url=BOB_ASKAR_ANON) as bob, + ): # Present the the credential's attributes print(">>> present proof ... again ...") await anoncreds_present_proof_v2( diff --git a/scenarios/examples/util.py b/scenarios/examples/util.py index 5e033905af..5c655f842e 100644 --- a/scenarios/examples/util.py +++ b/scenarios/examples/util.py @@ -1,29 +1,28 @@ import json +import time from dataclasses import dataclass from secrets import randbelow from typing import Any, Dict, List, Mapping, Optional, Tuple, Type, Union from uuid import uuid4 -import time - -import docker -from docker.models.containers import Container from acapy_controller import Controller from acapy_controller.controller import Minimal, MinType -from acapy_controller.logging import logging_to_stdout from acapy_controller.models import ( - CreateWalletResponse, V20CredExRecordIndy, V20PresExRecord, - V20PresExRecordList, ) +from docker.models.containers import Container + # docker utilities: def healthy(container: Container) -> bool: """Check if container is healthy.""" inspect_results = container.attrs - return inspect_results["State"]["Running"] and inspect_results["State"]["Health"]["Status"] == "healthy" + return ( + inspect_results["State"]["Running"] + and inspect_results["State"]["Health"]["Status"] == "healthy" + ) def unhealthy(container: Container) -> bool: @@ -45,18 +44,18 @@ def wait_until_healthy(client, container_id: str, attempts: int = 350, is_health raise TimeoutError("Timed out waiting for container") -def update_wallet_type(agent_command: List, wallet_type:str) -> str: - for i in range(len(agent_command)-1): +def update_wallet_type(agent_command: List, wallet_type: str) -> str: + for i in range(len(agent_command) - 1): if agent_command[i] == "--wallet-type": - agent_command[i+1] = wallet_type + agent_command[i + 1] = wallet_type return wallet_type raise Exception("Error unable to upgrade wallet type to askar-anoncreds") def get_wallet_name(agent_command: List) -> str: - for i in range(len(agent_command)-1): + for i in range(len(agent_command) - 1): if agent_command[i] == "--wallet-name": - return agent_command[i+1] + return agent_command[i + 1] raise Exception("Error unable to upgrade wallet type to askar-anoncreds")