@atlasauth/emulator-core 0.1.0 → 0.2.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/engine.d.ts +33 -2
- package/dist/engine.js +53 -8
- package/dist/engine.js.map +1 -1
- package/dist/error-catalog.js +8 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/event-gate.d.ts +3 -0
- package/dist/event-gate.js +372 -0
- package/dist/event-gate.js.map +1 -0
- package/dist/generic.js +9 -1
- package/dist/generic.js.map +1 -1
- package/dist/handlers/approvals.d.ts +2 -0
- package/dist/handlers/approvals.js +365 -0
- package/dist/handlers/approvals.js.map +1 -0
- package/dist/handlers/authz.d.ts +2 -0
- package/dist/handlers/authz.js +347 -0
- package/dist/handlers/authz.js.map +1 -0
- package/dist/handlers/billing.d.ts +2 -0
- package/dist/handlers/billing.js +398 -0
- package/dist/handlers/billing.js.map +1 -0
- package/dist/handlers/connections.d.ts +2 -0
- package/dist/handlers/connections.js +332 -0
- package/dist/handlers/connections.js.map +1 -0
- package/dist/handlers/device.d.ts +47 -0
- package/dist/handlers/device.js +648 -0
- package/dist/handlers/device.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/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 +4 -1
- package/dist/handlers/hooks.js.map +1 -1
- package/dist/handlers/index.d.ts +5 -1
- package/dist/handlers/index.js +32 -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 +55 -8
- package/dist/handlers/machines.js.map +1 -1
- package/dist/handlers/messaging.d.ts +4 -0
- package/dist/handlers/messaging.js +486 -0
- package/dist/handlers/messaging.js.map +1 -0
- package/dist/handlers/oauth-flows.d.ts +28 -0
- package/dist/handlers/oauth-flows.js +419 -0
- package/dist/handlers/oauth-flows.js.map +1 -0
- package/dist/handlers/oauth.d.ts +75 -0
- package/dist/handlers/oauth.js +608 -0
- package/dist/handlers/oauth.js.map +1 -0
- 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 +15 -0
- package/dist/handlers/platform.js +454 -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 +2 -0
- package/dist/handlers/scim.js +408 -0
- package/dist/handlers/scim.js.map +1 -0
- package/dist/handlers/sessions.d.ts +7 -3
- package/dist/handlers/sessions.js +55 -25
- 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 +4 -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/jws.d.ts +41 -0
- package/dist/jws.js +133 -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/parity-bin.js +3 -1
- package/dist/parity-bin.js.map +1 -1
- package/dist/parity-routes.d.ts +14 -0
- package/dist/parity-routes.js +421 -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/tokens.d.ts +17 -0
- package/dist/tokens.js +46 -0
- 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,419 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resetOAuthFlows = void 0;
|
|
4
|
+
exports.claimDpopJti = claimDpopJti;
|
|
5
|
+
exports.resolveRequestUri = resolveRequestUri;
|
|
6
|
+
exports.consentGate = consentGate;
|
|
7
|
+
exports.extensionGrant = extensionGrant;
|
|
8
|
+
exports.oauthFlowHandlers = oauthFlowHandlers;
|
|
9
|
+
const errors_1 = require("../errors");
|
|
10
|
+
const store_1 = require("../store");
|
|
11
|
+
const oauth_1 = require("./oauth");
|
|
12
|
+
const support_1 = require("./support");
|
|
13
|
+
/**
|
|
14
|
+
* The OAuth provider's interactive and out-of-band flows, on top of the core in `oauth.ts`: the consent screen (built-in
|
|
15
|
+
* `/oauth2/authorize/consent` and the delegated `/v1/oauth_consent_requests` challenge), pushed authorization requests
|
|
16
|
+
* (RFC 9126), the device authorization grant (RFC 8628) and OpenID CIBA (poll and ping). The emulator is its own user agent:
|
|
17
|
+
* the person who consents, enters the device code or answers a CIBA prompt is simulated by calling the same routes a
|
|
18
|
+
* browser or phone would.
|
|
19
|
+
*/
|
|
20
|
+
const PAR_TTL_MS = 60_000;
|
|
21
|
+
const CONSENT_TTL_MS = 10 * 60_000;
|
|
22
|
+
const DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';
|
|
23
|
+
const CIBA_GRANT = 'urn:openid:params:grant-type:ciba';
|
|
24
|
+
const DEVICE_TTL_S = 600;
|
|
25
|
+
const POLL_INTERVAL_S = 5;
|
|
26
|
+
const USER_CODE_ALPHABET = 'BCDFGHJKLMNPQRSTVWXZ';
|
|
27
|
+
const flows = (0, support_1.engineState)(() => ({ par: new Map(), consents: new Map(), remembered: new Map(), devices: new Map(), ciba: new Map(), dpopSeen: new Map() }));
|
|
28
|
+
const resetOAuthFlows = (_e) => undefined; // state lives in engineState, which engine.reset clears
|
|
29
|
+
exports.resetOAuthFlows = resetOAuthFlows;
|
|
30
|
+
/** Claim a DPoP proof's jti once inside its window; false when it was already used. */
|
|
31
|
+
function claimDpopJti(e, jkt, jti, ttlMs) {
|
|
32
|
+
const seen = flows(e).dpopSeen;
|
|
33
|
+
const now = e.clock.now();
|
|
34
|
+
for (const [k, until] of seen)
|
|
35
|
+
if (until <= now)
|
|
36
|
+
seen.delete(k);
|
|
37
|
+
const key = `${jkt}:${jti}`;
|
|
38
|
+
if (seen.has(key))
|
|
39
|
+
return false;
|
|
40
|
+
seen.set(key, now + ttlMs);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
const redirectTo = (uri, params) => {
|
|
44
|
+
const u = new URL(uri);
|
|
45
|
+
for (const [k, v] of Object.entries(params))
|
|
46
|
+
if (v !== undefined)
|
|
47
|
+
u.searchParams.set(k, v);
|
|
48
|
+
return u.toString();
|
|
49
|
+
};
|
|
50
|
+
const found = (location) => ({ status: 302, headers: { location, 'cache-control': 'no-store' } });
|
|
51
|
+
/** The user a flow acts for: an explicit id or email, else the one the emulator signs in, else the only user. */
|
|
52
|
+
function resolveUser(e, hint, allowSole = true) {
|
|
53
|
+
const live = e.db.users.filter((u) => !u.deleted);
|
|
54
|
+
if (hint)
|
|
55
|
+
return live.find((u) => u.id === hint || u.emails.some((m) => m.email_address.toLowerCase() === hint.toLowerCase()));
|
|
56
|
+
const auto = (0, oauth_1.st)(e).autoUser;
|
|
57
|
+
return (auto ? live.find((u) => u.id === auto) : undefined) ?? (allowSole && live.length === 1 ? live[0] : undefined);
|
|
58
|
+
}
|
|
59
|
+
// ── PAR ──────────────────────────────────────────────────────────────
|
|
60
|
+
/** An /authorize request carrying `request_uri`: swap in the pushed parameters (single use, bound to the client). */
|
|
61
|
+
function resolveRequestUri(e, query) {
|
|
62
|
+
const uri = query.get('request_uri');
|
|
63
|
+
if (!uri)
|
|
64
|
+
return { query };
|
|
65
|
+
const rec = flows(e).par.get(uri);
|
|
66
|
+
if (!rec || rec.used || rec.expiresAt <= e.clock.now())
|
|
67
|
+
return { error: { code: 'invalid_request_uri', description: 'The request_uri is unknown, expired or already used.' } };
|
|
68
|
+
if (query.get('client_id') !== rec.clientId)
|
|
69
|
+
return { error: { code: 'invalid_request', description: 'client_id does not match the client that pushed this request.' } };
|
|
70
|
+
rec.used = true;
|
|
71
|
+
return { query: new URLSearchParams({ ...rec.params, client_id: rec.clientId }) };
|
|
72
|
+
}
|
|
73
|
+
// ── consent ──────────────────────────────────────────────────────────
|
|
74
|
+
const rememberKey = (userId, clientId) => `${userId}|${clientId}`;
|
|
75
|
+
/** Where an authorize request must stop for the user's consent, or null when it can proceed (first-party client, consent not required, or already remembered). */
|
|
76
|
+
function consentGate(e, a) {
|
|
77
|
+
const { client, user, scope, prompt } = a;
|
|
78
|
+
const forced = prompt === 'consent';
|
|
79
|
+
if (client.first_party === true || !(client.require_consent === true || forced))
|
|
80
|
+
return null;
|
|
81
|
+
const held = flows(e).remembered.get(rememberKey(user.id, client.id));
|
|
82
|
+
if (!forced && held && scope.every((s) => held.has(s)))
|
|
83
|
+
return null;
|
|
84
|
+
if (prompt === 'none')
|
|
85
|
+
return found(redirectTo(a.redirectUri, { error: 'consent_required', error_description: 'The user has not consented to these scopes.', state: a.state, iss: e.issuer }));
|
|
86
|
+
const id = `consent_${(0, store_1.randomToken)(24)}`;
|
|
87
|
+
flows(e).consents.set(id, { id, clientId: client.id, userId: user.id, scope, redirectUri: a.redirectUri, challenge: a.challenge, nonce: a.nonce, state: a.state, expiresAt: e.clock.now() + CONSENT_TTL_MS, status: 'pending' });
|
|
88
|
+
return found(`${e.issuer}/oauth2/authorize/consent?consent_token=${id}`);
|
|
89
|
+
}
|
|
90
|
+
function liveConsent(e, id) {
|
|
91
|
+
const c = id ? flows(e).consents.get(id) : undefined;
|
|
92
|
+
if (!c || c.status !== 'pending' || c.expiresAt <= e.clock.now())
|
|
93
|
+
throw new errors_1.EmulatorError('NOT_FOUND', 'This consent request has expired or was already answered.');
|
|
94
|
+
return c;
|
|
95
|
+
}
|
|
96
|
+
/** Answer a consent request; returns the URL to send the browser to. The scopes granted are always a subset of what was asked. */
|
|
97
|
+
function settleConsent(e, c, d) {
|
|
98
|
+
const back = (p) => redirectTo(c.redirectUri, { ...p, state: c.state, iss: e.issuer });
|
|
99
|
+
const client = e.db.oauthClients.get(c.clientId);
|
|
100
|
+
if (!client || client.deleted) {
|
|
101
|
+
c.status = 'rejected';
|
|
102
|
+
return back({ error: 'unauthorized_client' });
|
|
103
|
+
}
|
|
104
|
+
if (!d.approve) {
|
|
105
|
+
c.status = 'rejected';
|
|
106
|
+
return back({ error: d.error ?? 'access_denied', error_description: d.description ?? 'The user denied the request.' });
|
|
107
|
+
}
|
|
108
|
+
const grant = d.grant ?? c.scope;
|
|
109
|
+
if (grant.some((s) => !c.scope.includes(s)))
|
|
110
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'grant_scope can only narrow the requested scopes.', 'grant_scope');
|
|
111
|
+
if (c.scope.includes('openid') && !grant.includes('openid'))
|
|
112
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'grant_scope must include openid.', 'grant_scope');
|
|
113
|
+
c.status = 'accepted';
|
|
114
|
+
if (d.remember !== false) {
|
|
115
|
+
const key = rememberKey(c.userId, c.clientId);
|
|
116
|
+
flows(e).remembered.set(key, new Set([...(flows(e).remembered.get(key) ?? []), ...grant]));
|
|
117
|
+
}
|
|
118
|
+
return back({ code: (0, oauth_1.issueCode)(e, { client, userId: c.userId, scope: grant, redirectUri: c.redirectUri, challenge: c.challenge, nonce: c.nonce }) });
|
|
119
|
+
}
|
|
120
|
+
// ── extension grants on /oauth2/token ────────────────────────────────
|
|
121
|
+
const pendingErr = (error, description) => (0, oauth_1.fail)(400, error, description);
|
|
122
|
+
/** `device_code` and `ciba` grants. Returns undefined for any other grant type. */
|
|
123
|
+
async function extensionGrant(c, client, type, cnf) {
|
|
124
|
+
const e = c.engine;
|
|
125
|
+
const now = e.clock.now();
|
|
126
|
+
if (type !== DEVICE_GRANT && type !== CIBA_GRANT)
|
|
127
|
+
return undefined;
|
|
128
|
+
const isDevice = type === DEVICE_GRANT;
|
|
129
|
+
const rec = isDevice ? flows(e).devices.get(String(c.body.device_code ?? '')) : flows(e).ciba.get(String(c.body.auth_req_id ?? ''));
|
|
130
|
+
if (!rec || rec.clientId !== client.id || rec.status === 'used')
|
|
131
|
+
return (0, oauth_1.fail)(400, 'invalid_grant', isDevice ? 'The device_code is invalid.' : 'The auth_req_id is invalid.');
|
|
132
|
+
if (rec.expiresAt <= now)
|
|
133
|
+
return pendingErr('expired_token', 'The request expired.');
|
|
134
|
+
if (rec.status === 'denied') {
|
|
135
|
+
rec.status = 'used';
|
|
136
|
+
return pendingErr('access_denied', 'The user denied the request.');
|
|
137
|
+
}
|
|
138
|
+
// Polling faster than the interval earns slow_down and a longer interval (RFC 8628 section 3.5).
|
|
139
|
+
if (rec.status === 'pending') {
|
|
140
|
+
if (now - rec.lastPoll < rec.interval * 1000) {
|
|
141
|
+
rec.interval += 5;
|
|
142
|
+
rec.lastPoll = now;
|
|
143
|
+
return pendingErr('slow_down', 'Polling too fast: wait at least the new interval.');
|
|
144
|
+
}
|
|
145
|
+
rec.lastPoll = now;
|
|
146
|
+
return pendingErr('authorization_pending', isDevice ? 'The user has not finished authorizing this device yet.' : 'The user has not answered yet.');
|
|
147
|
+
}
|
|
148
|
+
rec.status = 'used';
|
|
149
|
+
const userId = rec.userId;
|
|
150
|
+
const grant = { id: e.db.newId('oag'), clientId: client.id, userId, scope: rec.scope, revoked: false, jtis: new Set() };
|
|
151
|
+
(0, oauth_1.st)(e).grants.set(grant.id, grant);
|
|
152
|
+
return { body: await (0, oauth_1.issueTokens)(e, client, grant, null, now, undefined, cnf), headers: { 'cache-control': 'no-store', pragma: 'no-cache' } };
|
|
153
|
+
}
|
|
154
|
+
const userCodeOf = () => {
|
|
155
|
+
const bytes = crypto.getRandomValues(new Uint8Array(8));
|
|
156
|
+
const s = [...bytes].map((b) => USER_CODE_ALPHABET[b % USER_CODE_ALPHABET.length]).join('');
|
|
157
|
+
return `${s.slice(0, 4)}-${s.slice(4)}`;
|
|
158
|
+
};
|
|
159
|
+
const normaliseUserCode = (s) => String(s ?? '').toUpperCase().replace(/[^A-Z]/g, '');
|
|
160
|
+
function scopeFor(client, asked) {
|
|
161
|
+
const allowed = client.allowed_scopes ?? [];
|
|
162
|
+
const requested = (0, oauth_1.splitScope)(asked);
|
|
163
|
+
if (!requested.length)
|
|
164
|
+
return allowed;
|
|
165
|
+
const outside = requested.filter((s) => !allowed.includes(s));
|
|
166
|
+
return outside.length ? { error: (0, oauth_1.fail)(400, 'invalid_scope', `Scope not allowed for this client: ${outside.join(' ')}.`) } : requested;
|
|
167
|
+
}
|
|
168
|
+
function oauthFlowHandlers() {
|
|
169
|
+
const cibaView = (r) => ({ id: r.id, scope: r.scope, binding_message: r.bindingMessage, created_at: r.createdAt, expires_at: r.expiresAt });
|
|
170
|
+
const requireClient = (e, c, needGrant) => {
|
|
171
|
+
const auth = (0, oauth_1.authenticateClient)(e, c);
|
|
172
|
+
if ('error' in auth)
|
|
173
|
+
return auth;
|
|
174
|
+
if (needGrant && !auth.client.grant_types.includes(needGrant))
|
|
175
|
+
return { error: (0, oauth_1.fail)(400, 'unauthorized_client', `This client is not permitted the ${needGrant} grant.`) };
|
|
176
|
+
return auth;
|
|
177
|
+
};
|
|
178
|
+
return [
|
|
179
|
+
// ── PAR ──
|
|
180
|
+
{
|
|
181
|
+
method: 'POST',
|
|
182
|
+
pattern: '/oauth2/par',
|
|
183
|
+
public: true,
|
|
184
|
+
handler: (c) => {
|
|
185
|
+
const e = c.engine;
|
|
186
|
+
const auth = requireClient(e, c);
|
|
187
|
+
if ('error' in auth)
|
|
188
|
+
return auth.error;
|
|
189
|
+
const client = auth.client;
|
|
190
|
+
const b = c.body;
|
|
191
|
+
if (b.request_uri)
|
|
192
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'request_uri is not allowed here.');
|
|
193
|
+
if (b.client_id && b.client_id !== client.id)
|
|
194
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'client_id does not match the authenticated client.');
|
|
195
|
+
const redirectUri = typeof b.redirect_uri === 'string' ? b.redirect_uri : undefined;
|
|
196
|
+
if (!redirectUri || !client.redirect_uris.includes(redirectUri))
|
|
197
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'The redirect_uri does not match a registered URI.');
|
|
198
|
+
if (b.response_type !== 'code')
|
|
199
|
+
return (0, oauth_1.fail)(400, 'unsupported_response_type', 'Only response_type=code is supported.');
|
|
200
|
+
const asked = (0, oauth_1.splitScope)(b.scope ?? 'openid');
|
|
201
|
+
const outside = asked.filter((s) => !client.allowed_scopes.includes(s) && !['openid', 'profile', 'email', 'offline_access'].includes(s));
|
|
202
|
+
if (outside.length)
|
|
203
|
+
return (0, oauth_1.fail)(400, 'invalid_scope', `Scope not allowed: ${outside.join(' ')}.`);
|
|
204
|
+
if (b.code_challenge && (b.code_challenge_method ?? 'plain') !== 'S256')
|
|
205
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'code_challenge_method must be S256.');
|
|
206
|
+
if (!b.code_challenge && client.auth_method === 'none')
|
|
207
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'A public client must use PKCE (code_challenge).');
|
|
208
|
+
const params = {};
|
|
209
|
+
for (const [k, v] of Object.entries(b))
|
|
210
|
+
if (typeof v === 'string' && !['client_secret', 'client_id'].includes(k))
|
|
211
|
+
params[k] = v;
|
|
212
|
+
const uri = `urn:ietf:params:oauth:request_uri:${(0, store_1.randomToken)(24)}`;
|
|
213
|
+
flows(e).par.set(uri, { clientId: client.id, params, expiresAt: e.clock.now() + PAR_TTL_MS, used: false });
|
|
214
|
+
return { status: 201, body: { request_uri: uri, expires_in: PAR_TTL_MS / 1000 }, headers: { 'cache-control': 'no-store' } };
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
// ── consent: the built-in screen ──
|
|
218
|
+
{
|
|
219
|
+
method: 'GET',
|
|
220
|
+
pattern: '/oauth2/authorize/consent',
|
|
221
|
+
public: true,
|
|
222
|
+
handler: (c) => {
|
|
223
|
+
const e = c.engine;
|
|
224
|
+
const r = liveConsent(e, c.query.get('consent_token'));
|
|
225
|
+
const client = e.db.oauthClients.get(r.clientId);
|
|
226
|
+
return { body: { object: 'oauth_consent_screen', consent_token: r.id, client: { id: client.id, name: client.name }, user_id: r.userId, requested_scope: r.scope, expires_at: r.expiresAt } };
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
method: 'POST',
|
|
231
|
+
pattern: '/oauth2/authorize/consent',
|
|
232
|
+
public: true,
|
|
233
|
+
handler: (c) => {
|
|
234
|
+
const e = c.engine;
|
|
235
|
+
const r = liveConsent(e, typeof c.body.consent_token === 'string' ? c.body.consent_token : null);
|
|
236
|
+
const approve = c.body.decision === 'approve';
|
|
237
|
+
if (!approve && c.body.decision !== 'deny')
|
|
238
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'decision must be approve or deny.', 'decision');
|
|
239
|
+
return found(settleConsent(e, r, { approve }));
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
// ── consent: the delegated challenge (a customer's own consent page) ──
|
|
243
|
+
{
|
|
244
|
+
method: 'GET',
|
|
245
|
+
pattern: '/v1/oauth_consent_requests',
|
|
246
|
+
handler: (c) => {
|
|
247
|
+
const e = c.engine;
|
|
248
|
+
const r = liveConsent(e, c.query.get('consent_challenge'));
|
|
249
|
+
const client = e.db.oauthClients.get(r.clientId);
|
|
250
|
+
return { body: { object: 'oauth_consent_request', subject: r.userId, client: { id: client.id, client_id: client.id, name: client.name }, requested_scope: r.scope, expires_at: r.expiresAt } };
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
method: 'PUT',
|
|
255
|
+
pattern: '/v1/oauth_consent_requests/accept',
|
|
256
|
+
handler: (c) => {
|
|
257
|
+
const e = c.engine;
|
|
258
|
+
const r = liveConsent(e, c.query.get('consent_challenge'));
|
|
259
|
+
if (c.body.grant_scope !== undefined && (!Array.isArray(c.body.grant_scope) || c.body.grant_scope.some((s) => typeof s !== 'string')))
|
|
260
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'grant_scope must be a list of scopes.', 'grant_scope');
|
|
261
|
+
return { body: { object: 'oauth_consent_redirect', redirect_to: settleConsent(e, r, { approve: true, grant: c.body.grant_scope, remember: c.body.remember }) } };
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
method: 'PUT',
|
|
266
|
+
pattern: '/v1/oauth_consent_requests/reject',
|
|
267
|
+
handler: (c) => {
|
|
268
|
+
const e = c.engine;
|
|
269
|
+
const r = liveConsent(e, c.query.get('consent_challenge'));
|
|
270
|
+
return { body: { object: 'oauth_consent_redirect', redirect_to: settleConsent(e, r, { approve: false, error: c.body.error, description: c.body.error_description }) } };
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
// ── device authorization ──
|
|
274
|
+
{
|
|
275
|
+
method: 'POST',
|
|
276
|
+
pattern: '/oauth2/device_authorization',
|
|
277
|
+
public: true,
|
|
278
|
+
handler: (c) => {
|
|
279
|
+
const e = c.engine;
|
|
280
|
+
const auth = requireClient(e, c, DEVICE_GRANT);
|
|
281
|
+
if ('error' in auth)
|
|
282
|
+
return auth.error;
|
|
283
|
+
const scope = scopeFor(auth.client, c.body.scope);
|
|
284
|
+
if ('error' in scope)
|
|
285
|
+
return scope.error;
|
|
286
|
+
const rec = { deviceCode: (0, store_1.randomToken)(32), userCode: userCodeOf(), clientId: auth.client.id, scope, expiresAt: e.clock.now() + DEVICE_TTL_S * 1000, interval: POLL_INTERVAL_S, lastPoll: 0, status: 'pending' };
|
|
287
|
+
flows(e).devices.set(rec.deviceCode, rec);
|
|
288
|
+
const uri = `${e.issuer}/oauth2/device`;
|
|
289
|
+
return { body: { device_code: rec.deviceCode, user_code: rec.userCode, verification_uri: uri, verification_uri_complete: `${uri}?user_code=${rec.userCode}`, expires_in: DEVICE_TTL_S, interval: POLL_INTERVAL_S }, headers: { 'cache-control': 'no-store', pragma: 'no-cache' } };
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
method: 'GET',
|
|
294
|
+
pattern: '/oauth2/device',
|
|
295
|
+
public: true,
|
|
296
|
+
handler: (c) => {
|
|
297
|
+
const e = c.engine;
|
|
298
|
+
const code = normaliseUserCode(c.query.get('user_code'));
|
|
299
|
+
const rec = [...flows(e).devices.values()].find((d) => normaliseUserCode(d.userCode) === code && d.status === 'pending' && d.expiresAt > e.clock.now());
|
|
300
|
+
if (!rec)
|
|
301
|
+
throw new errors_1.EmulatorError('NOT_FOUND', 'That code is not valid or has expired.');
|
|
302
|
+
const client = e.db.oauthClients.get(rec.clientId);
|
|
303
|
+
return { body: { object: 'oauth_device_verification', user_code: rec.userCode, client: { id: client.id, name: client.name }, scope: rec.scope, expires_at: rec.expiresAt } };
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
method: 'POST',
|
|
308
|
+
pattern: '/oauth2/device/verify',
|
|
309
|
+
public: true,
|
|
310
|
+
handler: (c) => {
|
|
311
|
+
const e = c.engine;
|
|
312
|
+
const code = normaliseUserCode(c.body.user_code);
|
|
313
|
+
const rec = [...flows(e).devices.values()].find((d) => normaliseUserCode(d.userCode) === code && d.status === 'pending' && d.expiresAt > e.clock.now());
|
|
314
|
+
if (!rec)
|
|
315
|
+
throw new errors_1.EmulatorError('NOT_FOUND', 'That code is not valid or has expired.');
|
|
316
|
+
if (c.body.decision !== 'approve' && c.body.decision !== 'deny')
|
|
317
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'decision must be approve or deny.', 'decision');
|
|
318
|
+
if (c.body.decision === 'deny')
|
|
319
|
+
rec.status = 'denied';
|
|
320
|
+
else {
|
|
321
|
+
const user = resolveUser(e, typeof c.body.user_id === 'string' ? c.body.user_id : typeof c.body.login_hint === 'string' ? c.body.login_hint : null);
|
|
322
|
+
if (!user)
|
|
323
|
+
throw new errors_1.EmulatorError('VALIDATION_FAILED', 'No user to sign in. Pass user_id or POST /__emulator/oauth/login.', 'user_id');
|
|
324
|
+
if (user.banned)
|
|
325
|
+
throw new errors_1.EmulatorError('FORBIDDEN', 'The user is banned.');
|
|
326
|
+
rec.userId = user.id;
|
|
327
|
+
rec.status = 'approved';
|
|
328
|
+
}
|
|
329
|
+
return { body: { object: 'oauth_device_verification', status: rec.status } };
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
// ── CIBA ──
|
|
333
|
+
{
|
|
334
|
+
method: 'POST',
|
|
335
|
+
pattern: '/oauth2/backchannel_authentication',
|
|
336
|
+
public: true,
|
|
337
|
+
handler: (c) => {
|
|
338
|
+
const e = c.engine;
|
|
339
|
+
const auth = requireClient(e, c, CIBA_GRANT);
|
|
340
|
+
if ('error' in auth)
|
|
341
|
+
return auth.error;
|
|
342
|
+
const client = auth.client;
|
|
343
|
+
if (client.auth_method === 'none')
|
|
344
|
+
return (0, oauth_1.fail)(400, 'invalid_client', 'CIBA requires a confidential client.');
|
|
345
|
+
const scope = scopeFor(client, c.body.scope);
|
|
346
|
+
if ('error' in scope)
|
|
347
|
+
return scope.error;
|
|
348
|
+
const hint = typeof c.body.login_hint === 'string' ? c.body.login_hint : '';
|
|
349
|
+
if (!hint)
|
|
350
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'login_hint is required.');
|
|
351
|
+
const user = resolveUser(e, hint, false);
|
|
352
|
+
if (!user)
|
|
353
|
+
return (0, oauth_1.fail)(400, 'unknown_user_id', 'No user matches the login_hint.');
|
|
354
|
+
if (user.banned)
|
|
355
|
+
return (0, oauth_1.fail)(400, 'access_denied', 'The user is banned.');
|
|
356
|
+
const binding = c.body.binding_message;
|
|
357
|
+
if (binding !== undefined && (typeof binding !== 'string' || binding.length > 64 || !/^[\x20-\x7e]*$/.test(binding)))
|
|
358
|
+
return (0, oauth_1.fail)(400, 'invalid_binding_message', 'binding_message is up to 64 printable characters.');
|
|
359
|
+
const expiry = c.body.requested_expiry === undefined ? 120 : Number(c.body.requested_expiry);
|
|
360
|
+
if (!Number.isInteger(expiry) || expiry < 1 || expiry > 3600)
|
|
361
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'requested_expiry is a whole number of seconds from 1 to 3600.');
|
|
362
|
+
const mode = client.backchannel_token_delivery_mode ?? 'poll';
|
|
363
|
+
let token = null;
|
|
364
|
+
if (mode === 'ping') {
|
|
365
|
+
const t = c.body.client_notification_token;
|
|
366
|
+
if (typeof t !== 'string' || t.length < 22 || t.length > 1024 || !/^[\x21-\x7e]+$/.test(t))
|
|
367
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'client_notification_token is required (22 to 1024 printable characters) for ping.');
|
|
368
|
+
if (!client.backchannel_client_notification_endpoint)
|
|
369
|
+
return (0, oauth_1.fail)(400, 'invalid_request', 'This client has no notification endpoint registered.');
|
|
370
|
+
token = t;
|
|
371
|
+
}
|
|
372
|
+
const now = e.clock.now();
|
|
373
|
+
const rec = { id: `ciba_${(0, store_1.randomToken)(24)}`, clientId: client.id, userId: user.id, scope, bindingMessage: binding ?? null, expiresAt: now + expiry * 1000, interval: POLL_INTERVAL_S, lastPoll: 0, status: 'pending', notificationToken: token, createdAt: now };
|
|
374
|
+
flows(e).ciba.set(rec.id, rec);
|
|
375
|
+
return { body: { auth_req_id: rec.id, expires_in: expiry, ...(mode === 'poll' ? { interval: POLL_INTERVAL_S } : {}) }, headers: { 'cache-control': 'no-store' } };
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
method: 'GET',
|
|
380
|
+
pattern: '/v1/client/me/backchannel_requests',
|
|
381
|
+
public: true,
|
|
382
|
+
handler: async (c) => {
|
|
383
|
+
const e = c.engine;
|
|
384
|
+
const { userId } = await (0, support_1.sessionFromBearer)(c);
|
|
385
|
+
const now = e.clock.now();
|
|
386
|
+
const rows = [...flows(e).ciba.values()].filter((r) => r.userId === userId && r.status === 'pending' && r.expiresAt > now);
|
|
387
|
+
return { body: { object: 'list', data: rows.map((r) => ({ ...cibaView(r), client_name: e.db.oauthClients.get(r.clientId)?.name ?? 'An application' })) } };
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
method: 'POST',
|
|
392
|
+
pattern: '/v1/client/me/backchannel_requests/:id',
|
|
393
|
+
public: true,
|
|
394
|
+
handler: async (c) => {
|
|
395
|
+
const e = c.engine;
|
|
396
|
+
const { userId } = await (0, support_1.sessionFromBearer)(c);
|
|
397
|
+
const rec = flows(e).ciba.get(c.params.id ?? '');
|
|
398
|
+
// 404 for someone else's or an unknown request: never confirm one exists.
|
|
399
|
+
if (!rec || rec.userId !== userId)
|
|
400
|
+
throw new errors_1.EmulatorError('NOT_FOUND', 'Unknown request.');
|
|
401
|
+
if (rec.status !== 'pending' || rec.expiresAt <= e.clock.now())
|
|
402
|
+
throw new errors_1.EmulatorError('VERIFICATION_FAILED', 'This request is no longer pending.');
|
|
403
|
+
const approve = c.body.decision === 'approve';
|
|
404
|
+
rec.status = approve ? 'approved' : 'denied';
|
|
405
|
+
const client = e.db.oauthClients.get(rec.clientId);
|
|
406
|
+
if (client?.backchannel_token_delivery_mode === 'ping' && client.backchannel_client_notification_endpoint && rec.notificationToken) {
|
|
407
|
+
try {
|
|
408
|
+
await (e.options.fetch ?? fetch)(client.backchannel_client_notification_endpoint, { method: 'POST', headers: { 'content-type': 'application/json', authorization: `Bearer ${rec.notificationToken}` }, body: JSON.stringify({ auth_req_id: rec.id }) });
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
/* a failed ping leaves the request pollable */
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return { body: { object: 'backchannel_request', id: rec.id, status: rec.status } };
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
];
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=oauth-flows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-flows.js","sourceRoot":"","sources":["../../src/handlers/oauth-flows.ts"],"names":[],"mappings":";;;AAuEA,oCAQC;AAoBD,8CAQC;AAOD,kCAUC;AAoCD,wCA2BC;AAiBD,8CAwNC;AAlaD,sCAA0C;AAE1C,oCAAuC;AACvC,mCAAkH;AAClH,uCAA2D;AAE3D;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,CAAC;AACnC,MAAM,YAAY,GAAG,8CAA8C,CAAC;AACpE,MAAM,UAAU,GAAG,mCAAmC,CAAC;AACvD,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AA8ClD,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,GAAU,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5J,MAAM,eAAe,GAAG,CAAC,EAAU,EAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,wDAAwD;AAA3G,QAAA,eAAe,mBAAmC;AAE/D,uFAAuF;AACvF,SAAgB,YAAY,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW,EAAE,KAAa;IAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;QAAE,IAAI,KAAK,IAAI,GAAG;YAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,MAA0C,EAAU,EAAE;IACrF,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,KAAK,SAAS;YAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;AAEjH,iHAAiH;AACjH,SAAS,WAAW,CAAC,CAAS,EAAE,IAA+B,EAAE,SAAS,GAAG,IAAI;IAC/E,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAK,CAAC,CAAC,MAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC1I,MAAM,IAAI,GAAG,IAAA,UAAO,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACxH,CAAC;AAED,wEAAwE;AAExE,qHAAqH;AACrH,SAAgB,iBAAiB,CAAC,CAAS,EAAE,KAAsB;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sDAAsD,EAAE,EAAE,CAAC;IAC/K,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,+DAA+D,EAAE,EAAE,CAAC;IACzK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,wEAAwE;AAExE,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;AAElF,kKAAkK;AAClK,SAAgB,WAAW,CAAC,CAAS,EAAE,CAA0J;IAC/L,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC;IACpC,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,eAAe,KAAK,IAAI,IAAI,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7F,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,6CAA6C,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/L,MAAM,EAAE,GAAG,WAAW,IAAA,mBAAW,EAAC,EAAE,CAAC,EAAE,CAAC;IACxC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACjO,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,2CAA2C,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,EAA6B;IAC3D,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QAAE,MAAM,IAAI,sBAAa,CAAC,WAAW,EAAE,2DAA2D,CAAC,CAAC;IACpK,OAAO,CAAC,CAAC;AACX,CAAC;AAED,kIAAkI;AAClI,SAAS,aAAa,CAAC,CAAS,EAAE,CAAU,EAAE,CAAmG;IAC/I,MAAM,IAAI,GAAG,CAAC,CAAqC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3H,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC;QACtB,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC;QACtB,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,eAAe,EAAE,iBAAiB,EAAE,CAAC,CAAC,WAAW,IAAI,8BAA8B,EAAE,CAAC,CAAC;IACzH,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;IACjC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,sBAAa,CAAC,mBAAmB,EAAE,mDAAmD,EAAE,aAAa,CAAC,CAAC;IAC9J,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,sBAAa,CAAC,mBAAmB,EAAE,kCAAkC,EAAE,aAAa,CAAC,CAAC;IAC7J,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC;IACtB,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9C,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,IAAA,iBAAS,EAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACtJ,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,WAAmB,EAAS,EAAE,CAAC,IAAA,YAAI,EAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AAEhG,mFAAmF;AAC5E,KAAK,UAAU,cAAc,CAAC,CAAe,EAAE,MAAW,EAAE,IAAY,EAAE,GAAoB;IACnG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,KAAK,YAAY,CAAC;IACvC,MAAM,GAAG,GAAoC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;IACrK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAC7K,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,OAAO,UAAU,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAC;IACrE,CAAC;IACD,iGAAiG;IACjG,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;YAC7C,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;YAClB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC;YACnB,OAAO,UAAU,CAAC,WAAW,EAAE,mDAAmD,CAAC,CAAC;QACtF,CAAC;QACD,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC;QACnB,OAAO,UAAU,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;IACrJ,CAAC;IACD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,MAAM,GAAI,GAAW,CAAC,MAAgB,CAAC;IAC7C,MAAM,KAAK,GAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC/H,IAAA,UAAO,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAA,mBAAW,EAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;AAChJ,CAAC;AAED,MAAM,UAAU,GAAG,GAAW,EAAE;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC,CAAC;AACF,MAAM,iBAAiB,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAEvG,SAAS,QAAQ,CAAC,MAAW,EAAE,KAAyB;IACtD,MAAM,OAAO,GAAa,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IACtC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAA,YAAI,EAAC,GAAG,EAAE,eAAe,EAAE,sCAAsC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACxI,CAAC;AAED,SAAgB,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAO,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1J,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,CAAe,EAAE,SAAkB,EAAsC,EAAE;QAC3G,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,SAAS,IAAI,CAAE,IAAI,CAAC,MAAM,CAAC,WAAwB,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,IAAA,YAAI,EAAC,GAAG,EAAE,qBAAqB,EAAE,oCAAoC,SAAS,SAAS,CAAC,EAAE,CAAC;QACxL,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACL,YAAY;QACZ;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjC,IAAI,OAAO,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACjB,IAAI,CAAC,CAAC,WAAW;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,kCAAkC,CAAC,CAAC;gBAC3F,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,oDAAoD,CAAC,CAAC;gBACxI,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpF,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,mDAAmD,CAAC,CAAC;gBAC1J,IAAI,CAAC,CAAC,aAAa,KAAK,MAAM;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,2BAA2B,EAAE,uCAAuC,CAAC,CAAC;gBACvH,MAAM,KAAK,GAAG,IAAA,kBAAU,EAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzI,IAAI,OAAO,CAAC,MAAM;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,eAAe,EAAE,sBAAsB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClG,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,OAAO,CAAC,KAAK,MAAM;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,qCAAqC,CAAC,CAAC;gBACpJ,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,iDAAiD,CAAC,CAAC;gBAC/I,MAAM,MAAM,GAA2B,EAAE,CAAC;gBAC1C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAChI,MAAM,GAAG,GAAG,qCAAqC,IAAA,mBAAW,EAAC,EAAE,CAAC,EAAE,CAAC;gBACnE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC3G,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC;YAC9H,CAAC;SACF;QACD,qCAAqC;QACrC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,2BAA2B;YACpC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAE,CAAC;gBAClD,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;YAC/L,CAAC;SACF;QACD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,2BAA2B;YACpC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjG,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;gBAC9C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM;oBAAE,MAAM,IAAI,sBAAa,CAAC,mBAAmB,EAAE,mCAAmC,EAAE,UAAU,CAAC,CAAC;gBAC1I,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;SACF;QACD,yEAAyE;QACzE;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAE,CAAC;gBAClD,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;YACjM,CAAC;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;oBAAE,MAAM,IAAI,sBAAa,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,aAAa,CAAC,CAAC;gBACrP,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACnK,CAAC;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC3D,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1K,CAAC;SACF;QACD,6BAA6B;QAC7B;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,8BAA8B;YACvC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;gBAC/C,IAAI,OAAO,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;gBACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClD,IAAI,OAAO,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC,KAAK,CAAC;gBACzC,MAAM,GAAG,GAAc,EAAE,UAAU,EAAE,IAAA,mBAAW,EAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBAC3N,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,gBAAgB,CAAC;gBACxC,OAAO,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,yBAAyB,EAAE,GAAG,GAAG,cAAc,GAAG,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;YACrR,CAAC;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,gBAAgB;YACzB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;gBACzD,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxJ,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,sBAAa,CAAC,WAAW,EAAE,wCAAwC,CAAC,CAAC;gBACzF,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;gBACpD,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,2BAA2B,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;YAC/K,CAAC;SACF;QACD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB;YAChC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACjD,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxJ,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,sBAAa,CAAC,WAAW,EAAE,wCAAwC,CAAC,CAAC;gBACzF,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM;oBAAE,MAAM,IAAI,sBAAa,CAAC,mBAAmB,EAAE,mCAAmC,EAAE,UAAU,CAAC,CAAC;gBAC/J,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM;oBAAE,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;qBACjD,CAAC;oBACJ,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACpJ,IAAI,CAAC,IAAI;wBAAE,MAAM,IAAI,sBAAa,CAAC,mBAAmB,EAAE,mEAAmE,EAAE,SAAS,CAAC,CAAC;oBACxI,IAAI,IAAI,CAAC,MAAM;wBAAE,MAAM,IAAI,sBAAa,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;oBAC7E,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;oBACrB,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC1B,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/E,CAAC;SACF;QACD,aAAa;QACb;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oCAAoC;YAC7C,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC7C,IAAI,OAAO,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC3B,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,gBAAgB,EAAE,sCAAsC,CAAC,CAAC;gBAC9G,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,OAAO,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC,KAAK,CAAC;gBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,IAAI,CAAC,IAAI;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;gBAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzC,IAAI,CAAC,IAAI;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;gBAClF,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAAC;gBAC1E,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;gBACvC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,yBAAyB,EAAE,mDAAmD,CAAC,CAAC;gBACvN,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC7F,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,+DAA+D,CAAC,CAAC;gBACnK,MAAM,IAAI,GAAG,MAAM,CAAC,+BAA+B,IAAI,MAAM,CAAC;gBAC9D,IAAI,KAAK,GAAkB,IAAI,CAAC;gBAChC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;oBACpB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC;oBAC3C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;wBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,mFAAmF,CAAC,CAAC;oBACrN,IAAI,CAAC,MAAM,CAAC,wCAAwC;wBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,sDAAsD,CAAC,CAAC;oBAClJ,KAAK,GAAG,CAAC,CAAC;gBACZ,CAAC;gBACD,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAY,EAAE,EAAE,EAAE,QAAQ,IAAA,mBAAW,EAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,IAAI,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;gBAC1Q,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC/B,OAAO,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC;YACpK,CAAC;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,oCAAoC;YAC7C,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,2BAAiB,EAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;gBAC3H,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7J,CAAC;SACF;QACD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,wCAAwC;YACjD,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,2BAAiB,EAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjD,0EAA0E;gBAC1E,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;oBAAE,MAAM,IAAI,sBAAa,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;gBAC5F,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBAAE,MAAM,IAAI,sBAAa,CAAC,qBAAqB,EAAE,oCAAoC,CAAC,CAAC;gBACrJ,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;gBAC9C,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC7C,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,MAAM,EAAE,+BAA+B,KAAK,MAAM,IAAI,MAAM,CAAC,wCAAwC,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;oBACnI,IAAI,CAAC;wBACH,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,wCAAwC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC1P,CAAC;oBAAC,MAAM,CAAC;wBACP,+CAA+C;oBACjD,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACrF,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Engine, Reply, RouteContext, RouteDef } from '../engine';
|
|
2
|
+
import { type Obj } from '../openapi';
|
|
3
|
+
export interface Grant {
|
|
4
|
+
id: string;
|
|
5
|
+
clientId: string;
|
|
6
|
+
userId: string | null;
|
|
7
|
+
scope: string[];
|
|
8
|
+
revoked: boolean;
|
|
9
|
+
/** Access token jtis minted from this grant, so reuse of a code can revoke them. */
|
|
10
|
+
jtis: Set<string>;
|
|
11
|
+
/** The DPoP key the grant's refresh tokens are bound to (RFC 9449 section 8). */
|
|
12
|
+
jkt?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface OAuthState {
|
|
15
|
+
codes: Map<string, {
|
|
16
|
+
grantId: string;
|
|
17
|
+
redirectUri: string;
|
|
18
|
+
challenge: string | null;
|
|
19
|
+
nonce: string | null;
|
|
20
|
+
authTime: number;
|
|
21
|
+
expiresAt: number;
|
|
22
|
+
used: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
grants: Map<string, Grant>;
|
|
25
|
+
refresh: Map<string, {
|
|
26
|
+
grantId: string;
|
|
27
|
+
rotatedAt?: number;
|
|
28
|
+
successor?: string;
|
|
29
|
+
}>;
|
|
30
|
+
/** jti -> access token record (client_credentials and exchanged tokens have no grant). */
|
|
31
|
+
access: Map<string, {
|
|
32
|
+
clientId: string;
|
|
33
|
+
userId: string | null;
|
|
34
|
+
scope: string[];
|
|
35
|
+
exp: number;
|
|
36
|
+
revoked: boolean;
|
|
37
|
+
grantId: string | null;
|
|
38
|
+
cnf?: Obj;
|
|
39
|
+
}>;
|
|
40
|
+
autoUser: string | null;
|
|
41
|
+
}
|
|
42
|
+
export declare const st: (e: Engine) => OAuthState;
|
|
43
|
+
export declare const resetOAuth: (e: Engine) => void;
|
|
44
|
+
export declare const fail: (status: number, error: string, description: string, extra?: Obj) => Reply;
|
|
45
|
+
export declare function discoveryDocument(e: Engine): Obj;
|
|
46
|
+
/** Client authentication: Basic, or client_id (+ client_secret) in the body. `none` clients are identified only. */
|
|
47
|
+
export declare function authenticateClient(e: Engine, c: RouteContext): {
|
|
48
|
+
client: Obj;
|
|
49
|
+
} | {
|
|
50
|
+
error: Reply;
|
|
51
|
+
};
|
|
52
|
+
export declare const splitScope: (s: unknown) => string[];
|
|
53
|
+
export declare function mintAccess(e: Engine, input: {
|
|
54
|
+
client: Obj;
|
|
55
|
+
userId: string | null;
|
|
56
|
+
scope: string[];
|
|
57
|
+
grant: Grant | null;
|
|
58
|
+
audience?: string;
|
|
59
|
+
extra?: Obj;
|
|
60
|
+
cnf?: Obj;
|
|
61
|
+
}): Promise<{
|
|
62
|
+
token: string;
|
|
63
|
+
jti: string;
|
|
64
|
+
}>;
|
|
65
|
+
export declare function issueTokens(e: Engine, client: Obj, grant: Grant, nonce: string | null, authTime: number, refreshRec?: string, cnf?: Obj): Promise<Obj>;
|
|
66
|
+
/** Create the grant and the single-use authorization code for an approved request (after login and, when needed, consent). */
|
|
67
|
+
export declare function issueCode(e: Engine, a: {
|
|
68
|
+
client: Obj;
|
|
69
|
+
userId: string;
|
|
70
|
+
scope: string[];
|
|
71
|
+
redirectUri: string;
|
|
72
|
+
challenge: string | null;
|
|
73
|
+
nonce: string | null;
|
|
74
|
+
}): string;
|
|
75
|
+
export declare function oauthHandlers(): RouteDef[];
|