Skip to content

Commit c58681f

Browse files
committed
fix standard webhooks signature: use dot separators per spec
1 parent 70e6e2a commit c58681f

1 file changed

Lines changed: 9 additions & 6 deletions

File tree

crates/forge-runtime/src/webhook/handler.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use axum::{
1010
http::{HeaderMap, StatusCode},
1111
response::IntoResponse,
1212
};
13-
use base64::{Engine as _, engine::{DecodePaddingMode, GeneralPurpose, GeneralPurposeConfig, general_purpose}};
13+
use base64::{
14+
Engine as _,
15+
engine::{DecodePaddingMode, GeneralPurpose, GeneralPurposeConfig, general_purpose},
16+
};
1417
use ed25519_dalek::{Signature as Ed25519Signature, Verifier as _, VerifyingKey};
1518
use forge_core::CircuitBreakerClient;
1619
use forge_core::function::JobDispatch;
@@ -382,12 +385,12 @@ fn validate_standard_webhooks(
382385
Err(_) => return false,
383386
};
384387

385-
// Build the signed content: "{id}\n{timestamp}\n{body}"
388+
// Build the signed content per Standard Webhooks spec: "{id}.{timestamp}.{body}"
386389
let mut signed = Vec::with_capacity(msg_id.len() + msg_timestamp.len() + body.len() + 2);
387390
signed.extend_from_slice(msg_id.as_bytes());
388-
signed.push(b'\n');
391+
signed.push(b'.');
389392
signed.extend_from_slice(msg_timestamp.as_bytes());
390-
signed.push(b'\n');
393+
signed.push(b'.');
391394
signed.extend_from_slice(body);
392395

393396
let mut mac =
@@ -805,9 +808,9 @@ mod tests {
805808

806809
let mut signed = Vec::new();
807810
signed.extend_from_slice(msg_id.as_bytes());
808-
signed.push(b'\n');
811+
signed.push(b'.');
809812
signed.extend_from_slice(msg_timestamp.as_bytes());
810-
signed.push(b'\n');
813+
signed.push(b'.');
811814
signed.extend_from_slice(body);
812815

813816
let mut mac = Hmac::<Sha256>::new_from_slice(raw_key).unwrap();

0 commit comments

Comments
 (0)