Skip to content

Commit 9dc2fa3

Browse files
authored
Merge pull request openwallet-foundation#1962 from shaangill025/feat_oob_v1.1
feat: 00B v1.1 support
2 parents a900f90 + 2f8db62 commit 9dc2fa3

30 files changed

Lines changed: 545 additions & 170 deletions

aries_cloudagent/connections/base_manager.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66

77
import logging
8-
from typing import List, Sequence, Tuple
8+
from typing import Optional, List, Sequence, Tuple, Text
99

1010
from pydid import (
1111
BaseDIDDocument as ResolvedDocument,
@@ -227,7 +227,9 @@ async def remove_keys_for_did(self, did: str):
227227
storage: BaseStorage = session.inject(BaseStorage)
228228
await storage.delete_all_records(self.RECORD_TYPE_DID_KEY, {"did": did})
229229

230-
async def resolve_invitation(self, did: str):
230+
async def resolve_invitation(
231+
self, did: str, service_accept: Optional[Sequence[Text]] = None
232+
):
231233
"""
232234
Resolve invitation with the DID Resolver.
233235
@@ -241,7 +243,7 @@ async def resolve_invitation(self, did: str):
241243

242244
resolver = self._profile.inject(DIDResolver)
243245
try:
244-
doc_dict: dict = await resolver.resolve(self._profile, did)
246+
doc_dict: dict = await resolver.resolve(self._profile, did, service_accept)
245247
doc: ResolvedDocument = pydid.deserialize_document(doc_dict, strict=True)
246248
except ResolverError as error:
247249
raise BaseConnectionManagerError(

aries_cloudagent/core/protocol_registry.py

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
"""Handle registration and publication of supported protocols."""
22

33
import logging
4+
import re
45

5-
from string import Template
66
from typing import Mapping, Sequence
77

88
from ..config.injection_context import InjectionContext
99
from ..utils.classloader import ClassLoader
1010

11-
from .error import ProtocolMinorVersionNotSupported
11+
from .error import ProtocolMinorVersionNotSupported, ProtocolDefinitionValidationError
1212

1313
LOGGER = logging.getLogger(__name__)
1414

@@ -91,28 +91,34 @@ def create_msg_types_for_minor_version(self, typesets, version_definition):
9191
curr_minor_version = version_definition["current_minor_version"]
9292
min_minor_version = version_definition["minimum_minor_version"]
9393
major_version = version_definition["major_version"]
94-
if curr_minor_version >= min_minor_version and curr_minor_version >= 1:
94+
if curr_minor_version >= min_minor_version:
9595
for version_index in range(min_minor_version, curr_minor_version + 1):
9696
to_check = f"{str(major_version)}.{str(version_index)}"
9797
updated_typeset.update(
98-
self._get_updated_tyoeset_dict(typesets, to_check, updated_typeset)
98+
self._get_updated_typeset_dict(typesets, to_check, updated_typeset)
9999
)
100+
else:
101+
raise ProtocolDefinitionValidationError(
102+
"min_minor_version is greater than curr_minor_version for the"
103+
f" following typeset: {str(typesets)}"
104+
)
100105
return (updated_typeset,)
101106

102-
def _get_updated_tyoeset_dict(self, typesets, to_check, updated_typeset) -> dict:
107+
def _get_updated_typeset_dict(self, typesets, to_check, updated_typeset) -> dict:
103108
for typeset in typesets:
104109
for msg_type_string, module_path in typeset.items():
105-
updated_msg_type_string = Template(msg_type_string).substitute(
106-
version=to_check
110+
updated_msg_type_string = re.sub(
111+
r"(\d+\.)?(\*|\d+)", to_check, msg_type_string
107112
)
108113
updated_typeset[updated_msg_type_string] = module_path
109114
return updated_typeset
110115

111-
def _template_message_type_check(self, typeset) -> bool:
112-
for msg_type_string, _ in typeset.items():
113-
if "$version" in msg_type_string:
114-
return True
115-
return False
116+
def _message_type_check_for_minor_verssion(self, version_definition) -> bool:
117+
if not version_definition:
118+
return False
119+
curr_minor_version = version_definition["current_minor_version"]
120+
min_minor_version = version_definition["minimum_minor_version"]
121+
return bool(curr_minor_version >= 1 and curr_minor_version >= min_minor_version)
116122

117123
def _create_and_register_updated_typesets(self, typesets, version_definition):
118124
updated_typesets = self.create_msg_types_for_minor_version(
@@ -153,17 +159,18 @@ def register_message_types(self, *typesets, version_definition=None):
153159
"""
154160

155161
# Maintain support for versionless protocol modules
156-
template_msg_type_version = True
157162
updated_typesets = None
158-
for typeset in typesets:
159-
if not self._template_message_type_check(typeset):
163+
minor_versions_supported = self._message_type_check_for_minor_verssion(
164+
version_definition
165+
)
166+
if not minor_versions_supported:
167+
for typeset in typesets:
160168
self._typemap.update(typeset)
161-
template_msg_type_version = False
162169

163170
# Track versioned modules for version routing
164171
if version_definition:
165172
# create updated typesets for minor versions and register them
166-
if template_msg_type_version:
173+
if minor_versions_supported:
167174
updated_typesets = self._create_and_register_updated_typesets(
168175
typesets, version_definition
169176
)

aries_cloudagent/core/tests/test_protocol_registry.py

Lines changed: 114 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,19 @@ def test_message_type_query(self):
4545
assert matches == ()
4646

4747
def test_create_msg_types_for_minor_version(self):
48+
MSG_PATH = "aries_cloudagent.protocols.introduction.v0_1.messages"
4849
test_typesets = (
4950
{
50-
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/$version/fake-forward-invitation": "aries_cloudagent.protocols.introduction.v0_1.messages.forward_invitation.ForwardInvitation",
51-
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/$version/fake-invitation": "aries_cloudagent.protocols.introduction.v0_1.messages.invitation.Invitation",
52-
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/$version/fake-invitation-request": "aries_cloudagent.protocols.introduction.v0_1.messages.invitation_request.InvitationRequest",
53-
"https://didcom.org/introduction-service/$version/fake-forward-invitation": "aries_cloudagent.protocols.introduction.v0_1.messages.forward_invitation.ForwardInvitation",
54-
"https://didcom.org/introduction-service/$version/fake-invitation": "aries_cloudagent.protocols.introduction.v0_1.messages.invitation.Invitation",
55-
"https://didcom.org/introduction-service/$version/fake-invitation-request": "aries_cloudagent.protocols.introduction.v0_1.messages.invitation_request.InvitationRequest",
51+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/1.0/fake-forward-invitation": f"{MSG_PATH}.forward_invitation.ForwardInvitation",
52+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/1.0/fake-invitation": f"{MSG_PATH}.invitation.Invitation",
53+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/1.0/fake-invitation-request": f"{MSG_PATH}.invitation_request.InvitationRequest",
54+
"https://didcom.org/introduction-service/1.0/fake-forward-invitation": f"{MSG_PATH}.forward_invitation.ForwardInvitation",
55+
"https://didcom.org/introduction-service/1.0/fake-invitation": f"{MSG_PATH}.invitation.Invitation",
56+
"https://didcom.org/introduction-service/1.0/fake-invitation-request": f"{MSG_PATH}.invitation_request.InvitationRequest",
5657
},
5758
)
5859
test_version_def = {
59-
"current_minor_version": 1,
60+
"current_minor_version": 0,
6061
"major_version": 1,
6162
"minimum_minor_version": 0,
6263
"path": "v0_1",
@@ -78,23 +79,124 @@ def test_create_msg_types_for_minor_version(self):
7879
in updated_typeset
7980
)
8081
assert (
81-
"https://didcom.org/introduction-service/1.1/fake-forward-invitation"
82+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/1.0/fake-forward-invitation"
8283
in updated_typeset
8384
)
85+
86+
def test_introduction_create_msg_types_for_minor_version(self):
87+
MSG_PATH = "aries_cloudagent.protocols.introduction.v0_1.messages"
88+
test_typesets = (
89+
{
90+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/0.1/invitation-request": f"{MSG_PATH}.invitation_request.InvitationRequest",
91+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/0.1/invitation": f"{MSG_PATH}.invitation.Invitation",
92+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/0.1/forward-invitation": f"{MSG_PATH}.invitation_messages.forward_invitation.ForwardInvitation",
93+
"https://didcom.org/introduction-service/0.1/invitation-request": f"{MSG_PATH}.invitation_request.InvitationRequest",
94+
"https://didcom.org/introduction-service/0.1/invitation": f"{MSG_PATH}.invitation.Invitation",
95+
"https://didcom.org/introduction-service/0.1/forward-invitation": f"{MSG_PATH}.forward_invitation.ForwardInvitation",
96+
},
97+
)
98+
test_version_def = {
99+
"current_minor_version": 1,
100+
"major_version": 0,
101+
"minimum_minor_version": 1,
102+
"path": "v0_1",
103+
}
104+
updated_typesets = self.registry.create_msg_types_for_minor_version(
105+
test_typesets, test_version_def
106+
)
107+
updated_typeset = updated_typesets[0]
84108
assert (
85-
"https://didcom.org/introduction-service/1.1/fake-invitation"
109+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/0.1/invitation-request"
86110
in updated_typeset
87111
)
88112
assert (
89-
"https://didcom.org/introduction-service/1.1/fake-invitation-request"
113+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/0.1/invitation"
90114
in updated_typeset
91115
)
92116
assert (
93-
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/1.0/fake-forward-invitation"
117+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/0.1/forward-invitation"
118+
in updated_typeset
119+
)
120+
assert (
121+
"https://didcom.org/introduction-service/0.1/invitation-request"
122+
in updated_typeset
123+
)
124+
assert (
125+
"https://didcom.org/introduction-service/0.1/invitation" in updated_typeset
126+
)
127+
assert (
128+
"https://didcom.org/introduction-service/0.1/forward-invitation"
129+
in updated_typeset
130+
)
131+
132+
def test_oob_create_msg_types_for_minor_version(self):
133+
MSG_PATH = "aries_cloudagent.protocols.out_of_band.v1_0.messages"
134+
test_typesets = (
135+
{
136+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/invitation": f"{MSG_PATH}.invitation.Invitation",
137+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/handshake-reuse": f"{MSG_PATH}.reuse.HandshakeReuse",
138+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/handshake-reuse-accepted": f"{MSG_PATH}.reuse_accept.HandshakeReuseAccept",
139+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/problem_report": f"{MSG_PATH}.problem_report.OOBProblemReport",
140+
"https://didcom.org/out-of-band/1.1/invitation": f"{MSG_PATH}.invitation.Invitation",
141+
"https://didcom.org/out-of-band/1.1/handshake-reuse": f"{MSG_PATH}.reuse.HandshakeReuse",
142+
"https://didcom.org/out-of-band/1.1/handshake-reuse-accepted": f"{MSG_PATH}.reuse_accept.HandshakeReuseAccept",
143+
"https://didcom.org/out-of-band/1.1/problem_report": f"{MSG_PATH}.problem_report.OOBProblemReport",
144+
},
145+
)
146+
test_version_def = {
147+
"current_minor_version": 1,
148+
"major_version": 1,
149+
"minimum_minor_version": 0,
150+
"path": "v0_1",
151+
}
152+
updated_typesets = self.registry.create_msg_types_for_minor_version(
153+
test_typesets, test_version_def
154+
)
155+
updated_typeset = updated_typesets[0]
156+
assert "https://didcom.org/out-of-band/1.0/invitation" in updated_typeset
157+
assert "https://didcom.org/out-of-band/1.0/handshake-reuse" in updated_typeset
158+
assert (
159+
"https://didcom.org/out-of-band/1.0/handshake-reuse-accepted"
160+
in updated_typeset
161+
)
162+
assert "https://didcom.org/out-of-band/1.0/problem_report" in updated_typeset
163+
assert "https://didcom.org/out-of-band/1.1/invitation" in updated_typeset
164+
assert "https://didcom.org/out-of-band/1.1/handshake-reuse" in updated_typeset
165+
assert (
166+
"https://didcom.org/out-of-band/1.1/handshake-reuse-accepted"
167+
in updated_typeset
168+
)
169+
assert "https://didcom.org/out-of-band/1.1/problem_report" in updated_typeset
170+
assert (
171+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.0/invitation"
172+
in updated_typeset
173+
)
174+
assert (
175+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.0/handshake-reuse"
176+
in updated_typeset
177+
)
178+
assert (
179+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.0/handshake-reuse-accepted"
180+
in updated_typeset
181+
)
182+
assert (
183+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.0/problem_report"
184+
in updated_typeset
185+
)
186+
assert (
187+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/invitation"
188+
in updated_typeset
189+
)
190+
assert (
191+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/handshake-reuse"
192+
in updated_typeset
193+
)
194+
assert (
195+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/handshake-reuse-accepted"
94196
in updated_typeset
95197
)
96198
assert (
97-
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/introduction-service/1.1/fake-invitation-request"
199+
"did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/out-of-band/1.1/problem_report"
98200
in updated_typeset
99201
)
100202

aries_cloudagent/core/tests/test_util.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,19 @@ def test_get_version_from_message_type(self):
6464
)
6565

