Skip to content

Commit c2ed012

Browse files
jamshaleff137dbluhm
authored
1.2.lts.patch (#3816)
* Don't run workflow for release candidates Signed-off-by: jamshale <jamiehalebc@gmail.com> * Put cred_rev_id read, increment and write in a transaction Signed-off-by: jamshale <jamiehalebc@gmail.com> * Remove header from http/ws responses Signed-off-by: jamshale <jamiehalebc@gmail.com> * 🐛 Fix: emit_event should be lazy by default (#3699) Signed-off-by: ff137 <ff137@proton.me> Signed-off-by: jamshale <jamiehalebc@gmail.com> * fix: multiuse invite derived conns should have msg id Signed-off-by: Daniel Bluhm <dbluhm@pm.me> Signed-off-by: jamshale <jamiehalebc@gmail.com> * 🐛 Fix unchanged endpoint being rewritten to ledger (#3608) Resolves #3607 Signed-off-by: ff137 <ff137@proton.me> Signed-off-by: jamshale <jamiehalebc@gmail.com> * Poetry update Signed-off-by: jamshale <jamiehalebc@gmail.com> --------- Signed-off-by: jamshale <jamiehalebc@gmail.com> Signed-off-by: ff137 <ff137@proton.me> Signed-off-by: Daniel Bluhm <dbluhm@pm.me> Co-authored-by: Mourits de Beer <31511766+ff137@users.noreply.github.com> Co-authored-by: Daniel Bluhm <dbluhm@pm.me>
1 parent 4d84780 commit c2ed012

15 files changed

Lines changed: 1475 additions & 1193 deletions

File tree

acapy_agent/admin/server.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from ..transport.queue.basic import BasicMessageQueue
3131
from ..utils import general as general_utils
3232
from ..utils.extract_validation_error import extract_validation_error_message
33+
from ..utils.server import remove_unwanted_headers
3334
from ..utils.stats import Collector
3435
from ..utils.task_queue import TaskQueue
3536
from ..version import __version__
@@ -387,6 +388,8 @@ async def setup_context(request: web.Request, handler):
387388
]
388389
app.add_routes(server_routes)
389390

391+
app.on_response_prepare.append(remove_unwanted_headers)
392+
390393
plugin_registry = self.context.inject_or(PluginRegistry)
391394
if plugin_registry:
392395
await plugin_registry.register_admin_routes(app)

acapy_agent/admin/tests/test_admin_server.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,20 @@ async def test_server_health_state(self):
529529
assert response.status == 503
530530
await server.stop()
531531

532+
async def test_server_aiohttp_headers_removed(self):
533+
settings = {
534+
"admin.admin_insecure_mode": True,
535+
}
536+
server = await self.get_admin_server(settings)
537+
await server.start()
538+
539+
async with self.client_session.get(
540+
f"http://127.0.0.1:{self.port}/status/live", headers={}
541+
) as response:
542+
assert response.headers.get("Server") is None
543+
544+
await server.stop()
545+
532546
async def test_upgrade_middleware(self):
533547
profile = await create_test_profile()
534548
self.context = AdminRequestContext.test_context({}, profile)

acapy_agent/anoncreds/revocation.py

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,46 +1001,49 @@ def _has_required_id_and_tails_path():
10011001
rev_list = None
10021002

