@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,481 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.federationHandlers = federationHandlers;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
const jws_1 = require("../jws");
|
|
6
|
+
const store_1 = require("../store");
|
|
7
|
+
const device_1 = require("./device");
|
|
8
|
+
const support_1 = require("./support");
|
|
9
|
+
const util_1 = require("./util");
|
|
10
|
+
/**
|
|
11
|
+
* Workload identity federation for machines: trust policies (`/v1/machine_trust_policies`) and the public exchange
|
|
12
|
+
* `POST /v1/machines/federate`. A GitHub Actions, Kubernetes, Google Cloud or generic OIDC token is verified against the
|
|
13
|
+
* issuer's keys (inline `jwks`, `jwks_uri`, or discovery through the engine's `fetch` option), its issuer, audience,
|
|
14
|
+
* expiry (24 h token age cap), subject pattern and claim conditions are checked, and a short machine token comes back.
|
|
15
|
+
* An AWS proof is a presigned STS GetCallerIdentity request, validated strictly (STS host, https, path, exact body,
|
|
16
|
+
* header whitelist, audience signed as `x-atlas-audience`); the engine never contacts AWS itself: the identity comes from
|
|
17
|
+
* the `fetch` option, which a test points at a fake STS. Every refusal is the same 403.
|
|
18
|
+
*/
|
|
19
|
+
const KINDS = ['github_actions', 'kubernetes', 'aws', 'gcp', 'oidc'];
|
|
20
|
+
const DEFAULT_ISSUERS = { github_actions: 'https://token.actions.githubusercontent.com', gcp: 'https://accounts.google.com' };
|
|
21
|
+
const SLUG = /^[a-z0-9][a-z0-9_.-]{0,63}$/;
|
|
22
|
+
const MAX_PER_MACHINE = 20;
|
|
23
|
+
const MAX_TOKEN_AGE_S = 24 * 3600;
|
|
24
|
+
const SKEW_S = 30;
|
|
25
|
+
const STS_HOST = /^sts(\.[a-z0-9-]{4,30})?\.amazonaws\.com(\.cn)?$/;
|
|
26
|
+
const GET_CALLER_BODY = 'Action=GetCallerIdentity&Version=2011-06-15';
|
|
27
|
+
const AWS_HEADERS = new Set(['authorization', 'host', 'content-type', 'content-length', 'x-amz-date', 'x-amz-security-token', 'x-amz-content-sha256', 'x-atlas-audience', 'user-agent']);
|
|
28
|
+
const st = (0, support_1.engineState)((e) => ({ policies: new store_1.Table('machine_trust_policies', e.clock.now, 'mtp'), spentAws: new Set() }));
|
|
29
|
+
const bad = (message, param) => new errors_1.EmulatorError('VALIDATION_FAILED', message, param);
|
|
30
|
+
const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
31
|
+
const issuerOf = (p) => p.issuer ?? DEFAULT_ISSUERS[p.kind] ?? null;
|
|
32
|
+
function subjectPatternProblem(kind, pattern) {
|
|
33
|
+
if (!pattern || pattern.length > 512)
|
|
34
|
+
return 'subject_pattern is 1 to 512 characters.';
|
|
35
|
+
if (/^[*?]+$/.test(pattern))
|
|
36
|
+
return 'subject_pattern cannot be only wildcards: name who is trusted.';
|
|
37
|
+
if (kind === 'github_actions' && !/^repo:[A-Za-z0-9_.-]+\/[^*?]*/.test(pattern))
|
|
38
|
+
return 'For github_actions the pattern must name the owner, for example repo:my-org/my-repo:ref:refs/heads/main (wildcards allowed after the owner).';
|
|
39
|
+
if (kind === 'aws' && !/^arn:aws[a-z-]*:(iam|sts)::\d{12}:/.test(pattern))
|
|
40
|
+
return 'For aws the pattern must start with the account, for example arn:aws:iam::123456789012:role/deployer.';
|
|
41
|
+
if (kind === 'kubernetes' && !/^system:serviceaccount:[^*?:]+:/.test(pattern))
|
|
42
|
+
return 'For kubernetes the pattern must name the namespace, for example system:serviceaccount:prod:deployer.';
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function httpsUrl(raw, param) {
|
|
46
|
+
if (typeof raw !== 'string' || raw.length > 2048)
|
|
47
|
+
throw bad(`${param} must be an https URL.`, param);
|
|
48
|
+
let u;
|
|
49
|
+
try {
|
|
50
|
+
u = new URL(raw);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw bad(`${param} must be an https URL.`, param);
|
|
54
|
+
}
|
|
55
|
+
if (u.protocol !== 'https:' || u.username || u.password || u.search || u.hash)
|
|
56
|
+
throw bad(`${param} must be an https URL without credentials, query or fragment.`, param);
|
|
57
|
+
return raw;
|
|
58
|
+
}
|
|
59
|
+
function conditionsOf(raw) {
|
|
60
|
+
if (!Array.isArray(raw) || raw.length > 20)
|
|
61
|
+
throw bad('claim_conditions is a list of at most 20 conditions.', 'claim_conditions');
|
|
62
|
+
return raw.map((c, i) => {
|
|
63
|
+
const at = `claim_conditions[${i}]`;
|
|
64
|
+
if (!isObj(c))
|
|
65
|
+
throw bad('Each condition is an object with claim, op and value.', at);
|
|
66
|
+
if (Object.keys(c).some((k) => !['claim', 'op', 'value'].includes(k)))
|
|
67
|
+
throw bad('A condition takes claim, op and value.', at);
|
|
68
|
+
if (typeof c.claim !== 'string' || !c.claim || c.claim.length > 128)
|
|
69
|
+
throw bad('claim is a claim name of 1 to 128 characters.', `${at}.claim`);
|
|
70
|
+
if (!['equals', 'in', 'glob', 'exists'].includes(c.op))
|
|
71
|
+
throw bad('op is equals, in, glob or exists.', `${at}.op`);
|
|
72
|
+
if (c.op === 'exists') {
|
|
73
|
+
if (c.value !== undefined)
|
|
74
|
+
throw bad('exists takes no value.', `${at}.value`);
|
|
75
|
+
return { claim: c.claim, op: 'exists' };
|
|
76
|
+
}
|
|
77
|
+
const values = typeof c.value === 'string' ? [c.value] : Array.isArray(c.value) ? c.value : null;
|
|
78
|
+
if (!values || !values.length || values.length > 20 || values.some((v) => typeof v !== 'string' || !v || v.length > 256))
|
|
79
|
+
throw bad('value is a string, or a list of up to 20 strings of at most 256 characters.', `${at}.value`);
|
|
80
|
+
if (c.op === 'glob' && values.some((v) => /^[*?]+$/.test(v)))
|
|
81
|
+
throw bad('A glob cannot be only wildcards.', `${at}.value`);
|
|
82
|
+
return { claim: c.claim, op: c.op, value: c.value };
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function jwksOf(raw) {
|
|
86
|
+
const keys = isObj(raw) ? raw.keys : undefined;
|
|
87
|
+
if (!Array.isArray(keys) || !keys.length || keys.length > 20)
|
|
88
|
+
throw bad('jwks is { keys: [...] } with 1 to 20 public keys.', 'jwks');
|
|
89
|
+
for (const k of keys)
|
|
90
|
+
if (!isObj(k) || typeof k.kty !== 'string' || ['d', 'p', 'q', 'dp', 'dq', 'qi', 'k', 'oth'].some((x) => x in k))
|
|
91
|
+
throw bad('Every key in jwks must be a public JWK (no private parameters).', 'jwks');
|
|
92
|
+
return { keys };
|
|
93
|
+
}
|
|
94
|
+
function normalize(b, existing) {
|
|
95
|
+
const kind = b.kind ?? existing?.kind;
|
|
96
|
+
if (!KINDS.includes(kind))
|
|
97
|
+
throw bad(`kind must be one of ${KINDS.join(', ')}.`, 'kind');
|
|
98
|
+
if (existing && kind !== existing.kind)
|
|
99
|
+
throw bad('kind cannot change. Create a new policy.', 'kind');
|
|
100
|
+
const name = b.name ?? existing?.name;
|
|
101
|
+
if (typeof name !== 'string' || !SLUG.test(name))
|
|
102
|
+
throw bad('name is 1-64 characters: lowercase letters, digits, dot, dash or underscore, starting with a letter or digit.', 'name');
|
|
103
|
+
const audience = b.audience ?? existing?.audience;
|
|
104
|
+
if (typeof audience !== 'string' || !audience || audience.length > 255)
|
|
105
|
+
throw bad('audience is 1 to 255 characters.', 'audience');
|
|
106
|
+
if (kind === 'aws' && !/^[\x21-\x7e]{1,128}$/.test(audience))
|
|
107
|
+
throw bad('For aws the audience is 1 to 128 printable characters without spaces.', 'audience');
|
|
108
|
+
const subjectPattern = b.subject_pattern ?? existing?.subject_pattern;
|
|
109
|
+
if (typeof subjectPattern !== 'string')
|
|
110
|
+
throw bad('subject_pattern is required.', 'subject_pattern');
|
|
111
|
+
const problem = subjectPatternProblem(kind, subjectPattern);
|
|
112
|
+
if (problem)
|
|
113
|
+
throw bad(problem, 'subject_pattern');
|
|
114
|
+
let issuer = b.issuer !== undefined ? (b.issuer === null ? null : httpsUrl(b.issuer, 'issuer')) : (existing?.issuer ?? null);
|
|
115
|
+
const jwksUri = b.jwks_uri !== undefined ? (b.jwks_uri === null ? null : httpsUrl(b.jwks_uri, 'jwks_uri')) : (existing?.jwks_uri ?? null);
|
|
116
|
+
const jwks = b.jwks !== undefined ? (b.jwks === null ? null : jwksOf(b.jwks)) : (existing?.jwks ?? null);
|
|
117
|
+
if (kind === 'aws') {
|
|
118
|
+
if (issuer || jwksUri || jwks)
|
|
119
|
+
throw bad('An aws policy takes no issuer, jwks_uri or jwks: the signed STS request is the proof.', 'issuer');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
if (!issuer && !DEFAULT_ISSUERS[kind])
|
|
123
|
+
throw bad(`A ${kind} policy needs an issuer.`, 'issuer');
|
|
124
|
+
if (issuer === DEFAULT_ISSUERS[kind])
|
|
125
|
+
issuer = null;
|
|
126
|
+
}
|
|
127
|
+
const maxTtl = b.max_ttl_seconds ?? existing?.max_ttl_seconds ?? 600;
|
|
128
|
+
if (typeof maxTtl !== 'number' || !Number.isInteger(maxTtl) || maxTtl < 60 || maxTtl > 3600)
|
|
129
|
+
throw bad('max_ttl_seconds is an integer from 60 to 3600.', 'max_ttl_seconds');
|
|
130
|
+
const enabled = b.enabled ?? existing?.enabled ?? true;
|
|
131
|
+
if (typeof enabled !== 'boolean')
|
|
132
|
+
throw bad('enabled must be true or false.', 'enabled');
|
|
133
|
+
return { name, kind, issuer, jwks_uri: jwksUri, jwks, audience, subject_pattern: subjectPattern, claim_conditions: b.claim_conditions !== undefined ? conditionsOf(b.claim_conditions) : (existing?.claim_conditions ?? []), max_ttl_seconds: maxTtl, enabled };
|
|
134
|
+
}
|
|
135
|
+
const present = (p) => ({
|
|
136
|
+
object: 'machine_trust_policy',
|
|
137
|
+
id: p.id,
|
|
138
|
+
machine_id: p.machine_id,
|
|
139
|
+
name: p.name,
|
|
140
|
+
kind: p.kind,
|
|
141
|
+
issuer: issuerOf(p),
|
|
142
|
+
jwks_uri: p.jwks_uri ?? null,
|
|
143
|
+
jwks: p.jwks ?? null,
|
|
144
|
+
audience: p.audience,
|
|
145
|
+
subject_pattern: p.subject_pattern,
|
|
146
|
+
claim_conditions: p.claim_conditions,
|
|
147
|
+
max_ttl_seconds: p.max_ttl_seconds,
|
|
148
|
+
enabled: p.enabled,
|
|
149
|
+
last_used_at: p.last_used_at ?? null,
|
|
150
|
+
created_at: p.created_at,
|
|
151
|
+
updated_at: p.updated_at,
|
|
152
|
+
});
|
|
153
|
+
const claimString = (v) => (Array.isArray(v) ? v : [v]).filter((x) => ['string', 'number', 'boolean'].includes(typeof x)).map(String);
|
|
154
|
+
/** A dotted claim path; `kubernetes.io.namespace` reads `claims['kubernetes.io'].namespace` when the whole key is absent. */
|
|
155
|
+
function claimAt(claims, path) {
|
|
156
|
+
if (path in claims)
|
|
157
|
+
return claims[path];
|
|
158
|
+
let cur = claims;
|
|
159
|
+
const parts = path.split('.');
|
|
160
|
+
for (let i = 0; i < parts.length; i++) {
|
|
161
|
+
if (!cur || typeof cur !== 'object')
|
|
162
|
+
return undefined;
|
|
163
|
+
let matched = false;
|
|
164
|
+
for (let j = parts.length; j > i; j--) {
|
|
165
|
+
const key = parts.slice(i, j).join('.');
|
|
166
|
+
if (key in cur) {
|
|
167
|
+
cur = cur[key];
|
|
168
|
+
i = j - 1;
|
|
169
|
+
matched = true;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!matched)
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
return cur;
|
|
177
|
+
}
|
|
178
|
+
const conditionsPass = (conditions, claims) => conditions.every((c) => {
|
|
179
|
+
const got = claimAt(claims, c.claim);
|
|
180
|
+
if (c.op === 'exists')
|
|
181
|
+
return got !== undefined && got !== null;
|
|
182
|
+
const have = got === undefined || got === null ? [] : claimString(got);
|
|
183
|
+
const want = c.value === undefined ? [] : claimString(c.value);
|
|
184
|
+
if (!have.length || !want.length)
|
|
185
|
+
return false;
|
|
186
|
+
if (c.op === 'equals')
|
|
187
|
+
return have.some((h) => want.includes(h));
|
|
188
|
+
if (c.op === 'in')
|
|
189
|
+
return have.every((h) => want.includes(h));
|
|
190
|
+
return have.some((h) => want.some((w) => (0, jws_1.globMatch)(w, h)));
|
|
191
|
+
});
|
|
192
|
+
const deny = (reason) => ({ ok: false, reason });
|
|
193
|
+
const judge = (p, subject, claims) => (!(0, jws_1.globMatch)(p.subject_pattern, subject) ? deny('subject_mismatch') : !conditionsPass(p.claim_conditions, claims) ? deny('claim_condition_failed') : { ok: true, subject, claims });
|
|
194
|
+
async function issuerKeys(e, p) {
|
|
195
|
+
if (p.jwks?.keys?.length)
|
|
196
|
+
return p.jwks.keys;
|
|
197
|
+
const http = e.options.fetch ?? fetch;
|
|
198
|
+
const issuer = issuerOf(p);
|
|
199
|
+
let uri = p.jwks_uri;
|
|
200
|
+
const get = async (url) => {
|
|
201
|
+
const res = await http(url, { method: 'GET', headers: { accept: 'application/json' } });
|
|
202
|
+
if (!res.ok)
|
|
203
|
+
throw new Error(`status ${res.status}`);
|
|
204
|
+
return res.json();
|
|
205
|
+
};
|
|
206
|
+
if (!uri) {
|
|
207
|
+
const doc = await get(`${issuer.replace(/\/+$/, '')}/.well-known/openid-configuration`);
|
|
208
|
+
if (typeof doc.issuer !== 'string' || doc.issuer.replace(/\/+$/, '') !== issuer.replace(/\/+$/, ''))
|
|
209
|
+
throw new Error('issuer mismatch');
|
|
210
|
+
uri = doc.jwks_uri;
|
|
211
|
+
}
|
|
212
|
+
if (typeof uri !== 'string' || !/^https:\/\//i.test(uri))
|
|
213
|
+
throw new Error('jwks_uri must be https');
|
|
214
|
+
const set = await get(uri);
|
|
215
|
+
return (Array.isArray(set.keys) ? set.keys : []).filter((k) => !('d' in k) && !('k' in k));
|
|
216
|
+
}
|
|
217
|
+
async function verifyOidc(e, p, token) {
|
|
218
|
+
const issuer = issuerOf(p);
|
|
219
|
+
if (!issuer || p.kind === 'aws')
|
|
220
|
+
return deny('not_an_oidc_policy');
|
|
221
|
+
const jwt = (0, jws_1.decodeJwt)(token);
|
|
222
|
+
if (!jwt || !jws_1.SUPPORTED_ALGS.includes(String(jwt.header.alg)))
|
|
223
|
+
return deny('token_invalid');
|
|
224
|
+
let keys;
|
|
225
|
+
try {
|
|
226
|
+
keys = await issuerKeys(e, p);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return deny('issuer_keys_unavailable');
|
|
230
|
+
}
|
|
231
|
+
const candidates = keys.filter((k) => (jwt.header.kid ? k.kid === jwt.header.kid : true) && (!k.alg || k.alg === jwt.header.alg));
|
|
232
|
+
let verified = false;
|
|
233
|
+
for (const k of candidates)
|
|
234
|
+
if (await (0, jws_1.verifyJws)(jwt, k)) {
|
|
235
|
+
verified = true;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
if (!verified)
|
|
239
|
+
return deny('token_invalid');
|
|
240
|
+
const c = jwt.payload;
|
|
241
|
+
const nowS = e.clock.now() / 1000;
|
|
242
|
+
if (c.iss !== issuer)
|
|
243
|
+
return deny('token_invalid');
|
|
244
|
+
const aud = Array.isArray(c.aud) ? c.aud : [c.aud];
|
|
245
|
+
if (!aud.includes(p.audience))
|
|
246
|
+
return deny('token_invalid');
|
|
247
|
+
if (typeof c.exp !== 'number')
|
|
248
|
+
return deny('no_expiry');
|
|
249
|
+
if (c.exp + SKEW_S <= nowS)
|
|
250
|
+
return deny('token_invalid');
|
|
251
|
+
if (typeof c.nbf === 'number' && c.nbf - SKEW_S > nowS)
|
|
252
|
+
return deny('token_invalid');
|
|
253
|
+
if (typeof c.iat === 'number' && c.exp - c.iat > MAX_TOKEN_AGE_S)
|
|
254
|
+
return deny('token_too_long_lived');
|
|
255
|
+
if (typeof c.sub !== 'string' || !c.sub)
|
|
256
|
+
return deny('no_subject');
|
|
257
|
+
return judge(p, c.sub, c);
|
|
258
|
+
}
|
|
259
|
+
function checkAws(proof, audience) {
|
|
260
|
+
const fail = (reason) => ({ ok: false, reason });
|
|
261
|
+
if (proof.method !== undefined && String(proof.method).toUpperCase() !== 'POST')
|
|
262
|
+
return fail('aws_method');
|
|
263
|
+
if (typeof proof.url !== 'string')
|
|
264
|
+
return fail('aws_url');
|
|
265
|
+
let url;
|
|
266
|
+
try {
|
|
267
|
+
url = new URL(proof.url);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return fail('aws_url');
|
|
271
|
+
}
|
|
272
|
+
if (url.protocol !== 'https:' || !STS_HOST.test(url.hostname) || url.port || url.pathname !== '/' || url.search || url.username || url.password)
|
|
273
|
+
return fail('aws_url');
|
|
274
|
+
if (proof.body !== GET_CALLER_BODY)
|
|
275
|
+
return fail('aws_body');
|
|
276
|
+
if (!isObj(proof.headers))
|
|
277
|
+
return fail('aws_headers');
|
|
278
|
+
const headers = {};
|
|
279
|
+
for (const [k, v] of Object.entries(proof.headers)) {
|
|
280
|
+
const name = k.toLowerCase();
|
|
281
|
+
const value = Array.isArray(v) ? v[0] : v;
|
|
282
|
+
if (typeof value !== 'string' || !AWS_HEADERS.has(name) || value.length > 4096)
|
|
283
|
+
return fail('aws_headers');
|
|
284
|
+
headers[name] = value;
|
|
285
|
+
}
|
|
286
|
+
if (!headers.authorization || !headers['x-amz-date'])
|
|
287
|
+
return fail('aws_headers');
|
|
288
|
+
if (headers.host && headers.host !== url.host)
|
|
289
|
+
return fail('aws_headers');
|
|
290
|
+
if (headers['x-atlas-audience'] !== audience)
|
|
291
|
+
return fail('aws_audience');
|
|
292
|
+
const signed = /SignedHeaders=([^,\s]+)/.exec(headers.authorization)?.[1]?.split(';') ?? [];
|
|
293
|
+
if (!signed.includes('x-atlas-audience'))
|
|
294
|
+
return fail('aws_audience_unsigned');
|
|
295
|
+
return { ok: true, url: url.toString(), headers, fingerprint: `${headers.authorization}\n${headers['x-amz-date']}` };
|
|
296
|
+
}
|
|
297
|
+
async function verifyAws(e, p, proof) {
|
|
298
|
+
if (p.kind !== 'aws')
|
|
299
|
+
return deny('not_an_aws_policy');
|
|
300
|
+
const checked = checkAws(proof, p.audience);
|
|
301
|
+
if (!checked.ok)
|
|
302
|
+
return deny(checked.reason);
|
|
303
|
+
if (st(e).spentAws.has(checked.fingerprint))
|
|
304
|
+
return deny('aws_replayed');
|
|
305
|
+
let xml;
|
|
306
|
+
try {
|
|
307
|
+
const res = await (e.options.fetch ?? (() => Promise.reject(new Error('no fetch'))))(checked.url, { method: 'POST', headers: checked.headers, body: GET_CALLER_BODY });
|
|
308
|
+
if (!res.ok)
|
|
309
|
+
return { ...deny('aws_rejected') };
|
|
310
|
+
xml = await res.text();
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return deny('aws_unavailable');
|
|
314
|
+
}
|
|
315
|
+
const field = (tag) => new RegExp(`<${tag}>([^<]{1,2048})</${tag}>`).exec(xml)?.[1];
|
|
316
|
+
const arn = field('Arn');
|
|
317
|
+
const account = field('Account');
|
|
318
|
+
if (!arn || !account || !/^\d{12}$/.test(account))
|
|
319
|
+
return deny('aws_response');
|
|
320
|
+
// An assumed-role ARN is the role it assumes; other ARNs are their own identity.
|
|
321
|
+
const m = /^arn:(aws[a-z-]*):sts::(\d{12}):assumed-role\/([^/]+)\/(.+)$/.exec(arn);
|
|
322
|
+
const subject = m ? `arn:${m[1]}:iam::${m[2]}:role/${m[3]}` : arn;
|
|
323
|
+
const verdict = judge(p, subject, { arn, account, ...(field('UserId') ? { user_id: field('UserId') } : {}), ...(m ? { session_name: m[4] } : {}), sub: subject });
|
|
324
|
+
return verdict.ok ? { ...verdict, fingerprint: checked.fingerprint } : verdict;
|
|
325
|
+
}
|
|
326
|
+
/** First enabled policy that accepts the subject proof; every refusal reason is kept for the dry run. */
|
|
327
|
+
async function match(e, policies, input, policyId) {
|
|
328
|
+
const reasons = [];
|
|
329
|
+
const pool = policies.filter((p) => p.enabled && (!policyId || p.id === policyId));
|
|
330
|
+
if (!pool.length)
|
|
331
|
+
return { reasons: ['no_matching_policy'] };
|
|
332
|
+
for (const p of pool) {
|
|
333
|
+
let v;
|
|
334
|
+
if (input.token !== undefined) {
|
|
335
|
+
const iss = (0, jws_1.decodeJwt)(input.token)?.payload.iss;
|
|
336
|
+
if (typeof iss !== 'string' || (p.kind === 'aws') || (issuerOf(p) ?? '').replace(/\/+$/, '') !== iss.replace(/\/+$/, '')) {
|
|
337
|
+
reasons.push('issuer_mismatch');
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
v = await verifyOidc(e, p, input.token);
|
|
341
|
+
}
|
|
342
|
+
else
|
|
343
|
+
v = await verifyAws(e, p, input.aws);
|
|
344
|
+
if (v.ok)
|
|
345
|
+
return { policy: p, verdict: v };
|
|
346
|
+
reasons.push(v.reason);
|
|
347
|
+
}
|
|
348
|
+
return { reasons };
|
|
349
|
+
}
|
|
350
|
+
const policyOf = (e, id) => {
|
|
351
|
+
const p = st(e).policies.get(id);
|
|
352
|
+
if (!p)
|
|
353
|
+
throw (0, errors_1.notFound)('Trust policy');
|
|
354
|
+
return p;
|
|
355
|
+
};
|
|
356
|
+
function federationHandlers() {
|
|
357
|
+
const machineOf = (e, id) => {
|
|
358
|
+
const m = e.db.machines.get(String(id ?? ''));
|
|
359
|
+
if (!m || m.deleted)
|
|
360
|
+
throw new errors_1.EmulatorError('NOT_FOUND', 'machine_id is not a machine.', 'machine_id');
|
|
361
|
+
return m;
|
|
362
|
+
};
|
|
363
|
+
return [
|
|
364
|
+
{
|
|
365
|
+
method: 'GET',
|
|
366
|
+
pattern: '/v1/machine_trust_policies',
|
|
367
|
+
scope: 'machines:read',
|
|
368
|
+
handler: (c) => {
|
|
369
|
+
const mid = c.query.get('machine_id');
|
|
370
|
+
return { body: { object: 'list', data: st(c.engine).policies.filter((p) => !mid || p.machine_id === mid).map(present), has_more: false } };
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
method: 'POST',
|
|
375
|
+
pattern: '/v1/machine_trust_policies',
|
|
376
|
+
scope: 'machines:write',
|
|
377
|
+
handler: (c) => {
|
|
378
|
+
const e = c.engine;
|
|
379
|
+
const m = machineOf(e, (0, util_1.need)(c.body, 'machine_id'));
|
|
380
|
+
const fields = normalize(c.body);
|
|
381
|
+
const s = st(e);
|
|
382
|
+
if (s.policies.filter((p) => p.machine_id === m.id).length >= MAX_PER_MACHINE)
|
|
383
|
+
throw new errors_1.EmulatorError('CONFLICT', `A machine has at most ${MAX_PER_MACHINE} trust policies.`);
|
|
384
|
+
if (s.policies.find((p) => p.machine_id === m.id && p.name === fields.name))
|
|
385
|
+
throw new errors_1.EmulatorError('CONFLICT', `This machine already has a trust policy named "${fields.name}".`, 'name');
|
|
386
|
+
const now = e.clock.now();
|
|
387
|
+
const row = s.policies.insert({ machine_id: m.id, ...fields, last_used_at: null, created_at: now, updated_at: now });
|
|
388
|
+
return { status: 201, body: present(row) };
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
{ method: 'GET', pattern: '/v1/machine_trust_policies/:id', scope: 'machines:read', handler: (c) => ({ body: present(policyOf(c.engine, c.params.id)) }) },
|
|
392
|
+
{
|
|
393
|
+
method: 'PATCH',
|
|
394
|
+
pattern: '/v1/machine_trust_policies/:id',
|
|
395
|
+
scope: 'machines:write',
|
|
396
|
+
handler: (c) => {
|
|
397
|
+
const e = c.engine;
|
|
398
|
+
const p = policyOf(e, c.params.id);
|
|
399
|
+
const fields = normalize(c.body, p);
|
|
400
|
+
if (fields.name !== p.name && st(e).policies.find((x) => x.machine_id === p.machine_id && x.name === fields.name))
|
|
401
|
+
throw new errors_1.EmulatorError('CONFLICT', `This machine already has a trust policy named "${fields.name}".`, 'name');
|
|
402
|
+
Object.assign(p, fields, { updated_at: e.clock.now() });
|
|
403
|
+
return { body: present(p) };
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
method: 'DELETE',
|
|
408
|
+
pattern: '/v1/machine_trust_policies/:id',
|
|
409
|
+
scope: 'machines:write',
|
|
410
|
+
handler: (c) => {
|
|
411
|
+
const p = policyOf(c.engine, c.params.id);
|
|
412
|
+
st(c.engine).policies.delete(p.id);
|
|
413
|
+
return { body: { object: 'machine_trust_policy', id: p.id, deleted: true } };
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
// A dry run: would this proof be accepted by this policy (even disabled)? Mints and spends nothing.
|
|
418
|
+
method: 'POST',
|
|
419
|
+
pattern: '/v1/machine_trust_policies/:id/test',
|
|
420
|
+
scope: 'machines:read',
|
|
421
|
+
handler: async (c) => {
|
|
422
|
+
const p = policyOf(c.engine, c.params.id);
|
|
423
|
+
if ((c.body.token === undefined) === (c.body.aws === undefined))
|
|
424
|
+
throw bad('Send token (OIDC kinds) or aws (aws kind), not both and not neither.', 'token');
|
|
425
|
+
if (c.body.token !== undefined && typeof c.body.token !== 'string')
|
|
426
|
+
throw bad('token must be a string.', 'token');
|
|
427
|
+
if (c.body.aws !== undefined && !isObj(c.body.aws))
|
|
428
|
+
throw bad('aws must be an object.', 'aws');
|
|
429
|
+
const found = await match(c.engine, [{ ...p, enabled: true }], { token: c.body.token, aws: c.body.aws }, p.id);
|
|
430
|
+
return 'verdict' in found
|
|
431
|
+
? { body: { object: 'machine_trust_policy_test', accepted: true, subject: found.verdict.subject, claims: found.verdict.claims, reasons: [] } }
|
|
432
|
+
: { body: { object: 'machine_trust_policy_test', accepted: false, subject: null, claims: null, reasons: [...new Set(found.reasons)] } };
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
method: 'POST',
|
|
437
|
+
pattern: '/v1/machines/federate',
|
|
438
|
+
public: true,
|
|
439
|
+
handler: (c) => federate(c),
|
|
440
|
+
},
|
|
441
|
+
];
|
|
442
|
+
}
|
|
443
|
+
async function federate(c) {
|
|
444
|
+
const e = c.engine;
|
|
445
|
+
const b = c.body;
|
|
446
|
+
const machineId = typeof b.machine_id === 'string' ? b.machine_id.trim() : '';
|
|
447
|
+
if (!machineId)
|
|
448
|
+
throw bad('A `machine_id` is required.', 'machine_id');
|
|
449
|
+
if ((b.token === undefined) === (b.aws === undefined))
|
|
450
|
+
throw bad('Send `token` (a GitHub Actions, Kubernetes, GCP or OIDC token) or `aws` (a signed GetCallerIdentity request), not both and not neither.', 'token');
|
|
451
|
+
if (b.token !== undefined && (typeof b.token !== 'string' || !b.token || b.token.length > 16_384))
|
|
452
|
+
throw bad('`token` must be a JWT string.', 'token');
|
|
453
|
+
if (b.aws !== undefined && !isObj(b.aws))
|
|
454
|
+
throw bad('`aws` must be an object.', 'aws');
|
|
455
|
+
if (b.policy_id !== undefined && typeof b.policy_id !== 'string')
|
|
456
|
+
throw bad('`policy_id` must be a trust policy id.', 'policy_id');
|
|
457
|
+
// The same answer as a refused token: a caller learns nothing about which machines exist.
|
|
458
|
+
const refused = () => new errors_1.EmulatorError('FORBIDDEN', 'No trust policy of this machine accepts that token.');
|
|
459
|
+
const m = e.db.machines.get(machineId);
|
|
460
|
+
if (!m || m.deleted || m.status !== 'active')
|
|
461
|
+
throw refused();
|
|
462
|
+
const proved = await (0, device_1.provedBindingOf)(c);
|
|
463
|
+
(0, device_1.enforceTokenBinding)(m, proved);
|
|
464
|
+
const found = await match(e, st(e).policies.filter((p) => p.machine_id === m.id), { token: b.token, aws: b.aws }, b.policy_id);
|
|
465
|
+
if (!('verdict' in found))
|
|
466
|
+
throw refused();
|
|
467
|
+
const { policy, verdict } = found;
|
|
468
|
+
const issued = await (0, device_1.issueMachineToken)(c, m, b, {
|
|
469
|
+
proved,
|
|
470
|
+
maxTtlSeconds: policy.max_ttl_seconds,
|
|
471
|
+
extraClaims: { fed: { kind: policy.kind, policy_id: policy.id, sub: verdict.subject } },
|
|
472
|
+
// The signed AWS request is spent only once the token is certain to be issued.
|
|
473
|
+
beforeIssue: () => {
|
|
474
|
+
if (verdict.fingerprint)
|
|
475
|
+
st(e).spentAws.add(verdict.fingerprint);
|
|
476
|
+
},
|
|
477
|
+
});
|
|
478
|
+
policy.last_used_at = e.clock.now();
|
|
479
|
+
return issued;
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=federation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/handlers/federation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The relationship-model engine behind the FGA routes: an OpenFGA-style authorization model (JSON `type_definitions` or DSL
|
|
3
|
+
* text) with the six rewrite operators (direct, computed, tuple-to-userset, union, intersection, exclusion), tuple
|
|
4
|
+
* conditions over a small CEL subset, and check / list-objects / list-users / expand over a set of tuples.
|
|
5
|
+
*
|
|
6
|
+
* shortcut: conditions support comparisons, boolean and arithmetic operators, `in`, field and index access, list literals
|
|
7
|
+
* and the string functions startsWith, endsWith, contains, matches, size; no ipaddress, duration or map-typed parameters.
|
|
8
|
+
* Upgrade by running the real engine if a model depends on those.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ModelError extends Error {
|
|
11
|
+
readonly errors: string[];
|
|
12
|
+
constructor(errors: string[]);
|
|
13
|
+
}
|
|
14
|
+
export declare class TupleError extends Error {
|
|
15
|
+
}
|
|
16
|
+
type Us = any;
|
|
17
|
+
export interface Ref {
|
|
18
|
+
type: string;
|
|
19
|
+
relation?: string;
|
|
20
|
+
wildcard?: Record<string, never>;
|
|
21
|
+
condition?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface Compiled {
|
|
24
|
+
types: Map<string, Map<string, Us>>;
|
|
25
|
+
refs: Map<string, Map<string, Ref[]>>;
|
|
26
|
+
conds: Map<string, {
|
|
27
|
+
params: Map<string, string>;
|
|
28
|
+
ast: Cel;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
export interface FgaTuple {
|
|
32
|
+
user: string;
|
|
33
|
+
relation: string;
|
|
34
|
+
object: string;
|
|
35
|
+
condition?: {
|
|
36
|
+
name: string;
|
|
37
|
+
context?: Record<string, unknown>;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** OpenFGA DSL text to the JSON model. */
|
|
41
|
+
export declare function dslToModel(dsl: string): any;
|
|
42
|
+
/** Validate and compile a JSON model. Throws ModelError with every problem found. */
|
|
43
|
+
export declare function compileModel(model: unknown): Compiled;
|
|
44
|
+
export declare function compileStored(model: unknown): Compiled | null;
|
|
45
|
+
interface PUser {
|
|
46
|
+
type: string;
|
|
47
|
+
id: string;
|
|
48
|
+
rel: string | null;
|
|
49
|
+
wild: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare function parseUser(s: string): PUser;
|
|
52
|
+
export declare function parseObject(s: string): {
|
|
53
|
+
type: string;
|
|
54
|
+
id: string;
|
|
55
|
+
};
|
|
56
|
+
/** Write-time type validation: the same rules the real store applies against the latest model. Null when allowed. */
|
|
57
|
+
export declare function validateTuple(m: Compiled, t: FgaTuple): string | null;
|
|
58
|
+
type Cel = any;
|
|
59
|
+
export declare class Resolver {
|
|
60
|
+
readonly model: Compiled;
|
|
61
|
+
private readonly context;
|
|
62
|
+
private readonly by;
|
|
63
|
+
private readonly objects;
|
|
64
|
+
errors: number;
|
|
65
|
+
constructor(model: Compiled, tuples: readonly FgaTuple[], context: Record<string, unknown> | undefined);
|
|
66
|
+
private read;
|
|
67
|
+
private holds;
|
|
68
|
+
check(user: PUser, object: string, relation: string): boolean;
|
|
69
|
+
private relation;
|
|
70
|
+
private node;
|
|
71
|
+
/** Ids of `type` objects the user holds `relation` on (candidates are the objects named in any tuple). */
|
|
72
|
+
listObjects(user: PUser, relation: string, type: string): string[];
|
|
73
|
+
/** Concrete users of `userType` that hold `relation` on the object. */
|
|
74
|
+
listUsers(object: string, relation: string, userType: string): string[];
|
|
75
|
+
/** The userset tree of a relation (the rewrite structure with the direct users at each `this` leaf). */
|
|
76
|
+
expand(object: string, relation: string): any;
|
|
77
|
+
}
|
|
78
|
+
export {};
|