Skip to content

Commit 780bcdd

Browse files
committed
fixes
1 parent b46ac62 commit 780bcdd

File tree

4 files changed

+26
-51
lines changed

4 files changed

+26
-51
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ async def webhook(request: Request):
123123

124124
verified_webhook: Webhook = verify_webhook_event_signature(
125125
body=body,
126-
signature=signature,
127126
timestamp=timestamp,
128127
secret=SECRET_KEY,
128+
expected_signature=signature,
129129
)
130130

131131
if verified_webhook is not None:

examples/webhooks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def main() -> None:
4949

5050
verified_webhook = verify_webhook_event_signature(
5151
body=evt,
52-
signature=signature,
52+
expected_signature=signature,
5353
timestamp=timestamp,
5454
secret=SECRET,
5555
)

src/browser_use_sdk/lib/webhooks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def create_webhook_signature(payload: Any, timestamp: str, secret: str) -> str:
7878

7979
def verify_webhook_event_signature(
8080
body: Union[Dict[str, Any], str],
81-
signature: str,
81+
expected_signature: str,
8282
timestamp: str,
8383
#
8484
secret: str,
@@ -127,7 +127,7 @@ def verify_webhook_event_signature(
127127
payload=webhook_event.payload.model_dump(), timestamp=timestamp, secret=secret
128128
)
129129

130-
if not hmac.compare_digest(signature, expected_signature):
130+
if not hmac.compare_digest(expected_signature, expected_signature):
131131
return None
132132

133133
return webhook_event

tests/test_webhooks.py

Lines changed: 22 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
from browser_use_sdk.lib.webhooks import (
99
WebhookTest,
1010
WebhookTestPayload,
11-
WebhookAgentTaskStatusUpdate,
12-
WebhookAgentTaskStatusUpdatePayload,
1311
create_webhook_signature,
1412
verify_webhook_event_signature,
1513
)
@@ -23,17 +21,15 @@ def test_create_webhook_signature() -> None:
2321

2422
signature = create_webhook_signature(payload, timestamp, secret)
2523

26-
# Signature should be a hex string
2724
assert isinstance(signature, str)
28-
assert len(signature) == 64 # SHA256 hex length
25+
assert len(signature) == 64
2926

30-
# Same inputs should produce same signature
3127
signature2 = create_webhook_signature(payload, timestamp, secret)
3228
assert signature == signature2
3329

34-
# Different payload should produce different signature
3530
different_payload = {"test": "different"}
3631
different_signature = create_webhook_signature(different_payload, timestamp, secret)
32+
3733
assert signature != different_signature
3834

3935

@@ -51,7 +47,10 @@ def test_verify_webhook_event_signature_valid() -> None:
5147

5248
# Verify signature
5349
verified_webhook = verify_webhook_event_signature(
54-
body=webhook.model_dump(), secret=secret, signature=signature, timestamp=timestamp
50+
body=webhook.model_dump(),
51+
secret=secret,
52+
timestamp=timestamp,
53+
expected_signature=signature,
5554
)
5655

5756
assert verified_webhook is not None
@@ -68,67 +67,43 @@ def test_verify_webhook_event_signature_invalid_signature() -> None:
6867
payload = WebhookTestPayload(test="ok")
6968
webhook = WebhookTest(type="test", timestamp=datetime.now(timezone.utc), payload=payload)
7069

71-
# Use invalid signature
72-
invalid_signature = "invalid_signature_123"
73-
7470
verified_webhook = verify_webhook_event_signature(
75-
body=webhook.model_dump(), secret=secret, signature=invalid_signature, timestamp=timestamp
71+
body=webhook.model_dump(),
72+
secret=secret,
73+
timestamp=timestamp,
74+
expected_signature="random_invalid_signature",
7675
)
7776

7877
assert verified_webhook is None
7978

8079

8180
def test_verify_webhook_event_signature_wrong_secret() -> None:
8281
"""Test webhook signature verification with wrong secret."""
83-
secret = "test-secret-key"
84-
wrong_secret = "wrong-secret-key"
82+
8583
timestamp = "2023-01-01T00:00:00Z"
8684

8785
# Create test webhook
8886
payload = WebhookTestPayload(test="ok")
8987
webhook = WebhookTest(type="test", timestamp=datetime.now(timezone.utc), payload=payload)
9088

9189
# Create signature with correct secret
92-
signature = create_webhook_signature(webhook.payload.model_dump(), timestamp, secret)
90+
signature = create_webhook_signature(
91+
payload=webhook.payload.model_dump(),
92+
timestamp=timestamp,
93+
secret="test-secret-key",
94+
)
9395

9496
# Verify with wrong secret
9597
verified_webhook = verify_webhook_event_signature(
96-
body=webhook.model_dump(), secret=wrong_secret, signature=signature, timestamp=timestamp
98+
body=webhook.model_dump(),
99+
secret="wrong-secret-key",
100+
timestamp=timestamp,
101+
expected_signature=signature,
97102
)
98103

99104
assert verified_webhook is None
100105

101106

102-
def test_verify_webhook_event_signature_agent_task_status_update() -> None:
103-
"""Test webhook signature verification for agent task status update."""
104-
secret = "test-secret-key"
105-
timestamp = "2023-01-01T00:00:00Z"
106-
107-
# Create agent task status update webhook
108-
payload = WebhookAgentTaskStatusUpdatePayload(
109-
session_id="sess_123", task_id="task_456", status="started", metadata={"progress": 25}
110-
)
111-
112-
webhook = WebhookAgentTaskStatusUpdate(
113-
type="agent.task.status_update", timestamp=datetime.now(timezone.utc), payload=payload
114-
)
115-
116-
# Create signature
117-
signature = create_webhook_signature(webhook.payload.model_dump(), timestamp, secret)
118-
119-
# Verify signature
120-
verified_webhook = verify_webhook_event_signature(
121-
body=webhook.model_dump(), secret=secret, signature=signature, timestamp=timestamp
122-
)
123-
124-
assert verified_webhook is not None
125-
assert isinstance(verified_webhook, WebhookAgentTaskStatusUpdate)
126-
assert verified_webhook.payload.session_id == "sess_123"
127-
assert verified_webhook.payload.status == "started"
128-
assert verified_webhook.payload.metadata is not None
129-
assert verified_webhook.payload.metadata["progress"] == 25
130-
131-
132107
def test_verify_webhook_event_signature_string_body() -> None:
133108
"""Test webhook signature verification with string body."""
134109
secret = "test-secret-key"
@@ -143,7 +118,7 @@ def test_verify_webhook_event_signature_string_body() -> None:
143118

144119
# Verify with string body
145120
verified_webhook = verify_webhook_event_signature(
146-
body=webhook.model_dump(), secret=secret, signature=signature, timestamp=timestamp
121+
body=webhook.model_dump(), secret=secret, expected_signature=signature, timestamp=timestamp
147122
)
148123

149124
assert verified_webhook is not None
@@ -159,7 +134,7 @@ def test_verify_webhook_event_signature_invalid_body() -> None:
159134
invalid_body: Dict[str, Any] = {"type": "invalid_type", "timestamp": "invalid", "payload": {}}
160135

161136
verified_webhook = verify_webhook_event_signature(
162-
body=invalid_body, secret=secret, signature="some_signature", timestamp=timestamp
137+
body=invalid_body, secret=secret, expected_signature="some_signature", timestamp=timestamp
163138
)
164139

165140
assert verified_webhook is None

0 commit comments

Comments
 (0)