Skip to content

Commit b31dd94

Browse files
authored
Merge branch 'main' into feature/enable-aggr-vcs
2 parents 65a1099 + c66ee16 commit b31dd94

14 files changed

Lines changed: 471 additions & 87 deletions

File tree

aries_cloudagent/core/conductor.py

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
from ..config.logging import LoggingConfigurator
2727
from ..config.provider import ClassProvider
2828
from ..config.wallet import wallet_config
29-
from ..connections.models.conn_record import ConnRecord
3029
from ..core.profile import Profile
3130
from ..indy.verifier import IndyVerifier
3231
from ..ledger.base import BaseLedger
@@ -451,33 +450,23 @@ async def start(self) -> None:
451450
if mediation_connections_invite
452451
else OutOfBandManager(self.root_profile)
453452
)
454-
async with self.root_profile.session() as session:
455-
invitation = invitation_handler.from_url(
453+
record = await mgr.receive_invitation(
454+
invitation=invitation_handler.from_url(
456455
mediation_invite_record.invite
457-
)
458-
if isinstance(mgr, OutOfBandManager):
459-
oob_record = await mgr.receive_invitation(
460-
invitation=invitation,
461-
auto_accept=True,
462-
)
463-
conn_record = await ConnRecord.retrieve_by_id(
464-
session, oob_record.connection_id
465-
)
466-
else:
467-
conn_record = await mgr.receive_invitation(
468-
invitation=invitation,
469-
auto_accept=True,
470-
)
456+
),
457+
auto_accept=True,
458+
)
459+
async with self.root_profile.session() as session:
471460
await (
472461
MediationInviteStore(
473462
session.context.inject(BaseStorage)
474463
).mark_default_invite_as_used()
475464
)
476465

477-
await conn_record.metadata_set(
466+
await record.metadata_set(
478467
session, MediationManager.SEND_REQ_AFTER_CONNECTION, True
479468
)
480-
await conn_record.metadata_set(
469+
await record.metadata_set(
481470
session, MediationManager.SET_TO_DEFAULT_ON_GRANTED, True
482471
)
483472

aries_cloudagent/core/tests/test_conductor.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from ...protocols.coordinate_mediation.v1_0.models.mediation_record import (
2525
MediationRecord,
2626
)
27+
from ...protocols.out_of_band.v1_0.models.oob_record import OobRecord
2728
from ...resolver.did_resolver import DIDResolver
2829
from ...multitenant.base import BaseMultitenantManager
2930
from ...multitenant.manager import MultitenantManager
@@ -1172,8 +1173,13 @@ async def test_mediator_invitation_0434(self, mock_from_url, _):
11721173
)
11731174
conn_record.accept = ConnRecord.ACCEPT_MANUAL
11741175
await conn_record.save(await conductor.root_profile.session())
1175-
oob_record = async_mock.MagicMock(
1176+
invitation = test_module.InvitationMessage()
1177+
oob_record = OobRecord(
1178+
invitation=invitation,
1179+
invi_msg_id=invitation._id,
1180+
role=OobRecord.ROLE_RECEIVER,
11761181
connection_id=conn_record.connection_id,
1182+
state=OobRecord.STATE_INITIAL,
11771183
)
11781184
with async_mock.patch.object(
11791185
test_module,
@@ -1194,6 +1200,7 @@ async def test_mediator_invitation_0434(self, mock_from_url, _):
11941200
await conductor.start()
11951201
await conductor.stop()
11961202
mock_from_url.assert_called_once_with("test-invite")
1203+
mock_mgr.return_value.receive_invitation.assert_called_once()
11971204

11981205
@async_mock.patch.object(test_module, "MediationInviteStore")
11991206
@async_mock.patch.object(test_module.ConnectionInvitation, "from_url")

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",

aries_cloudagent/protocols/endorse_transaction/v1_0/controller.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
ENDORSE_TRANSACTION = "aries.transaction.endorse"
66
REFUSE_TRANSACTION = "aries.transaction.refuse"
77
WRITE_TRANSACTION = "aries.transaction.ledger.write"
8+
WRITE_TRANSACTION = "aries.transaction.ledger.write"
9+
WRITE_DID_TRANSACTION = "aries.transaction.ledger.write_did"
10+
REGISTER_PUBLIC_DID = "aries.transaction.register_public_did"
811

912

1013
class Controller:
@@ -15,4 +18,10 @@ def __init__(self, protocol: str):
1518

1619
def determine_goal_codes(self) -> Sequence[str]:
1720
"""Return defined goal_codes."""
18-
return [ENDORSE_TRANSACTION, REFUSE_TRANSACTION, WRITE_TRANSACTION]
21+
return [
22+
ENDORSE_TRANSACTION,
23+
REFUSE_TRANSACTION,
24+
WRITE_TRANSACTION,
25+
WRITE_DID_TRANSACTION,
26+
REGISTER_PUBLIC_DID,
27+
]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ async def handle(self, context: RequestContext, responder: BaseResponder):
4545
(
4646
transaction,
4747
transaction_acknowledgement_message,
48-
) = await mgr.complete_transaction(transaction=transaction)
48+
) = await mgr.complete_transaction(transaction, False)
4949

5050
await responder.send_reply(
5151
transaction_acknowledgement_message,

0 commit comments

Comments
 (0)