10031003
if _has_required_id_and_tails_path():
1004-
async with self.profile.session() as session:
1005-
rev_reg_def = await session.handle.fetch(
1006-
CATEGORY_REV_REG_DEF, rev_reg_def_id
1007-
)
1008-
rev_list = await session.handle.fetch(CATEGORY_REV_LIST, rev_reg_def_id)
1009-
rev_key = await session.handle.fetch(
1004+
# We need to make sure the read, index increment, and write
1005+
# operations are done in a transaction.
1006+
# TODO: This isn't fully atomic in a clustered environment as the
1007+
# read transaction may happen concurrently with another.
1008+
async with self.profile.transaction() as txn:
1009+
rev_reg_def = await txn.handle.fetch(CATEGORY_REV_REG_DEF, rev_reg_def_id)
1010+
rev_list = await txn.handle.fetch(CATEGORY_REV_LIST, rev_reg_def_id)
1011+
rev_key = await txn.handle.fetch(
10101012
CATEGORY_REV_REG_DEF_PRIVATE, rev_reg_def_id
10111013
)
10121014

1013-
_handle_missing_entries(rev_list, rev_reg_def, rev_key)
1015+
_handle_missing_entries(rev_list, rev_reg_def, rev_key)
10141016

1015-
rev_list_value_json = rev_list.value_json
1016-
rev_list_tags = rev_list.tags
1017+
rev_list_value_json = rev_list.value_json
1018+
rev_list_tags = rev_list.tags
10171019

1018-
# If the rev_list state is failed then the tails file was never uploaded,
1019-
# try to upload it now and finish the revocation list
1020-
if rev_list_tags.get("state") == RevListState.STATE_FAILED:
1021-
await self.upload_tails_file(
1022-
RevRegDef.deserialize(rev_reg_def.value_json)
1023-
)
1024-
rev_list_tags["state"] = RevListState.STATE_FINISHED
1025-
1026-
rev_reg_index = rev_list_value_json["next_index"]
1027-
try:
1028-
rev_reg_def = RevocationRegistryDefinition.load(rev_reg_def.raw_value)
1029-
rev_list = RevocationStatusList.load(rev_list_value_json["rev_list"])
1030-
except AnoncredsError as err:
1031-
raise AnonCredsRevocationError(
1032-
"Error loading revocation registry"
1033-
) from err
1020+
# If the rev_list state is failed then the tails file was never uploaded,
1021+
# try to upload it now and finish the revocation list
1022+
if rev_list_tags.get("state") == RevListState.STATE_FAILED:
1023+
await self.upload_tails_file(
1024+
RevRegDef.deserialize(rev_reg_def.value_json)
1025+
)
1026+
rev_list_tags["state"] = RevListState.STATE_FINISHED
10341027

1035-
# NOTE: we increment the index ahead of time to keep the
1036-
# transaction short. The revocation registry itself will NOT
1037-
# be updated because we always use ISSUANCE_BY_DEFAULT.
1038-
# If something goes wrong later, the index will be skipped.
1039-
# FIXME - double check issuance type in case of upgraded wallet?
1040-
if rev_reg_index > rev_reg_def.max_cred_num:
1041-
raise AnonCredsRevocationRegistryFullError("Revocation registry is full")
1042-
rev_list_value_json["next_index"] = rev_reg_index + 1
1043-
async with self.profile.transaction() as txn:
1028+
rev_reg_index = rev_list_value_json["next_index"]
1029+
try:
1030+
rev_reg_def = RevocationRegistryDefinition.load(rev_reg_def.raw_value)
1031+
rev_list = RevocationStatusList.load(rev_list_value_json["rev_list"])
1032+
except AnoncredsError as err:
1033+
raise AnonCredsRevocationError(
1034+
"Error loading revocation registry"
1035+
) from err
1036+
1037+
# NOTE: we increment the index ahead of time to keep the
1038+
# transaction short. The revocation registry itself will NOT
1039+
# be updated because we always use ISSUANCE_BY_DEFAULT.
1040+
# If something goes wrong later, the index will be skipped.
1041+
# FIXME - double check issuance type in case of upgraded wallet?
1042+
if rev_reg_index > rev_reg_def.max_cred_num:
1043+
raise AnonCredsRevocationRegistryFullError(
1044+
"Revocation registry is full"
1045+
)
1046+
rev_list_value_json["next_index"] = rev_reg_index + 1
10441047
await txn.handle.replace(
10451048
CATEGORY_REV_LIST,
10461049
rev_reg_def_id,

acapy_agent/ledger/indy_vdr.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,7 @@ async def update_endpoint_for_did(
724724
endorser_did: DID of the endorser to use for the transaction
725725
routing_keys: List of routing keys
726726
"""
727+
routing_keys = routing_keys or [] # Ensure list type if None was passed
727728
public_info = await self.get_wallet_public_did()
728729
if not public_info:
729730
raise BadLedgerRequestError(
@@ -742,8 +743,13 @@ async def update_endpoint_for_did(
742743
existing_routing_keys = (
743744
all_exist_endpoints.get("routingKeys") if all_exist_endpoints else None
744745
)
746+
existing_routing_keys = existing_routing_keys or []
745747

746-
if exist_endpoint_of_type != endpoint or existing_routing_keys != routing_keys:
748+
endpoint_changed = exist_endpoint_of_type != endpoint
749+
routing_keys_changed = set(existing_routing_keys) != set(routing_keys)
750+
751+
if endpoint_changed or routing_keys_changed:
752+
LOGGER.info("Endpoint or routing keys have changed, updating endpoint")
747753
if self.read_only:
748754
raise LedgerError(
749755
"Error cannot update endpoint when ledger is in read only mode"

acapy_agent/protocols/didexchange/v1_0/manager.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,7 @@ async def _derive_new_conn_from_multiuse_invitation(
759759
"""
760760
new_conn_rec = ConnRecord(
761761
invitation_key=conn_rec.invitation_key,
762+
invitation_msg_id=conn_rec.invitation_msg_id,
762763
state=ConnRecord.State.INIT.rfc160,
763764
accept=conn_rec.accept,
764765
their_role=conn_rec.their_role,

acapy_agent/protocols/issue_credential/v2_0/models/cred_ex_record.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ async def emit_event(self, session: ProfileSession, payload: Optional[Any] = Non
207207
payload = V20CredExRecordWebhook(**payload)
208208
payload = payload.__dict__
209209

210-
await session.profile.notify(topic, payload)
210+
await session.emit_event(topic, payload)
211211

212212
@property
213213
def record_value(self) -> Mapping:

acapy_agent/protocols/present_proof/v2_0/models/pres_exchange.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ async def emit_event(self, session: ProfileSession, payload: Optional[Any] = Non
205205
payload = V20PresExRecordWebhook(**payload)
206206
payload = payload.__dict__
207207

208-
await session.profile.notify(topic, payload)
208+
await session.emit_event(topic, payload)
209209

210210
@property
211211
def record_value(self) -> Mapping:

acapy_agent/transport/inbound/http.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from aiohttp import web
66

77
from ...messaging.error import MessageParseError
8+
from ...utils.server import remove_unwanted_headers
89
from ..error import WireFormatParseError
910
from ..wire_format import DIDCOMM_V0_MIME_TYPE, DIDCOMM_V1_MIME_TYPE
1011
from .base import BaseInboundTransport, InboundTransportSetupError
@@ -38,6 +39,7 @@ async def make_application(self) -> web.Application:
3839
app = web.Application(**app_args)
3940
app.add_routes([web.get("/", self.invite_message_handler)])
4041
app.add_routes([web.post("/", self.inbound_message_handler)])
42+
app.on_response_prepare.append(remove_unwanted_headers)
4143
return app
4244

4345
async def start(self) -> None:

acapy_agent/transport/inbound/tests/test_http_transport.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ async def test_send_receive_message(self):
106106

107107
async with self.client.post("/", json=test_message) as resp:
108108
assert await resp.json() == {"response": "ok"}
109+
# Assert that Server header is cleared
110+
assert resp.headers.get("Server") is None
109111

110112
await self.transport.stop()
111113

acapy_agent/transport/inbound/tests/test_ws_transport.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,7 @@ async def test_message_and_response(self):
101101
result = await asyncio.wait_for(ws.receive_json(), 1.0)
102102
assert result == {"response": "ok"}
103103

104+
# Check the Server header is removed
105+
assert "Server" not in ws._response.headers
106+
104107
await self.transport.stop()

0 commit comments

Comments
 (0)