Skip to content

Commit 1f51bdf

Browse files
authored
fix(server): handle unwrapped legacy push notification configurations (#821)
# Description Fix the database PushNotificationConfig store when reading legacy data from version 0.3. The store now correctly handles cases when legacy PushNotificationConfig was stored.
1 parent 245eca3 commit 1f51bdf

2 files changed

Lines changed: 28 additions & 21 deletions

File tree

src/a2a/server/tasks/database_push_notification_config_store.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ def _from_orm(
185185
decrypted_payload = self._fernet.decrypt(payload)
186186
return self._parse_config(
187187
decrypted_payload.decode('utf-8'),
188+
model_instance.task_id,
188189
model_instance.protocol_version,
189190
)
190191
except Exception as e:
@@ -218,7 +219,9 @@ def _from_orm(
218219
else payload
219220
)
220221
return self._parse_config(
221-
payload_str, model_instance.protocol_version
222+
payload_str,
223+
model_instance.task_id,
224+
model_instance.protocol_version,
222225
)
223226

224227
except Exception as e:
@@ -341,20 +344,27 @@ async def delete_info(
341344
)
342345

343346
def _parse_config(
344-
self, json_payload: str, protocol_version: str | None = None
347+
self,
348+
json_payload: str,
349+
task_id: str | None = None,
350+
protocol_version: str | None = None,
345351
) -> TaskPushNotificationConfig:
346352
"""Parses a JSON payload into a TaskPushNotificationConfig proto.
347353
348-
Uses protocol_version to decide between modern parsing and legacy conversion.
354+
Args:
355+
json_payload: The JSON payload to parse.
356+
task_id: The unique identifier of the task. Only required for legacy
357+
(0.3) protocol versions.
358+
protocol_version: The protocol version used for serialization.
349359
"""
350360
if protocol_version == '1.0':
351361
return Parse(json_payload, TaskPushNotificationConfig())
352-
353-
legacy_instance = (
354-
types_v03.TaskPushNotificationConfig.model_validate_json(
355-
json_payload
356-
)
362+
inner_config = types_v03.PushNotificationConfig.model_validate_json(
363+
json_payload
357364
)
358365
return conversions.to_core_task_push_notification_config(
359-
legacy_instance
366+
types_v03.TaskPushNotificationConfig(
367+
task_id=task_id or '',
368+
push_notification_config=inner_config,
369+
)
360370
)

tests/server/tasks/test_database_push_notification_config_store.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,10 @@ async def test_set_and_get_info_multiple_configs(
220220

221221
task_id = 'task-1'
222222
config1 = TaskPushNotificationConfig(
223-
id='config-1', url='http://example.com/1'
223+
id='config-1', task_id=task_id, url='http://example.com/1'
224224
)
225225
config2 = TaskPushNotificationConfig(
226-
id='config-2', url='http://example.com/2'
226+
id='config-2', task_id=task_id, url='http://example.com/2'
227227
)
228228

229229
await db_store_parameterized.set_info(
@@ -738,16 +738,13 @@ async def test_get_0_3_push_notification_config_detailed(
738738
context_user = ServerCallContext(user=SampleUser(user_name=owner))
739739

740740
# 1. Create a legacy PushNotificationConfig using v0.3 models
741-
legacy_config = types_v03.TaskPushNotificationConfig(
742-
task_id=task_id,
743-
push_notification_config=types_v03.PushNotificationConfig(
744-
id=config_id,
745-
url='https://example.com/push',
746-
token='legacy-token',
747-
authentication=types_v03.PushNotificationAuthenticationInfo(
748-
schemes=['bearer'],
749-
credentials='legacy-creds',
750-
),
741+
legacy_config = types_v03.PushNotificationConfig(
742+
id=config_id,
743+
url='https://example.com/push',
744+
token='legacy-token',
745+
authentication=types_v03.PushNotificationAuthenticationInfo(
746+
schemes=['bearer'],
747+
credentials='legacy-creds',
751748
),
752749
)
753750

0 commit comments

Comments
 (0)