Skip to content

Commit 5d42eac

Browse files
authored
Merge branch 'hyperledger:main' into feature/did-method-key-type-registry
2 parents cbf7801 + 1fb0bca commit 5d42eac

32 files changed

Lines changed: 893 additions & 127 deletions

File tree

Endorser.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ Endorsement:
5656
For Authors, specify whether to automatically create transactions for a cred def's revocation registry. (If not specified, the controller must invoke the endpoints required to create
5757
the revocation registry and assign to the cred def.) [env var: ACAPY_CREATE_REVOCATION_TRANSACTIONS]
5858
--auto-promote-author-did
59-
For Authors, specify whether to automatically promote a DID to the wallet public DID after writing to the ledger.
59+
For Authors, specify whether to automatically promote a DID to the wallet public DID after writing to the ledger. [env var: ACAPY_AUTO_PROMOTE_AUTHOR_DID]
6060
```
6161

6262
## How Aca-py Handles Endorsements

aries_cloudagent/config/argparse.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1837,7 +1837,7 @@ def add_arguments(self, parser: ArgumentParser):
18371837
parser.add_argument(
18381838
"--auto-promote-author-did",
18391839
action="store_true",
1840-
env_var="ACAPY_PROMOTE-AUTHOR-DID",
1840+
env_var="ACAPY_AUTO_PROMOTE_AUTHOR_DID",
18411841
help="For Authors, specify whether to automatically promote"
18421842
" a DID to the wallet public DID after writing to the ledger.",
18431843
)

aries_cloudagent/core/conductor.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,7 @@ async def start(self) -> None:
450450
if mediation_connections_invite
451451
else OutOfBandManager(self.root_profile)
452452
)
453-
454-
conn_record = await mgr.receive_invitation(
453+
record = await mgr.receive_invitation(
455454
invitation=invitation_handler.from_url(
456455
mediation_invite_record.invite
457456
),
@@ -464,10 +463,10 @@ async def start(self) -> None:
464463
).mark_default_invite_as_used()
465464
)
466465

467-
await conn_record.metadata_set(
466+
await record.metadata_set(
468467
session, MediationManager.SEND_REQ_AFTER_CONNECTION, True
469468
)
470-
await conn_record.metadata_set(
469+
await record.metadata_set(
471470
session, MediationManager.SET_TO_DEFAULT_ON_GRANTED, True
472471
)
473472

aries_cloudagent/core/dispatcher.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,10 @@ async def make_message(
296296
if not isinstance(parsed_msg, dict):
297297
raise MessageParseError("Expected a JSON object")
298298
message_type = parsed_msg.get("@type")
299-
message_type_rec_version = get_version_from_message_type(message_type)
300299

301300
if not message_type:
302301
raise MessageParseError("Message does not contain '@type' parameter")
302+
message_type_rec_version = get_version_from_message_type(message_type)
303303

304304
registry: ProtocolRegistry = self.profile.inject(ProtocolRegistry)
305305
try:

aries_cloudagent/core/tests/test_conductor.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from ...protocols.coordinate_mediation.v1_0.models.mediation_record import (
2222
MediationRecord,
2323
)
24+
from ...protocols.out_of_band.v1_0.models.oob_record import OobRecord
2425
from ...resolver.did_resolver import DIDResolver
2526
from ...storage.base import BaseStorage
2627
from ...storage.error import StorageNotFoundError
@@ -1155,7 +1156,9 @@ async def test_mediator_invitation_0434(self, mock_from_url, _):
11551156
"test": async_mock.MagicMock(schemes=["http"])
11561157
}
11571158
await conductor.setup()
1158-
1159+
conductor.root_profile.context.update_settings(
1160+
{"mediation.connections_invite": False}
1161+
)
11591162
conn_record = ConnRecord(
11601163
invitation_key="3Dn1SJNPaCXcvvJvSbsFWP2xaCjMom3can8CQNhWrTRx",
11611164
their_label="Hello",
@@ -1164,12 +1167,20 @@ async def test_mediator_invitation_0434(self, mock_from_url, _):
11641167
)
11651168
conn_record.accept = ConnRecord.ACCEPT_MANUAL
11661169
await conn_record.save(await conductor.root_profile.session())
1170+
invitation = test_module.InvitationMessage()
1171+
oob_record = OobRecord(
1172+
invitation=invitation,
1173+
invi_msg_id=invitation._id,
1174+
role=OobRecord.ROLE_RECEIVER,
1175+
connection_id=conn_record.connection_id,
1176+
state=OobRecord.STATE_INITIAL,
1177+
)
11671178
with async_mock.patch.object(
11681179
test_module,
11691180
"OutOfBandManager",
11701181
async_mock.MagicMock(
11711182
return_value=async_mock.MagicMock(
1172-
receive_invitation=async_mock.AsyncMock(return_value=conn_record)
1183+
receive_invitation=async_mock.AsyncMock(return_value=oob_record)
11731184
)
11741185
),
11751186
) as mock_mgr, async_mock.patch.object(
@@ -1179,6 +1190,7 @@ async def test_mediator_invitation_0434(self, mock_from_url, _):
11791190
return_value=async_mock.MagicMock(value=f"v{__version__}")
11801191
),
11811192
):
1193+
assert not conductor.root_profile.settings["mediation.connections_invite"]
11821194
await conductor.start()
11831195
await conductor.stop()
11841196
mock_from_url.assert_called_once_with("test-invite")

aries_cloudagent/ledger/routes.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
TransactionManagerError,
2727
)
2828
from ..protocols.endorse_transaction.v1_0.models.transaction_record import (
29+
TransactionRecord,
2930
TransactionRecordSchema,
3031
)
3132
from ..protocols.endorse_transaction.v1_0.util import (
@@ -295,18 +296,29 @@ async def register_ledger_nym(request: web.BaseRequest):
295296
)
296297
endorser_did = endorser_info["endorser_did"]
297298

299+
meta_data = {"did": did, "verkey": verkey, "alias": alias, "role": role}
298300
success = False
299301
txn = None
300302
async with ledger:
301303
try:
302-
(success, txn) = await ledger.register_nym(
303-
did,
304-
verkey,
305-
alias,
306-
role,
307-
write_ledger=write_ledger,
308-
endorser_did=endorser_did,
309-
)
304+
# if we are an author check if we have a public DID or not
305+
write_ledger_nym_transaction = True
306+
# special case - if we are an author with no public DID
307+
if create_transaction_for_endorser:
308+
public_info = await ledger.get_wallet_public_did()
309+
if not public_info:
310+
write_ledger_nym_transaction = False
311+
success = False
312+
txn = {"signed_txn": json.dumps(meta_data)}
313+
if write_ledger_nym_transaction:
314+
(success, txn) = await ledger.register_nym(
315+
did,
316+
verkey,
317+
alias,
318+
role,
319+
write_ledger=write_ledger,
320+
endorser_did=endorser_did,
321+
)
310322
except LedgerTransactionError as err:
311323
raise web.HTTPForbidden(reason=err.roll_up)
312324
except LedgerError as err:
@@ -321,7 +333,6 @@ async def register_ledger_nym(request: web.BaseRequest):
321333
)
322334
)
323335

324-
meta_data = {"did": did, "verkey": verkey, "alias": alias, "role": role}
325336
if not create_transaction_for_endorser:
326337
# Notify event
327338
await notify_register_did_event(context.profile, did, meta_data)
@@ -340,12 +351,21 @@ async def register_ledger_nym(request: web.BaseRequest):
340351
# if auto-request, send the request to the endorser
341352
if context.settings.get_value("endorser.auto_request"):
342353
try:
354+
endorser_write_txn = not write_ledger_nym_transaction
343355
transaction, transaction_request = await transaction_mgr.create_request(
344356
transaction=transaction,
357+
author_goal_code=TransactionRecord.REGISTER_PUBLIC_DID
358+
if endorser_write_txn
359+
else None,
360+
signer_goal_code=TransactionRecord.WRITE_DID_TRANSACTION
361+
if endorser_write_txn
362+
else None,
363+
endorser_write_txn=endorser_write_txn,
345364
# TODO see if we need to parameterize these params
346365
# expires_time=expires_time,
347366
# endorser_write_txn=endorser_write_txn,
348367
)
368+
txn = transaction.serialize()
349369
except (StorageError, TransactionManagerError) as err:
350370
raise web.HTTPBadRequest(reason=err.roll_up) from err
351371

aries_cloudagent/ledger/tests/test_routes.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,50 @@ async def test_register_nym_create_transaction_for_endorser(self):
359359
{"success": True, "txn": {"signed_txn": {"...": "..."}}}
360360
)
361361

362+
async def test_register_nym_create_transaction_for_endorser_no_public_did(self):
363+
self.request.query = {
364+
"did": "a_test_did",
365+
"verkey": "a_test_verkey",
366+
"alias": "did_alias",
367+
"role": "reset",
368+
"create_transaction_for_endorser": "true",
369+
"conn_id": "dummy",
370+
}
371+
self.profile.context.settings["endorser.author"] = True
372+
373+
with async_mock.patch.object(
374+
ConnRecord, "retrieve_by_id", async_mock.AsyncMock()
375+
) as mock_conn_rec_retrieve, async_mock.patch.object(
376+
test_module, "TransactionManager", async_mock.MagicMock()
377+
) as mock_txn_mgr, async_mock.patch.object(
378+
test_module.web, "json_response", async_mock.MagicMock()
379+
) as mock_response:
380+
mock_txn_mgr.return_value = async_mock.MagicMock(
381+
create_record=async_mock.AsyncMock(
382+
return_value=async_mock.MagicMock(
383+
serialize=async_mock.MagicMock(return_value={"...": "..."})
384+
)
385+
)
386+
)
387+
mock_conn_rec_retrieve.return_value = async_mock.MagicMock(
388+
metadata_get=async_mock.AsyncMock(
389+
return_value={
390+
"endorser_did": ("did"),
391+
"endorser_name": ("name"),
392+
}
393+
)
394+
)
395+
self.ledger.register_nym.return_value: Tuple[bool, dict] = (
396+
True,
397+
{"signed_txn": {"...": "..."}},
398+
)
399+
400+
result = await test_module.register_ledger_nym(self.request)
401+
assert result == mock_response.return_value
402+
mock_response.assert_called_once_with(
403+
{"success": True, "txn": {"signed_txn": {"...": "..."}}}
404+
)
405+
362406
async def test_register_nym_create_transaction_for_endorser_storage_x(self):
363407
self.request.query = {
364408
"did": "a_test_did",

0 commit comments

Comments
 (0)