Skip to content

Commit e07066c

Browse files
authored
Merge pull request #3112 from dbluhm/fix/did-peer-4-conn-lookup
fix: multiuse invites with did peer 4
2 parents 9f0a9d2 + c428b23 commit e07066c

File tree

8 files changed

+162
-94
lines changed

8 files changed

+162
-94
lines changed

.pre-commit-config.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,3 @@ repos:
1717
# Run the formatter
1818
- id: ruff-format
1919
stages: [commit]
20-
args: [--fix, --exit-non-zero-on-fix, --formatter]

aries_cloudagent/connections/base_manager.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,6 @@ async def find_did_for_key(self, key: str) -> str:
424424
storage: BaseStorage = session.inject(BaseStorage)
425425
record = await storage.find_record(self.RECORD_TYPE_DID_KEY, {"key": key})
426426
ret_did = record.tags["did"]
427-
if ret_did.startswith("did:peer:4"):
428-
ret_did = self.long_did_peer_to_short(ret_did)
429427
return ret_did
430428

431429
async def remove_keys_for_did(self, did: str):
@@ -452,9 +450,7 @@ async def resolve_didcomm_services(
452450
doc_dict: dict = await resolver.resolve(self._profile, did, service_accept)
453451
doc: ResolvedDocument = pydid.deserialize_document(doc_dict, strict=True)
454452
except ResolverError as error:
455-
raise BaseConnectionManagerError(
456-
"Failed to resolve DID services"
457-
) from error
453+
raise BaseConnectionManagerError("Failed to resolve DID services") from error
458454

459455
if not doc.service:
460456
raise BaseConnectionManagerError(
@@ -523,10 +519,7 @@ async def resolve_invitation(
523519

524520
return (
525521
endpoint,
526-
[
527-
self._extract_key_material_in_base58_format(key)
528-
for key in recipient_keys
529-
],
522+
[self._extract_key_material_in_base58_format(key) for key in recipient_keys],
530523
[self._extract_key_material_in_base58_format(key) for key in routing_keys],
531524
)
532525

@@ -800,9 +793,7 @@ async def get_connection_targets(
800793
async with cache.acquire(cache_key) as entry:
801794
if entry.result:
802795
self._logger.debug("Connection targets retrieved from cache")
803-
targets = [
804-
ConnectionTarget.deserialize(row) for row in entry.result
805-
]
796+
targets = [ConnectionTarget.deserialize(row) for row in entry.result]
806797
else:
807798
if not connection:
808799
async with self._profile.session() as session:
@@ -817,9 +808,7 @@ async def get_connection_targets(
817808
# Otherwise, a replica that participated early in exchange
818809
# may have bad data set in cache.
819810
self._logger.debug("Caching connection targets")
820-
await entry.set_result(
821-
[row.serialize() for row in targets], 3600
822-
)
811+
await entry.set_result([row.serialize() for row in targets], 3600)
823812
else:
824813
self._logger.debug(
825814
"Not caching connection targets for connection in "
@@ -878,12 +867,8 @@ def diddoc_connection_targets(
878867
did=doc.did,
879868
endpoint=service.endpoint,
880869
label=their_label,
881-
recipient_keys=[
882-
key.value for key in (service.recip_keys or ())
883-
],
884-
routing_keys=[
885-
key.value for key in (service.routing_keys or ())
886-
],
870+
recipient_keys=[key.value for key in (service.recip_keys or ())],
871+
routing_keys=[key.value for key in (service.routing_keys or ())],
887872
sender_key=sender_verkey,
888873
)
889874
)
@@ -920,7 +905,18 @@ async def find_connection(
920905
921906
"""
922907
connection = None
923-
if their_did:
908+
if their_did and their_did.startswith("did:peer:4"):
909+
# did:peer:4 always recorded as long
910+
long = their_did
911+
short = self.long_did_peer_to_short(their_did)
912+
try:
913+
async with self._profile.session() as session:
914+
connection = await ConnRecord.retrieve_by_did_peer_4(
915+
session, long, short, my_did
916+
)
917+
except StorageNotFoundError:
918+
pass
919+
elif their_did:
924920
try:
925921
async with self._profile.session() as session:
926922
connection = await ConnRecord.retrieve_by_did(

aries_cloudagent/connections/models/conn_record.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,9 @@ def __init__(
217217
self.their_role = (
218218
ConnRecord.Role.get(their_role).rfc160
219219
if isinstance(their_role, str)
220-
else None if their_role is None else their_role.rfc160
220+
else None
221+
if their_role is None
222+
else their_role.rfc160
221223
)
222224
self.invitation_key = invitation_key
223225
self.invitation_msg_id = invitation_msg_id
@@ -293,6 +295,44 @@ async def retrieve_by_did(
293295

294296
return await cls.retrieve_by_tag_filter(session, tag_filter, post_filter)
295297

298+
@classmethod
299+
async def retrieve_by_did_peer_4(
300+
cls,
301+
session: ProfileSession,
302+
their_did_long: Optional[str] = None,
303+
their_did_short: Optional[str] = None,
304+
my_did: Optional[str] = None,
305+
their_role: Optional[str] = None,
306+
) -> "ConnRecord":
307+
"""Retrieve a connection record by target DID.
308+
309+
Args:
310+
session: The active profile session
311+
their_did_long: The target DID to filter by, in long form
312+
their_did_short: The target DID to filter by, in short form
313+
my_did: One of our DIDs to filter by
314+
my_role: Filter connections by their role
315+
their_role: Filter connections by their role
316+
"""
317+
tag_filter = {}
318+
if their_did_long and their_did_short:
319+
tag_filter["$or"] = [
320+
{"their_did": their_did_long},
321+
{"their_did": their_did_short},
322+
]
323+
elif their_did_short:
324+
tag_filter["their_did"] = their_did_short
325+
elif their_did_long:
326+
tag_filter["their_did"] = their_did_long
327+
if my_did:
328+
tag_filter["my_did"] = my_did
329+
330+
post_filter = {}
331+
if their_role:
332+
post_filter["their_role"] = cls.Role.get(their_role).rfc160
333+
334+
return await cls.retrieve_by_tag_filter(session, tag_filter, post_filter)
335+
296336
@classmethod
297337
async def retrieve_by_invitation_key(
298338
cls, session: ProfileSession, invitation_key: str, their_role: str = None
@@ -375,9 +415,7 @@ async def retrieve_by_request_id(
375415
return await cls.retrieve_by_tag_filter(session, tag_filter)
376416

377417
@classmethod
378-
async def retrieve_by_alias(
379-
cls, session: ProfileSession, alias: str
380-
) -> "ConnRecord":
418+
async def retrieve_by_alias(cls, session: ProfileSession, alias: str) -> "ConnRecord":
381419
"""Retrieve a connection record from an alias.
382420
383421
Args:

aries_cloudagent/connections/models/tests/test_conn_record.py

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ def setUp(self):
2525
self.test_target_did = "GbuDUYXaUZRfHD2jeDuQuP"
2626
self.test_target_verkey = "9WCgWKUaAJj3VWxxtzvvMQN3AoFxoBtBDo9ntwJnVVCC"
2727

28+
self.test_did_peer_4_a = "did:peer:4zQmV3Hf1TT4Xn73MBVf2NAWdMwrzUabpEvwtV3RoZc17Vxr:z2pfttj3xn6tJ7wpHV9ZSwpQVMNtHC7EtM36r1mC5fDpZ25882Yitk21QPbqzuefKPrbFsexWmQtE78vYWweckXtKeu5BhuFDvCjMUf8SC5z7cMPvp8SCdcbqWnHxygjBH9zAAs9myGRnZYXuAkq6CfBdn6ZiNmdRf65TdVfE3cYfS4jNzVZDs1abwytn4jdFJ2fwVegPB3vLY8XxeUEx12a4rtjkqMhs6zBQbJvc4PVUM9rvMbPM2QeXDy7ovkkHaKLUbNUxjQrcQeiR8MTLe1iaVtUv6RpBf4z7ioqfa4VDRmAZT7isVM3NvENUceeUfDZoFbM8PZqGkCbFvfoKiK3SrmTsvPtpXaBAfR4z7w18cFjsvvLBNMZbPnARn4oZijCkYwgaNmAUthgDP4XBFetdUo8728w25FUwTWjAPc1BdSSWPWMRKwCqyAP1Q1hM8dU6otT27MQaQ1rozKncn3U48CXEi2Ef26EDBrSozEWR273ancFojNXBbZVghZG5b6xdypjQir9PgTF94dsygtu47hNxQweVKLUM1p9umqHLhjvLhpS1aGQkGZNnKUHjLDHdToigo15F7TAf8RfMaducHBThFzEp9TUJmiZFTUYQ1uaBgSPMSaWnvTfUoFmLoGbdrWj1vVEsRrARq37u1SJGLqBx7FM2SUd8nxPsChP5jY8ka8F8r7j8qZLHZqvUXbynPUsViwwdFFk8SCsBWfiQgvq7sRiTdLnYv3H5DSwA1uW2GNYXGgkT9aJza4Sk1gvag5iAbQZgxbU594enjVSTjiWsFw2oYQ75JJwiSEgsP2rhpGsNhXxfECNLUtb7FQbDQPtUvLHCJATf7QXJEoWjpfAywmB6NyQcXfskco6FKJNNHeZBnST6U1meH98Ku66vha1k8hAc72iBhXQBnWUjaGRyzELsh2LkBH2UNwW9TuFhxz3SKtL5pGShVQ5XGQhmdrkWP68d6h7c1JqsfogcDBnmWS4VSbJwgtsPNTSsTHGX8hpGvg"
29+
self.test_did_peer_4_short_a = (
30+
"did:peer:4zQmV3Hf1TT4Xn73MBVf2NAWdMwrzUabpEvwtV3RoZc17Vxr"
31+
)
32+
self.test_did_peer_4_b = "did:peer:4zQmQ4dEtoGcivpiH6gtWwhWJY2ENVWuZifb62uzR76HGPPw:z7p4QX8zEXt2sMjv1Tqq8Lv8Nx8oGo2uRczBe21vyfMhQzsWDnwGmjriYfUX75WDq622czcdHjWGhh2VTbzKhLXUjY8Ma7g64dKAVcy8SaxN5QVdjwpXgD7htKCgCjah8jHEzyBZFrtdfTHiVXfSUz1BiURQf1Z3NfxW5cWYsvDJVvQzVmdHb8ekzCnvxCqL2UV1v9SBb1DsU66N3PCp9HVpSrqUJQyFU2Ddc8bb6u8SJfBU1nyCkNMgfA1zAyKnSBrzZWyyNzAm9oBV36qjC1Qjfcpq4FBnGr7foh5sLXppBwu2ES8U2nxdGrQzAbN47DKBoKJqPVxNh5tTuBdYjDGt7PcvZQjHQGNXXuhJctM5besZci2saGefCHzoZ87vSsFuKq6oXEsW512eadiNZWjHSdG9J4ToMEMK9WT66vGGLFdZszB3xhdFqEDnAMcpnoFUL5WN243aH6492jPC2Zjdi1BvHC1J8bUuvyihAKXF3WmFz7gJWmh6MrTEWNqb17K6tqbyXjFmfnS2RbAi8xBFj3sSsXkSs6TRTXAZD9DenYaQq4RMa2Kqh6VKGvkXAjVHKcPh9Ncpt6rU9ZYttNHbDJFgahwB8KisVBK8FBpG"
33+
self.test_did_peer_4_short_b = (
34+
"did:peer:4zQmQ4dEtoGcivpiH6gtWwhWJY2ENVWuZifb62uzR76HGPPw"
35+
)
36+
2837
self.test_conn_record = ConnRecord(
2938
my_did=self.test_did,
3039
their_did=self.test_target_did,
@@ -39,9 +48,7 @@ async def test_get_enums(self):
3948
assert ConnRecord.Role.get("Larry") is None
4049
assert ConnRecord.State.get("a suffusion of yellow") is None
4150

42-
assert (
43-
ConnRecord.Role.get(ConnRecord.Role.REQUESTER) is ConnRecord.Role.REQUESTER
44-
)
51+
assert ConnRecord.Role.get(ConnRecord.Role.REQUESTER) is ConnRecord.Role.REQUESTER
4552

4653
assert (
4754
ConnRecord.State.get(ConnRecord.State.RESPONSE) is ConnRecord.State.RESPONSE
@@ -133,6 +140,71 @@ async def test_retrieve_by_did(self):
133140
)
134141
assert result == record
135142

143+
async def test_retrieve_by_did_peer_4_by_long(self):
144+
record = ConnRecord(
145+
my_did=self.test_did,
146+
their_did=self.test_did_peer_4_a,
147+
their_role=ConnRecord.Role.RESPONDER.rfc23,
148+
state=ConnRecord.State.COMPLETED.rfc23,
149+
)
150+
rec_id = await record.save(self.session)
151+
result = await ConnRecord.retrieve_by_did_peer_4(
152+
session=self.session,
153+
my_did=self.test_did,
154+
their_did_long=self.test_did_peer_4_a,
155+
their_role=ConnRecord.Role.RESPONDER.rfc160,
156+
)
157+
assert result == record
158+
159+
async def test_retrieve_by_did_peer_4_by_short(self):
160+
record = ConnRecord(
161+
my_did=self.test_did,
162+
their_did=self.test_did_peer_4_short_b,
163+
their_role=ConnRecord.Role.RESPONDER.rfc23,
164+
state=ConnRecord.State.COMPLETED.rfc23,
165+
)
166+
await record.save(self.session)
167+
result = await ConnRecord.retrieve_by_did_peer_4(
168+
session=self.session,
169+
my_did=self.test_did,
170+
their_did_short=self.test_did_peer_4_short_b,
171+
their_role=ConnRecord.Role.RESPONDER.rfc160,
172+
)
173+
assert result == record
174+
175+
async def test_retrieve_by_did_peer_4_by_either(self):
176+
record_short = ConnRecord(
177+
my_did=self.test_did,
178+
their_did=self.test_did_peer_4_short_a,
179+
their_role=ConnRecord.Role.RESPONDER.rfc23,
180+
state=ConnRecord.State.COMPLETED.rfc23,
181+
)
182+
await record_short.save(self.session)
183+
record_long = ConnRecord(
184+
my_did=self.test_did,
185+
their_did=self.test_did_peer_4_b,
186+
their_role=ConnRecord.Role.RESPONDER.rfc23,
187+
state=ConnRecord.State.COMPLETED.rfc23,
188+
)
189+
await record_long.save(self.session)
190+
191+
result = await ConnRecord.retrieve_by_did_peer_4(
192+
session=self.session,
193+
my_did=self.test_did,
194+
their_did_short=self.test_did_peer_4_short_a,
195+
their_did_long=self.test_did_peer_4_a,
196+
their_role=ConnRecord.Role.RESPONDER.rfc160,
197+
)
198+
assert result == record_short
199+
result = await ConnRecord.retrieve_by_did_peer_4(
200+
session=self.session,
201+
my_did=self.test_did,
202+
their_did_short=self.test_did_peer_4_short_b,
203+
their_did_long=self.test_did_peer_4_b,
204+
their_role=ConnRecord.Role.RESPONDER.rfc160,
205+
)
206+
assert result == record_long
207+
136208
async def test_from_storage_with_initiator_old(self):
137209
record = ConnRecord(my_did=self.test_did, state=ConnRecord.State.COMPLETED)
138210
ser = record.serialize()
@@ -300,9 +372,7 @@ async def test_attach_retrieve_request(self):
300372
connection_id = await record.save(self.session)
301373

302374
req = ConnectionRequest(
303-
connection=ConnectionDetail(
304-
did=self.test_did, did_doc=DIDDoc(self.test_did)
305-
),
375+
connection=ConnectionDetail(did=self.test_did, did_doc=DIDDoc(self.test_did)),
306376
label="abc123",
307377
)
308378
await record.attach_request(self.session, req)
@@ -317,9 +387,7 @@ async def test_attach_request_abstain_on_alien_deco(self):
317387
connection_id = await record.save(self.session)
318388

319389
req = ConnectionRequest(
320-
connection=ConnectionDetail(
321-
did=self.test_did, did_doc=DIDDoc(self.test_did)
322-
),
390+
connection=ConnectionDetail(did=self.test_did, did_doc=DIDDoc(self.test_did)),
323391
label="abc123",
324392
)
325393
ser = req.serialize()

aries_cloudagent/protocols/endorse_transaction/v1_0/handlers/tests/test_transaction_job_to_send_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ async def test_called(self):
2626
await handler.handle(request_context, responder)
2727

2828
mock_tran_mgr.return_value.set_transaction_their_job.assert_called_once_with(
29-
request_context.message, request_context.message_receipt
29+
request_context.message, request_context.connection_record
3030
)
3131
assert not responder.messages
3232

@@ -48,6 +48,6 @@ async def test_called_x(self):
4848
await handler.handle(request_context, responder)
4949

5050
mock_tran_mgr.return_value.set_transaction_their_job.assert_called_once_with(
51-
request_context.message, request_context.message_receipt
51+
request_context.message, request_context.connection_record
5252
)
5353
assert not responder.messages

aries_cloudagent/protocols/endorse_transaction/v1_0/handlers/transaction_job_to_send_handler.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ async def handle(self, context: RequestContext, responder: BaseResponder):
2626

2727
if not context.connection_ready:
2828
raise HandlerException("No connection established")
29+
assert context.connection_record
2930

3031
mgr = TransactionManager(context.profile)
3132
try:
32-
await mgr.set_transaction_their_job(context.message, context.message_receipt)
33+
await mgr.set_transaction_their_job(
34+
context.message, context.connection_record
35+
)
3336
except TransactionManagerError:
3437
self._logger.exception("Error receiving transaction jobs")

aries_cloudagent/protocols/endorse_transaction/v1_0/manager.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
notify_revocation_reg_endorsed_event,
2222
)
2323
from ....storage.error import StorageError, StorageNotFoundError
24-
from ....transport.inbound.receipt import MessageReceipt
2524
from ....wallet.base import BaseWallet
2625
from ....wallet.util import notify_endorse_did_attrib_event, notify_endorse_did_event
2726
from .messages.cancel_transaction import CancelTransaction
@@ -310,9 +309,7 @@ async def create_endorse_response(
310309
)
311310
# we don't have an endorsed transaction so just return did meta-data
312311
ledger_response = {
313-
"result": {
314-
"txn": {"type": "1", "data": {"dest": meta_data["did"]}}
315-
},
312+
"result": {"txn": {"type": "1", "data": {"dest": meta_data["did"]}}},
316313
"meta_data": meta_data,
317314
}
318315
endorsed_msg = json.dumps(ledger_response)
@@ -430,9 +427,7 @@ async def complete_transaction(
430427

431428
# if we are the author, we need to write the endorsed ledger transaction ...
432429
# ... EXCEPT for DID transactions, which the endorser will write
433-
if (not endorser) and (
434-
txn_goal_code != TransactionRecord.WRITE_DID_TRANSACTION
435-
):
430+
if (not endorser) and (txn_goal_code != TransactionRecord.WRITE_DID_TRANSACTION):
436431
ledger = self.profile.inject(BaseLedger)
437432
if not ledger:
438433
raise TransactionManagerError("No ledger available")
@@ -772,20 +767,17 @@ async def set_transaction_my_job(self, record: ConnRecord, transaction_my_job: s
772767
return tx_job_to_send
773768

774769
async def set_transaction_their_job(
775-
self, tx_job_received: TransactionJobToSend, receipt: MessageReceipt
770+
self, tx_job_received: TransactionJobToSend, connection: ConnRecord
776771
):
777772
"""Set transaction_their_job.
778773
779774
Args:
780775
tx_job_received: The transaction job that is received from the other agent
781-
receipt: The Message Receipt Object
776+
connection: connection to set metadata on
782777
"""
783778

784779
try:
785780
async with self._profile.session() as session:
786-
connection = await ConnRecord.retrieve_by_did(
787-
session, receipt.sender_did, receipt.recipient_did
788-
)
789781
value = await connection.metadata_get(session, "transaction_jobs")
790782
if value:
791783
value["transaction_their_job"] = tx_job_received.job
@@ -893,9 +885,7 @@ async def endorsed_txn_post_processing(
893885
elif ledger_response["result"]["txn"]["type"] == "114":
894886
# revocation entry transaction
895887
rev_reg_id = ledger_response["result"]["txn"]["data"]["revocRegDefId"]
896-
revoked = ledger_response["result"]["txn"]["data"]["value"].get(
897-
"revoked", []
898-
)
888+
revoked = ledger_response["result"]["txn"]["data"]["value"].get("revoked", [])
899889
meta_data["context"]["rev_reg_id"] = rev_reg_id
900890
if is_anoncreds:
901891
await AnonCredsRevocation(self._profile).finish_revocation_list(

0 commit comments

Comments
 (0)