@crvouga/mockingbird-service-stripe 3.10.3 → 3.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog — @crvouga/mockingbird-service-stripe
2
2
 
3
+ ## 3.10.4 (2026-11-02)
4
+
5
+ ### Fixes and improvements
6
+
7
+ - compare the admin key in constant time ([2a43141](https://github.com/crvouga/mockingbird/commit/2a43141f50dab41e698c3bbce0c69bf65b40e24e))
8
+
3
9
  ## 3.10.3 (2026-11-02)
4
10
 
5
11
  ### Fixes and improvements
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createRuntime,
3
3
  validateAccounts
4
- } from "./chunk-KXNVS35C.js";
4
+ } from "./chunk-BM3DUOET.js";
5
5
  import {
6
6
  listen
7
- } from "./chunk-KHNJCSHG.js";
7
+ } from "./chunk-RSTEXFHT.js";
8
8
 
9
9
  // src/server.ts
10
10
  import { readFileSync } from "node:fs";
@@ -87,4 +87,4 @@ export {
87
87
  createServer,
88
88
  serveTarget
89
89
  };
90
- //# sourceMappingURL=chunk-SOIQVFQD.js.map
90
+ //# sourceMappingURL=chunk-AL3LIES3.js.map
@@ -17,7 +17,7 @@ import {
17
17
  requestBaseUrl,
18
18
  resolveSchema,
19
19
  signers
20
- } from "./chunk-NUTYUHW7.js";
20
+ } from "./chunk-HN7EI4ER.js";
21
21
 
22
22
  // src/account.ts
23
23
  var accountOfKey = (key) => `acct_${opaqueToken(key, 8)}`;
@@ -15879,4 +15879,4 @@ export {
15879
15879
  createRuntime2 as createRuntime,
15880
15880
  StripeAPI
15881
15881
  };
15882
- //# sourceMappingURL=chunk-KXNVS35C.js.map
15882
+ //# sourceMappingURL=chunk-BM3DUOET.js.map
@@ -2482,6 +2482,46 @@ var createNamespaceControls = (options) => {
2482
2482
  };
2483
2483
  };
2484
2484
 
