@crvouga/mockingbird-service-emqx 0.9.4 → 0.9.5

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-emqx
2
2
 
3
+ ## 0.9.5 (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
  ## 0.9.4 (2026-11-02)
4
10
 
5
11
  ### Fixes and improvements
@@ -4695,6 +4695,25 @@ var createNamespaceControls = (options) => {
4695
4695
  };
4696
4696
  };
4697
4697
 
4698
+ // ../core/dist/signing.js
4699
+ var encoder = new TextEncoder();
4700
+ var toBase64 = (bytes) => {
4701
+ let binary = "";
4702
+ for (const byte of bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)) {
4703
+ binary += String.fromCharCode(byte);
4704
+ }
4705
+ return btoa(binary);
4706
+ };
4707
+ var fromBase64 = (value) => Uint8Array.from(atob(value), (char) => char.charCodeAt(0));
4708
+ var timingSafeEqual = (a, b) => {
4709
+ if (a.length !== b.length)
4710
+ return false;
4711
+ let diff = 0;
4712
+ for (let i = 0; i < a.length; i++)
4713
+ diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
4714
+ return diff === 0;
4715
+ };
4716
+
4698
4717
  // ../core/dist/surface.js
4699
4718
  var defineMock = (runtime) => runtime;
4700
4719
  var ADMIN_ROUTE_REFERENCE = {
@@ -4813,6 +4832,10 @@ var assertAdminPrefixAvailable = (prefix, paths) => {
4813
4832
  }
4814
4833
  };
4815
4834
  var ADMIN_KEY_HEADER = CONTROL_HEADERS.adminKey;
4835
+ var hasAdminKey = (headers, adminKey) => {
4836
+ const sent = headers.get(ADMIN_KEY_HEADER);
4837
+ return sent !== null && timingSafeEqual(sent, adminKey);
4838
+ };
4816
4839
  var NAMESPACE_HEADER = CONTROL_HEADERS.namespace;
4817
4840
  var ADMIN_DOCS_URL = "https://mockingbird.chrisvouga.dev/docs/admin-controls";
4818
4841
  var ADMIN_CONTROL_PAGES = [
@@ -5286,7 +5309,7 @@ var createControlPlane = (context) => {
5286
5309
  }
5287
5310
  const path = url.pathname.slice(adminPrefix.length) || "/";
5288
5311
  const shell = request.method === "GET" && (path === "/ui" || path === "/ui/");
5289
- if (!shell && context.adminKey !== void 0 && request.headers.get(ADMIN_KEY_HEADER) !== context.adminKey) {
5312
+ if (!shell && context.adminKey !== void 0 && !hasAdminKey(request.headers, context.adminKey)) {
5290
5313
  return adminError(401, `missing or wrong ${ADMIN_KEY_HEADER}`);
5291
5314
  }
5292
5315
  for (const route of routes) {
@@ -6065,18 +6088,7 @@ var stateAdminRoutes = (routes) => {
6065
6088
  };
6066
6089
 
6067
6090
  // ../core/dist/version.js
6068
- var PACKAGE_VERSION = true ? "0.9.4" : UNRELEASED_VERSION;
6069
-
6070
- // ../core/dist/signing.js
6071
- var encoder = new TextEncoder();
6072
- var toBase64 = (bytes) => {
6073
- let binary = "";
6074
- for (const byte of bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)) {
6075
- binary += String.fromCharCode(byte);
6076
- }
6077
- return btoa(binary);
6078
- };
6079
- var fromBase64 = (value) => Uint8Array.from(atob(value), (char) => char.charCodeAt(0));
6091
+ var PACKAGE_VERSION = true ? "0.9.5" : UNRELEASED_VERSION;
6080
6092
 
6081
6093
  // ../core/dist/webhooks.js
6082
6094
  var json4 = (status, body) => new Response(JSON.stringify(body), {
@@ -7055,7 +7067,7 @@ var createRuntime = (options) => {
7055
7067
  throw error;
7056
7068
  }
7057
7069
  const rewinds = at !== void 0 && selectedBranch === "main" && MUTATING_METHODS.has(request.method);
7058
- if ((requested || rewinds) && options.adminKey !== void 0 && request.headers.get(ADMIN_KEY_HEADER) !== options.adminKey)
7070
+ if ((requested || rewinds) && options.adminKey !== void 0 && !hasAdminKey(request.headers, options.adminKey))
7059
7071
  return refuse(401, `control headers need ${ADMIN_KEY_HEADER}`);
7060
7072
  controls.ensure(namespace);
7061
7073
  if (requested?.restore !== void 0 && !snapshotStore.get(namespace, requested.restore))
@@ -9558,4 +9570,4 @@ export {
9558
9570
  apiKeyCredential,
9559
9571
  EmqxAPI
9560
9572
  };
9561
- //# sourceMappingURL=chunk-PYAPMHUE.js.map
9573
+ //# sourceMappingURL=chunk-6SILEQM5.js.map