Skip to content

Commit 60b5f04

Browse files
authored
Require moshcode webhook secret in production (#30)
1 parent 82e5afa commit 60b5f04

1 file changed

Lines changed: 2 additions & 1 deletion

File tree

app/api/webhooks/moshcode/route.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ export const dynamic = "force-dynamic";
1111
// the payload shape is nailed down.
1212
function verify(rawBody: string, sig: string | null): boolean {
1313
const secret = process.env.MOSHCODE_WEBHOOK_SECRET || "";
14-
if (!secret) return true; // no secret configured yet — accept in dev
14+
if (!secret) return process.env.NODE_ENV !== "production";
1515
if (!sig) return false;
1616
const parts: Record<string, string> = {};
1717
for (const kv of sig.split(",")) { const i = kv.indexOf("="); if (i > -1) parts[kv.slice(0, i).trim()] = kv.slice(i + 1).trim(); }
1818
const { t, v1 } = parts;
1919
if (!t || !v1) return false;
2020
const ts = Number(t);
2121
if (!Number.isFinite(ts) || Math.abs(Date.now() / 1000 - ts) > 300) return false;
22+
if (!/^[a-f0-9]{64}$/i.test(v1)) return false;
2223
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
2324
const a = Buffer.from(v1), b = Buffer.from(expected);
2425
return a.length === b.length && crypto.timingSafeEqual(a, b);

0 commit comments

Comments
 (0)