2485
+ // ../core/dist/signing.js
2486
+ var encoder = new TextEncoder();
2487
+ var toBase64 = (bytes) => {
2488
+ let binary = "";
2489
+ for (const byte of bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)) {
2490
+ binary += String.fromCharCode(byte);
2491
+ }
2492
+ return btoa(binary);
2493
+ };
2494
+ var fromBase64 = (value) => Uint8Array.from(atob(value), (char) => char.charCodeAt(0));
2495
+ var toHex = (bytes) => [...bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
2496
+ var keyBytes = (key) => typeof key === "string" ? encoder.encode(key) : key;
2497
+ var hmac = async (algorithm, key, message, encoding = "hex") => {
2498
+ const imported = await crypto.subtle.importKey("raw", keyBytes(key), { name: "HMAC", hash: algorithm }, false, ["sign"]);
2499
+ const signed = await crypto.subtle.sign("HMAC", imported, typeof message === "string" ? encoder.encode(message) : message);
2500
+ return encoding === "hex" ? toHex(signed) : toBase64(signed);
2501
+ };
2502
+ var svixSecretBytes = (secret) => {
2503
+ const raw = secret.replace(/^f?whsec_/, "");
2504
+ try {
2505
+ return fromBase64(raw);
2506
+ } catch {
2507
+ throw new TypeError("webhook secret must be whsec_<base64> (as Svix issues it)");
2508
+ }
2509
+ };
2510
+ var signSvix = async (secret, messageId, timestampSeconds, body) => `v1,${await hmac("SHA-256", svixSecretBytes(secret), `${messageId}.${timestampSeconds}.${body}`, "base64")}`;
2511
+ var signTimestamped = async (secret, timestampSeconds, body) => `t=${timestampSeconds},v1=${await hmac("SHA-256", secret, `${timestampSeconds}.${body}`, "hex")}`;
2512
+ var signTwilio = async (authToken, url, params) => {
2513
+ const payload = url + Object.keys(params).sort().map((key) => `${key}${params[key]}`).join("");
2514
+ return hmac("SHA-1", authToken, payload, "base64");
2515
+ };
2516
+ var timingSafeEqual = (a, b) => {
2517
+ if (a.length !== b.length)
2518
+ return false;
2519
+ let diff = 0;
2520
+ for (let i = 0; i < a.length; i++)
2521
+ diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
2522
+ return diff === 0;
2523
+ };
2524
+
2485
2525
  // ../core/dist/surface.js
2486
2526
  var defineMock = (runtime) => runtime;
2487
2527
  var ADMIN_ROUTE_REFERENCE = {
@@ -2600,6 +2640,10 @@ var assertAdminPrefixAvailable = (prefix, paths) => {
2600
2640
  }
2601
2641
  };
2602
2642
  var ADMIN_KEY_HEADER = CONTROL_HEADERS.adminKey;
2643
+ var hasAdminKey = (headers, adminKey) => {
2644
+ const sent = headers.get(ADMIN_KEY_HEADER);
2645
+ return sent !== null && timingSafeEqual(sent, adminKey);
2646
+ };
2603
2647
  var NAMESPACE_HEADER = CONTROL_HEADERS.namespace;
2604
2648
  var ADMIN_DOCS_URL = "https://mockingbird.chrisvouga.dev/docs/admin-controls";
2605
2649
  var ADMIN_CONTROL_PAGES = [
@@ -3073,7 +3117,7 @@ var createControlPlane = (context) => {
3073
3117
  }
3074
3118
  const path = url.pathname.slice(adminPrefix.length) || "/";
3075
3119
  const shell = request.method === "GET" && (path === "/ui" || path === "/ui/");
3076
- if (!shell && context.adminKey !== void 0 && request.headers.get(ADMIN_KEY_HEADER) !== context.adminKey) {
3120
+ if (!shell && context.adminKey !== void 0 && !hasAdminKey(request.headers, context.adminKey)) {
3077
3121
  return adminError(401, `missing or wrong ${ADMIN_KEY_HEADER}`);
3078
3122
  }
3079
3123
  for (const route of routes) {
@@ -3874,39 +3918,7 @@ var stateAdminRoutes = (routes) => {
3874
3918
  };
3875
3919
 
3876
3920
  // ../core/dist/version.js
3877
- var PACKAGE_VERSION = true ? "3.10.3" : UNRELEASED_VERSION;
3878
-
3879
- // ../core/dist/signing.js
3880
- var encoder = new TextEncoder();
3881
- var toBase64 = (bytes) => {
3882
- let binary = "";
3883
- for (const byte of bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)) {
3884
- binary += String.fromCharCode(byte);
3885
- }
3886
- return btoa(binary);
3887
- };
3888
- var fromBase64 = (value) => Uint8Array.from(atob(value), (char) => char.charCodeAt(0));
3889
- var toHex = (bytes) => [...bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
3890
- var keyBytes = (key) => typeof key === "string" ? encoder.encode(key) : key;
3891
- var hmac = async (algorithm, key, message, encoding = "hex") => {
3892
- const imported = await crypto.subtle.importKey("raw", keyBytes(key), { name: "HMAC", hash: algorithm }, false, ["sign"]);
3893
- const signed = await crypto.subtle.sign("HMAC", imported, typeof message === "string" ? encoder.encode(message) : message);
3894
- return encoding === "hex" ? toHex(signed) : toBase64(signed);
3895
- };
3896
- var svixSecretBytes = (secret) => {
3897
- const raw = secret.replace(/^f?whsec_/, "");
3898
- try {
3899
- return fromBase64(raw);
3900
- } catch {
3901
- throw new TypeError("webhook secret must be whsec_<base64> (as Svix issues it)");
3902
- }
3903
- };
3904
- var signSvix = async (secret, messageId, timestampSeconds, body) => `v1,${await hmac("SHA-256", svixSecretBytes(secret), `${messageId}.${timestampSeconds}.${body}`, "base64")}`;
3905
- var signTimestamped = async (secret, timestampSeconds, body) => `t=${timestampSeconds},v1=${await hmac("SHA-256", secret, `${timestampSeconds}.${body}`, "hex")}`;
3906
- var signTwilio = async (authToken, url, params) => {
3907
- const payload = url + Object.keys(params).sort().map((key) => `${key}${params[key]}`).join("");
3908
- return hmac("SHA-1", authToken, payload, "base64");
3909
- };
3921
+ var PACKAGE_VERSION = true ? "3.10.4" : UNRELEASED_VERSION;
3910
3922
 
3911
3923
  // ../core/dist/webhooks.js
3912
3924
  var signers = {
@@ -5303,7 +5315,7 @@ var createRuntime = (options) => {
5303
5315
  throw error;
5304
5316
  }
5305
5317
  const rewinds = at !== void 0 && selectedBranch === "main" && MUTATING_METHODS.has(request.method);
5306
- if ((requested || rewinds) && options.adminKey !== void 0 && request.headers.get(ADMIN_KEY_HEADER) !== options.adminKey)
5318
+ if ((requested || rewinds) && options.adminKey !== void 0 && !hasAdminKey(request.headers, options.adminKey))
5307
5319
  return refuse(401, `control headers need ${ADMIN_KEY_HEADER}`);
5308
5320
  controls.ensure(namespace);
5309
5321
  if (requested?.restore !== void 0 && !snapshotStore.get(namespace, requested.restore))
@@ -5837,4 +5849,4 @@ export {
5837
5849
  createRuntime,
5838
5850
  signV4
5839
5851
  };
5840
- //# sourceMappingURL=chunk-NUTYUHW7.js.map
5852
+ //# sourceMappingURL=chunk-HN7EI4ER.js.map