@atlasauth/emulator-core 0.1.0 → 0.3.0
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/dist/adopt.d.ts +50 -0
- package/dist/adopt.js +57 -0
- package/dist/adopt.js.map +1 -0
- package/dist/coverage.d.ts +15 -0
- package/dist/coverage.js +31 -0
- package/dist/coverage.js.map +1 -0
- package/dist/crypto-util.d.ts +10 -0
- package/dist/crypto-util.js +76 -0
- package/dist/crypto-util.js.map +1 -0
- package/dist/custom-html.d.ts +57 -0
- package/dist/custom-html.js +491 -0
- package/dist/custom-html.js.map +1 -0
- package/dist/engine.d.ts +34 -3
- package/dist/engine.js +57 -8
- package/dist/engine.js.map +1 -1
- package/dist/error-catalog.js +16 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/event-gate.d.ts +3 -0
- package/dist/event-gate.js +430 -0
- package/dist/event-gate.js.map +1 -0
- package/dist/generic.js +14 -2
- package/dist/generic.js.map +1 -1
- package/dist/handlers/access-signals.d.ts +48 -0
- package/dist/handlers/access-signals.js +76 -0
- package/dist/handlers/access-signals.js.map +1 -0
- package/dist/handlers/approvals.d.ts +2 -0
- package/dist/handlers/approvals.js +418 -0
- package/dist/handlers/approvals.js.map +1 -0
- package/dist/handlers/authz-data.d.ts +2 -0
- package/dist/handlers/authz-data.js +627 -0
- package/dist/handlers/authz-data.js.map +1 -0
- package/dist/handlers/authz-layers.d.ts +229 -0
- package/dist/handlers/authz-layers.js +786 -0
- package/dist/handlers/authz-layers.js.map +1 -0
- package/dist/handlers/authz-state.d.ts +80 -0
- package/dist/handlers/authz-state.js +175 -0
- package/dist/handlers/authz-state.js.map +1 -0
- package/dist/handlers/authz.d.ts +2 -0
- package/dist/handlers/authz.js +410 -0
- package/dist/handlers/authz.js.map +1 -0
- package/dist/handlers/billing.d.ts +100 -0
- package/dist/handlers/billing.js +877 -0
- package/dist/handlers/billing.js.map +1 -0
- package/dist/handlers/cedar-ext.d.ts +35 -0
- package/dist/handlers/cedar-ext.js +174 -0
- package/dist/handlers/cedar-ext.js.map +1 -0
- package/dist/handlers/cedar.d.ts +146 -0
- package/dist/handlers/cedar.js +689 -0
- package/dist/handlers/cedar.js.map +1 -0
- package/dist/handlers/connections.d.ts +5 -0
- package/dist/handlers/connections.js +561 -0
- package/dist/handlers/connections.js.map +1 -0
- package/dist/handlers/control.js +6 -1
- package/dist/handlers/control.js.map +1 -1
- package/dist/handlers/device.d.ts +47 -0
- package/dist/handlers/device.js +665 -0
- package/dist/handlers/device.js.map +1 -0
- package/dist/handlers/emu3-misc.d.ts +38 -0
- package/dist/handlers/emu3-misc.js +1056 -0
- package/dist/handlers/emu3-misc.js.map +1 -0
- package/dist/handlers/emu4-actions-access.d.ts +46 -0
- package/dist/handlers/emu4-actions-access.js +107 -0
- package/dist/handlers/emu4-actions-access.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
- package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog.js +143 -0
- package/dist/handlers/emu4-actions-catalog.js.map +1 -0
- package/dist/handlers/emu4-actions-def.d.ts +50 -0
- package/dist/handlers/emu4-actions-def.js +250 -0
- package/dist/handlers/emu4-actions-def.js.map +1 -0
- package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
- package/dist/handlers/emu4-actions-sandbox.js +318 -0
- package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
- package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
- package/dist/handlers/emu4-actions-typegen.js +73 -0
- package/dist/handlers/emu4-actions-typegen.js.map +1 -0
- package/dist/handlers/emu4-actions.d.ts +2 -0
- package/dist/handlers/emu4-actions.js +506 -0
- package/dist/handlers/emu4-actions.js.map +1 -0
- package/dist/handlers/emu4-authz-trust.d.ts +40 -0
- package/dist/handlers/emu4-authz-trust.js +488 -0
- package/dist/handlers/emu4-authz-trust.js.map +1 -0
- package/dist/handlers/emu4-authz.d.ts +2 -0
- package/dist/handlers/emu4-authz.js +752 -0
- package/dist/handlers/emu4-authz.js.map +1 -0
- package/dist/handlers/emu4-billing-core.d.ts +23 -0
- package/dist/handlers/emu4-billing-core.js +22 -0
- package/dist/handlers/emu4-billing-core.js.map +1 -0
- package/dist/handlers/emu4-billing-x.d.ts +2 -0
- package/dist/handlers/emu4-billing-x.js +489 -0
- package/dist/handlers/emu4-billing-x.js.map +1 -0
- package/dist/handlers/emu4-billing.d.ts +14 -0
- package/dist/handlers/emu4-billing.js +846 -0
- package/dist/handlers/emu4-billing.js.map +1 -0
- package/dist/handlers/emu4-clones.d.ts +2 -0
- package/dist/handlers/emu4-clones.js +322 -0
- package/dist/handlers/emu4-clones.js.map +1 -0
- package/dist/handlers/emu4-compliance.d.ts +8 -0
- package/dist/handlers/emu4-compliance.js +39 -0
- package/dist/handlers/emu4-compliance.js.map +1 -0
- package/dist/handlers/emu4-config.d.ts +14 -0
- package/dist/handlers/emu4-config.js +148 -0
- package/dist/handlers/emu4-config.js.map +1 -0
- package/dist/handlers/emu4-cookies.d.ts +8 -0
- package/dist/handlers/emu4-cookies.js +248 -0
- package/dist/handlers/emu4-cookies.js.map +1 -0
- package/dist/handlers/emu4-erasure.d.ts +2 -0
- package/dist/handlers/emu4-erasure.js +587 -0
- package/dist/handlers/emu4-erasure.js.map +1 -0
- package/dist/handlers/emu4-federation.d.ts +8 -0
- package/dist/handlers/emu4-federation.js +18 -0
- package/dist/handlers/emu4-federation.js.map +1 -0
- package/dist/handlers/emu4-journey-math.d.ts +42 -0
- package/dist/handlers/emu4-journey-math.js +99 -0
- package/dist/handlers/emu4-journey-math.js.map +1 -0
- package/dist/handlers/emu4-messaging.d.ts +21 -0
- package/dist/handlers/emu4-messaging.js +595 -0
- package/dist/handlers/emu4-messaging.js.map +1 -0
- package/dist/handlers/emu4-minors.d.ts +7 -0
- package/dist/handlers/emu4-minors.js +408 -0
- package/dist/handlers/emu4-minors.js.map +1 -0
- package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
- package/dist/handlers/emu4-oauth-audit.js +17 -0
- package/dist/handlers/emu4-oauth-audit.js.map +1 -0
- package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
- package/dist/handlers/emu4-oauth-auth.js +363 -0
- package/dist/handlers/emu4-oauth-auth.js.map +1 -0
- package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
- package/dist/handlers/emu4-oauth-delivery.js +207 -0
- package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
- package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
- package/dist/handlers/emu4-oauth-keys.js +268 -0
- package/dist/handlers/emu4-oauth-keys.js.map +1 -0
- package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
- package/dist/handlers/emu4-oauth-pub.js +420 -0
- package/dist/handlers/emu4-oauth-pub.js.map +1 -0
- package/dist/handlers/emu4-oauth.d.ts +10 -0
- package/dist/handlers/emu4-oauth.js +23 -0
- package/dist/handlers/emu4-oauth.js.map +1 -0
- package/dist/handlers/emu4-policies.d.ts +2 -0
- package/dist/handlers/emu4-policies.js +408 -0
- package/dist/handlers/emu4-policies.js.map +1 -0
- package/dist/handlers/emu4-region.d.ts +2 -0
- package/dist/handlers/emu4-region.js +189 -0
- package/dist/handlers/emu4-region.js.map +1 -0
- package/dist/handlers/emu4-saml.d.ts +12 -0
- package/dist/handlers/emu4-saml.js +532 -0
- package/dist/handlers/emu4-saml.js.map +1 -0
- package/dist/handlers/emu4-shared.d.ts +44 -0
- package/dist/handlers/emu4-shared.js +90 -0
- package/dist/handlers/emu4-shared.js.map +1 -0
- package/dist/handlers/emu4-snapshots.d.ts +38 -0
- package/dist/handlers/emu4-snapshots.js +231 -0
- package/dist/handlers/emu4-snapshots.js.map +1 -0
- package/dist/handlers/emu4-sns.d.ts +9 -0
- package/dist/handlers/emu4-sns.js +21 -0
- package/dist/handlers/emu4-sns.js.map +1 -0
- package/dist/handlers/emu4-trust-binding.d.ts +27 -0
- package/dist/handlers/emu4-trust-binding.js +344 -0
- package/dist/handlers/emu4-trust-binding.js.map +1 -0
- package/dist/handlers/emu4-trust.d.ts +35 -0
- package/dist/handlers/emu4-trust.js +543 -0
- package/dist/handlers/emu4-trust.js.map +1 -0
- package/dist/handlers/federation.d.ts +2 -0
- package/dist/handlers/federation.js +481 -0
- package/dist/handlers/federation.js.map +1 -0
- package/dist/handlers/fga-engine.d.ts +78 -0
- package/dist/handlers/fga-engine.js +663 -0
- package/dist/handlers/fga-engine.js.map +1 -0
- package/dist/handlers/governance.d.ts +2 -0
- package/dist/handlers/governance.js +460 -0
- package/dist/handlers/governance.js.map +1 -0
- package/dist/handlers/hooks.js +17 -1
- package/dist/handlers/hooks.js.map +1 -1
- package/dist/handlers/index.d.ts +5 -1
- package/dist/handlers/index.js +45 -3
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/keys.js +6 -1
- package/dist/handlers/keys.js.map +1 -1
- package/dist/handlers/machines.js +61 -8
- package/dist/handlers/machines.js.map +1 -1
- package/dist/handlers/messaging.d.ts +6 -0
- package/dist/handlers/messaging.js +893 -0
- package/dist/handlers/messaging.js.map +1 -0
- package/dist/handlers/oauth-adv.d.ts +191 -0
- package/dist/handlers/oauth-adv.js +1305 -0
- package/dist/handlers/oauth-adv.js.map +1 -0
- package/dist/handlers/oauth-flows.d.ts +52 -0
- package/dist/handlers/oauth-flows.js +480 -0
- package/dist/handlers/oauth-flows.js.map +1 -0
- package/dist/handlers/oauth.d.ts +96 -0
- package/dist/handlers/oauth.js +793 -0
- package/dist/handlers/oauth.js.map +1 -0
- package/dist/handlers/orgs.js +6 -0
- package/dist/handlers/orgs.js.map +1 -1
- package/dist/handlers/passkeys.d.ts +3 -0
- package/dist/handlers/passkeys.js +293 -0
- package/dist/handlers/passkeys.js.map +1 -0
- package/dist/handlers/platform.d.ts +20 -0
- package/dist/handlers/platform.js +472 -0
- package/dist/handlers/platform.js.map +1 -0
- package/dist/handlers/round2.d.ts +8 -0
- package/dist/handlers/round2.js +372 -0
- package/dist/handlers/round2.js.map +1 -0
- package/dist/handlers/scim.d.ts +4 -0
- package/dist/handlers/scim.js +595 -0
- package/dist/handlers/scim.js.map +1 -0
- package/dist/handlers/sessions.d.ts +9 -3
- package/dist/handlers/sessions.js +76 -38
- package/dist/handlers/sessions.js.map +1 -1
- package/dist/handlers/support.d.ts +20 -0
- package/dist/handlers/support.js +62 -0
- package/dist/handlers/support.js.map +1 -0
- package/dist/handlers/users.js +7 -0
- package/dist/handlers/users.js.map +1 -1
- package/dist/handlers/workflows.d.ts +2 -0
- package/dist/handlers/workflows.js +428 -0
- package/dist/handlers/workflows.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/jwe.d.ts +18 -0
- package/dist/jwe.js +101 -0
- package/dist/jwe.js.map +1 -0
- package/dist/jws.d.ts +41 -0
- package/dist/jws.js +135 -0
- package/dist/jws.js.map +1 -0
- package/dist/messages.d.ts +7 -0
- package/dist/messages.js +8 -4
- package/dist/messages.js.map +1 -1
- package/dist/messaging-callbacks.d.ts +100 -0
- package/dist/messaging-callbacks.js +767 -0
- package/dist/messaging-callbacks.js.map +1 -0
- package/dist/openapi.js +41 -1
- package/dist/openapi.js.map +1 -1
- package/dist/parity-bin.js +3 -1
- package/dist/parity-bin.js.map +1 -1
- package/dist/parity-emu3-authz.d.ts +3 -0
- package/dist/parity-emu3-authz.js +61 -0
- package/dist/parity-emu3-authz.js.map +1 -0
- package/dist/parity-emu3-billing.d.ts +3 -0
- package/dist/parity-emu3-billing.js +25 -0
- package/dist/parity-emu3-billing.js.map +1 -0
- package/dist/parity-emu3-messaging.d.ts +3 -0
- package/dist/parity-emu3-messaging.js +27 -0
- package/dist/parity-emu3-messaging.js.map +1 -0
- package/dist/parity-emu3-misc.d.ts +2 -0
- package/dist/parity-emu3-misc.js +63 -0
- package/dist/parity-emu3-misc.js.map +1 -0
- package/dist/parity-emu3-oauth.d.ts +2 -0
- package/dist/parity-emu3-oauth.js +39 -0
- package/dist/parity-emu3-oauth.js.map +1 -0
- package/dist/parity-emu4-actions.d.ts +2 -0
- package/dist/parity-emu4-actions.js +38 -0
- package/dist/parity-emu4-actions.js.map +1 -0
- package/dist/parity-emu4-authz.d.ts +3 -0
- package/dist/parity-emu4-authz.js +68 -0
- package/dist/parity-emu4-authz.js.map +1 -0
- package/dist/parity-emu4-billing.d.ts +6 -0
- package/dist/parity-emu4-billing.js +44 -0
- package/dist/parity-emu4-billing.js.map +1 -0
- package/dist/parity-emu4-compliance.d.ts +2 -0
- package/dist/parity-emu4-compliance.js +92 -0
- package/dist/parity-emu4-compliance.js.map +1 -0
- package/dist/parity-emu4-federation.d.ts +2 -0
- package/dist/parity-emu4-federation.js +33 -0
- package/dist/parity-emu4-federation.js.map +1 -0
- package/dist/parity-emu4-messaging.d.ts +3 -0
- package/dist/parity-emu4-messaging.js +42 -0
- package/dist/parity-emu4-messaging.js.map +1 -0
- package/dist/parity-emu4-oauth.d.ts +2 -0
- package/dist/parity-emu4-oauth.js +55 -0
- package/dist/parity-emu4-oauth.js.map +1 -0
- package/dist/parity-emu4-trust.d.ts +2 -0
- package/dist/parity-emu4-trust.js +41 -0
- package/dist/parity-emu4-trust.js.map +1 -0
- package/dist/parity-routes.d.ts +14 -0
- package/dist/parity-routes.js +439 -0
- package/dist/parity-routes.js.map +1 -0
- package/dist/parity.d.ts +10 -3
- package/dist/parity.js +14 -5
- package/dist/parity.js.map +1 -1
- package/dist/sns-cert.d.ts +9 -0
- package/dist/sns-cert.js +101 -0
- package/dist/sns-cert.js.map +1 -0
- package/dist/tokens.d.ts +85 -3
- package/dist/tokens.js +196 -24
- package/dist/tokens.js.map +1 -1
- package/dist/webauthn-virtual.d.ts +70 -0
- package/dist/webauthn-virtual.js +186 -0
- package/dist/webauthn-virtual.js.map +1 -0
- package/dist/webhook-ext.d.ts +16 -0
- package/dist/webhook-ext.js +218 -0
- package/dist/webhook-ext.js.map +1 -0
- package/dist/webhooks.d.ts +3 -0
- package/dist/webhooks.js +37 -3
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Engine, RouteContext } from '../engine';
|
|
2
|
+
import { EmulatorError } from '../errors';
|
|
3
|
+
import type { Obj } from '../openapi';
|
|
4
|
+
/**
|
|
5
|
+
* Shared by the round-four compliance and federation modules: the instance configuration the emulator keeps for the
|
|
6
|
+
* compliance settings (the part a config snapshot captures), the audit trail those routes write, and small helpers.
|
|
7
|
+
*/
|
|
8
|
+
export declare const bad: (message: string, param?: string) => EmulatorError;
|
|
9
|
+
export declare const conflict: (message: string) => EmulatorError;
|
|
10
|
+
export declare const isObj: (v: unknown) => v is Obj;
|
|
11
|
+
export declare const hex: (data: string) => Promise<string>;
|
|
12
|
+
export declare const DAY = 86400000;
|
|
13
|
+
export declare const listOf: (data: Obj[], extra?: Obj) => Obj;
|
|
14
|
+
export declare const needObj: (v: unknown, param: string) => Obj;
|
|
15
|
+
/** Canonical JSON (sorted keys), the form digests and diffs compare. */
|
|
16
|
+
export declare function canonical(v: unknown): string;
|
|
17
|
+
export declare const MINOR_DEFAULTS: Obj;
|
|
18
|
+
export declare const COOKIE_DEFAULTS: Obj;
|
|
19
|
+
export declare const DATA_POLICY_DEFAULTS: Obj;
|
|
20
|
+
export declare const INACTIVE_DEFAULTS: Obj;
|
|
21
|
+
export declare const instanceConfig: (e: Engine) => Obj;
|
|
22
|
+
export declare const resetInstanceConfig: (e: Engine) => void;
|
|
23
|
+
export declare const minorsCfg: (e: Engine) => Obj;
|
|
24
|
+
export declare const cookieCfg: (e: Engine) => Obj;
|
|
25
|
+
export interface AuditRow {
|
|
26
|
+
id: string;
|
|
27
|
+
action: string;
|
|
28
|
+
actor_type: string;
|
|
29
|
+
actor_id: string | null;
|
|
30
|
+
target_type: string;
|
|
31
|
+
target_id: string;
|
|
32
|
+
metadata: Obj;
|
|
33
|
+
created_at: number;
|
|
34
|
+
}
|
|
35
|
+
export declare const auditLog: (e: Engine) => AuditRow[];
|
|
36
|
+
export declare const actorOf: (c: RouteContext | null) => {
|
|
37
|
+
type: string;
|
|
38
|
+
id: string | null;
|
|
39
|
+
};
|
|
40
|
+
export declare function audit(e: Engine, c: RouteContext | null, action: string, targetType: string, targetId: string, metadata?: Obj): void;
|
|
41
|
+
export declare const liveUser: (e: Engine, id: string | undefined) => Obj;
|
|
42
|
+
export declare const iso: (ms: number) => string;
|
|
43
|
+
/** Pagination over a newest-first array with the real `limit` / `starting_after` query. */
|
|
44
|
+
export declare function pageReply(c: RouteContext, items: Obj[]): Obj;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.iso = exports.liveUser = exports.actorOf = exports.auditLog = exports.cookieCfg = exports.minorsCfg = exports.resetInstanceConfig = exports.instanceConfig = exports.INACTIVE_DEFAULTS = exports.DATA_POLICY_DEFAULTS = exports.COOKIE_DEFAULTS = exports.MINOR_DEFAULTS = exports.needObj = exports.listOf = exports.DAY = exports.hex = exports.isObj = exports.conflict = exports.bad = void 0;
|
|
4
|
+
exports.canonical = canonical;
|
|
5
|
+
exports.audit = audit;
|
|
6
|
+
exports.pageReply = pageReply;
|
|
7
|
+
const errors_1 = require("../errors");
|
|
8
|
+
const crypto_util_1 = require("../crypto-util");
|
|
9
|
+
const support_1 = require("./support");
|
|
10
|
+
/**
|
|
11
|
+
* Shared by the round-four compliance and federation modules: the instance configuration the emulator keeps for the
|
|
12
|
+
* compliance settings (the part a config snapshot captures), the audit trail those routes write, and small helpers.
|
|
13
|
+
*/
|
|
14
|
+
const bad = (message, param) => new errors_1.EmulatorError('VALIDATION_FAILED', message, param);
|
|
15
|
+
exports.bad = bad;
|
|
16
|
+
const conflict = (message) => new errors_1.EmulatorError('CONFLICT', message);
|
|
17
|
+
exports.conflict = conflict;
|
|
18
|
+
const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
19
|
+
exports.isObj = isObj;
|
|
20
|
+
const hex = async (data) => [...(await (0, crypto_util_1.sha256)(data))].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
21
|
+
exports.hex = hex;
|
|
22
|
+
exports.DAY = 86_400_000;
|
|
23
|
+
const listOf = (data, extra = {}) => ({ object: 'list', data, has_more: false, next_cursor: null, ...extra });
|
|
24
|
+
exports.listOf = listOf;
|
|
25
|
+
const needObj = (v, param) => {
|
|
26
|
+
if (!(0, exports.isObj)(v))
|
|
27
|
+
throw (0, exports.bad)(`${param} must be an object.`, param);
|
|
28
|
+
return v;
|
|
29
|
+
};
|
|
30
|
+
exports.needObj = needObj;
|
|
31
|
+
/** Canonical JSON (sorted keys), the form digests and diffs compare. */
|
|
32
|
+
function canonical(v) {
|
|
33
|
+
if (Array.isArray(v))
|
|
34
|
+
return `[${v.map(canonical).join(',')}]`;
|
|
35
|
+
if ((0, exports.isObj)(v))
|
|
36
|
+
return `{${Object.keys(v).sort().map((k) => `${JSON.stringify(k)}:${canonical(v[k])}`).join(',')}}`;
|
|
37
|
+
return JSON.stringify(v) ?? 'null';
|
|
38
|
+
}
|
|
39
|
+
// ── instance configuration the compliance settings live in ──
|
|
40
|
+
exports.MINOR_DEFAULTS = { enabled: false, birthdateTrait: 'birthdate', countryTrait: null, defaultConsentAge: 13, consentAges: {}, minimumAge: null, restriction: 'hold', consentTtlHours: 72, consentMethods: ['email_link', 'admin'], minAssuranceLevel: 'low', trustedAgeMethods: [] };
|
|
41
|
+
exports.COOKIE_DEFAULTS = { enabled: false, categories: ['necessary', 'functional', 'analytics', 'marketing'], policyVersion: null, honorGpc: true, honorDnt: false, repromptDays: 365, retentionDays: 0 };
|
|
42
|
+
exports.DATA_POLICY_DEFAULTS = { controller: { name: null, contactEmail: null, dpoEmail: null }, activities: [] };
|
|
43
|
+
exports.INACTIVE_DEFAULTS = { enabled: false, afterDays: 730, warnDays: 30, action: 'notify' };
|
|
44
|
+
const defaults = () => ({
|
|
45
|
+
compliance: { minors: structuredClone(exports.MINOR_DEFAULTS), cookieConsent: structuredClone(exports.COOKIE_DEFAULTS), dataPolicy: structuredClone(exports.DATA_POLICY_DEFAULTS), inactiveUsers: structuredClone(exports.INACTIVE_DEFAULTS), dataRegion: null, consents: [], retention: { dsrDueDays: 30, erasureGraceDays: 7, deletedUserGraceDays: 30, anonymousRetentionDays: 30, ownershipTransfer: 'off' } },
|
|
46
|
+
localization: { requireReview: false, requireFourEyes: false },
|
|
47
|
+
approvals: {},
|
|
48
|
+
});
|
|
49
|
+
exports.instanceConfig = (0, support_1.engineState)(() => defaults());
|
|
50
|
+
const resetInstanceConfig = (e) => {
|
|
51
|
+
const cfg = (0, exports.instanceConfig)(e);
|
|
52
|
+
for (const k of Object.keys(cfg))
|
|
53
|
+
delete cfg[k];
|
|
54
|
+
Object.assign(cfg, defaults());
|
|
55
|
+
};
|
|
56
|
+
exports.resetInstanceConfig = resetInstanceConfig;
|
|
57
|
+
const minorsCfg = (e) => (0, exports.instanceConfig)(e).compliance.minors;
|
|
58
|
+
exports.minorsCfg = minorsCfg;
|
|
59
|
+
const cookieCfg = (e) => (0, exports.instanceConfig)(e).compliance.cookieConsent;
|
|
60
|
+
exports.cookieCfg = cookieCfg;
|
|
61
|
+
exports.auditLog = (0, support_1.engineState)(() => []);
|
|
62
|
+
const actorOf = (c) => (c?.key ? { type: 'api_key', id: `apikey_${c.key.key.slice(-8)}` } : { type: 'system', id: null });
|
|
63
|
+
exports.actorOf = actorOf;
|
|
64
|
+
function audit(e, c, action, targetType, targetId, metadata = {}) {
|
|
65
|
+
const a = (0, exports.actorOf)(c);
|
|
66
|
+
(0, exports.auditLog)(e).push({ id: e.db.newId('audit'), action, actor_type: a.type, actor_id: a.id, target_type: targetType, target_id: targetId, metadata, created_at: e.clock.now() });
|
|
67
|
+
}
|
|
68
|
+
const liveUser = (e, id) => {
|
|
69
|
+
const u = e.db.users.get(id);
|
|
70
|
+
if (!u || u.deleted)
|
|
71
|
+
throw (0, errors_1.notFound)('User');
|
|
72
|
+
return u;
|
|
73
|
+
};
|
|
74
|
+
exports.liveUser = liveUser;
|
|
75
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
76
|
+
exports.iso = iso;
|
|
77
|
+
/** Pagination over a newest-first array with the real `limit` / `starting_after` query. */
|
|
78
|
+
function pageReply(c, items) {
|
|
79
|
+
const limit = Math.min(Math.max(Number(c.query.get('limit') ?? 20) || 20, 1), 100);
|
|
80
|
+
const after = c.query.get('starting_after');
|
|
81
|
+
let start = 0;
|
|
82
|
+
if (after) {
|
|
83
|
+
const at = items.findIndex((i) => i.id === after);
|
|
84
|
+
start = at < 0 ? items.length : at + 1;
|
|
85
|
+
}
|
|
86
|
+
const data = items.slice(start, start + limit);
|
|
87
|
+
const more = start + limit < items.length;
|
|
88
|
+
return { object: 'list', data, has_more: more, next_cursor: more ? (data[data.length - 1]?.id ?? null) : null };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=emu4-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emu4-shared.js","sourceRoot":"","sources":["../../src/handlers/emu4-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Engine, RouteDef } from '../engine';
|
|
2
|
+
import type { Obj } from '../openapi';
|
|
3
|
+
/**
|
|
4
|
+
* Config time travel. A snapshot is the instance's configuration at one moment with every secret removed: the last-written
|
|
5
|
+
* singleton settings (`PATCH`/`PUT` of instance-wide settings) plus the compliance configuration. You can list snapshots, diff any
|
|
6
|
+
* two (or one against now) and restore one: a restore puts the configuration back as it was, keeps the secrets the instance holds
|
|
7
|
+
* today, and first saves the state it replaces so a restore can be undone the same way.
|
|
8
|
+
* shortcut: the document-driven settings routes cannot be hooked, so the write-time `auto` snapshot is taken by the compliance
|
|
9
|
+
* configuration route and by `POST /__emulator/config_snapshots/capture` (what the real worker pass does).
|
|
10
|
+
*/
|
|
11
|
+
declare const SOURCES: readonly ["manual", "auto", "pre_restore", "cli", "clone"];
|
|
12
|
+
export declare function redact(value: unknown, path?: string, out?: string[]): {
|
|
13
|
+
value: unknown;
|
|
14
|
+
redacted: string[];
|
|
15
|
+
};
|
|
16
|
+
/** The configuration as the emulator holds it: instance-wide settings by route, the compliance configuration, the allowed origins. */
|
|
17
|
+
export declare function currentConfig(e: Engine): {
|
|
18
|
+
auth_config: Obj;
|
|
19
|
+
allowed_origins: string[];
|
|
20
|
+
};
|
|
21
|
+
/** Take a snapshot of the instance as it is now. `skipIfUnchanged` (the automatic path) writes nothing when the newest snapshot is identical. */
|
|
22
|
+
export declare function captureSnapshot(e: Engine, input: {
|
|
23
|
+
label?: string | null;
|
|
24
|
+
source: (typeof SOURCES)[number];
|
|
25
|
+
actor?: string | null;
|
|
26
|
+
skipIfUnchanged?: boolean;
|
|
27
|
+
current?: {
|
|
28
|
+
auth_config: Obj;
|
|
29
|
+
allowed_origins: string[];
|
|
30
|
+
};
|
|
31
|
+
}): Promise<{
|
|
32
|
+
snapshot: Obj;
|
|
33
|
+
created: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
/** Called by the routes that change configuration: the write-time snapshot, deduplicated by digest. */
|
|
36
|
+
export declare const captureAutoSnapshot: (e: Engine) => Promise<unknown>;
|
|
37
|
+
export declare function snapshotHandlers(): RouteDef[];
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.captureAutoSnapshot = void 0;
|
|
4
|
+
exports.redact = redact;
|
|
5
|
+
exports.currentConfig = currentConfig;
|
|
6
|
+
exports.captureSnapshot = captureSnapshot;
|
|
7
|
+
exports.snapshotHandlers = snapshotHandlers;
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
const store_1 = require("../store");
|
|
10
|
+
const support_1 = require("./support");
|
|
11
|
+
const emu4_shared_1 = require("./emu4-shared");
|
|
12
|
+
const emu4_config_1 = require("./emu4-config");
|
|
13
|
+
/**
|
|
14
|
+
* Config time travel. A snapshot is the instance's configuration at one moment with every secret removed: the last-written
|
|
15
|
+
* singleton settings (`PATCH`/`PUT` of instance-wide settings) plus the compliance configuration. You can list snapshots, diff any
|
|
16
|
+
* two (or one against now) and restore one: a restore puts the configuration back as it was, keeps the secrets the instance holds
|
|
17
|
+
* today, and first saves the state it replaces so a restore can be undone the same way.
|
|
18
|
+
* shortcut: the document-driven settings routes cannot be hooked, so the write-time `auto` snapshot is taken by the compliance
|
|
19
|
+
* configuration route and by `POST /__emulator/config_snapshots/capture` (what the real worker pass does).
|
|
20
|
+
*/
|
|
21
|
+
const SOURCES = ['manual', 'auto', 'pre_restore', 'cli', 'clone'];
|
|
22
|
+
const LABEL_MAX = 120;
|
|
23
|
+
const AUTO_KEEP = 200;
|
|
24
|
+
/** Key names whose string value is a credential, and the at-rest envelope of an encrypted field. */
|
|
25
|
+
const SECRET_KEY = /(secret|password|passwd|passphrase|private[_-]?key|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|signing|credential|salt|hmac|cipher|(^|[_-])token$|(^|[_-])pass$|(^|[_-])pwd$)/i;
|
|
26
|
+
const ENVELOPE = /^v\d+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/;
|
|
27
|
+
const ATLAS_SECRET = /\b(sk|rk|whsec|ak|pk_live)_[A-Za-z0-9_-]{8,}/;
|
|
28
|
+
const secretLike = (key, value) => typeof value === 'string' && value !== '' && (SECRET_KEY.test(key) || ENVELOPE.test(value) || ATLAS_SECRET.test(value));
|
|
29
|
+
function redact(value, path = '', out = []) {
|
|
30
|
+
if (Array.isArray(value))
|
|
31
|
+
return { value: value.map((v, i) => redact(v, `${path}[${i}]`, out).value), redacted: out };
|
|
32
|
+
if ((0, emu4_shared_1.isObj)(value)) {
|
|
33
|
+
const next = {};
|
|
34
|
+
for (const [k, v] of Object.entries(value)) {
|
|
35
|
+
const here = path ? `${path}.${k}` : k;
|
|
36
|
+
if (secretLike(k, v)) {
|
|
37
|
+
out.push(here);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
next[k] = redact(v, here, out).value;
|
|
41
|
+
}
|
|
42
|
+
return { value: next, redacted: out };
|
|
43
|
+
}
|
|
44
|
+
return { value, redacted: out };
|
|
45
|
+
}
|
|
46
|
+
/** Put the secrets the live config holds back into a restored copy (only where the snapshot has the surrounding object). */
|
|
47
|
+
function carrySecrets(target, current) {
|
|
48
|
+
if (Array.isArray(target) && Array.isArray(current))
|
|
49
|
+
return target.map((t, i) => (i < current.length ? carrySecrets(t, current[i]) : t));
|
|
50
|
+
if ((0, emu4_shared_1.isObj)(target) && (0, emu4_shared_1.isObj)(current)) {
|
|
51
|
+
const next = { ...target };
|
|
52
|
+
for (const [k, v] of Object.entries(current)) {
|
|
53
|
+
if (secretLike(k, v)) {
|
|
54
|
+
if (!(k in next))
|
|
55
|
+
next[k] = v;
|
|
56
|
+
}
|
|
57
|
+
else if (k in next)
|
|
58
|
+
next[k] = carrySecrets(next[k], v);
|
|
59
|
+
}
|
|
60
|
+
return next;
|
|
61
|
+
}
|
|
62
|
+
return target;
|
|
63
|
+
}
|
|
64
|
+
function diffConfig(a, b, path = '', out = []) {
|
|
65
|
+
if ((0, emu4_shared_1.isObj)(a) && (0, emu4_shared_1.isObj)(b)) {
|
|
66
|
+
for (const k of [...new Set([...Object.keys(a), ...Object.keys(b)])].sort())
|
|
67
|
+
diffConfig(a[k], b[k], path ? `${path}.${k}` : k, out);
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
if ((0, emu4_shared_1.canonical)(a ?? null) !== (0, emu4_shared_1.canonical)(b ?? null))
|
|
71
|
+
out.push({ path, before: a ?? null, after: b ?? null });
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
/** The configuration as the emulator holds it: instance-wide settings by route, the compliance configuration, the allowed origins. */
|
|
75
|
+
function currentConfig(e) {
|
|
76
|
+
const settings = {};
|
|
77
|
+
for (const [path, body] of e.singletons)
|
|
78
|
+
if (path !== '/v1/instance/config_snapshots')
|
|
79
|
+
settings[path] = structuredClone(body);
|
|
80
|
+
const cfg = (0, emu4_shared_1.instanceConfig)(e);
|
|
81
|
+
const origins = e.singletons.get('/v1/instance')?.allowed_origins;
|
|
82
|
+
return { auth_config: { settings, compliance: structuredClone(cfg.compliance), localization: structuredClone(cfg.localization) }, allowed_origins: Array.isArray(origins) ? [...origins] : [] };
|
|
83
|
+
}
|
|
84
|
+
const snapshots = (0, support_1.engineState)((e) => new store_1.Table('instance_config_snapshots', e.clock.now, 'cfgs'));
|
|
85
|
+
const digestOf = (authConfig, origins) => (0, emu4_shared_1.hex)((0, emu4_shared_1.canonical)({ auth_config: authConfig, allowed_origins: origins }));
|
|
86
|
+
const present = (s, withConfig = false) => ({
|
|
87
|
+
object: 'config_snapshot', id: s.id, version: s.version, label: s.label ?? null, source: s.source, sha256: s.sha256, redacted_paths: s.redacted_paths, created_by: s.created_by ?? null, created_at: s.created_at,
|
|
88
|
+
...(withConfig ? { auth_config: s.auth_config, allowed_origins: s.allowed_origins } : {}),
|
|
89
|
+
});
|
|
90
|
+
/** Take a snapshot of the instance as it is now. `skipIfUnchanged` (the automatic path) writes nothing when the newest snapshot is identical. */
|
|
91
|
+
async function captureSnapshot(e, input) {
|
|
92
|
+
const cur = input.current ?? currentConfig(e);
|
|
93
|
+
const red = redact(cur.auth_config);
|
|
94
|
+
const sha = await digestOf(red.value, cur.allowed_origins);
|
|
95
|
+
const t = snapshots(e);
|
|
96
|
+
if (input.skipIfUnchanged) {
|
|
97
|
+
const last = t.all()[0];
|
|
98
|
+
if (last && last.sha256 === sha)
|
|
99
|
+
return { snapshot: last, created: false };
|
|
100
|
+
}
|
|
101
|
+
const version = (t.all().reduce((m, s) => Math.max(m, s.version), 0)) + 1;
|
|
102
|
+
const snapshot = t.insert({ version, label: input.label ?? null, source: input.source, auth_config: red.value, allowed_origins: cur.allowed_origins, redacted_paths: red.redacted, sha256: sha, created_by: input.actor ?? null, created_at: e.clock.now() });
|
|
103
|
+
if (input.source === 'auto' || input.source === 'pre_restore') {
|
|
104
|
+
const autos = t.all().filter((s) => s.source === 'auto' || s.source === 'pre_restore');
|
|
105
|
+
for (const old of autos.slice(AUTO_KEEP))
|
|
106
|
+
t.delete(old.id);
|
|
107
|
+
}
|
|
108
|
+
return { snapshot, created: true };
|
|
109
|
+
}
|
|
110
|
+
/** Called by the routes that change configuration: the write-time snapshot, deduplicated by digest. */
|
|
111
|
+
const captureAutoSnapshot = (e) => captureSnapshot(e, { source: 'auto', skipIfUnchanged: true });
|
|
112
|
+
exports.captureAutoSnapshot = captureAutoSnapshot;
|
|
113
|
+
const parseLabel = (raw) => {
|
|
114
|
+
if (raw === undefined || raw === null)
|
|
115
|
+
return null;
|
|
116
|
+
if (typeof raw !== 'string' || raw.trim() === '' || raw.length > LABEL_MAX)
|
|
117
|
+
throw (0, emu4_shared_1.bad)(`label is text of 1 to ${LABEL_MAX} characters.`, 'label');
|
|
118
|
+
return raw.trim();
|
|
119
|
+
};
|
|
120
|
+
async function side(e, ref) {
|
|
121
|
+
if (ref === 'current') {
|
|
122
|
+
const cur = currentConfig(e);
|
|
123
|
+
return { label: 'current', auth_config: redact(cur.auth_config).value, allowed_origins: cur.allowed_origins };
|
|
124
|
+
}
|
|
125
|
+
const s = snapshots(e).get(ref);
|
|
126
|
+
if (!s)
|
|
127
|
+
throw (0, errors_1.notFound)('Unknown snapshot');
|
|
128
|
+
return { label: s.id, auth_config: s.auth_config, allowed_origins: s.allowed_origins };
|
|
129
|
+
}
|
|
130
|
+
function snapshotHandlers() {
|
|
131
|
+
const READ = 'instance:read';
|
|
132
|
+
const WRITE = 'instance:write';
|
|
133
|
+
const knownFields = (b, allowed) => {
|
|
134
|
+
const k = Object.keys(b).find((x) => !allowed.includes(x));
|
|
135
|
+
if (k)
|
|
136
|
+
throw (0, emu4_shared_1.bad)(`Unrecognised field ${k}. Expected any of ${allowed.join(', ')}.`, k);
|
|
137
|
+
};
|
|
138
|
+
return [
|
|
139
|
+
{ method: 'POST', pattern: '/v1/instance/config_snapshots', scope: WRITE, handler: async (c) => {
|
|
140
|
+
knownFields(c.body, ['label']);
|
|
141
|
+
const label = parseLabel(c.body.label);
|
|
142
|
+
const { snapshot } = await captureSnapshot(c.engine, { label, source: 'manual', actor: (0, emu4_shared_1.actorOf)(c).id });
|
|
143
|
+
(0, emu4_shared_1.audit)(c.engine, c, 'config_snapshot.created', 'config_snapshot', snapshot.id, { version: snapshot.version, source: 'manual' });
|
|
144
|
+
return { status: 201, body: present(snapshot) };
|
|
145
|
+
} },
|
|
146
|
+
{ method: 'GET', pattern: '/v1/instance/config_snapshots', scope: READ, handler: (c) => {
|
|
147
|
+
const source = c.query.get('source');
|
|
148
|
+
if (source !== null && !SOURCES.includes(source))
|
|
149
|
+
throw (0, emu4_shared_1.bad)(`source is one of: ${SOURCES.join(', ')}.`, 'source');
|
|
150
|
+
return { body: (0, emu4_shared_1.pageReply)(c, snapshots(c.engine).all().filter((s) => !source || s.source === source).map((s) => present(s))) };
|
|
151
|
+
} },
|
|
152
|
+
{ method: 'GET', pattern: '/v1/instance/config_snapshots/diff', scope: READ, handler: async (c) => {
|
|
153
|
+
const from = c.query.get('from');
|
|
154
|
+
if (!from)
|
|
155
|
+
throw (0, emu4_shared_1.bad)('from is a snapshot id or "current".', 'from');
|
|
156
|
+
const a = await side(c.engine, from);
|
|
157
|
+
const b = await side(c.engine, c.query.get('to') || 'current');
|
|
158
|
+
const changes = diffConfig(a.auth_config, b.auth_config);
|
|
159
|
+
const originsChanged = (0, emu4_shared_1.canonical)(a.allowed_origins) !== (0, emu4_shared_1.canonical)(b.allowed_origins);
|
|
160
|
+
return { body: { object: 'config_snapshot_diff', from: a.label, to: b.label, changes, allowed_origins: originsChanged ? { before: a.allowed_origins, after: b.allowed_origins } : null, unchanged: changes.length === 0 && !originsChanged } };
|
|
161
|
+
} },
|
|
162
|
+
{ method: 'GET', pattern: '/v1/instance/config_snapshots/:id', scope: READ, handler: (c) => {
|
|
163
|
+
const s = snapshots(c.engine).get(c.params.id);
|
|
164
|
+
if (!s)
|
|
165
|
+
throw (0, errors_1.notFound)('Unknown snapshot');
|
|
166
|
+
return { body: present(s, true) };
|
|
167
|
+
} },
|
|
168
|
+
{ method: 'POST', pattern: '/v1/instance/config_snapshots/:id/restore', scope: WRITE, handler: async (c) => {
|
|
169
|
+
const e = c.engine;
|
|
170
|
+
knownFields(c.body, ['dry_run', 'include_allowed_origins', 'expected_sha256']);
|
|
171
|
+
const snap = snapshots(e).get(c.params.id);
|
|
172
|
+
if (!snap)
|
|
173
|
+
throw (0, errors_1.notFound)('Unknown snapshot');
|
|
174
|
+
for (const k of ['dry_run', 'include_allowed_origins'])
|
|
175
|
+
if (c.body[k] !== undefined && typeof c.body[k] !== 'boolean')
|
|
176
|
+
throw (0, emu4_shared_1.bad)(`${k} must be true or false.`, k);
|
|
177
|
+
if (c.body.expected_sha256 !== undefined && typeof c.body.expected_sha256 !== 'string')
|
|
178
|
+
throw (0, emu4_shared_1.bad)('expected_sha256 must be a string.', 'expected_sha256');
|
|
179
|
+
const includeOrigins = c.body.include_allowed_origins === true;
|
|
180
|
+
const cur = currentConfig(e);
|
|
181
|
+
const currentRedacted = redact(cur.auth_config).value;
|
|
182
|
+
const currentSha = await digestOf(currentRedacted, cur.allowed_origins);
|
|
183
|
+
const next = carrySecrets(snap.auth_config, cur.auth_config);
|
|
184
|
+
const changes = diffConfig(currentRedacted, snap.auth_config);
|
|
185
|
+
const origins = includeOrigins ? snap.allowed_origins : null;
|
|
186
|
+
const originsChange = !!origins && (0, emu4_shared_1.canonical)(origins) !== (0, emu4_shared_1.canonical)(cur.allowed_origins);
|
|
187
|
+
const view = (applied) => ({ object: 'config_snapshot_restore', snapshot_id: snap.id, version: snap.version, dry_run: !applied, applied, current_sha256: currentSha, changes, allowed_origins_changed: originsChange });
|
|
188
|
+
if (c.body.dry_run === true)
|
|
189
|
+
return { body: view(false) };
|
|
190
|
+
if (typeof c.body.expected_sha256 === 'string' && c.body.expected_sha256 !== currentSha)
|
|
191
|
+
throw (0, emu4_shared_1.conflict)('The configuration changed since this restore was previewed. Preview it again.');
|
|
192
|
+
const problems = (0, emu4_config_1.configProblems)({ compliance: next.compliance, localization: next.localization });
|
|
193
|
+
if (problems.length > 0)
|
|
194
|
+
throw (0, emu4_shared_1.bad)(`This snapshot no longer passes configuration checks: ${problems.slice(0, 5).map((p) => `${p.param}: ${p.message}`).join('; ')}`, 'snapshot');
|
|
195
|
+
if (changes.length === 0 && !originsChange)
|
|
196
|
+
return { body: view(true) };
|
|
197
|
+
await captureSnapshot(e, { label: `Before restoring version ${snap.version}`, source: 'pre_restore', actor: (0, emu4_shared_1.actorOf)(c).id, current: cur });
|
|
198
|
+
// settings the snapshot does not hold are removed; the rest are put back (with today's secrets kept)
|
|
199
|
+
const settings = (next.settings ?? {});
|
|
200
|
+
for (const path of [...e.singletons.keys()])
|
|
201
|
+
if (path !== '/v1/instance/config_snapshots' && !(path in settings))
|
|
202
|
+
e.singletons.delete(path);
|
|
203
|
+
for (const [path, body] of Object.entries(settings))
|
|
204
|
+
e.singletons.set(path, structuredClone(body));
|
|
205
|
+
const cfg = (0, emu4_shared_1.instanceConfig)(e);
|
|
206
|
+
cfg.compliance = structuredClone(next.compliance);
|
|
207
|
+
cfg.localization = structuredClone(next.localization);
|
|
208
|
+
if (originsChange)
|
|
209
|
+
e.singletons.set('/v1/instance', { ...(e.singletons.get('/v1/instance') ?? {}), allowed_origins: origins });
|
|
210
|
+
const paths = changes.slice(0, 100).map((x) => x.path);
|
|
211
|
+
(0, emu4_shared_1.audit)(e, c, 'config_snapshot.restored', 'config_snapshot', snap.id, { version: snap.version, changed_paths: paths, allowed_origins_changed: originsChange });
|
|
212
|
+
e.webhooks.emit('config_snapshot.restored', { id: snap.id, version: snap.version, label: snap.label ?? null, changed_paths: paths, restored_at: e.clock.now() });
|
|
213
|
+
return { body: view(true) };
|
|
214
|
+
} },
|
|
215
|
+
{ method: 'DELETE', pattern: '/v1/instance/config_snapshots/:id', scope: WRITE, handler: (c) => {
|
|
216
|
+
const e = c.engine;
|
|
217
|
+
const s = snapshots(e).get(c.params.id);
|
|
218
|
+
if (!s)
|
|
219
|
+
throw (0, errors_1.notFound)('Unknown snapshot');
|
|
220
|
+
snapshots(e).delete(s.id);
|
|
221
|
+
(0, emu4_shared_1.audit)(e, c, 'config_snapshot.deleted', 'config_snapshot', s.id, { version: s.version });
|
|
222
|
+
return { status: 204 };
|
|
223
|
+
} },
|
|
224
|
+
// POST /__emulator/config_snapshots/capture: what the worker pass (and the write-time hook) does: an automatic snapshot, skipped when nothing changed.
|
|
225
|
+
{ method: 'POST', pattern: '/__emulator/config_snapshots/capture', public: true, handler: async (c) => {
|
|
226
|
+
const { snapshot, created } = await captureSnapshot(c.engine, { source: 'auto', skipIfUnchanged: true });
|
|
227
|
+
return { body: { object: 'config_snapshot_capture', created, snapshot: present(snapshot) } };
|
|
228
|
+
} },
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=emu4-snapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emu4-snapshots.js","sourceRoot":"","sources":["../../src/handlers/emu4-snapshots.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Engine } from '../engine';
|
|
2
|
+
import type { Obj } from '../openapi';
|
|
3
|
+
/** What the emulator knows about Amazon SNS: extra certificates a test registered, and subscription confirmations "visited". */
|
|
4
|
+
export declare const snsState: (e: Engine) => {
|
|
5
|
+
certs: Map<string, string>;
|
|
6
|
+
confirmations: Obj[];
|
|
7
|
+
};
|
|
8
|
+
/** What fetching a SigningCertURL returns: a registered certificate for that exact URL, the built-in one at its own path, else nothing. */
|
|
9
|
+
export declare function snsCertificateFor(e: Engine, url: string, builtIn: string): string | null;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.snsState = void 0;
|
|
4
|
+
exports.snsCertificateFor = snsCertificateFor;
|
|
5
|
+
const sns_cert_1 = require("../sns-cert");
|
|
6
|
+
const support_1 = require("./support");
|
|
7
|
+
/** What the emulator knows about Amazon SNS: extra certificates a test registered, and subscription confirmations "visited". */
|
|
8
|
+
exports.snsState = (0, support_1.engineState)((_e) => ({ certs: new Map(), confirmations: [] }));
|
|
9
|
+
/** What fetching a SigningCertURL returns: a registered certificate for that exact URL, the built-in one at its own path, else nothing. */
|
|
10
|
+
function snsCertificateFor(e, url, builtIn) {
|
|
11
|
+
const registered = (0, exports.snsState)(e).certs.get(url);
|
|
12
|
+
if (registered)
|
|
13
|
+
return registered;
|
|
14
|
+
try {
|
|
15
|
+
return new URL(url).pathname === sns_cert_1.SNS_CERT_PATH ? builtIn : null;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=emu4-sns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emu4-sns.js","sourceRoot":"","sources":["../../src/handlers/emu4-sns.ts"],"names":[],"mappings":";;;AASA,8CAQC;AAhBD,0CAA4C;AAE5C,uCAAwC;AAExC,gIAAgI;AACnH,QAAA,QAAQ,GAAG,IAAA,qBAAW,EAAC,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,EAAkB,EAAE,aAAa,EAAE,EAAW,EAAE,CAAC,CAAC,CAAC;AAExH,2IAA2I;AAC3I,SAAgB,iBAAiB,CAAC,CAAS,EAAE,GAAW,EAAE,OAAe;IACvE,MAAM,UAAU,GAAG,IAAA,gBAAQ,EAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,wBAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Engine, RouteContext, RouteDef } from '../engine';
|
|
2
|
+
import type { Obj } from '../openapi';
|
|
3
|
+
/**
|
|
4
|
+
* Sender-constrained sessions (a DPoP key per session) and device-bound sessions (the browser DBSC protocol).
|
|
5
|
+
* Both are opt-in through the trust config (`/__emulator/trust/config`); an engine left alone behaves as before.
|
|
6
|
+
*/
|
|
7
|
+
export interface TrustConfig {
|
|
8
|
+
session_binding: {
|
|
9
|
+
mode: 'off' | 'optional' | 'required';
|
|
10
|
+
require_attestation: boolean;
|
|
11
|
+
};
|
|
12
|
+
device_bound_sessions: boolean;
|
|
13
|
+
/** Whether native app attestation is on for the instance (the real instance verifies Apple and Google evidence). */
|
|
14
|
+
app_attestation: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const trustConfig: (e: Engine) => TrustConfig;
|
|
17
|
+
/** `cnf.jkt` for the session JWT of a bound session; nothing for an unbound one. */
|
|
18
|
+
export declare const sessionBindingClaims: (e: Engine, sessionId: string) => Obj;
|
|
19
|
+
/**
|
|
20
|
+
* The gate on the refresh route: a session bound to a key refreshes only with a fresh single-use proof from that key
|
|
21
|
+
* (401 `dpop_binding_required`); with mode `required` an unbound session cannot refresh (401 `session_binding_required`);
|
|
22
|
+
* a session bound to a device needs that device's bound cookie (401 `device_binding_required`).
|
|
23
|
+
*/
|
|
24
|
+
export declare function enforceSessionBinding(c: RouteContext, sessionId: string): Promise<void>;
|
|
25
|
+
/** `Secure-Session-Registration` for a session handed out with a refresh cookie that is not bound to a device yet. */
|
|
26
|
+
export declare function dbscRegistrationHeaders(e: Engine, sessionId: string): Promise<Record<string, string>>;
|
|
27
|
+
export declare function emu4TrustBindingHandlers(): RouteDef[];
|