From ec6f79c46a9c8ec2f50b381511c6369b547eabca Mon Sep 17 00:00:00 2001 From: Nicholas Rempel Date: Tue, 5 Nov 2019 13:31:48 -0800 Subject: [PATCH 1/8] Update message types to include new uri Signed-off-by: Nicholas Rempel --- .../protocols/actionmenu/message_types.py | 9 +++++++ .../protocols/basicmessage/message_types.py | 7 +++++- .../protocols/connections/message_types.py | 17 +++++++++++++ .../protocols/credentials/message_types.py | 19 ++++++++++++++ .../protocols/discovery/message_types.py | 7 ++++++ .../protocols/introduction/message_types.py | 13 ++++++++++ .../issue_credential/v1_0/message_types.py | 25 +++++++++++++++++++ .../present_proof/v1_0/message_types.py | 15 +++++++++++ .../protocols/presentations/message_types.py | 11 ++++++++ .../protocols/problem_report/message_types.py | 9 ++++++- .../protocols/routing/message_types.py | 22 ++++++++++++++++ .../protocols/trustping/message_types.py | 7 ++++++ 12 files changed, 159 insertions(+), 2 deletions(-) diff --git a/aries_cloudagent/protocols/actionmenu/message_types.py b/aries_cloudagent/protocols/actionmenu/message_types.py index 9dc9907645..5a006de1aa 100644 --- a/aries_cloudagent/protocols/actionmenu/message_types.py +++ b/aries_cloudagent/protocols/actionmenu/message_types.py @@ -6,12 +6,21 @@ MENU_REQUEST = f"{PROTOCOL_URI}/menu-request" PERFORM = f"{PROTOCOL_URI}/perform" +NEW_PROTOCOL_URI = "https://didcomm.org/action-menu/1.0" + +NEW_MENU = f"{NEW_PROTOCOL_URI}/menu" +NEW_MENU_REQUEST = f"{NEW_PROTOCOL_URI}/menu-request" +NEW_PERFORM = f"{NEW_PROTOCOL_URI}/perform" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.actionmenu" MESSAGE_TYPES = { MENU: f"{PROTOCOL_PACKAGE}.messages.menu.Menu", MENU_REQUEST: (f"{PROTOCOL_PACKAGE}.messages.menu_request.MenuRequest"), PERFORM: f"{PROTOCOL_PACKAGE}.messages.perform.Perform", + NEW_MENU: f"{PROTOCOL_PACKAGE}.messages.menu.Menu", + NEW_MENU_REQUEST: (f"{PROTOCOL_PACKAGE}.messages.menu_request.MenuRequest"), + NEW_PERFORM: f"{PROTOCOL_PACKAGE}.messages.perform.Perform", } CONTROLLERS = {PROTOCOL_URI: f"{PROTOCOL_PACKAGE}.controller.Controller"} diff --git a/aries_cloudagent/protocols/basicmessage/message_types.py b/aries_cloudagent/protocols/basicmessage/message_types.py index 1a2937b31e..4c793d23eb 100644 --- a/aries_cloudagent/protocols/basicmessage/message_types.py +++ b/aries_cloudagent/protocols/basicmessage/message_types.py @@ -4,8 +4,13 @@ BASIC_MESSAGE = f"{PROTOCOL_URI}/message" +NEW_PROTOCOL_URI = "https://didcomm.org/basicmessage/1.0" + +NEW_BASIC_MESSAGE = f"{NEW_PROTOCOL_URI}/message" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.basicmessage" MESSAGE_TYPES = { - BASIC_MESSAGE: f"{PROTOCOL_PACKAGE}.messages.basicmessage.BasicMessage" + BASIC_MESSAGE: f"{PROTOCOL_PACKAGE}.messages.basicmessage.BasicMessage", + NEW_BASIC_MESSAGE: f"{PROTOCOL_PACKAGE}.messages.basicmessage.BasicMessage", } diff --git a/aries_cloudagent/protocols/connections/message_types.py b/aries_cloudagent/protocols/connections/message_types.py index 330f5b9a6e..92cae00ce4 100644 --- a/aries_cloudagent/protocols/connections/message_types.py +++ b/aries_cloudagent/protocols/connections/message_types.py @@ -7,6 +7,13 @@ CONNECTION_RESPONSE = f"{PROTOCOL_URI}/response" PROBLEM_REPORT = f"{PROTOCOL_URI}/problem_report" +NEW_PROTOCOL_URI = "https://didcomm.org/connections/1.0" + +NEW_CONNECTION_INVITATION = f"{NEW_PROTOCOL_URI}/invitation" +NEW_CONNECTION_REQUEST = f"{NEW_PROTOCOL_URI}/request" +NEW_CONNECTION_RESPONSE = f"{NEW_PROTOCOL_URI}/response" +NEW_PROBLEM_REPORT = f"{NEW_PROTOCOL_URI}/problem_report" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.connections" MESSAGE_TYPES = { @@ -20,4 +27,14 @@ f"{PROTOCOL_PACKAGE}.messages.connection_response.ConnectionResponse" ), PROBLEM_REPORT: f"{PROTOCOL_PACKAGE}.messages.problem_report.ProblemReport", + NEW_CONNECTION_INVITATION: ( + f"{PROTOCOL_PACKAGE}.messages.connection_invitation.ConnectionInvitation" + ), + NEW_CONNECTION_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.connection_request.ConnectionRequest" + ), + NEW_CONNECTION_RESPONSE: ( + f"{PROTOCOL_PACKAGE}.messages.connection_response.ConnectionResponse" + ), + NEW_PROBLEM_REPORT: f"{PROTOCOL_PACKAGE}.messages.problem_report.ProblemReport", } diff --git a/aries_cloudagent/protocols/credentials/message_types.py b/aries_cloudagent/protocols/credentials/message_types.py index 59655bcd85..c6876cb486 100644 --- a/aries_cloudagent/protocols/credentials/message_types.py +++ b/aries_cloudagent/protocols/credentials/message_types.py @@ -7,6 +7,13 @@ CREDENTIAL_ISSUE = f"{PROTOCOL_URI}/credential-issue" CREDENTIAL_STORED = f"{PROTOCOL_URI}/credential-stored" +NEW_PROTOCOL_URI = "https://didcomm.org/credential-issuance/0.1" + +NEW_CREDENTIAL_OFFER = f"{NEW_PROTOCOL_URI}/credential-offer" +NEW_CREDENTIAL_REQUEST = f"{NEW_PROTOCOL_URI}/credential-request" +NEW_CREDENTIAL_ISSUE = f"{NEW_PROTOCOL_URI}/credential-issue" +NEW_CREDENTIAL_STORED = f"{NEW_PROTOCOL_URI}/credential-stored" + PROTOCOL_PACKAGE = "aries_cloudagent.messaging.credentials" MESSAGE_TYPES = { @@ -18,4 +25,16 @@ CREDENTIAL_STORED: ( f"{PROTOCOL_PACKAGE}.messages.credential_stored.CredentialStored" ), + NEW_CREDENTIAL_OFFER: ( + f"{PROTOCOL_PACKAGE}.messages.credential_offer.CredentialOffer" + ), + NEW_CREDENTIAL_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.credential_request.CredentialRequest" + ), + NEW_CREDENTIAL_ISSUE: ( + f"{PROTOCOL_PACKAGE}.messages.credential_issue.CredentialIssue" + ), + NEW_CREDENTIAL_STORED: ( + f"{PROTOCOL_PACKAGE}.messages.credential_stored.CredentialStored" + ), } diff --git a/aries_cloudagent/protocols/discovery/message_types.py b/aries_cloudagent/protocols/discovery/message_types.py index f02f403e7c..d7107d9e8c 100644 --- a/aries_cloudagent/protocols/discovery/message_types.py +++ b/aries_cloudagent/protocols/discovery/message_types.py @@ -5,9 +5,16 @@ DISCLOSE = f"{PROTOCOL_URI}/disclose" QUERY = f"{PROTOCOL_URI}/query" +NEW_PROTOCOL_URI = "https://didcomm.org/discover-features/1.0" + +NEW_DISCLOSE = f"{NEW_PROTOCOL_URI}/disclose" +NEW_QUERY = f"{NEW_PROTOCOL_URI}/query" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.discovery" MESSAGE_TYPES = { DISCLOSE: f"{PROTOCOL_PACKAGE}.messages.disclose.Disclose", QUERY: f"{PROTOCOL_PACKAGE}.messages.query.Query", + NEW_DISCLOSE: f"{PROTOCOL_PACKAGE}.messages.disclose.Disclose", + NEW_QUERY: f"{PROTOCOL_PACKAGE}.messages.query.Query", } diff --git a/aries_cloudagent/protocols/introduction/message_types.py b/aries_cloudagent/protocols/introduction/message_types.py index 2a2de8a7a5..c189bbe79a 100644 --- a/aries_cloudagent/protocols/introduction/message_types.py +++ b/aries_cloudagent/protocols/introduction/message_types.py @@ -6,6 +6,12 @@ INVITATION = f"{PROTOCOL_URI}/invitation" FORWARD_INVITATION = f"{PROTOCOL_URI}/forward-invitation" +NEW_PROTOCOL_URI = "https://didcomm.org/introduction-service/0.1" + +NEW_INVITATION_REQUEST = f"{NEW_PROTOCOL_URI}/invitation-request" +NEW_INVITATION = f"{NEW_PROTOCOL_URI}/invitation" +NEW_FORWARD_INVITATION = f"{NEW_PROTOCOL_URI}/forward-invitation" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.introduction" MESSAGE_TYPES = { @@ -16,4 +22,11 @@ FORWARD_INVITATION: ( f"{PROTOCOL_PACKAGE}.messages.forward_invitation.ForwardInvitation" ), + NEW_INVITATION_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.invitation_request.InvitationRequest" + ), + NEW_INVITATION: f"{PROTOCOL_PACKAGE}.messages.invitation.Invitation", + NEW_FORWARD_INVITATION: ( + f"{PROTOCOL_PACKAGE}.messages.forward_invitation.ForwardInvitation" + ), } diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/message_types.py b/aries_cloudagent/protocols/issue_credential/v1_0/message_types.py index 1806184f44..3814740b0d 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/message_types.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/message_types.py @@ -10,6 +10,16 @@ CREDENTIAL_ISSUE = f"{PROTOCOL_URI}/issue-credential" CREDENTIAL_STORED = f"{PROTOCOL_URI}/credential-stored" +NEW_PROTOCOL_URI = "https://didcomm.org/issue-credential/1.0" + +# Message types + +NEW_CREDENTIAL_PROPOSAL = f"{NEW_PROTOCOL_URI}/propose-credential" +NEW_CREDENTIAL_OFFER = f"{NEW_PROTOCOL_URI}/offer-credential" +NEW_CREDENTIAL_REQUEST = f"{NEW_PROTOCOL_URI}/request-credential" +NEW_CREDENTIAL_ISSUE = f"{NEW_PROTOCOL_URI}/issue-credential" +NEW_CREDENTIAL_STORED = f"{NEW_PROTOCOL_URI}/credential-stored" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.issue_credential.v1_0" MESSAGE_TYPES = { @@ -24,6 +34,21 @@ CREDENTIAL_STORED: ( f"{PROTOCOL_PACKAGE}.messages.credential_stored.CredentialStored" ), + NEW_CREDENTIAL_PROPOSAL: ( + f"{PROTOCOL_PACKAGE}.messages.credential_proposal.CredentialProposal" + ), + NEW_CREDENTIAL_OFFER: ( + f"{PROTOCOL_PACKAGE}.messages.credential_offer.CredentialOffer" + ), + NEW_CREDENTIAL_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.credential_request.CredentialRequest" + ), + NEW_CREDENTIAL_ISSUE: ( + f"{PROTOCOL_PACKAGE}.messages.credential_issue.CredentialIssue" + ), + NEW_CREDENTIAL_STORED: ( + f"{PROTOCOL_PACKAGE}.messages.credential_stored.CredentialStored" + ), } # Inner object types diff --git a/aries_cloudagent/protocols/present_proof/v1_0/message_types.py b/aries_cloudagent/protocols/present_proof/v1_0/message_types.py index 45f675f86a..4f8bd702f9 100644 --- a/aries_cloudagent/protocols/present_proof/v1_0/message_types.py +++ b/aries_cloudagent/protocols/present_proof/v1_0/message_types.py @@ -8,6 +8,14 @@ PRESENTATION_REQUEST = f"{PROTOCOL_URI}/request-presentation" PRESENTATION = f"{PROTOCOL_URI}/presentation" +NEW_PROTOCOL_URI = "https://didcomm.org/present-proof/1.0" + +# New Message types + +NEW_PRESENTATION_PROPOSAL = f"{NEW_PROTOCOL_URI}/propose-presentation" +NEW_PRESENTATION_REQUEST = f"{NEW_PROTOCOL_URI}/request-presentation" +NEW_PRESENTATION = f"{NEW_PROTOCOL_URI}/presentation" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.present_proof.v1_0" MESSAGE_TYPES = { @@ -18,6 +26,13 @@ f"{PROTOCOL_PACKAGE}.messages.presentation_request.PresentationRequest" ), PRESENTATION: f"{PROTOCOL_PACKAGE}.messages.presentation.Presentation", + NEW_PRESENTATION_PROPOSAL: ( + f"{PROTOCOL_PACKAGE}.messages.presentation_proposal.PresentationProposal" + ), + NEW_PRESENTATION_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.presentation_request.PresentationRequest" + ), + NEW_PRESENTATION: f"{PROTOCOL_PACKAGE}.messages.presentation.Presentation", } # Inner object types diff --git a/aries_cloudagent/protocols/presentations/message_types.py b/aries_cloudagent/protocols/presentations/message_types.py index 6964f8c705..f327c9c193 100644 --- a/aries_cloudagent/protocols/presentations/message_types.py +++ b/aries_cloudagent/protocols/presentations/message_types.py @@ -5,6 +5,11 @@ PRESENTATION_REQUEST = f"{PROTOCOL_URI}/presentation-request" CREDENTIAL_PRESENTATION = f"{PROTOCOL_URI}/credential-presentation" +NEW_PROTOCOL_URI = "https://didcomm.org/credential-presentation/0.1" + +NEW_PRESENTATION_REQUEST = f"{NEW_PROTOCOL_URI}/presentation-request" +NEW_CREDENTIAL_PRESENTATION = f"{NEW_PROTOCOL_URI}/credential-presentation" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.presentations" MESSAGE_TYPES = { @@ -14,4 +19,10 @@ CREDENTIAL_PRESENTATION: ( f"{PROTOCOL_PACKAGE}.messages.credential_presentation.CredentialPresentation" ), + NEW_PRESENTATION_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.presentation_request.PresentationRequest" + ), + NEW_CREDENTIAL_PRESENTATION: ( + f"{PROTOCOL_PACKAGE}.messages.credential_presentation.CredentialPresentation" + ), } diff --git a/aries_cloudagent/protocols/problem_report/message_types.py b/aries_cloudagent/protocols/problem_report/message_types.py index 32793fb473..bf0d7a5e1b 100644 --- a/aries_cloudagent/protocols/problem_report/message_types.py +++ b/aries_cloudagent/protocols/problem_report/message_types.py @@ -4,6 +4,13 @@ PROBLEM_REPORT = f"{PROTOCOL_URI}/problem-report" +NEW_PROTOCOL_URI = "https://didcomm.org/notification/1.0" + +NEW_PROBLEM_REPORT = f"{NEW_PROTOCOL_URI}/problem-report" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.problem_report" -MESSAGE_TYPES = {PROBLEM_REPORT: f"{PROTOCOL_PACKAGE}.messages.ProblemReport"} +MESSAGE_TYPES = { + PROBLEM_REPORT: f"{PROTOCOL_PACKAGE}.messages.ProblemReport", + NEW_PROBLEM_REPORT: f"{PROTOCOL_PACKAGE}.messages.ProblemReport" +} diff --git a/aries_cloudagent/protocols/routing/message_types.py b/aries_cloudagent/protocols/routing/message_types.py index 51419998f3..051b45de5f 100644 --- a/aries_cloudagent/protocols/routing/message_types.py +++ b/aries_cloudagent/protocols/routing/message_types.py @@ -9,6 +9,15 @@ ROUTE_UPDATE_REQUEST = f"{PROTOCOL_URI}/route-update-request" ROUTE_UPDATE_RESPONSE = f"{PROTOCOL_URI}/route-update-response" +NEW_PROTOCOL_URI = "https://didcomm.org/routing/1.0" + +NEW_FORWARD = f"{NEW_PROTOCOL_URI}/forward" + +NEW_ROUTE_QUERY_REQUEST = f"{NEW_PROTOCOL_URI}/route-query-request" +NEW_ROUTE_QUERY_RESPONSE = f"{NEW_PROTOCOL_URI}/route-query-response" +NEW_ROUTE_UPDATE_REQUEST = f"{NEW_PROTOCOL_URI}/route-update-request" +NEW_ROUTE_UPDATE_RESPONSE = f"{NEW_PROTOCOL_URI}/route-update-response" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.routing" MESSAGE_TYPES = { @@ -25,4 +34,17 @@ ROUTE_UPDATE_RESPONSE: ( f"{PROTOCOL_PACKAGE}.messages.route_update_response.RouteUpdateResponse" ), + NEW_FORWARD: f"{PROTOCOL_PACKAGE}.messages.forward.Forward", + NEW_ROUTE_QUERY_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.route_query_request.RouteQueryRequest" + ), + NEW_ROUTE_QUERY_RESPONSE: ( + f"{PROTOCOL_PACKAGE}.messages.route_query_response.RouteQueryResponse" + ), + NEW_ROUTE_UPDATE_REQUEST: ( + f"{PROTOCOL_PACKAGE}.messages.route_update_request.RouteUpdateRequest" + ), + NEW_ROUTE_UPDATE_RESPONSE: ( + f"{PROTOCOL_PACKAGE}.messages.route_update_response.RouteUpdateResponse" + ), } diff --git a/aries_cloudagent/protocols/trustping/message_types.py b/aries_cloudagent/protocols/trustping/message_types.py index 498a98efaa..19a19efcef 100644 --- a/aries_cloudagent/protocols/trustping/message_types.py +++ b/aries_cloudagent/protocols/trustping/message_types.py @@ -5,9 +5,16 @@ PING = f"{PROTOCOL_URI}/ping" PING_RESPONSE = f"{PROTOCOL_URI}/ping_response" +NEW_PROTOCOL_URI = "https://didcomm.org/trust_ping/1.0" + +NEW_PING = f"{NEW_PROTOCOL_URI}/ping" +NEW_PING_RESPONSE = f"{NEW_PROTOCOL_URI}/ping_response" + PROTOCOL_PACKAGE = "aries_cloudagent.protocols.trustping" MESSAGE_TYPES = { PING: f"{PROTOCOL_PACKAGE}.messages.ping.Ping", PING_RESPONSE: f"{PROTOCOL_PACKAGE}.messages.ping_response.PingResponse", + NEW_PING: f"{PROTOCOL_PACKAGE}.messages.ping.Ping", + NEW_PING_RESPONSE: f"{PROTOCOL_PACKAGE}.messages.ping_response.PingResponse", } From 2cbe267e42b9bfe6a58012ec6d8d2c5e70800852 Mon Sep 17 00:00:00 2001 From: Nicholas Rempel Date: Tue, 5 Nov 2019 15:23:27 -0800 Subject: [PATCH 2/8] if inbound message used new type prefix, replies to the message should use the same Signed-off-by: Nicholas Rempel --- aries_cloudagent/dispatcher.py | 10 ++++++++++ aries_cloudagent/messaging/responder.py | 1 + aries_cloudagent/protocols/actionmenu/messages/menu.py | 5 +++-- .../protocols/actionmenu/messages/menu_request.py | 3 ++- .../protocols/actionmenu/messages/perform.py | 3 ++- .../protocols/basicmessage/messages/basicmessage.py | 3 ++- .../connections/messages/connection_invitation.py | 9 +++++++-- .../connections/messages/connection_request.py | 5 +++-- .../connections/messages/connection_response.py | 7 ++++++- .../protocols/connections/messages/problem_report.py | 3 ++- .../protocols/credentials/messages/credential_issue.py | 3 ++- .../protocols/credentials/messages/credential_offer.py | 3 ++- .../credentials/messages/credential_request.py | 3 ++- .../credentials/messages/credential_stored.py | 3 ++- .../protocols/discovery/messages/disclose.py | 3 ++- aries_cloudagent/protocols/discovery/messages/query.py | 3 ++- .../introduction/messages/forward_invitation.py | 5 +++-- .../protocols/introduction/messages/invitation.py | 5 +++-- .../introduction/messages/invitation_request.py | 3 ++- .../issue_credential/v1_0/messages/credential_issue.py | 8 +++++++- .../issue_credential/v1_0/messages/credential_offer.py | 8 +++++++- .../v1_0/messages/credential_proposal.py | 7 ++++++- .../v1_0/messages/credential_request.py | 8 +++++++- .../v1_0/messages/credential_stored.py | 3 ++- .../present_proof/v1_0/messages/presentation.py | 3 ++- .../v1_0/messages/presentation_proposal.py | 7 ++++++- .../v1_0/messages/presentation_request.py | 7 ++++++- .../presentations/messages/credential_presentation.py | 7 ++++++- .../presentations/messages/presentation_request.py | 7 ++++++- aries_cloudagent/protocols/problem_report/message.py | 5 +++-- aries_cloudagent/protocols/routing/messages/forward.py | 3 ++- .../protocols/routing/messages/route_query_request.py | 9 +++++++-- .../protocols/routing/messages/route_query_response.py | 7 ++++++- .../protocols/routing/messages/route_update_request.py | 7 ++++++- .../routing/messages/route_update_response.py | 7 ++++++- aries_cloudagent/protocols/trustping/messages/ping.py | 3 ++- .../protocols/trustping/messages/ping_response.py | 3 ++- 37 files changed, 147 insertions(+), 42 deletions(-) diff --git a/aries_cloudagent/dispatcher.py b/aries_cloudagent/dispatcher.py index 4b8fac0e05..1dabe2c237 100644 --- a/aries_cloudagent/dispatcher.py +++ b/aries_cloudagent/dispatcher.py @@ -125,6 +125,11 @@ async def make_message(self, parsed_msg: dict) -> AgentMessage: # throws a MessageParseError on failure message_type = serializer.extract_message_type(parsed_msg) + # If this message used the new @type format, outoing + # messages should be the same + if "https://didcomm.org" in message_type: + self.context.use_new_type_prefix = True + message_cls = registry.resolve_message_class(message_type) if not message_cls: @@ -171,6 +176,11 @@ async def create_outbound( "in_time": in_time, "out_time": datetime_now(), } + + # Use new message @type prefix if incoming message contained it + if self.context.use_new_type_prefix: + message.Meta.message_type = message.Meta.new_message_type + return await super().create_outbound(message, **kwargs) async def send_outbound(self, message: OutboundMessage): diff --git a/aries_cloudagent/messaging/responder.py b/aries_cloudagent/messaging/responder.py index 0ef2361396..09adf5f8f7 100644 --- a/aries_cloudagent/messaging/responder.py +++ b/aries_cloudagent/messaging/responder.py @@ -53,6 +53,7 @@ async def create_outbound( else: payload = message encoded = True + return OutboundMessage( payload, connection_id=connection_id, diff --git a/aries_cloudagent/protocols/actionmenu/messages/menu.py b/aries_cloudagent/protocols/actionmenu/messages/menu.py index 6c08791329..802a3f8d93 100644 --- a/aries_cloudagent/protocols/actionmenu/messages/menu.py +++ b/aries_cloudagent/protocols/actionmenu/messages/menu.py @@ -6,7 +6,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import MENU, PROTOCOL_PACKAGE +from ..message_types import MENU, NEW_MENU, PROTOCOL_PACKAGE from ..models.menu_option import MenuOption, MenuOptionSchema HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.menu_handler.MenuHandler" @@ -20,6 +20,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = MENU + new_message_type = NEW_MENU schema_class = "MenuSchema" def __init__( @@ -54,7 +55,7 @@ class Meta: model_class = Menu - title = fields.Str(required=False, description="Menu title", example="My Menu",) + title = fields.Str(required=False, description="Menu title", example="My Menu") description = fields.Str( required=False, description="Introductory text for the menu", diff --git a/aries_cloudagent/protocols/actionmenu/messages/menu_request.py b/aries_cloudagent/protocols/actionmenu/messages/menu_request.py index f27d655601..fcb15795da 100644 --- a/aries_cloudagent/protocols/actionmenu/messages/menu_request.py +++ b/aries_cloudagent/protocols/actionmenu/messages/menu_request.py @@ -2,7 +2,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import MENU_REQUEST, PROTOCOL_PACKAGE +from ..message_types import MENU_REQUEST, NEW_MENU_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.menu_request_handler.MenuRequestHandler" @@ -15,6 +15,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = MENU_REQUEST + new_message_type = NEW_MENU_REQUEST schema_class = "MenuRequestSchema" def __init__(self, **kwargs): diff --git a/aries_cloudagent/protocols/actionmenu/messages/perform.py b/aries_cloudagent/protocols/actionmenu/messages/perform.py index cbbf0ce205..1b6a6731bb 100644 --- a/aries_cloudagent/protocols/actionmenu/messages/perform.py +++ b/aries_cloudagent/protocols/actionmenu/messages/perform.py @@ -6,7 +6,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PERFORM, PROTOCOL_PACKAGE +from ..message_types import PERFORM, NEW_PERFORM, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.perform_handler.PerformHandler" @@ -19,6 +19,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = PERFORM + new_message_type = NEW_PERFORM schema_class = "PerformSchema" def __init__(self, *, name: str = None, params: Mapping[str, str] = None, **kwargs): diff --git a/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py b/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py index 5c54f7dbb8..06cc6c91dc 100644 --- a/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py +++ b/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py @@ -9,7 +9,7 @@ from ....messaging.util import datetime_now, datetime_to_str from ....messaging.valid import INDY_ISO8601_DATETIME -from ..message_types import BASIC_MESSAGE, PROTOCOL_PACKAGE +from ..message_types import BASIC_MESSAGE, NEW_BASIC_MESSAGE, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.basicmessage_handler.BasicMessageHandler" @@ -22,6 +22,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = BASIC_MESSAGE + new_message_type = NEW_BASIC_MESSAGE schema_class = "BasicMessageSchema" def __init__( diff --git a/aries_cloudagent/protocols/connections/messages/connection_invitation.py b/aries_cloudagent/protocols/connections/messages/connection_invitation.py index d6286cb273..e5189163eb 100644 --- a/aries_cloudagent/protocols/connections/messages/connection_invitation.py +++ b/aries_cloudagent/protocols/connections/messages/connection_invitation.py @@ -9,7 +9,11 @@ from ....messaging.valid import INDY_DID, INDY_RAW_PUBLIC_KEY from ....wallet.util import b64_to_bytes, bytes_to_b64 -from ..message_types import CONNECTION_INVITATION, PROTOCOL_PACKAGE +from ..message_types import ( + CONNECTION_INVITATION, + NEW_CONNECTION_INVITATION, + PROTOCOL_PACKAGE, +) HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers" @@ -25,6 +29,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = CONNECTION_INVITATION + new_message_type = NEW_CONNECTION_INVITATION schema_class = "ConnectionInvitationSchema" def __init__( @@ -98,7 +103,7 @@ class Meta: model_class = ConnectionInvitation label = fields.Str( - required=False, description="Optional label for connection", example="Bob", + required=False, description="Optional label for connection", example="Bob" ) did = fields.Str( required=False, description="DID for connection invitation", **INDY_DID diff --git a/aries_cloudagent/protocols/connections/messages/connection_request.py b/aries_cloudagent/protocols/connections/messages/connection_request.py index a965cc069c..4c3bdca998 100644 --- a/aries_cloudagent/protocols/connections/messages/connection_request.py +++ b/aries_cloudagent/protocols/connections/messages/connection_request.py @@ -3,7 +3,7 @@ from marshmallow import fields from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CONNECTION_REQUEST, PROTOCOL_PACKAGE +from ..message_types import CONNECTION_REQUEST, NEW_CONNECTION_REQUEST, PROTOCOL_PACKAGE from ..models.connection_detail import ConnectionDetail, ConnectionDetailSchema HANDLER_CLASS = ( @@ -20,6 +20,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = CONNECTION_REQUEST + new_message_type = NEW_CONNECTION_REQUEST schema_class = "ConnectionRequestSchema" def __init__( @@ -51,7 +52,7 @@ class Meta: model_class = ConnectionRequest - connection = fields.Nested(ConnectionDetailSchema, required=True,) + connection = fields.Nested(ConnectionDetailSchema, required=True) label = fields.Str( required=True, description="Label for connection request", diff --git a/aries_cloudagent/protocols/connections/messages/connection_response.py b/aries_cloudagent/protocols/connections/messages/connection_response.py index 6a9c0c5134..d15289314b 100644 --- a/aries_cloudagent/protocols/connections/messages/connection_response.py +++ b/aries_cloudagent/protocols/connections/messages/connection_response.py @@ -3,7 +3,11 @@ from marshmallow import fields from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CONNECTION_RESPONSE, PROTOCOL_PACKAGE +from ..message_types import ( + CONNECTION_RESPONSE, + NEW_CONNECTION_RESPONSE, + PROTOCOL_PACKAGE, +) from ..models.connection_detail import ConnectionDetail, ConnectionDetailSchema HANDLER_CLASS = ( @@ -21,6 +25,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "ConnectionResponseSchema" message_type = CONNECTION_RESPONSE + new_message_type = NEW_CONNECTION_RESPONSE def __init__(self, *, connection: ConnectionDetail = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/connections/messages/problem_report.py b/aries_cloudagent/protocols/connections/messages/problem_report.py index 447e9ab1d0..85af9157a0 100644 --- a/aries_cloudagent/protocols/connections/messages/problem_report.py +++ b/aries_cloudagent/protocols/connections/messages/problem_report.py @@ -4,7 +4,7 @@ from marshmallow import fields from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PROBLEM_REPORT +from ..message_types import PROBLEM_REPORT, NEW_PROBLEM_REPORT HANDLER_CLASS = "aries_cloudagent.messaging.problem_report.handler.ProblemReportHandler" @@ -27,6 +27,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = PROBLEM_REPORT + new_message_type = NEW_PROBLEM_REPORT schema_class = "ProblemReportSchema" def __init__(self, *, problem_code: str = None, explain: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/credentials/messages/credential_issue.py b/aries_cloudagent/protocols/credentials/messages/credential_issue.py index d3b6675df2..bed692765b 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_issue.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_issue.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_ISSUE, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_ISSUE, NEW_CREDENTIAL_ISSUE, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers.credential_issue_handler.CredentialIssueHandler" @@ -20,6 +20,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialIssueSchema" message_type = CREDENTIAL_ISSUE + new_message_type = NEW_CREDENTIAL_ISSUE def __init__(self, *, issue: str = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/credentials/messages/credential_offer.py b/aries_cloudagent/protocols/credentials/messages/credential_offer.py index a546485757..8255efabdf 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_offer.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_offer.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_OFFER, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_OFFER, NEW_CREDENTIAL_OFFER, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -21,6 +21,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialOfferSchema" message_type = CREDENTIAL_OFFER + new_message_type = NEW_CREDENTIAL_OFFER def __init__( self, diff --git a/aries_cloudagent/protocols/credentials/messages/credential_request.py b/aries_cloudagent/protocols/credentials/messages/credential_request.py index 37e508c44c..2cb3e4d459 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_request.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_request.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_REQUEST, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_REQUEST, NEW_CREDENTIAL_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers." @@ -21,6 +21,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialRequestSchema" message_type = CREDENTIAL_REQUEST + new_message_type = NEW_CREDENTIAL_REQUEST def __init__(self, *, request: str = None, comment: str = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/credentials/messages/credential_stored.py b/aries_cloudagent/protocols/credentials/messages/credential_stored.py index 6e047a10d8..411575fc3b 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_stored.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_stored.py @@ -2,7 +2,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_STORED, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_STORED, NEW_CREDENTIAL_STORED, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers.credential_stored_handler.CredentialStoredHandler" @@ -18,6 +18,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialStoredSchema" message_type = CREDENTIAL_STORED + new_message_type = NEW_CREDENTIAL_STORED def __init__(self, **kwargs): """Initialize credential object.""" diff --git a/aries_cloudagent/protocols/discovery/messages/disclose.py b/aries_cloudagent/protocols/discovery/messages/disclose.py index 0f955f552c..79f9d7390a 100644 --- a/aries_cloudagent/protocols/discovery/messages/disclose.py +++ b/aries_cloudagent/protocols/discovery/messages/disclose.py @@ -7,7 +7,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import DISCLOSE, PROTOCOL_PACKAGE +from ..message_types import DISCLOSE, NEW_DISCLOSE, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.disclose_handler.DiscloseHandler" @@ -20,6 +20,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = DISCLOSE + new_message_type = NEW_DISCLOSE schema_class = "DiscloseSchema" def __init__(self, *, protocols: Mapping[str, Mapping] = None, **kwargs): diff --git a/aries_cloudagent/protocols/discovery/messages/query.py b/aries_cloudagent/protocols/discovery/messages/query.py index 37f74db109..b21b8534ba 100644 --- a/aries_cloudagent/protocols/discovery/messages/query.py +++ b/aries_cloudagent/protocols/discovery/messages/query.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import QUERY, PROTOCOL_PACKAGE +from ..message_types import QUERY, NEW_QUERY, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.query_handler.QueryHandler" @@ -20,6 +20,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = QUERY + new_message_type = NEW_QUERY schema_class = "QuerySchema" def __init__(self, *, query: str = None, comment: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/introduction/messages/forward_invitation.py b/aries_cloudagent/protocols/introduction/messages/forward_invitation.py index 5ec0f7051b..e05444a485 100644 --- a/aries_cloudagent/protocols/introduction/messages/forward_invitation.py +++ b/aries_cloudagent/protocols/introduction/messages/forward_invitation.py @@ -9,7 +9,7 @@ ConnectionInvitationSchema, ) -from ..message_types import FORWARD_INVITATION, PROTOCOL_PACKAGE +from ..message_types import FORWARD_INVITATION, NEW_FORWARD_INVITATION, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -25,6 +25,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = FORWARD_INVITATION + new_message_type = NEW_FORWARD_INVITATION schema_class = "ForwardInvitationSchema" def __init__( @@ -50,7 +51,7 @@ class Meta: model_class = ForwardInvitation - invitation = fields.Nested(ConnectionInvitationSchema(), required=True,) + invitation = fields.Nested(ConnectionInvitationSchema(), required=True) message = fields.Str( required=False, allow_none=True, diff --git a/aries_cloudagent/protocols/introduction/messages/invitation.py b/aries_cloudagent/protocols/introduction/messages/invitation.py index 68289b2cb4..48580fedeb 100644 --- a/aries_cloudagent/protocols/introduction/messages/invitation.py +++ b/aries_cloudagent/protocols/introduction/messages/invitation.py @@ -9,7 +9,7 @@ ConnectionInvitationSchema, ) -from ..message_types import INVITATION, PROTOCOL_PACKAGE +from ..message_types import INVITATION, NEW_INVITATION, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.invitation_handler.InvitationHandler" @@ -23,6 +23,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = INVITATION + new_message_type = NEW_INVITATION schema_class = "InvitationSchema" def __init__( @@ -48,7 +49,7 @@ class Meta: model_class = Invitation - invitation = fields.Nested(ConnectionInvitationSchema(), required=True,) + invitation = fields.Nested(ConnectionInvitationSchema(), required=True) message = fields.Str( required=False, description="Comments on the introduction", diff --git a/aries_cloudagent/protocols/introduction/messages/invitation_request.py b/aries_cloudagent/protocols/introduction/messages/invitation_request.py index a7c29afc34..c1700f8715 100644 --- a/aries_cloudagent/protocols/introduction/messages/invitation_request.py +++ b/aries_cloudagent/protocols/introduction/messages/invitation_request.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import INVITATION_REQUEST, PROTOCOL_PACKAGE +from ..message_types import INVITATION_REQUEST, NEW_INVITATION_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers.invitation_request_handler.InvitationRequestHandler" @@ -19,6 +19,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = INVITATION_REQUEST + new_message_type = NEW_INVITATION_REQUEST schema_class = "InvitationRequestSchema" def __init__(self, *, responder: str = None, message: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py index fa8e713e84..82ff57e4de 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py @@ -11,7 +11,12 @@ AttachDecoratorSchema, ) -from ..message_types import ATTACH_DECO_IDS, CREDENTIAL_ISSUE, PROTOCOL_PACKAGE +from ..message_types import ( + ATTACH_DECO_IDS, + CREDENTIAL_ISSUE, + NEW_CREDENTIAL_ISSUE, + PROTOCOL_PACKAGE, +) HANDLER_CLASS = ( @@ -28,6 +33,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialIssueSchema" message_type = CREDENTIAL_ISSUE + new_message_type = NEW_CREDENTIAL_ISSUE def __init__( self, diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py index 5e77b8125f..b7b09642e4 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py @@ -11,7 +11,12 @@ AttachDecoratorSchema, ) -from ..message_types import ATTACH_DECO_IDS, CREDENTIAL_OFFER, PROTOCOL_PACKAGE +from ..message_types import ( + ATTACH_DECO_IDS, + CREDENTIAL_OFFER, + NEW_CREDENTIAL_OFFER, + PROTOCOL_PACKAGE, +) from .inner.credential_preview import CredentialPreview, CredentialPreviewSchema @@ -29,6 +34,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialOfferSchema" message_type = CREDENTIAL_OFFER + new_message_type = NEW_CREDENTIAL_OFFER def __init__( self, diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py index 0923ae52a1..df30484f2d 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py @@ -4,7 +4,11 @@ from .....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_PROPOSAL, PROTOCOL_PACKAGE +from ..message_types import ( + CREDENTIAL_PROPOSAL, + NEW_CREDENTIAL_PROPOSAL, + PROTOCOL_PACKAGE, +) from .inner.credential_preview import CredentialPreview, CredentialPreviewSchema @@ -24,6 +28,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialProposalSchema" message_type = CREDENTIAL_PROPOSAL + new_message_type = NEW_CREDENTIAL_PROPOSAL def __init__( self, diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py index 044e8e0aa4..58ebe83f57 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py @@ -11,7 +11,12 @@ AttachDecoratorSchema, ) -from ..message_types import ATTACH_DECO_IDS, CREDENTIAL_REQUEST, PROTOCOL_PACKAGE +from ..message_types import ( + ATTACH_DECO_IDS, + CREDENTIAL_REQUEST, + NEW_CREDENTIAL_REQUEST, + PROTOCOL_PACKAGE, +) HANDLER_CLASS = ( @@ -29,6 +34,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialRequestSchema" message_type = CREDENTIAL_REQUEST + new_message_type = NEW_CREDENTIAL_REQUEST def __init__( self, diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_stored.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_stored.py index 429c03364a..f7e95d9629 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_stored.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_stored.py @@ -4,7 +4,7 @@ from .....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_STORED, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_STORED, NEW_CREDENTIAL_STORED, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers.credential_stored_handler.CredentialStoredHandler" @@ -20,6 +20,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialStoredSchema" message_type = CREDENTIAL_STORED + new_message_type = NEW_CREDENTIAL_STORED def __init__(self, **kwargs): """Initialize credential object.""" diff --git a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py index dae1b0d6f9..760b3421b0 100644 --- a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py +++ b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py @@ -11,7 +11,7 @@ AttachDecoratorSchema, ) -from ..message_types import PRESENTATION, PROTOCOL_PACKAGE +from ..message_types import PRESENTATION, NEW_PRESENTATION, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.presentation_handler.PresentationHandler" @@ -26,6 +26,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "PresentationSchema" message_type = PRESENTATION + new_message_type = NEW_PRESENTATION def __init__( self, diff --git a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py index a7ca59387d..31983988e6 100644 --- a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py +++ b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py @@ -4,7 +4,11 @@ from .....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PRESENTATION_PROPOSAL, PROTOCOL_PACKAGE +from ..message_types import ( + PRESENTATION_PROPOSAL, + NEW_PRESENTATION_PROPOSAL, + PROTOCOL_PACKAGE, +) from .inner.presentation_preview import PresentationPreview, PresentationPreviewSchema @@ -24,6 +28,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "PresentationProposalSchema" message_type = PRESENTATION_PROPOSAL + new_message_type = NEW_PRESENTATION_PROPOSAL def __init__( self, diff --git a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py index 0cdf7f589d..56dc8a1b86 100644 --- a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py +++ b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py @@ -11,7 +11,11 @@ AttachDecoratorSchema, ) -from ..message_types import PRESENTATION_REQUEST, PROTOCOL_PACKAGE +from ..message_types import ( + PRESENTATION_REQUEST, + NEW_PRESENTATION_REQUEST, + PROTOCOL_PACKAGE, +) HANDLER_CLASS = ( @@ -29,6 +33,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "PresentationRequestSchema" message_type = PRESENTATION_REQUEST + new_message_type = NEW_PRESENTATION_REQUEST def __init__( self, diff --git a/aries_cloudagent/protocols/presentations/messages/credential_presentation.py b/aries_cloudagent/protocols/presentations/messages/credential_presentation.py index 33d6fb2081..cf57750ec9 100644 --- a/aries_cloudagent/protocols/presentations/messages/credential_presentation.py +++ b/aries_cloudagent/protocols/presentations/messages/credential_presentation.py @@ -4,7 +4,11 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_PRESENTATION, PROTOCOL_PACKAGE +from ..message_types import ( + CREDENTIAL_PRESENTATION, + NEW_CREDENTIAL_PRESENTATION, + PROTOCOL_PACKAGE, +) HANDLER_CLASS = ( @@ -22,6 +26,7 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialPresentationSchema" message_type = CREDENTIAL_PRESENTATION + new_message_type = NEW_CREDENTIAL_PRESENTATION def __init__(self, presentation: str = None, comment: str = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/presentations/messages/presentation_request.py b/aries_cloudagent/protocols/presentations/messages/presentation_request.py index 7f96fef469..5468ebafb9 100644 --- a/aries_cloudagent/protocols/presentations/messages/presentation_request.py +++ b/aries_cloudagent/protocols/presentations/messages/presentation_request.py @@ -4,7 +4,11 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PRESENTATION_REQUEST, PROTOCOL_PACKAGE +from ..message_types import ( + PRESENTATION_REQUEST, + NEW_PRESENTATION_REQUEST, + PROTOCOL_PACKAGE, +) HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers." @@ -20,6 +24,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = PRESENTATION_REQUEST + new_message_type = NEW_PRESENTATION_REQUEST schema_class = "PresentationRequestSchema" def __init__(self, request: str = None, comment: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/problem_report/message.py b/aries_cloudagent/protocols/problem_report/message.py index 76a8fd5e3d..02e1ef307d 100644 --- a/aries_cloudagent/protocols/problem_report/message.py +++ b/aries_cloudagent/protocols/problem_report/message.py @@ -6,7 +6,7 @@ from ...messaging.agent_message import AgentMessage, AgentMessageSchema -from .message_types import PROBLEM_REPORT, PROTOCOL_PACKAGE +from .message_types import PROBLEM_REPORT, NEW_PROBLEM_REPORT, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handler.ProblemReportHandler" @@ -19,6 +19,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = PROBLEM_REPORT + new_message_type = NEW_PROBLEM_REPORT schema_class = "ProblemReportSchema" def __init__( @@ -85,7 +86,7 @@ class Meta: example="did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/error-codes", ) locale = fields.Str( - data_key="@locale", required=False, description="Locale", example="en-US", + data_key="@locale", required=False, description="Locale", example="en-US" ) explain_ltxt = fields.Str( data_key="explain-ltxt", diff --git a/aries_cloudagent/protocols/routing/messages/forward.py b/aries_cloudagent/protocols/routing/messages/forward.py index da5e2e8b67..02e9a5acf0 100644 --- a/aries_cloudagent/protocols/routing/messages/forward.py +++ b/aries_cloudagent/protocols/routing/messages/forward.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import FORWARD, PROTOCOL_PACKAGE +from ..message_types import FORWARD, NEW_FORWARD, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.forward_handler.ForwardHandler" @@ -17,6 +17,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = FORWARD + new_message_type = NEW_FORWARD schema_class = "ForwardSchema" def __init__(self, *, to: str = None, msg: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/routing/messages/route_query_request.py b/aries_cloudagent/protocols/routing/messages/route_query_request.py index 5a98cf8c61..5a9cbe435c 100644 --- a/aries_cloudagent/protocols/routing/messages/route_query_request.py +++ b/aries_cloudagent/protocols/routing/messages/route_query_request.py @@ -4,7 +4,11 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PROTOCOL_PACKAGE, ROUTE_QUERY_REQUEST +from ..message_types import ( + PROTOCOL_PACKAGE, + ROUTE_QUERY_REQUEST, + NEW_ROUTE_QUERY_REQUEST, +) from ..models.paginate import Paginate, PaginateSchema HANDLER_CLASS = ( @@ -20,6 +24,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_QUERY_REQUEST + new_message_type = NEW_ROUTE_QUERY_REQUEST schema_class = "RouteQueryRequestSchema" def __init__(self, *, filter: dict = None, paginate: Paginate = None, **kwargs): @@ -46,7 +51,7 @@ class Meta: filter = fields.Dict( keys=fields.Str(description="field"), values=fields.List( - fields.Str(description="value"), description="List of values", + fields.Str(description="value"), description="List of values" ), required=False, allow_none=True, diff --git a/aries_cloudagent/protocols/routing/messages/route_query_response.py b/aries_cloudagent/protocols/routing/messages/route_query_response.py index 3213931e8c..73b2338e40 100644 --- a/aries_cloudagent/protocols/routing/messages/route_query_response.py +++ b/aries_cloudagent/protocols/routing/messages/route_query_response.py @@ -6,7 +6,11 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PROTOCOL_PACKAGE, ROUTE_QUERY_RESPONSE +from ..message_types import ( + PROTOCOL_PACKAGE, + ROUTE_QUERY_RESPONSE, + NEW_ROUTE_QUERY_RESPONSE, +) from ..models.paginated import Paginated, PaginatedSchema from ..models.route_query_result import RouteQueryResult, RouteQueryResultSchema @@ -24,6 +28,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_QUERY_RESPONSE + new_message_type = NEW_ROUTE_QUERY_RESPONSE schema_class = "RouteQueryResponseSchema" def __init__( diff --git a/aries_cloudagent/protocols/routing/messages/route_update_request.py b/aries_cloudagent/protocols/routing/messages/route_update_request.py index 0fbbb88658..f1957e052d 100644 --- a/aries_cloudagent/protocols/routing/messages/route_update_request.py +++ b/aries_cloudagent/protocols/routing/messages/route_update_request.py @@ -6,7 +6,11 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PROTOCOL_PACKAGE, ROUTE_UPDATE_REQUEST +from ..message_types import ( + PROTOCOL_PACKAGE, + ROUTE_UPDATE_REQUEST, + NEW_ROUTE_UPDATE_REQUEST, +) from ..models.route_update import RouteUpdate, RouteUpdateSchema HANDLER_CLASS = ( @@ -23,6 +27,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_UPDATE_REQUEST + new_message_type = NEW_ROUTE_UPDATE_REQUEST schema_class = "RouteUpdateRequestSchema" def __init__(self, *, updates: Sequence[RouteUpdate] = None, **kwargs): diff --git a/aries_cloudagent/protocols/routing/messages/route_update_response.py b/aries_cloudagent/protocols/routing/messages/route_update_response.py index 4391f213df..c1bfaa388b 100644 --- a/aries_cloudagent/protocols/routing/messages/route_update_response.py +++ b/aries_cloudagent/protocols/routing/messages/route_update_response.py @@ -6,7 +6,11 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PROTOCOL_PACKAGE, ROUTE_UPDATE_RESPONSE +from ..message_types import ( + PROTOCOL_PACKAGE, + ROUTE_UPDATE_RESPONSE, + NEW_ROUTE_UPDATE_RESPONSE, +) from ..models.route_updated import RouteUpdated, RouteUpdatedSchema HANDLER_CLASS = ( @@ -23,6 +27,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_UPDATE_RESPONSE + new_message_type = NEW_ROUTE_UPDATE_RESPONSE schema_class = "RouteUpdateResponseSchema" def __init__(self, *, updated: Sequence[RouteUpdated] = None, **kwargs): diff --git a/aries_cloudagent/protocols/trustping/messages/ping.py b/aries_cloudagent/protocols/trustping/messages/ping.py index 9fcde40b24..c7d1b703a6 100644 --- a/aries_cloudagent/protocols/trustping/messages/ping.py +++ b/aries_cloudagent/protocols/trustping/messages/ping.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PING, PROTOCOL_PACKAGE +from ..message_types import PING, NEW_PING, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.ping_handler.PingHandler" @@ -17,6 +17,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = PING + new_message_type = NEW_PING schema_class = "PingSchema" def __init__( diff --git a/aries_cloudagent/protocols/trustping/messages/ping_response.py b/aries_cloudagent/protocols/trustping/messages/ping_response.py index 6cd338719b..6476fe59fd 100644 --- a/aries_cloudagent/protocols/trustping/messages/ping_response.py +++ b/aries_cloudagent/protocols/trustping/messages/ping_response.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PING_RESPONSE, PROTOCOL_PACKAGE +from ..message_types import PING_RESPONSE, NEW_PING_RESPONSE, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.ping_response_handler.PingResponseHandler" @@ -17,6 +17,7 @@ class Meta: handler_class = HANDLER_CLASS message_type = PING_RESPONSE + new_message_type = NEW_PING_RESPONSE schema_class = "PingResponseSchema" def __init__(self, *, comment: str = None, **kwargs): From 7962e9d950a940fb446c85aba7c8263e4241e292 Mon Sep 17 00:00:00 2001 From: Nicholas Rempel Date: Fri, 8 Nov 2019 09:32:07 -0800 Subject: [PATCH 3/8] Use set_value method on settings Signed-off-by: Nicholas Rempel --- aries_cloudagent/dispatcher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aries_cloudagent/dispatcher.py b/aries_cloudagent/dispatcher.py index 1dabe2c237..633cf6a82c 100644 --- a/aries_cloudagent/dispatcher.py +++ b/aries_cloudagent/dispatcher.py @@ -128,7 +128,7 @@ async def make_message(self, parsed_msg: dict) -> AgentMessage: # If this message used the new @type format, outoing # messages should be the same if "https://didcomm.org" in message_type: - self.context.use_new_type_prefix = True + self.context.settings.set_value("use_new_type_prefix", True) message_cls = registry.resolve_message_class(message_type) @@ -178,7 +178,7 @@ async def create_outbound( } # Use new message @type prefix if incoming message contained it - if self.context.use_new_type_prefix: + if self._context.settings.get_value("use_new_type_prefix"): message.Meta.message_type = message.Meta.new_message_type return await super().create_outbound(message, **kwargs) From c34b88af4b70a08810112d650b223bde5639a66a Mon Sep 17 00:00:00 2001 From: Andrew Whitehead Date: Tue, 18 Feb 2020 09:06:13 -0800 Subject: [PATCH 4/8] handle send timeout in admin websocket (issue #366) Signed-off-by: Andrew Whitehead --- aries_cloudagent/admin/server.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/aries_cloudagent/admin/server.py b/aries_cloudagent/admin/server.py index 3580eb37c5..0e5c68dca8 100644 --- a/aries_cloudagent/admin/server.py +++ b/aries_cloudagent/admin/server.py @@ -30,7 +30,7 @@ class AdminModulesSchema(Schema): """Schema for the modules endpoint.""" result = fields.List( - fields.Str(description="admin module"), description="List of admin modules", + fields.Str(description="admin module"), description="List of admin modules" ) @@ -377,7 +377,11 @@ async def websocket_handler(self, request): receive = loop.create_task(ws.receive()) if send.done(): - msg = send.result() + try: + msg = send.result() + except asyncio.TimeoutError: + msg = None + if msg is None: # we send fake pings because the JS client # can't detect real ones From c1ea8a41f7b0533371ac3b2921797796ad6c3a50 Mon Sep 17 00:00:00 2001 From: Nicholas Rempel Date: Tue, 18 Feb 2020 12:20:35 -0800 Subject: [PATCH 5/8] remove "new" reference in message defs Signed-off-by: Nicholas Rempel --- .../protocols/actionmenu/messages/menu.py | 3 +- .../actionmenu/messages/menu_request.py | 3 +- .../protocols/actionmenu/messages/perform.py | 3 +- .../basicmessage/messages/basicmessage.py | 3 +- .../messages/connection_invitation.py | 7 +-- .../messages/connection_request.py | 3 +- .../messages/connection_response.py | 7 +-- .../connections/messages/problem_report.py | 3 +- .../credentials/messages/credential_issue.py | 3 +- .../credentials/messages/credential_offer.py | 3 +- .../messages/credential_request.py | 3 +- .../credentials/messages/credential_stored.py | 3 +- .../protocols/discovery/messages/disclose.py | 3 +- .../protocols/discovery/messages/query.py | 3 +- .../messages/forward_invitation.py | 3 +- .../introduction/messages/invitation.py | 3 +- .../messages/invitation_request.py | 3 +- .../v1_0/messages/credential_issue.py | 8 +--- .../v1_0/messages/credential_offer.py | 8 +--- .../v1_0/messages/credential_proposal.py | 46 ++++--------------- .../v1_0/messages/credential_request.py | 8 +--- .../v1_0/messages/presentation.py | 3 +- .../v1_0/messages/presentation_proposal.py | 7 +-- .../v1_0/messages/presentation_request.py | 7 +-- .../messages/credential_presentation.py | 7 +-- .../messages/presentation_request.py | 7 +-- .../protocols/problem_report/message.py | 3 +- .../protocols/routing/messages/forward.py | 3 +- .../routing/messages/route_query_request.py | 7 +-- .../routing/messages/route_query_response.py | 7 +-- .../routing/messages/route_update_request.py | 7 +-- .../routing/messages/route_update_response.py | 7 +-- .../protocols/trustping/messages/ping.py | 3 +- .../trustping/messages/ping_response.py | 3 +- 34 files changed, 41 insertions(+), 159 deletions(-) diff --git a/aries_cloudagent/protocols/actionmenu/messages/menu.py b/aries_cloudagent/protocols/actionmenu/messages/menu.py index 802a3f8d93..ae713a8dd3 100644 --- a/aries_cloudagent/protocols/actionmenu/messages/menu.py +++ b/aries_cloudagent/protocols/actionmenu/messages/menu.py @@ -6,7 +6,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import MENU, NEW_MENU, PROTOCOL_PACKAGE +from ..message_types import MENU, PROTOCOL_PACKAGE from ..models.menu_option import MenuOption, MenuOptionSchema HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.menu_handler.MenuHandler" @@ -20,7 +20,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = MENU - new_message_type = NEW_MENU schema_class = "MenuSchema" def __init__( diff --git a/aries_cloudagent/protocols/actionmenu/messages/menu_request.py b/aries_cloudagent/protocols/actionmenu/messages/menu_request.py index fcb15795da..f27d655601 100644 --- a/aries_cloudagent/protocols/actionmenu/messages/menu_request.py +++ b/aries_cloudagent/protocols/actionmenu/messages/menu_request.py @@ -2,7 +2,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import MENU_REQUEST, NEW_MENU_REQUEST, PROTOCOL_PACKAGE +from ..message_types import MENU_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.menu_request_handler.MenuRequestHandler" @@ -15,7 +15,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = MENU_REQUEST - new_message_type = NEW_MENU_REQUEST schema_class = "MenuRequestSchema" def __init__(self, **kwargs): diff --git a/aries_cloudagent/protocols/actionmenu/messages/perform.py b/aries_cloudagent/protocols/actionmenu/messages/perform.py index 1b6a6731bb..cbbf0ce205 100644 --- a/aries_cloudagent/protocols/actionmenu/messages/perform.py +++ b/aries_cloudagent/protocols/actionmenu/messages/perform.py @@ -6,7 +6,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PERFORM, NEW_PERFORM, PROTOCOL_PACKAGE +from ..message_types import PERFORM, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.perform_handler.PerformHandler" @@ -19,7 +19,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = PERFORM - new_message_type = NEW_PERFORM schema_class = "PerformSchema" def __init__(self, *, name: str = None, params: Mapping[str, str] = None, **kwargs): diff --git a/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py b/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py index 2c5eece961..343be01acd 100644 --- a/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py +++ b/aries_cloudagent/protocols/basicmessage/messages/basicmessage.py @@ -9,7 +9,7 @@ from ....messaging.util import datetime_now, datetime_to_str from ....messaging.valid import INDY_ISO8601_DATETIME -from ..message_types import BASIC_MESSAGE, NEW_BASIC_MESSAGE, PROTOCOL_PACKAGE +from ..message_types import BASIC_MESSAGE, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.basicmessage_handler.BasicMessageHandler" @@ -22,7 +22,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = BASIC_MESSAGE - new_message_type = NEW_BASIC_MESSAGE schema_class = "BasicMessageSchema" def __init__( diff --git a/aries_cloudagent/protocols/connections/messages/connection_invitation.py b/aries_cloudagent/protocols/connections/messages/connection_invitation.py index e5189163eb..87c8b2c6dd 100644 --- a/aries_cloudagent/protocols/connections/messages/connection_invitation.py +++ b/aries_cloudagent/protocols/connections/messages/connection_invitation.py @@ -9,11 +9,7 @@ from ....messaging.valid import INDY_DID, INDY_RAW_PUBLIC_KEY from ....wallet.util import b64_to_bytes, bytes_to_b64 -from ..message_types import ( - CONNECTION_INVITATION, - NEW_CONNECTION_INVITATION, - PROTOCOL_PACKAGE, -) +from ..message_types import CONNECTION_INVITATION, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers" @@ -29,7 +25,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = CONNECTION_INVITATION - new_message_type = NEW_CONNECTION_INVITATION schema_class = "ConnectionInvitationSchema" def __init__( diff --git a/aries_cloudagent/protocols/connections/messages/connection_request.py b/aries_cloudagent/protocols/connections/messages/connection_request.py index 4c3bdca998..d30a550146 100644 --- a/aries_cloudagent/protocols/connections/messages/connection_request.py +++ b/aries_cloudagent/protocols/connections/messages/connection_request.py @@ -3,7 +3,7 @@ from marshmallow import fields from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CONNECTION_REQUEST, NEW_CONNECTION_REQUEST, PROTOCOL_PACKAGE +from ..message_types import CONNECTION_REQUEST, PROTOCOL_PACKAGE from ..models.connection_detail import ConnectionDetail, ConnectionDetailSchema HANDLER_CLASS = ( @@ -20,7 +20,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = CONNECTION_REQUEST - new_message_type = NEW_CONNECTION_REQUEST schema_class = "ConnectionRequestSchema" def __init__( diff --git a/aries_cloudagent/protocols/connections/messages/connection_response.py b/aries_cloudagent/protocols/connections/messages/connection_response.py index d15289314b..6a9c0c5134 100644 --- a/aries_cloudagent/protocols/connections/messages/connection_response.py +++ b/aries_cloudagent/protocols/connections/messages/connection_response.py @@ -3,11 +3,7 @@ from marshmallow import fields from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - CONNECTION_RESPONSE, - NEW_CONNECTION_RESPONSE, - PROTOCOL_PACKAGE, -) +from ..message_types import CONNECTION_RESPONSE, PROTOCOL_PACKAGE from ..models.connection_detail import ConnectionDetail, ConnectionDetailSchema HANDLER_CLASS = ( @@ -25,7 +21,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "ConnectionResponseSchema" message_type = CONNECTION_RESPONSE - new_message_type = NEW_CONNECTION_RESPONSE def __init__(self, *, connection: ConnectionDetail = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/connections/messages/problem_report.py b/aries_cloudagent/protocols/connections/messages/problem_report.py index b82d95b430..e5beef4407 100644 --- a/aries_cloudagent/protocols/connections/messages/problem_report.py +++ b/aries_cloudagent/protocols/connections/messages/problem_report.py @@ -4,7 +4,7 @@ from marshmallow import fields, validate from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PROBLEM_REPORT, NEW_PROBLEM_REPORT +from ..message_types import PROBLEM_REPORT HANDLER_CLASS = "aries_cloudagent.messaging.problem_report.handler.ProblemReportHandler" @@ -27,7 +27,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = PROBLEM_REPORT - new_message_type = NEW_PROBLEM_REPORT schema_class = "ProblemReportSchema" def __init__(self, *, problem_code: str = None, explain: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/credentials/messages/credential_issue.py b/aries_cloudagent/protocols/credentials/messages/credential_issue.py index bed692765b..d3b6675df2 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_issue.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_issue.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_ISSUE, NEW_CREDENTIAL_ISSUE, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_ISSUE, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers.credential_issue_handler.CredentialIssueHandler" @@ -20,7 +20,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialIssueSchema" message_type = CREDENTIAL_ISSUE - new_message_type = NEW_CREDENTIAL_ISSUE def __init__(self, *, issue: str = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/credentials/messages/credential_offer.py b/aries_cloudagent/protocols/credentials/messages/credential_offer.py index 8255efabdf..a546485757 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_offer.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_offer.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_OFFER, NEW_CREDENTIAL_OFFER, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_OFFER, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -21,7 +21,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialOfferSchema" message_type = CREDENTIAL_OFFER - new_message_type = NEW_CREDENTIAL_OFFER def __init__( self, diff --git a/aries_cloudagent/protocols/credentials/messages/credential_request.py b/aries_cloudagent/protocols/credentials/messages/credential_request.py index 2cb3e4d459..37e508c44c 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_request.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_request.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_REQUEST, NEW_CREDENTIAL_REQUEST, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers." @@ -21,7 +21,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialRequestSchema" message_type = CREDENTIAL_REQUEST - new_message_type = NEW_CREDENTIAL_REQUEST def __init__(self, *, request: str = None, comment: str = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/credentials/messages/credential_stored.py b/aries_cloudagent/protocols/credentials/messages/credential_stored.py index 411575fc3b..6e047a10d8 100644 --- a/aries_cloudagent/protocols/credentials/messages/credential_stored.py +++ b/aries_cloudagent/protocols/credentials/messages/credential_stored.py @@ -2,7 +2,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import CREDENTIAL_STORED, NEW_CREDENTIAL_STORED, PROTOCOL_PACKAGE +from ..message_types import CREDENTIAL_STORED, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers.credential_stored_handler.CredentialStoredHandler" @@ -18,7 +18,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialStoredSchema" message_type = CREDENTIAL_STORED - new_message_type = NEW_CREDENTIAL_STORED def __init__(self, **kwargs): """Initialize credential object.""" diff --git a/aries_cloudagent/protocols/discovery/messages/disclose.py b/aries_cloudagent/protocols/discovery/messages/disclose.py index b35b71bc7f..0b413eb352 100644 --- a/aries_cloudagent/protocols/discovery/messages/disclose.py +++ b/aries_cloudagent/protocols/discovery/messages/disclose.py @@ -7,7 +7,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import DISCLOSE, NEW_DISCLOSE, PROTOCOL_PACKAGE +from ..message_types import DISCLOSE, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.disclose_handler.DiscloseHandler" @@ -20,7 +20,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = DISCLOSE - new_message_type = NEW_DISCLOSE schema_class = "DiscloseSchema" def __init__(self, *, protocols: Sequence[Mapping[str, Mapping]] = None, **kwargs): diff --git a/aries_cloudagent/protocols/discovery/messages/query.py b/aries_cloudagent/protocols/discovery/messages/query.py index b21b8534ba..37f74db109 100644 --- a/aries_cloudagent/protocols/discovery/messages/query.py +++ b/aries_cloudagent/protocols/discovery/messages/query.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import QUERY, NEW_QUERY, PROTOCOL_PACKAGE +from ..message_types import QUERY, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.query_handler.QueryHandler" @@ -20,7 +20,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = QUERY - new_message_type = NEW_QUERY schema_class = "QuerySchema" def __init__(self, *, query: str = None, comment: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/introduction/messages/forward_invitation.py b/aries_cloudagent/protocols/introduction/messages/forward_invitation.py index e05444a485..e07dddc10b 100644 --- a/aries_cloudagent/protocols/introduction/messages/forward_invitation.py +++ b/aries_cloudagent/protocols/introduction/messages/forward_invitation.py @@ -9,7 +9,7 @@ ConnectionInvitationSchema, ) -from ..message_types import FORWARD_INVITATION, NEW_FORWARD_INVITATION, PROTOCOL_PACKAGE +from ..message_types import FORWARD_INVITATION, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -25,7 +25,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = FORWARD_INVITATION - new_message_type = NEW_FORWARD_INVITATION schema_class = "ForwardInvitationSchema" def __init__( diff --git a/aries_cloudagent/protocols/introduction/messages/invitation.py b/aries_cloudagent/protocols/introduction/messages/invitation.py index 48580fedeb..2795849810 100644 --- a/aries_cloudagent/protocols/introduction/messages/invitation.py +++ b/aries_cloudagent/protocols/introduction/messages/invitation.py @@ -9,7 +9,7 @@ ConnectionInvitationSchema, ) -from ..message_types import INVITATION, NEW_INVITATION, PROTOCOL_PACKAGE +from ..message_types import INVITATION, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.invitation_handler.InvitationHandler" @@ -23,7 +23,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = INVITATION - new_message_type = NEW_INVITATION schema_class = "InvitationSchema" def __init__( diff --git a/aries_cloudagent/protocols/introduction/messages/invitation_request.py b/aries_cloudagent/protocols/introduction/messages/invitation_request.py index c1700f8715..a7c29afc34 100644 --- a/aries_cloudagent/protocols/introduction/messages/invitation_request.py +++ b/aries_cloudagent/protocols/introduction/messages/invitation_request.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import INVITATION_REQUEST, NEW_INVITATION_REQUEST, PROTOCOL_PACKAGE +from ..message_types import INVITATION_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers.invitation_request_handler.InvitationRequestHandler" @@ -19,7 +19,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = INVITATION_REQUEST - new_message_type = NEW_INVITATION_REQUEST schema_class = "InvitationRequestSchema" def __init__(self, *, responder: str = None, message: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py index c5b2646461..fd71e31f2f 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_issue.py @@ -10,12 +10,7 @@ AttachDecoratorSchema, ) -from ..message_types import ( - ATTACH_DECO_IDS, - CREDENTIAL_ISSUE, - NEW_CREDENTIAL_ISSUE, - PROTOCOL_PACKAGE, -) +from ..message_types import ATTACH_DECO_IDS, CREDENTIAL_ISSUE, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -32,7 +27,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialIssueSchema" message_type = CREDENTIAL_ISSUE - new_message_type = NEW_CREDENTIAL_ISSUE def __init__( self, diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py index 99faf925ab..9a375cbf8c 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_offer.py @@ -10,12 +10,7 @@ AttachDecoratorSchema, ) -from ..message_types import ( - ATTACH_DECO_IDS, - CREDENTIAL_OFFER, - NEW_CREDENTIAL_OFFER, - PROTOCOL_PACKAGE, -) +from ..message_types import ATTACH_DECO_IDS, CREDENTIAL_OFFER, PROTOCOL_PACKAGE from .inner.credential_preview import CredentialPreview, CredentialPreviewSchema @@ -33,7 +28,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialOfferSchema" message_type = CREDENTIAL_OFFER - new_message_type = NEW_CREDENTIAL_OFFER def __init__( self, diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py index d02d93051e..23b2f35202 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_proposal.py @@ -10,11 +10,7 @@ INDY_VERSION, ) -from ..message_types import ( - CREDENTIAL_PROPOSAL, - NEW_CREDENTIAL_PROPOSAL, - PROTOCOL_PACKAGE, -) +from ..message_types import CREDENTIAL_PROPOSAL, PROTOCOL_PACKAGE from .inner.credential_preview import CredentialPreview, CredentialPreviewSchema @@ -34,7 +30,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialProposalSchema" message_type = CREDENTIAL_PROPOSAL - new_message_type = NEW_CREDENTIAL_PROPOSAL def __init__( self, @@ -84,36 +79,11 @@ class Meta: comment = fields.Str(required=False, allow_none=False) credential_proposal = fields.Nested( - CredentialPreviewSchema, - required=False, - allow_none=False, - ) - schema_id = fields.Str( - required=False, - allow_none=False, - **INDY_SCHEMA_ID - ) - schema_issuer_did = fields.Str( - required=False, - allow_none=False, - **INDY_DID - ) - schema_name = fields.Str( - required=False, - allow_none=False, - ) - schema_version = fields.Str( - required=False, - allow_none=False, - **INDY_VERSION - ) - cred_def_id = fields.Str( - required=False, - allow_none=False, - **INDY_CRED_DEF_ID - ) - issuer_did = fields.Str( - required=False, - allow_none=False, - **INDY_DID + CredentialPreviewSchema, required=False, allow_none=False ) + schema_id = fields.Str(required=False, allow_none=False, **INDY_SCHEMA_ID) + schema_issuer_did = fields.Str(required=False, allow_none=False, **INDY_DID) + schema_name = fields.Str(required=False, allow_none=False) + schema_version = fields.Str(required=False, allow_none=False, **INDY_VERSION) + cred_def_id = fields.Str(required=False, allow_none=False, **INDY_CRED_DEF_ID) + issuer_did = fields.Str(required=False, allow_none=False, **INDY_DID) diff --git a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py index 95240171f9..1ba98b572b 100644 --- a/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py +++ b/aries_cloudagent/protocols/issue_credential/v1_0/messages/credential_request.py @@ -10,12 +10,7 @@ AttachDecoratorSchema, ) -from ..message_types import ( - ATTACH_DECO_IDS, - CREDENTIAL_REQUEST, - NEW_CREDENTIAL_REQUEST, - PROTOCOL_PACKAGE, -) +from ..message_types import ATTACH_DECO_IDS, CREDENTIAL_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -33,7 +28,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialRequestSchema" message_type = CREDENTIAL_REQUEST - new_message_type = NEW_CREDENTIAL_REQUEST def __init__( self, diff --git a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py index 760b3421b0..dae1b0d6f9 100644 --- a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py +++ b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation.py @@ -11,7 +11,7 @@ AttachDecoratorSchema, ) -from ..message_types import PRESENTATION, NEW_PRESENTATION, PROTOCOL_PACKAGE +from ..message_types import PRESENTATION, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.presentation_handler.PresentationHandler" @@ -26,7 +26,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "PresentationSchema" message_type = PRESENTATION - new_message_type = NEW_PRESENTATION def __init__( self, diff --git a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py index e12c34217c..70da18fd9c 100644 --- a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py +++ b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_proposal.py @@ -4,11 +4,7 @@ from .....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - PRESENTATION_PROPOSAL, - NEW_PRESENTATION_PROPOSAL, - PROTOCOL_PACKAGE, -) +from ..message_types import PRESENTATION_PROPOSAL, PROTOCOL_PACKAGE from .inner.presentation_preview import PresentationPreview, PresentationPreviewSchema @@ -28,7 +24,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "PresentationProposalSchema" message_type = PRESENTATION_PROPOSAL - new_message_type = NEW_PRESENTATION_PROPOSAL def __init__( self, diff --git a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py index 56dc8a1b86..0cdf7f589d 100644 --- a/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py +++ b/aries_cloudagent/protocols/present_proof/v1_0/messages/presentation_request.py @@ -11,11 +11,7 @@ AttachDecoratorSchema, ) -from ..message_types import ( - PRESENTATION_REQUEST, - NEW_PRESENTATION_REQUEST, - PROTOCOL_PACKAGE, -) +from ..message_types import PRESENTATION_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -33,7 +29,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "PresentationRequestSchema" message_type = PRESENTATION_REQUEST - new_message_type = NEW_PRESENTATION_REQUEST def __init__( self, diff --git a/aries_cloudagent/protocols/presentations/messages/credential_presentation.py b/aries_cloudagent/protocols/presentations/messages/credential_presentation.py index cf57750ec9..33d6fb2081 100644 --- a/aries_cloudagent/protocols/presentations/messages/credential_presentation.py +++ b/aries_cloudagent/protocols/presentations/messages/credential_presentation.py @@ -4,11 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - CREDENTIAL_PRESENTATION, - NEW_CREDENTIAL_PRESENTATION, - PROTOCOL_PACKAGE, -) +from ..message_types import CREDENTIAL_PRESENTATION, PROTOCOL_PACKAGE HANDLER_CLASS = ( @@ -26,7 +22,6 @@ class Meta: handler_class = HANDLER_CLASS schema_class = "CredentialPresentationSchema" message_type = CREDENTIAL_PRESENTATION - new_message_type = NEW_CREDENTIAL_PRESENTATION def __init__(self, presentation: str = None, comment: str = None, **kwargs): """ diff --git a/aries_cloudagent/protocols/presentations/messages/presentation_request.py b/aries_cloudagent/protocols/presentations/messages/presentation_request.py index 5468ebafb9..7f96fef469 100644 --- a/aries_cloudagent/protocols/presentations/messages/presentation_request.py +++ b/aries_cloudagent/protocols/presentations/messages/presentation_request.py @@ -4,11 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - PRESENTATION_REQUEST, - NEW_PRESENTATION_REQUEST, - PROTOCOL_PACKAGE, -) +from ..message_types import PRESENTATION_REQUEST, PROTOCOL_PACKAGE HANDLER_CLASS = ( f"{PROTOCOL_PACKAGE}.handlers." @@ -24,7 +20,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = PRESENTATION_REQUEST - new_message_type = NEW_PRESENTATION_REQUEST schema_class = "PresentationRequestSchema" def __init__(self, request: str = None, comment: str = None, **kwargs): diff --git a/aries_cloudagent/protocols/problem_report/message.py b/aries_cloudagent/protocols/problem_report/message.py index 02e1ef307d..8588e8477b 100644 --- a/aries_cloudagent/protocols/problem_report/message.py +++ b/aries_cloudagent/protocols/problem_report/message.py @@ -6,7 +6,7 @@ from ...messaging.agent_message import AgentMessage, AgentMessageSchema -from .message_types import PROBLEM_REPORT, NEW_PROBLEM_REPORT, PROTOCOL_PACKAGE +from .message_types import PROBLEM_REPORT, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handler.ProblemReportHandler" @@ -19,7 +19,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = PROBLEM_REPORT - new_message_type = NEW_PROBLEM_REPORT schema_class = "ProblemReportSchema" def __init__( diff --git a/aries_cloudagent/protocols/routing/messages/forward.py b/aries_cloudagent/protocols/routing/messages/forward.py index 6c757fcf91..e8d4ed4fb3 100644 --- a/aries_cloudagent/protocols/routing/messages/forward.py +++ b/aries_cloudagent/protocols/routing/messages/forward.py @@ -8,7 +8,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import FORWARD, NEW_FORWARD, PROTOCOL_PACKAGE +from ..message_types import FORWARD, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.forward_handler.ForwardHandler" @@ -21,7 +21,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = FORWARD - new_message_type = NEW_FORWARD schema_class = "ForwardSchema" def __init__(self, *, to: str = None, msg: Union[dict, str] = None, **kwargs): diff --git a/aries_cloudagent/protocols/routing/messages/route_query_request.py b/aries_cloudagent/protocols/routing/messages/route_query_request.py index 5a9cbe435c..51e6bdaac2 100644 --- a/aries_cloudagent/protocols/routing/messages/route_query_request.py +++ b/aries_cloudagent/protocols/routing/messages/route_query_request.py @@ -4,11 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - PROTOCOL_PACKAGE, - ROUTE_QUERY_REQUEST, - NEW_ROUTE_QUERY_REQUEST, -) +from ..message_types import PROTOCOL_PACKAGE, ROUTE_QUERY_REQUEST from ..models.paginate import Paginate, PaginateSchema HANDLER_CLASS = ( @@ -24,7 +20,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_QUERY_REQUEST - new_message_type = NEW_ROUTE_QUERY_REQUEST schema_class = "RouteQueryRequestSchema" def __init__(self, *, filter: dict = None, paginate: Paginate = None, **kwargs): diff --git a/aries_cloudagent/protocols/routing/messages/route_query_response.py b/aries_cloudagent/protocols/routing/messages/route_query_response.py index 73b2338e40..3213931e8c 100644 --- a/aries_cloudagent/protocols/routing/messages/route_query_response.py +++ b/aries_cloudagent/protocols/routing/messages/route_query_response.py @@ -6,11 +6,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - PROTOCOL_PACKAGE, - ROUTE_QUERY_RESPONSE, - NEW_ROUTE_QUERY_RESPONSE, -) +from ..message_types import PROTOCOL_PACKAGE, ROUTE_QUERY_RESPONSE from ..models.paginated import Paginated, PaginatedSchema from ..models.route_query_result import RouteQueryResult, RouteQueryResultSchema @@ -28,7 +24,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_QUERY_RESPONSE - new_message_type = NEW_ROUTE_QUERY_RESPONSE schema_class = "RouteQueryResponseSchema" def __init__( diff --git a/aries_cloudagent/protocols/routing/messages/route_update_request.py b/aries_cloudagent/protocols/routing/messages/route_update_request.py index f1957e052d..0fbbb88658 100644 --- a/aries_cloudagent/protocols/routing/messages/route_update_request.py +++ b/aries_cloudagent/protocols/routing/messages/route_update_request.py @@ -6,11 +6,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - PROTOCOL_PACKAGE, - ROUTE_UPDATE_REQUEST, - NEW_ROUTE_UPDATE_REQUEST, -) +from ..message_types import PROTOCOL_PACKAGE, ROUTE_UPDATE_REQUEST from ..models.route_update import RouteUpdate, RouteUpdateSchema HANDLER_CLASS = ( @@ -27,7 +23,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_UPDATE_REQUEST - new_message_type = NEW_ROUTE_UPDATE_REQUEST schema_class = "RouteUpdateRequestSchema" def __init__(self, *, updates: Sequence[RouteUpdate] = None, **kwargs): diff --git a/aries_cloudagent/protocols/routing/messages/route_update_response.py b/aries_cloudagent/protocols/routing/messages/route_update_response.py index c1bfaa388b..4391f213df 100644 --- a/aries_cloudagent/protocols/routing/messages/route_update_response.py +++ b/aries_cloudagent/protocols/routing/messages/route_update_response.py @@ -6,11 +6,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import ( - PROTOCOL_PACKAGE, - ROUTE_UPDATE_RESPONSE, - NEW_ROUTE_UPDATE_RESPONSE, -) +from ..message_types import PROTOCOL_PACKAGE, ROUTE_UPDATE_RESPONSE from ..models.route_updated import RouteUpdated, RouteUpdatedSchema HANDLER_CLASS = ( @@ -27,7 +23,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = ROUTE_UPDATE_RESPONSE - new_message_type = NEW_ROUTE_UPDATE_RESPONSE schema_class = "RouteUpdateResponseSchema" def __init__(self, *, updated: Sequence[RouteUpdated] = None, **kwargs): diff --git a/aries_cloudagent/protocols/trustping/messages/ping.py b/aries_cloudagent/protocols/trustping/messages/ping.py index c7d1b703a6..9fcde40b24 100644 --- a/aries_cloudagent/protocols/trustping/messages/ping.py +++ b/aries_cloudagent/protocols/trustping/messages/ping.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PING, NEW_PING, PROTOCOL_PACKAGE +from ..message_types import PING, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.ping_handler.PingHandler" @@ -17,7 +17,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = PING - new_message_type = NEW_PING schema_class = "PingSchema" def __init__( diff --git a/aries_cloudagent/protocols/trustping/messages/ping_response.py b/aries_cloudagent/protocols/trustping/messages/ping_response.py index 6476fe59fd..6cd338719b 100644 --- a/aries_cloudagent/protocols/trustping/messages/ping_response.py +++ b/aries_cloudagent/protocols/trustping/messages/ping_response.py @@ -4,7 +4,7 @@ from ....messaging.agent_message import AgentMessage, AgentMessageSchema -from ..message_types import PING_RESPONSE, NEW_PING_RESPONSE, PROTOCOL_PACKAGE +from ..message_types import PING_RESPONSE, PROTOCOL_PACKAGE HANDLER_CLASS = f"{PROTOCOL_PACKAGE}.handlers.ping_response_handler.PingResponseHandler" @@ -17,7 +17,6 @@ class Meta: handler_class = HANDLER_CLASS message_type = PING_RESPONSE - new_message_type = NEW_PING_RESPONSE schema_class = "PingResponseSchema" def __init__(self, *, comment: str = None, **kwargs): From 34a623ceea1ed1f56f672f593b31a193c833ecac Mon Sep 17 00:00:00 2001 From: Andrew Whitehead Date: Wed, 19 Feb 2020 09:36:59 -0800 Subject: [PATCH 6/8] fix logging of received credential in demo Signed-off-by: Andrew Whitehead --- demo/runners/alice.py | 10 ++++++---- demo/runners/support/agent.py | 33 +++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/demo/runners/alice.py b/demo/runners/alice.py index 8cfd5b2352..a521decf9e 100644 --- a/demo/runners/alice.py +++ b/demo/runners/alice.py @@ -31,10 +31,12 @@ def __init__(self, http_port: int, admin_port: int, **kwargs): http_port, admin_port, prefix="Alice", - extra_args=[] if os.getenv("NO_AUTO") else [ + extra_args=[] + if os.getenv("NO_AUTO") + else [ "--auto-accept-invites", "--auto-accept-requests", - "--auto-store-credential" + "--auto-store-credential", ], seed=None, **kwargs, @@ -74,12 +76,12 @@ async def handle_issue_credential(self, message): if state == "offer_received": log_status("#15 After receiving credential offer, send credential request") await self.admin_POST( - "/issue-credential/records/" f"{credential_exchange_id}/send-request" + f"/issue-credential/records/{credential_exchange_id}/send-request" ) elif state == "credential_acked": - self.log("Stored credential {cred_id} in wallet") cred_id = message["credential_id"] + self.log(f"Stored credential {cred_id} in wallet") log_status(f"#18.1 Stored credential {cred_id} in wallet") resp = await self.admin_GET(f"/credential/{cred_id}") log_json(resp, label="Credential details:") diff --git a/demo/runners/support/agent.py b/demo/runners/support/agent.py index cbc76e36f7..8fe87c0463 100644 --- a/demo/runners/support/agent.py +++ b/demo/runners/support/agent.py @@ -338,7 +338,15 @@ async def handle_webhook(self, topic: str, payload): handler = f"handle_{topic}" method = getattr(self, handler, None) if method: - EVENT_LOGGER.debug(f"Agent called controller webhook: {handler}" + f" with payload: \n{json.dumps(payload, indent=4)}" if payload else "") + EVENT_LOGGER.debug( + "Agent called controller webhook: %s%s", + handler, + ( + f" with payload: \n{json.dumps(payload, indent=4)}" + if payload + else "" + ), + ) asyncio.get_event_loop().create_task(method(payload)) else: log_msg( @@ -367,9 +375,14 @@ async def admin_request( async def admin_GET(self, path, text=False, params=None) -> ClientResponse: try: - EVENT_LOGGER.debug(f"Controller GET {path} request to Agent") + EVENT_LOGGER.debug("Controller GET %s request to Agent", path) response = await self.admin_request("GET", path, None, text, params) - EVENT_LOGGER.debug(f"Response from GET {path} received: \n{json.dumps(response, indent=4)}") + EVENT_LOGGER.debug( + "Response from GET %s received: \n%s", + path, + json.dumps(response, indent=4), + ) + return response except ClientError as e: self.log(f"Error during GET {path}: {str(e)}") raise @@ -378,9 +391,17 @@ async def admin_POST( self, path, data=None, text=False, params=None ) -> ClientResponse: try: - EVENT_LOGGER.debug(f"Controller POST {path} request to Agent" + f" with data: \n{json.dumps(data, indent=4)}" if data else ""); - response = await self.admin_request("POST", path, data, text, params) - EVENT_LOGGER.debug(f"Response from POST {path} received: \n{json.dumps(response, indent=4)}"); + EVENT_LOGGER.debug( + "Controller POST %s request to Agent%s", + path, + (f" with data: \n{json.dumps(data, indent=4)}" if data else ""), + ) + response = await self.admin_request("POST", path, data, text, params) + EVENT_LOGGER.debug( + "Response from POST %s received: \n%s", + path, + json.dumps(response, indent=4), + ) return response except ClientError as e: self.log(f"Error during POST {path}: {str(e)}") From affdb8dd49972f4abfff446038e80c01f2f3d54b Mon Sep 17 00:00:00 2001 From: Andrew Whitehead Date: Wed, 19 Feb 2020 10:29:02 -0800 Subject: [PATCH 7/8] fix pass-through of demo agent arguments; logging cleanup Signed-off-by: Andrew Whitehead --- demo/run_demo | 40 ++++++++++++++--------------------- demo/runners/alice.py | 19 ++++++++++++----- demo/runners/faber.py | 24 ++++++++++++++------- demo/runners/support/agent.py | 29 +++++++++++++------------ 4 files changed, 62 insertions(+), 50 deletions(-) diff --git a/demo/run_demo b/demo/run_demo index 6650be5716..1fb51b5ceb 100755 --- a/demo/run_demo +++ b/demo/run_demo @@ -4,35 +4,31 @@ shopt -s nocasematch cd $(dirname $0) +AGENT="$1" +shift +ARGS="" + for i in "$@" do case $i in --events) EVENTS=1 - shift - ;; - --no-auto) - NO_AUTO=1 - shift + continue ;; - *) - AGENT="$i" - shift + --timing) + if [ ! -d "../logs" ]; then + mkdir ../logs && chmod -R uga+rws ../logs + fi + if [ "$(ls -ld ../logs | grep dr..r..rwx)" == "" ]; then + echo "Error: To use the --timing parameter, the directory '../logs' must exist and all users must be able to write to it." + echo "For example, to create the directory and then set the permissions use: 'mkdir ../logs; chmod uga+rws ../logs'" + exit 1 + fi ;; esac + ARGS="${ARGS:+$ARGS }$i" done -case "$@" in *--timing*) - if [ ! -d "../logs" ]; then - mkdir ../logs && chmod -R uga+rws ../logs - fi - if [ "$(ls -ld ../logs | grep dr..r..rwx)" == "" ]; then - echo "Error: To use the --timing parameter, the directory '../logs' must exist and all users must be able to write to it." - echo "For example, to create the directory and then set the permissions use: 'mkdir ../logs; chmod uga+rws ../logs'" - exit 1 - fi -esac - if [ "$AGENT" = "faber" ]; then AGENT_MODULE="faber" AGENT_PORT=8020 @@ -89,13 +85,9 @@ fi if ! [ -z "$GENESIS_URL" ]; then DOCKER_ENV="${DOCKER_ENV} -e GENESIS_URL=${GENESIS_URL}" fi - if ! [ -z "$EVENTS" ]; then DOCKER_ENV="${DOCKER_ENV} -e EVENTS=1" fi -if ! [ -z "$NO_AUTO" ]; then - DOCKER_ENV="${DOCKER_ENV} -e NO_AUTO=1" -fi # on Windows, docker run needs to be prefixed by winpty if [ "$OSTYPE" = "msys" ]; then @@ -108,4 +100,4 @@ $DOCKER run --name $AGENT --rm -it \ -p 0.0.0.0:$AGENT_PORT_RANGE:$AGENT_PORT_RANGE \ -v "/$(pwd)/../logs:/home/indy/logs" \ $DOCKER_ENV \ - faber-alice-demo $AGENT_MODULE --port $AGENT_PORT $@ + faber-alice-demo $AGENT_MODULE --port $AGENT_PORT $ARGS diff --git a/demo/runners/alice.py b/demo/runners/alice.py index a521decf9e..f5ab30f326 100644 --- a/demo/runners/alice.py +++ b/demo/runners/alice.py @@ -25,14 +25,16 @@ class AliceAgent(DemoAgent): - def __init__(self, http_port: int, admin_port: int, **kwargs): + def __init__( + self, http_port: int, admin_port: int, no_auto: bool = False, **kwargs + ): super().__init__( "Alice Agent", http_port, admin_port, prefix="Alice", extra_args=[] - if os.getenv("NO_AUTO") + if no_auto else [ "--auto-accept-invites", "--auto-accept-requests", @@ -207,7 +209,7 @@ async def input_invitation(agent): await agent.detect_connection() -async def main(start_port: int, show_timing: bool = False): +async def main(start_port: int, no_auto: bool = False, show_timing: bool = False): genesis = await default_genesis_txns() if not genesis: @@ -219,7 +221,11 @@ async def main(start_port: int, show_timing: bool = False): try: log_status("#7 Provision an agent and wallet, get back configuration details") agent = AliceAgent( - start_port, start_port + 1, genesis_data=genesis, timing=show_timing + start_port, + start_port + 1, + genesis_data=genesis, + no_auto=no_auto, + timing=show_timing, ) await agent.listen_webhooks(start_port + 2) @@ -273,6 +279,7 @@ async def main(start_port: int, show_timing: bool = False): import argparse parser = argparse.ArgumentParser(description="Runs an Alice demo agent.") + parser.add_argument("--no-auto", action="store_true", help="Disable auto issuance") parser.add_argument( "-p", "--port", @@ -289,6 +296,8 @@ async def main(start_port: int, show_timing: bool = False): require_indy() try: - asyncio.get_event_loop().run_until_complete(main(args.port, args.timing)) + asyncio.get_event_loop().run_until_complete( + main(args.port, args.no_auto, args.timing) + ) except KeyboardInterrupt: os._exit(1) diff --git a/demo/runners/faber.py b/demo/runners/faber.py index 2bd60e9bbe..a68de3db27 100644 --- a/demo/runners/faber.py +++ b/demo/runners/faber.py @@ -28,16 +28,17 @@ class FaberAgent(DemoAgent): - def __init__(self, http_port: int, admin_port: int, **kwargs): + def __init__( + self, http_port: int, admin_port: int, no_auto: bool = False, **kwargs + ): super().__init__( "Faber Agent", http_port, admin_port, prefix="Faber", - extra_args=[] if os.getenv("NO_AUTO") else [ - "--auto-accept-invites", - "--auto-accept-requests" - ], + extra_args=[] + if no_auto + else ["--auto-accept-invites", "--auto-accept-requests"], **kwargs, ) self.connection_id = None @@ -117,7 +118,7 @@ async def handle_basicmessages(self, message): self.log("Received message:", message["content"]) -async def main(start_port: int, show_timing: bool = False): +async def main(start_port: int, no_auto: bool = False, show_timing: bool = False): genesis = await default_genesis_txns() if not genesis: @@ -129,7 +130,11 @@ async def main(start_port: int, show_timing: bool = False): try: log_status("#1 Provision an agent and wallet, get back configuration details") agent = FaberAgent( - start_port, start_port + 1, genesis_data=genesis, timing=show_timing + start_port, + start_port + 1, + genesis_data=genesis, + no_auto=no_auto, + timing=show_timing, ) await agent.listen_webhooks(start_port + 2) await agent.register_did() @@ -277,6 +282,7 @@ async def main(start_port: int, show_timing: bool = False): import argparse parser = argparse.ArgumentParser(description="Runs a Faber demo agent.") + parser.add_argument("--no-auto", action="store_true", help="Disable auto issuance") parser.add_argument( "-p", "--port", @@ -293,6 +299,8 @@ async def main(start_port: int, show_timing: bool = False): require_indy() try: - asyncio.get_event_loop().run_until_complete(main(args.port, args.timing)) + asyncio.get_event_loop().run_until_complete( + main(args.port, args.no_auto, args.timing) + ) except KeyboardInterrupt: os._exit(1) diff --git a/demo/runners/support/agent.py b/demo/runners/support/agent.py index 8fe87c0463..8e845133eb 100644 --- a/demo/runners/support/agent.py +++ b/demo/runners/support/agent.py @@ -24,8 +24,9 @@ event_stream_handler = logging.StreamHandler() event_stream_handler.setFormatter(logging.Formatter("\nEVENT: %(message)s")) +DEBUG_EVENTS = os.getenv("EVENTS") EVENT_LOGGER = logging.getLogger("event") -EVENT_LOGGER.setLevel(logging.DEBUG if os.getenv("EVENTS") else logging.NOTSET) +EVENT_LOGGER.setLevel(logging.DEBUG if DEBUG_EVENTS else logging.NOTSET) EVENT_LOGGER.addHandler(event_stream_handler) EVENT_LOGGER.propagate = False @@ -55,6 +56,16 @@ DEFAULT_PYTHON_PATH = "." +class repr_json: + def __init__(self, val): + self.val = val + + def __repr__(self) -> str: + if isinstance(self.val, str): + return self.val + return json.dumps(self.val, indent=4) + + async def default_genesis_txns(): genesis = None try: @@ -341,11 +352,7 @@ async def handle_webhook(self, topic: str, payload): EVENT_LOGGER.debug( "Agent called controller webhook: %s%s", handler, - ( - f" with payload: \n{json.dumps(payload, indent=4)}" - if payload - else "" - ), + (f" with payload: \n{repr_json(payload)}" if payload else ""), ) asyncio.get_event_loop().create_task(method(payload)) else: @@ -378,9 +385,7 @@ async def admin_GET(self, path, text=False, params=None) -> ClientResponse: EVENT_LOGGER.debug("Controller GET %s request to Agent", path) response = await self.admin_request("GET", path, None, text, params) EVENT_LOGGER.debug( - "Response from GET %s received: \n%s", - path, - json.dumps(response, indent=4), + "Response from GET %s received: \n%s", path, repr_json(response), ) return response except ClientError as e: @@ -394,13 +399,11 @@ async def admin_POST( EVENT_LOGGER.debug( "Controller POST %s request to Agent%s", path, - (f" with data: \n{json.dumps(data, indent=4)}" if data else ""), + (" with data: \n{}".format(repr_json(data)) if data else ""), ) response = await self.admin_request("POST", path, data, text, params) EVENT_LOGGER.debug( - "Response from POST %s received: \n%s", - path, - json.dumps(response, indent=4), + "Response from POST %s received: \n%s", path, repr_json(response), ) return response except ClientError as e: From 06ce82a6ca03a747a57478cd99815dd94a68621e Mon Sep 17 00:00:00 2001 From: shaktishenoy Date: Sun, 23 Feb 2020 00:10:13 +0530 Subject: [PATCH 8/8] Adding screenshots from sklump. Signed-off-by: shaktishenoy --- demo/AriesOpenAPIDemo.md | 36 +++++++++++++++++++++--- demo/collateral/conn-id.png | Bin 0 -> 41889 bytes demo/collateral/cred-def-id.png | Bin 0 -> 43064 bytes demo/collateral/issuer-did.png | Bin 0 -> 44293 bytes demo/collateral/schema-name-version.png | Bin 0 -> 32556 bytes 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 demo/collateral/conn-id.png create mode 100644 demo/collateral/cred-def-id.png create mode 100644 demo/collateral/issuer-did.png create mode 100644 demo/collateral/schema-name-version.png diff --git a/demo/AriesOpenAPIDemo.md b/demo/AriesOpenAPIDemo.md index b4e5de269e..718e626104 100644 --- a/demo/AriesOpenAPIDemo.md +++ b/demo/AriesOpenAPIDemo.md @@ -31,7 +31,7 @@ This demo is for developers comfortable with playing around with APIs using the ## Running in a Browser -T + We will get started by getting three browser tabs ready that will be used throughout the lab. Two will be Swagger UIs for the Faber and Alice Agent and one for the Public Ledger (showing the Hyperledger Indy ledger). In your browser, go to the docker playground service [Play with VON](http://play-with-von.vonx.io) (from the BC Gov). On the title screen, click "Start". On the next screen, click (in the left menu) "+Add a new instance". That will start up a terminal in your browser. Run the following commands to start the Faber agent. It is not a typo that the last line has "faber" in it. We're just borrowing that script to get started. @@ -182,11 +182,39 @@ OK, the one time setup work for issuing a credential complete. We can now issue ## Issuing a Credential -Issuing a credential from the Faber agent to Alice’s agent is done with another API call. In the Faber browser tab, scroll down to the **`POST /issue-credential/send`** and get ready to (but don’t yet) execute the request. Before execution, you need to find some other data to complete the JSON.Keep a notepad ready to copy the data you find. +Issuing a credential from the Faber agent to Alice’s agent is done with another API call. In the Faber browser tab, scroll down to the **`POST /issue-credential/send`** and get ready to (but don’t yet) execute the request. Before execution, you need to find some other data to complete the JSON. Keep a notepad ready to copy the data you find. + +First, scroll back up to the **`GET /connections`** API endpoint and execute it. From the result, find the the `connection_id` and copy the value. + +
+ Click here to see a screenshot + Connection ID +
+ +A little trickier to find is the `cred_def_id`. Go back to the terminal where you started the Faber agent, and scroll back until you see the text `#3/4 Create a new schema/cred def on the ledger` and then just below that `Cred def ID:`. Copy the text following that label. While you are at it, copy the text following the label `Schema ID:` as well. + +
+ Show me a screenshot! + Cred Def and Schema ID +
+ +Note: Another way to get the `cred_def_id` is to find it by searching the Indy network transactions posted to the ledger browser app. That works well if you are running locally by clicking the `Domain` link and using the search feature. However, that approach is harder to do when running in the browser, because there are many credential definitions on that ledger instance. + +Now scroll up the terminal till you see the text `#1 Provision an agent and wallet, get back configuration details`. Below that you see `Public DID Information:` displayed in the Faber Agent banner. Copy the text after the label `-DID:`. This is the public did of Faber Agent. In our case, its the DID of the schema issuer. + +
+ Show me where I can find the issuer DID + Issuer DID +
+ +You'll also need this to track down the schema issued by Faber Agent on the `Domain` ledger. We'll do this next. Go to your ledger URL (It is [http://dev.greenlight.bcovrin.vonx.io](http://dev.greenlight.bcovrin.vonx.io) in case you are running this demo from the browser), refresh the page (important), and in the top right corner, select `Type:` as `SCHEMA`. This will filter out transactions of type `SCHEMA`. Typically there are thousands of them displayed in pages of 10. Go to the last page, scroll down to the end and look for the entry in which the `Signed by:` value in the `Message Wrapper` is the same as the public DID of Faber Agent. From the `Transaction` section of this entry, copy the values of `Schema name:` and `Schema version:` -First, scroll back up to the **`GET /connections`** API endpoint and execute it. From the result, find the the `connection_id` and copy the value. A little trickier to find is the `cred_def_id`. Go back to the terminal where you started the Faber agent, and scroll back until you see the text `#3/4 Create a new schema/cred def on the ledger` and then just below that `Cred def ID:`. Copy the text following that label. Another way to get the `cred_def_id` is to find it by searching the Indy network transactions posted to the ledger browser app. That works well if you are running locally by clicking the `Domain` link and using the search feature. However, that approach is harder to do when running in the browser, because there are many credential definitions on that ledger instance. While you are at it, copy the text following the label `Schema ID:` as well. Now scroll up the terminal till you see the text `#1 Provision an agent and wallet, get back configuration details`. Below that you see `Public DID Information:` displayed in the Faber Agent banner. Copy the text after the label `-DID:`. This is the public did of Faber Agent. In our case, its the DID of the schema issuer. You'll also need this to track down the schema issued by Faber Agent on the `Domain` ledger. We'll do this next. +
+ Click here to see where you can find schema related information + Schema Info +
-Go to your ledger URL (It is [http://dev.greenlight.bcovrin.vonx.io](http://dev.greenlight.bcovrin.vonx.io) in case you are running this demo from the browser), refresh the page (important), and in the top right corner, select `Type:` as `SCHEMA`. This will filter out transactions of type `SCHEMA`. Typically there are thousands of them displayed in pages of 10. Go to the last page, scroll down to the end and look for the entry in which the `Signed by:` value in the `Message Wrapper` is the same as the public DID of Faber Agent. From the `Transaction` section of this entry, copy the values of `Schema name:` and `Schema version:` We now have (almost) all the information we need to fill in the JSON. The good news is that the hard part is done. +We now have (almost) all the information we need to fill in the JSON. The good news is that the hard part is done. Use the data that you gathered in the steps above to fill in the vales for `schema_issuer_did:` (the public DID of Faber Agent), `schema_id:` (the text following `Schema ID:` that you scraped off the Faber Agent terminal), `cred_def_id:` (the text following `Cred def ID:` scraped off the Faber Agent terminal), `issuer_did:` (the public DID of Faber Agent), `schema_name` and `schema_version` (values copied from the schema entry of the `Domain` ledger). diff --git a/demo/collateral/conn-id.png b/demo/collateral/conn-id.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2c7ca66eb909db0ddb9e704d32e7b5ade48677 GIT binary patch literal 41889 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 literal 0 HcmV?d00001 diff --git a/demo/collateral/issuer-did.png b/demo/collateral/issuer-did.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b5cc6b7b312ab7e745a0c16a93000551e1da4a GIT binary patch literal 44293 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 z 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/demo/collateral/schema-name-version.png b/demo/collateral/schema-name-version.png new file mode 100644 index 0000000000000000000000000000000000000000..248699c947f4d19015b4c6bef32b1b4951cd547d GIT binary patch literal 32556 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 literal 0 HcmV?d00001