Skip to content

Commit 1c92c0c

Browse files
author
Yuki I
committed
fix: resolve the error related to profile context switching
Signed-off-by: Yuki I <omoge.real@gmail.com>
1 parent 8a83571 commit 1c92c0c

File tree

2 files changed

+106
-51
lines changed

2 files changed

+106
-51
lines changed

acapy_agent/anoncreds/default/legacy_indy/registry.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,7 @@ async def _revoc_reg_entry_with_fix(
823823
rev_list.issuer_id,
824824
write_ledger=write_ledger,
825825
endorser_did=endorser_did,
826+
profile=profile,
826827
)
827828
except LedgerTransactionError as err:
828829
if "InvalidClientRequest" in err.roll_up:
@@ -1209,20 +1210,23 @@ async def txn_submit(
12091210
taa_accept: Optional[bool] = None,
12101211
sign_did: DIDInfo = sentinel,
12111212
write_ledger: bool = True,
1213+
profile: Optional[Profile] = None,
12121214
) -> str:
12131215
"""Submit a transaction to the ledger."""
12141216

12151217
try:
12161218
async with ledger:
1217-
return await shield(
1218-
ledger.txn_submit(
1219-
ledger_transaction,
1220-
sign=sign,
1221-
taa_accept=taa_accept,
1222-
sign_did=sign_did,
1223-
write_ledger=write_ledger,
1224-
)
1225-
)
1219+
kwargs = {
1220+
"sign": sign,
1221+
"taa_accept": taa_accept,
1222+
"sign_did": sign_did,
1223+
"write_ledger": write_ledger,
1224+
}
1225+
1226+
if profile is not None:
1227+
kwargs["profile"] = profile
1228+
1229+
return await shield(ledger.txn_submit(ledger_transaction, **kwargs))
12261230
except LedgerError as err:
12271231
raise AnonCredsRegistrationError(err.roll_up) from err
12281232

acapy_agent/ledger/indy_vdr.py

Lines changed: 93 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ async def _submit(
312312
taa_accept: Optional[bool] = None,
313313
sign_did: DIDInfo = sentinel,
314314
write_ledger: bool = True,
315+
profile: Optional[Profile] = None, # <-- ADD profile parameter
315316
) -> dict:
316317
"""Sign and submit request to ledger.
317318
@@ -321,9 +322,10 @@ async def _submit(
321322
taa_accept: whether to apply TAA acceptance to the (signed, write) request
322323
sign_did: override the signing DID
323324
write_ledger: whether to write the request to the ledger
324-
325+
profile: The profile context used for the request
325326
"""
326327