6666
def test_get_version_from_message(self):
67-
assert test_module.get_version_from_message(HandshakeReuse()) == "1.0"
67+
assert test_module.get_version_from_message(HandshakeReuse()) == "1.1"
6868

69-
async def test_get_proto_default_version(self):
69+
async def test_get_proto_default_version_from_msg_class(self):
7070
profile = make_profile()
7171
assert (
72-
await test_module.get_proto_default_version(profile, HandshakeReuse)
72+
await test_module.get_proto_default_version_from_msg_class(
73+
profile, HandshakeReuse
74+
)
75+
) == "1.1"
76+
77+
def test_get_proto_default_version(self):
78+
assert (
79+
test_module.get_proto_default_version(
80+
"aries_cloudagent.protocols.out_of_band.definition"
81+
)
7382
) == "1.1"

aries_cloudagent/core/util.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,20 @@ def get_version_from_message(msg: AgentMessage) -> str:
9595
return get_version_from_message_type(msg_type)
9696

9797

98-
async def get_proto_default_version(
98+
async def get_proto_default_version_from_msg_class(
9999
profile: Profile, msg_class: type, major_version: int = 1
100100
) -> str:
101101
"""Return default protocol version from version_definition."""
102102
version_definition = await get_version_def_from_msg_class(
103103
profile, msg_class, major_version
104104
)
105-
default_major_version = version_definition["major_version"]
106-
default_minor_version = version_definition["current_minor_version"]
107-
return f"{default_major_version}.{default_minor_version}"
105+
return _get_default_version_from_version_def(version_definition)
106+
107+
108+
def get_proto_default_version(def_path: str, major_version: int = 1) -> str:
109+
"""Return default protocol version from version_definition."""
110+
version_definition = _get_version_def_from_path(def_path, major_version)
111+
return _get_default_version_from_version_def(version_definition)
108112

109113

110114
def _get_path_from_msg_class(msg_class: type) -> str:
@@ -116,10 +120,26 @@ def _get_path_from_msg_class(msg_class: type) -> str:
116120
return (path.replace("/", ".")) + "definition"
117121

118122

123+
def _get_version_def_from_path(definition_path: str, major_version: int = 1):
124+
version_definition = None
125+
definition = ClassLoader.load_module(definition_path)
126+
for protocol_version in definition.versions:
127+
if major_version == protocol_version["major_version"]:
128+
version_definition = protocol_version
129+
break
130+
return version_definition
131+
132+
133+
def _get_default_version_from_version_def(version_definition) -> str:
134+
default_major_version = version_definition["major_version"]
135+
default_minor_version = version_definition["current_minor_version"]
136+
return f"{default_major_version}.{default_minor_version}"
137+
138+
119139
async def get_version_def_from_msg_class(
120140
profile: Profile, msg_class: type, major_version: int = 1
121141
):
122-
"""Return version_definition of a protocol."""
142+
"""Return version_definition of a protocol from msg_class."""
123143
cache = profile.inject_or(BaseCache)
124144
version_definition = None
125145
if cache:
@@ -129,11 +149,7 @@ async def get_version_def_from_msg_class(
129149
if version_definition:
130150
return version_definition
131151
definition_path = _get_path_from_msg_class(msg_class)
132-
definition = ClassLoader.load_module(definition_path)
133-
for protocol_version in definition.versions:
134-
if major_version == protocol_version["major_version"]:
135-
version_definition = protocol_version
136-
break
152+
version_definition = _get_version_def_from_path(definition_path, major_version)
137153
if not version_definition:
138154
raise ProtocolDefinitionValidationError(
139155
f"Unable to load protocol version_definition for {str(msg_class)}"

0 commit comments

Comments
 (0)