328+
current_profile = profile or self.profile
327329
if not self.pool_handle:
328330
raise ClosedPoolError(
329331
f"Cannot sign and submit request to closed pool '{self.pool_name}'"
@@ -336,7 +338,7 @@ async def _submit(
336338

337339
if sign is None or sign:
338340
if sign_did is sentinel:
339-
sign_did = await self.get_wallet_public_did()
341+
sign_did = await self.get_wallet_public_did(profile=current_profile)
340342
if sign is None:
341343
sign = bool(sign_did)
342344

@@ -345,7 +347,9 @@ async def _submit(
345347
raise BadLedgerRequestError("Cannot sign request without a public DID")
346348

347349
if taa_accept or taa_accept is None:
348-
acceptance = await self.get_latest_txn_author_acceptance()
350+
acceptance = await self.get_latest_txn_author_acceptance(
351+
profile=current_profile
352+
)
349353
if acceptance:
350354
acceptance = {
351355
"taaDigest": acceptance["digest"],
@@ -354,12 +358,16 @@ async def _submit(
354358
}
355359
request.set_txn_author_agreement_acceptance(acceptance)
356360

357-
async with self.profile.session() as session:
361+
async with current_profile.session() as session:
358362
wallet = session.inject(BaseWallet)
359-
request.set_signature(
360-
await wallet.sign_message(request.signature_input, sign_did.verkey)
361-
)
362-
del wallet
363+
try:
364+
signature = await wallet.sign_message(
365+
message=request.signature_input,
366+
from_verkey=sign_did.verkey,
367+
)
368+
request.set_signature(signature)
369+
except WalletNotFoundError as e:
370+
raise WalletNotFoundError("Missing key for sign operation") from e
363371

364372
if not write_ledger:
365373
return json.loads(request.body)
@@ -368,6 +376,10 @@ async def _submit(
368376
request_result = await self.pool.handle.submit_request(request)
369377
except VdrError as err:
370378
raise LedgerTransactionError("Ledger request error") from err
379+
except Exception as e:
380+
raise LedgerTransactionError(
381+
"Unexpected error during ledger submission"
382+
) from e
371383

372384
return request_result
373385

@@ -1003,15 +1015,18 @@ async def accept_txn_author_agreement(
10031015
cache_key = TAA_ACCEPTED_RECORD_TYPE + "::" + self.profile.name
10041016
await cache.set(cache_key, acceptance, self.pool.cache_duration)
10051017

1006-
async def get_latest_txn_author_acceptance(self) -> dict:
1018+
async def get_latest_txn_author_acceptance(
1019+
self, profile: Optional[Profile] = None
1020+
) -> dict:
10071021
"""Look up the latest TAA acceptance."""
1008-
cache_key = TAA_ACCEPTED_RECORD_TYPE + "::" + self.profile.name
1022+
current_profile = profile or self.profile
1023+
cache_key = TAA_ACCEPTED_RECORD_TYPE + "::" + current_profile.name
10091024
acceptance = self.pool.cache and await self.pool.cache.get(cache_key)
10101025
if not acceptance:
10111026
tag_filter = {"pool_name": self.pool_name}
1012-
async with self.profile.session() as session:
1027+
async with current_profile.session() as session:
10131028
storage = session.inject(BaseStorage)
1014-
cache = self.profile.inject_or(BaseCache)
1029+
cache = current_profile.inject_or(BaseCache)
10151030
found = await storage.find_all_records(
10161031
TAA_ACCEPTED_RECORD_TYPE, tag_filter
10171032
)
@@ -1226,24 +1241,34 @@ async def send_revoc_reg_entry(
12261241
issuer_did: Optional[str] = None,
12271242
write_ledger: bool = True,
12281243
endorser_did: Optional[str] = None,
1244+
profile: Optional[Profile] = None,
12291245
) -> dict:
12301246
"""Publish a revocation registry entry to the ledger."""
1231-
async with self.profile.session() as session:
1247+
1248+
current_profile = profile or self.profile
1249+
async with current_profile.session() as session:
12321250
wallet = session.inject(BaseWallet)
1233-
if issuer_did:
1234-
did_info = await wallet.get_local_did(issuer_did)
1235-
else:
1251+
try:
12361252
did_info = await wallet.get_public_did()
1237-
del wallet
1253+
except Exception:
1254+
raise
1255+
finally:
1256+
del wallet
1257+
12381258
if not did_info:
12391259
raise LedgerTransactionError(
12401260
"No issuer DID found for revocation registry entry"
12411261
)
12421262

1243-
if self.profile.context.settings.get("wallet.type") == "askar-anoncreds":
1244-
from acapy_agent.anoncreds.default.legacy_indy.registry import (
1245-
LegacyIndyRegistry,
1246-
)
1263+
wallet_type = current_profile.context.settings.get("wallet.type")
1264+
if wallet_type == "askar-anoncreds":
1265+
try:
1266+
from acapy_agent.anoncreds.default.legacy_indy.registry import (
1267+
LegacyIndyRegistry,
1268+
)
1269+
1270+
except ImportError:
1271+
raise
12471272

12481273
revoc_reg_entry_req = await self._create_revoc_reg_entry_request(
12491274
did_info,
@@ -1253,17 +1278,23 @@ async def send_revoc_reg_entry(
12531278
write_ledger=write_ledger,
12541279
endorser_did=endorser_did,
12551280
)
1281+
12561282
if endorser_did and not write_ledger:
1283+
LOGGER.debug("Adding endorser to request")
12571284
revoc_reg_entry_req.set_endorser(endorser_did)
12581285

12591286
legacy_indy_registry = LegacyIndyRegistry()
1260-
resp = await legacy_indy_registry.txn_submit(
1261-
self,
1262-
revoc_reg_entry_req,
1263-
sign=True,
1264-
sign_did=did_info,
1265-
write_ledger=write_ledger,
1266-
)
1287+
try:
1288+
resp = await legacy_indy_registry.txn_submit(
1289+
self,
1290+
revoc_reg_entry_req,
1291+
sign=True,
1292+
sign_did=did_info,
1293+
write_ledger=write_ledger,
1294+
profile=current_profile,
1295+
)
1296+
except Exception:
1297+
raise
12671298

12681299
if not write_ledger:
12691300
return revoc_reg_id, {"signed_txn": resp}
@@ -1284,22 +1315,36 @@ async def send_revoc_reg_entry(
12841315
revoc_def_type,
12851316
json.dumps(revoc_reg_entry),
12861317
)
1318+
12871319
if endorser_did and not write_ledger:
12881320
request.set_endorser(endorser_did)
1321+
12891322
except VdrError as err:
12901323
raise LedgerError(
12911324
"Exception when sending revocation registry entry"
12921325
) from err
1293-
resp = await self._submit(
1294-
request, True, sign_did=did_info, write_ledger=write_ledger
1295-
)
1296-
return {"result": resp}
12971326

1298-
async def get_wallet_public_did(self) -> DIDInfo:
1327+
try:
1328+
resp = await self._submit(
1329+
request,
1330+
True,
1331+
sign_did=did_info,
1332+
write_ledger=write_ledger,
1333+
profile=current_profile,
1334+
)
1335+
return {"result": resp}
1336+
except Exception as err:
1337+
raise LedgerError(
1338+
"Exception when sending revocation registry entry"
1339+
) from err
1340+
1341+
async def get_wallet_public_did(self, profile: Optional[Profile] = None) -> DIDInfo:
12991342
"""Fetch the public DID from the wallet."""
1300-
async with self.profile.session() as session:
1343+
current_profile = profile or self.profile
1344+
async with current_profile.session() as session:
13011345
wallet = session.inject(BaseWallet)
1302-
return await wallet.get_public_did()
1346+
public_did = await wallet.get_public_did()
1347+
return public_did
13031348

13041349
async def txn_endorse(
13051350
self,
@@ -1334,15 +1379,21 @@ async def txn_submit(
13341379
taa_accept: Optional[bool] = None,
13351380
sign_did: DIDInfo = sentinel,
13361381
write_ledger: bool = True,
1382+
profile: Optional[Profile] = None,
13371383
) -> str:
13381384
"""Write the provided (signed and possibly endorsed) transaction to the ledger."""
1339-
resp = await self._submit(
1340-
request_json,
1341-
sign=sign,
1342-
taa_accept=taa_accept,
1343-
sign_did=sign_did,
1344-
write_ledger=write_ledger,
1345-
)
1385+
kwargs = {
1386+
"sign": sign,
1387+
"taa_accept": taa_accept,
1388+
"sign_did": sign_did,
1389+
"write_ledger": write_ledger,
1390+
}
1391+
1392+
if profile:
1393+
kwargs["profile"] = profile
1394+
1395+
resp = await self._submit(request_json, **kwargs)
1396+
13461397
if write_ledger:
13471398
# match the format returned by indy sdk
13481399
resp = {"op": "REPLY", "result": resp}

0 commit comments

Comments
 (0)