@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.
Files changed (300) hide show
  1. package/dist/adopt.d.ts +50 -0
  2. package/dist/adopt.js +57 -0
  3. package/dist/adopt.js.map +1 -0
  4. package/dist/coverage.d.ts +15 -0
  5. package/dist/coverage.js +31 -0
  6. package/dist/coverage.js.map +1 -0
  7. package/dist/crypto-util.d.ts +10 -0
  8. package/dist/crypto-util.js +76 -0
  9. package/dist/crypto-util.js.map +1 -0
  10. package/dist/custom-html.d.ts +57 -0
  11. package/dist/custom-html.js +491 -0
  12. package/dist/custom-html.js.map +1 -0
  13. package/dist/engine.d.ts +34 -3
  14. package/dist/engine.js +57 -8
  15. package/dist/engine.js.map +1 -1
  16. package/dist/error-catalog.js +16 -0
  17. package/dist/error-catalog.js.map +1 -1
  18. package/dist/event-gate.d.ts +3 -0
  19. package/dist/event-gate.js +430 -0
  20. package/dist/event-gate.js.map +1 -0
  21. package/dist/generic.js +14 -2
  22. package/dist/generic.js.map +1 -1
  23. package/dist/handlers/access-signals.d.ts +48 -0
  24. package/dist/handlers/access-signals.js +76 -0
  25. package/dist/handlers/access-signals.js.map +1 -0
  26. package/dist/handlers/approvals.d.ts +2 -0
  27. package/dist/handlers/approvals.js +418 -0
  28. package/dist/handlers/approvals.js.map +1 -0
  29. package/dist/handlers/authz-data.d.ts +2 -0
  30. package/dist/handlers/authz-data.js +627 -0
  31. package/dist/handlers/authz-data.js.map +1 -0
  32. package/dist/handlers/authz-layers.d.ts +229 -0
  33. package/dist/handlers/authz-layers.js +786 -0
  34. package/dist/handlers/authz-layers.js.map +1 -0
  35. package/dist/handlers/authz-state.d.ts +80 -0
  36. package/dist/handlers/authz-state.js +175 -0
  37. package/dist/handlers/authz-state.js.map +1 -0
  38. package/dist/handlers/authz.d.ts +2 -0
  39. package/dist/handlers/authz.js +410 -0
  40. package/dist/handlers/authz.js.map +1 -0
  41. package/dist/handlers/billing.d.ts +100 -0
  42. package/dist/handlers/billing.js +877 -0
  43. package/dist/handlers/billing.js.map +1 -0
  44. package/dist/handlers/cedar-ext.d.ts +35 -0
  45. package/dist/handlers/cedar-ext.js +174 -0
  46. package/dist/handlers/cedar-ext.js.map +1 -0
  47. package/dist/handlers/cedar.d.ts +146 -0
  48. package/dist/handlers/cedar.js +689 -0
  49. package/dist/handlers/cedar.js.map +1 -0
  50. package/dist/handlers/connections.d.ts +5 -0
  51. package/dist/handlers/connections.js +561 -0
  52. package/dist/handlers/connections.js.map +1 -0
  53. package/dist/handlers/control.js +6 -1
  54. package/dist/handlers/control.js.map +1 -1
  55. package/dist/handlers/device.d.ts +47 -0
  56. package/dist/handlers/device.js +665 -0
  57. package/dist/handlers/device.js.map +1 -0
  58. package/dist/handlers/emu3-misc.d.ts +38 -0
  59. package/dist/handlers/emu3-misc.js +1056 -0
  60. package/dist/handlers/emu3-misc.js.map +1 -0
  61. package/dist/handlers/emu4-actions-access.d.ts +46 -0
  62. package/dist/handlers/emu4-actions-access.js +107 -0
  63. package/dist/handlers/emu4-actions-access.js.map +1 -0
  64. package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
  65. package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
  66. package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
  67. package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
  68. package/dist/handlers/emu4-actions-catalog.js +143 -0
  69. package/dist/handlers/emu4-actions-catalog.js.map +1 -0
  70. package/dist/handlers/emu4-actions-def.d.ts +50 -0
  71. package/dist/handlers/emu4-actions-def.js +250 -0
  72. package/dist/handlers/emu4-actions-def.js.map +1 -0
  73. package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
  74. package/dist/handlers/emu4-actions-sandbox.js +318 -0
  75. package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
  76. package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
  77. package/dist/handlers/emu4-actions-typegen.js +73 -0
  78. package/dist/handlers/emu4-actions-typegen.js.map +1 -0
  79. package/dist/handlers/emu4-actions.d.ts +2 -0
  80. package/dist/handlers/emu4-actions.js +506 -0
  81. package/dist/handlers/emu4-actions.js.map +1 -0
  82. package/dist/handlers/emu4-authz-trust.d.ts +40 -0
  83. package/dist/handlers/emu4-authz-trust.js +488 -0
  84. package/dist/handlers/emu4-authz-trust.js.map +1 -0
  85. package/dist/handlers/emu4-authz.d.ts +2 -0
  86. package/dist/handlers/emu4-authz.js +752 -0
  87. package/dist/handlers/emu4-authz.js.map +1 -0
  88. package/dist/handlers/emu4-billing-core.d.ts +23 -0
  89. package/dist/handlers/emu4-billing-core.js +22 -0
  90. package/dist/handlers/emu4-billing-core.js.map +1 -0
  91. package/dist/handlers/emu4-billing-x.d.ts +2 -0
  92. package/dist/handlers/emu4-billing-x.js +489 -0
  93. package/dist/handlers/emu4-billing-x.js.map +1 -0
  94. package/dist/handlers/emu4-billing.d.ts +14 -0
  95. package/dist/handlers/emu4-billing.js +846 -0
  96. package/dist/handlers/emu4-billing.js.map +1 -0
  97. package/dist/handlers/emu4-clones.d.ts +2 -0
  98. package/dist/handlers/emu4-clones.js +322 -0
  99. package/dist/handlers/emu4-clones.js.map +1 -0
  100. package/dist/handlers/emu4-compliance.d.ts +8 -0
  101. package/dist/handlers/emu4-compliance.js +39 -0
  102. package/dist/handlers/emu4-compliance.js.map +1 -0
  103. package/dist/handlers/emu4-config.d.ts +14 -0
  104. package/dist/handlers/emu4-config.js +148 -0
  105. package/dist/handlers/emu4-config.js.map +1 -0
  106. package/dist/handlers/emu4-cookies.d.ts +8 -0
  107. package/dist/handlers/emu4-cookies.js +248 -0
  108. package/dist/handlers/emu4-cookies.js.map +1 -0
  109. package/dist/handlers/emu4-erasure.d.ts +2 -0
  110. package/dist/handlers/emu4-erasure.js +587 -0
  111. package/dist/handlers/emu4-erasure.js.map +1 -0
  112. package/dist/handlers/emu4-federation.d.ts +8 -0
  113. package/dist/handlers/emu4-federation.js +18 -0
  114. package/dist/handlers/emu4-federation.js.map +1 -0
  115. package/dist/handlers/emu4-journey-math.d.ts +42 -0
  116. package/dist/handlers/emu4-journey-math.js +99 -0
  117. package/dist/handlers/emu4-journey-math.js.map +1 -0
  118. package/dist/handlers/emu4-messaging.d.ts +21 -0
  119. package/dist/handlers/emu4-messaging.js +595 -0
  120. package/dist/handlers/emu4-messaging.js.map +1 -0
  121. package/dist/handlers/emu4-minors.d.ts +7 -0
  122. package/dist/handlers/emu4-minors.js +408 -0
  123. package/dist/handlers/emu4-minors.js.map +1 -0
  124. package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
  125. package/dist/handlers/emu4-oauth-audit.js +17 -0
  126. package/dist/handlers/emu4-oauth-audit.js.map +1 -0
  127. package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
  128. package/dist/handlers/emu4-oauth-auth.js +363 -0
  129. package/dist/handlers/emu4-oauth-auth.js.map +1 -0
  130. package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
  131. package/dist/handlers/emu4-oauth-delivery.js +207 -0
  132. package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
  133. package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
  134. package/dist/handlers/emu4-oauth-keys.js +268 -0
  135. package/dist/handlers/emu4-oauth-keys.js.map +1 -0
  136. package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
  137. package/dist/handlers/emu4-oauth-pub.js +420 -0
  138. package/dist/handlers/emu4-oauth-pub.js.map +1 -0
  139. package/dist/handlers/emu4-oauth.d.ts +10 -0
  140. package/dist/handlers/emu4-oauth.js +23 -0
  141. package/dist/handlers/emu4-oauth.js.map +1 -0
  142. package/dist/handlers/emu4-policies.d.ts +2 -0
  143. package/dist/handlers/emu4-policies.js +408 -0
  144. package/dist/handlers/emu4-policies.js.map +1 -0
  145. package/dist/handlers/emu4-region.d.ts +2 -0
  146. package/dist/handlers/emu4-region.js +189 -0
  147. package/dist/handlers/emu4-region.js.map +1 -0
  148. package/dist/handlers/emu4-saml.d.ts +12 -0
  149. package/dist/handlers/emu4-saml.js +532 -0
  150. package/dist/handlers/emu4-saml.js.map +1 -0
  151. package/dist/handlers/emu4-shared.d.ts +44 -0
  152. package/dist/handlers/emu4-shared.js +90 -0
  153. package/dist/handlers/emu4-shared.js.map +1 -0
  154. package/dist/handlers/emu4-snapshots.d.ts +38 -0
  155. package/dist/handlers/emu4-snapshots.js +231 -0
  156. package/dist/handlers/emu4-snapshots.js.map +1 -0
  157. package/dist/handlers/emu4-sns.d.ts +9 -0
  158. package/dist/handlers/emu4-sns.js +21 -0
  159. package/dist/handlers/emu4-sns.js.map +1 -0
  160. package/dist/handlers/emu4-trust-binding.d.ts +27 -0
  161. package/dist/handlers/emu4-trust-binding.js +344 -0
  162. package/dist/handlers/emu4-trust-binding.js.map +1 -0
  163. package/dist/handlers/emu4-trust.d.ts +35 -0
  164. package/dist/handlers/emu4-trust.js +543 -0
  165. package/dist/handlers/emu4-trust.js.map +1 -0
  166. package/dist/handlers/federation.d.ts +2 -0
  167. package/dist/handlers/federation.js +481 -0
  168. package/dist/handlers/federation.js.map +1 -0
  169. package/dist/handlers/fga-engine.d.ts +78 -0
  170. package/dist/handlers/fga-engine.js +663 -0
  171. package/dist/handlers/fga-engine.js.map +1 -0
  172. package/dist/handlers/governance.d.ts +2 -0
  173. package/dist/handlers/governance.js +460 -0
  174. package/dist/handlers/governance.js.map +1 -0
  175. package/dist/handlers/hooks.js +17 -1
  176. package/dist/handlers/hooks.js.map +1 -1
  177. package/dist/handlers/index.d.ts +5 -1
  178. package/dist/handlers/index.js +45 -3
  179. package/dist/handlers/index.js.map +1 -1
  180. package/dist/handlers/keys.js +6 -1
  181. package/dist/handlers/keys.js.map +1 -1
  182. package/dist/handlers/machines.js +61 -8
  183. package/dist/handlers/machines.js.map +1 -1
  184. package/dist/handlers/messaging.d.ts +6 -0
  185. package/dist/handlers/messaging.js +893 -0
  186. package/dist/handlers/messaging.js.map +1 -0
  187. package/dist/handlers/oauth-adv.d.ts +191 -0
  188. package/dist/handlers/oauth-adv.js +1305 -0
  189. package/dist/handlers/oauth-adv.js.map +1 -0
  190. package/dist/handlers/oauth-flows.d.ts +52 -0
  191. package/dist/handlers/oauth-flows.js +480 -0
  192. package/dist/handlers/oauth-flows.js.map +1 -0
  193. package/dist/handlers/oauth.d.ts +96 -0
  194. package/dist/handlers/oauth.js +793 -0
  195. package/dist/handlers/oauth.js.map +1 -0
  196. package/dist/handlers/orgs.js +6 -0
  197. package/dist/handlers/orgs.js.map +1 -1
  198. package/dist/handlers/passkeys.d.ts +3 -0
  199. package/dist/handlers/passkeys.js +293 -0
  200. package/dist/handlers/passkeys.js.map +1 -0
  201. package/dist/handlers/platform.d.ts +20 -0
  202. package/dist/handlers/platform.js +472 -0
  203. package/dist/handlers/platform.js.map +1 -0
  204. package/dist/handlers/round2.d.ts +8 -0
  205. package/dist/handlers/round2.js +372 -0
  206. package/dist/handlers/round2.js.map +1 -0
  207. package/dist/handlers/scim.d.ts +4 -0
  208. package/dist/handlers/scim.js +595 -0
  209. package/dist/handlers/scim.js.map +1 -0
  210. package/dist/handlers/sessions.d.ts +9 -3
  211. package/dist/handlers/sessions.js +76 -38
  212. package/dist/handlers/sessions.js.map +1 -1
  213. package/dist/handlers/support.d.ts +20 -0
  214. package/dist/handlers/support.js +62 -0
  215. package/dist/handlers/support.js.map +1 -0
  216. package/dist/handlers/users.js +7 -0
  217. package/dist/handlers/users.js.map +1 -1
  218. package/dist/handlers/workflows.d.ts +2 -0
  219. package/dist/handlers/workflows.js +428 -0
  220. package/dist/handlers/workflows.js.map +1 -0
  221. package/dist/index.d.ts +8 -0
  222. package/dist/index.js +23 -1
  223. package/dist/index.js.map +1 -1
  224. package/dist/jwe.d.ts +18 -0
  225. package/dist/jwe.js +101 -0
  226. package/dist/jwe.js.map +1 -0
  227. package/dist/jws.d.ts +41 -0
  228. package/dist/jws.js +135 -0
  229. package/dist/jws.js.map +1 -0
  230. package/dist/messages.d.ts +7 -0
  231. package/dist/messages.js +8 -4
  232. package/dist/messages.js.map +1 -1
  233. package/dist/messaging-callbacks.d.ts +100 -0
  234. package/dist/messaging-callbacks.js +767 -0
  235. package/dist/messaging-callbacks.js.map +1 -0
  236. package/dist/openapi.js +41 -1
  237. package/dist/openapi.js.map +1 -1
  238. package/dist/parity-bin.js +3 -1
  239. package/dist/parity-bin.js.map +1 -1
  240. package/dist/parity-emu3-authz.d.ts +3 -0
  241. package/dist/parity-emu3-authz.js +61 -0
  242. package/dist/parity-emu3-authz.js.map +1 -0
  243. package/dist/parity-emu3-billing.d.ts +3 -0
  244. package/dist/parity-emu3-billing.js +25 -0
  245. package/dist/parity-emu3-billing.js.map +1 -0
  246. package/dist/parity-emu3-messaging.d.ts +3 -0
  247. package/dist/parity-emu3-messaging.js +27 -0
  248. package/dist/parity-emu3-messaging.js.map +1 -0
  249. package/dist/parity-emu3-misc.d.ts +2 -0
  250. package/dist/parity-emu3-misc.js +63 -0
  251. package/dist/parity-emu3-misc.js.map +1 -0
  252. package/dist/parity-emu3-oauth.d.ts +2 -0
  253. package/dist/parity-emu3-oauth.js +39 -0
  254. package/dist/parity-emu3-oauth.js.map +1 -0
  255. package/dist/parity-emu4-actions.d.ts +2 -0
  256. package/dist/parity-emu4-actions.js +38 -0
  257. package/dist/parity-emu4-actions.js.map +1 -0
  258. package/dist/parity-emu4-authz.d.ts +3 -0
  259. package/dist/parity-emu4-authz.js +68 -0
  260. package/dist/parity-emu4-authz.js.map +1 -0
  261. package/dist/parity-emu4-billing.d.ts +6 -0
  262. package/dist/parity-emu4-billing.js +44 -0
  263. package/dist/parity-emu4-billing.js.map +1 -0
  264. package/dist/parity-emu4-compliance.d.ts +2 -0
  265. package/dist/parity-emu4-compliance.js +92 -0
  266. package/dist/parity-emu4-compliance.js.map +1 -0
  267. package/dist/parity-emu4-federation.d.ts +2 -0
  268. package/dist/parity-emu4-federation.js +33 -0
  269. package/dist/parity-emu4-federation.js.map +1 -0
  270. package/dist/parity-emu4-messaging.d.ts +3 -0
  271. package/dist/parity-emu4-messaging.js +42 -0
  272. package/dist/parity-emu4-messaging.js.map +1 -0
  273. package/dist/parity-emu4-oauth.d.ts +2 -0
  274. package/dist/parity-emu4-oauth.js +55 -0
  275. package/dist/parity-emu4-oauth.js.map +1 -0
  276. package/dist/parity-emu4-trust.d.ts +2 -0
  277. package/dist/parity-emu4-trust.js +41 -0
  278. package/dist/parity-emu4-trust.js.map +1 -0
  279. package/dist/parity-routes.d.ts +14 -0
  280. package/dist/parity-routes.js +439 -0
  281. package/dist/parity-routes.js.map +1 -0
  282. package/dist/parity.d.ts +10 -3
  283. package/dist/parity.js +14 -5
  284. package/dist/parity.js.map +1 -1
  285. package/dist/sns-cert.d.ts +9 -0
  286. package/dist/sns-cert.js +101 -0
  287. package/dist/sns-cert.js.map +1 -0
  288. package/dist/tokens.d.ts +85 -3
  289. package/dist/tokens.js +196 -24
  290. package/dist/tokens.js.map +1 -1
  291. package/dist/webauthn-virtual.d.ts +70 -0
  292. package/dist/webauthn-virtual.js +186 -0
  293. package/dist/webauthn-virtual.js.map +1 -0
  294. package/dist/webhook-ext.d.ts +16 -0
  295. package/dist/webhook-ext.js +218 -0
  296. package/dist/webhook-ext.js.map +1 -0
  297. package/dist/webhooks.d.ts +3 -0
  298. package/dist/webhooks.js +37 -3
  299. package/dist/webhooks.js.map +1 -1
  300. package/package.json +2 -2
@@ -0,0 +1,480 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resetOAuthFlows = exports.heldConsent = exports.cibaRecords = 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 oauth_adv_1 = require("./oauth-adv");
13
+ const support_1 = require("./support");
14
+ const emu4_oauth_auth_1 = require("./emu4-oauth-auth");
15
+ const emu4_oauth_pub_1 = require("./emu4-oauth-pub");
16
+ const emu4_oauth_delivery_1 = require("./emu4-oauth-delivery");
17
+ /**
18
+ * The OAuth provider's interactive and out-of-band flows, on top of the core in `oauth.ts`: the consent screen (built-in
19
+ * `/oauth2/authorize/consent` and the delegated `/v1/oauth_consent_requests` challenge), pushed authorization requests
20
+ * (RFC 9126), the device authorization grant (RFC 8628) and OpenID CIBA (poll and ping). The emulator is its own user agent:
21
+ * the person who consents, enters the device code or answers a CIBA prompt is simulated by calling the same routes a
22
+ * browser or phone would.
23
+ */
24
+ const PAR_TTL_MS = 60_000;
25
+ const CONSENT_TTL_MS = 10 * 60_000;
26
+ const DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';
27
+ const CIBA_GRANT = 'urn:openid:params:grant-type:ciba';
28
+ const DEVICE_TTL_S = 600;
29
+ const POLL_INTERVAL_S = 5;
30
+ const USER_CODE_ALPHABET = 'BCDFGHJKLMNPQRSTVWXZ';
31
+ const flows = (0, support_1.engineState)(() => ({ par: new Map(), consents: new Map(), remembered: new Map(), devices: new Map(), ciba: new Map(), dpopSeen: new Map() }));
32
+ /** The CIBA requests of this engine (the delivery sweep announces expired push requests). */
33
+ const cibaRecords = (e) => flows(e).ciba;
34
+ exports.cibaRecords = cibaRecords;
35
+ /** The scopes a user holds a remembered consent for at a client, if any. */
36
+ const heldConsent = (e, userId, clientId) => flows(e).remembered.get(`${userId}|${clientId}`);
37
+ exports.heldConsent = heldConsent;
38
+ const resetOAuthFlows = (_e) => undefined; // state lives in engineState, which engine.reset clears
39
+ exports.resetOAuthFlows = resetOAuthFlows;
40
+ /** Claim a DPoP proof's jti once inside its window; false when it was already used. */
41
+ function claimDpopJti(e, jkt, jti, ttlMs) {
42
+ const seen = flows(e).dpopSeen;
43
+ const now = e.clock.now();
44
+ for (const [k, until] of seen)
45
+ if (until <= now)
46
+ seen.delete(k);
47
+ const key = `${jkt}:${jti}`;
48
+ if (seen.has(key))
49
+ return false;
50
+ seen.set(key, now + ttlMs);
51
+ return true;
52
+ }
53
+ const found = (location) => ({ status: 302, headers: { location, 'cache-control': 'no-store' } });
54
+ /** The user a flow acts for: an explicit id or email, else the one the emulator signs in, else the only user. */
55
+ function resolveUser(e, hint, allowSole = true) {
56
+ const live = e.db.users.filter((u) => !u.deleted);
57
+ if (hint)
58
+ return live.find((u) => u.id === hint || u.emails.some((m) => m.email_address.toLowerCase() === hint.toLowerCase()));
59
+ const auto = (0, oauth_1.st)(e).autoUser;
60
+ return (auto ? live.find((u) => u.id === auto) : undefined) ?? (allowSole && live.length === 1 ? live[0] : undefined);
61
+ }
62
+ // ── PAR ──────────────────────────────────────────────────────────────
63
+ /** An /authorize request carrying `request_uri`: swap in the pushed parameters (single use, bound to the client). */
64
+ function resolveRequestUri(e, query) {
65
+ const uri = query.get('request_uri');
66
+ if (!uri)
67
+ return { query };
68
+ const rec = flows(e).par.get(uri);
69
+ if (!rec || rec.used || rec.expiresAt <= e.clock.now())
70
+ return { error: { code: 'invalid_request_uri', description: 'The request_uri is unknown, expired or already used.' } };
71
+ if (query.get('client_id') !== rec.clientId)
72
+ return { error: { code: 'invalid_request', description: 'client_id does not match the client that pushed this request.' } };
73
+ rec.used = true;
74
+ return { query: new URLSearchParams({ ...rec.params, client_id: rec.clientId }) };
75
+ }
76
+ // ── consent ──────────────────────────────────────────────────────────
77
+ const rememberKey = (userId, clientId) => `${userId}|${clientId}`;
78
+ /** 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). */
79
+ async function consentGate(e, a) {
80
+ const { client, user, scope, prompt } = a;
81
+ const forced = prompt === 'consent' || a.force === true;
82
+ const ext = a.ext ?? oauth_adv_1.CODE_EXT;
83
+ if (client.first_party === true || !(client.require_consent === true || forced))
84
+ return null;
85
+ const held = flows(e).remembered.get(rememberKey(user.id, client.id));
86
+ if (!forced && held && scope.every((s) => held.has(s)))
87
+ return null;
88
+ // One consent for a verified publisher's other apps (openid, email and profile only).
89
+ if (!forced && (0, emu4_oauth_pub_1.publisherDecision)(e, client, user.id, scope).skipConsent)
90
+ return null;
91
+ if (prompt === 'none')
92
+ return (0, emu4_oauth_auth_1.authReply)(e, client, a.redirectUri, (0, oauth_adv_1.authUrl)(e, a.redirectUri, { error: 'consent_required', error_description: 'The user has not consented to these scopes.', state: a.state, iss: e.issuer }, !!(0, oauth_adv_1.parseResponseType)(ext.rt)?.frontChannelTokens, ext.mode), ext.mode);
93
+ const id = `consent_${(0, store_1.randomToken)(24)}`;
94
+ 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, ext, expiresAt: e.clock.now() + CONSENT_TTL_MS, status: 'pending' });
95
+ return found(`${e.issuer}/oauth2/authorize/consent?consent_token=${id}`);
96
+ }
97
+ function liveConsent(e, id) {
98
+ const c = id ? flows(e).consents.get(id) : undefined;
99
+ if (!c || c.status !== 'pending' || c.expiresAt <= e.clock.now())
100
+ throw new errors_1.EmulatorError('NOT_FOUND', 'This consent request has expired or was already answered.');
101
+ return c;
102
+ }
103
+ /** Answer a consent request; returns the URL to send the browser to. The scopes granted are always a subset of what was asked. */
104
+ async function settleConsent(e, c, d) {
105
+ const back = (p) => (0, oauth_adv_1.authUrl)(e, c.redirectUri, { ...p, state: c.state, iss: e.issuer }, !!(0, oauth_adv_1.parseResponseType)(c.ext.rt)?.frontChannelTokens, c.ext.mode);
106
+ const client = e.db.oauthClients.get(c.clientId);
107
+ if (!client || client.deleted) {
108
+ c.status = 'rejected';
109
+ return back({ error: 'unauthorized_client' });
110
+ }
111
+ if (!d.approve) {
112
+ c.status = 'rejected';
113
+ return back({ error: d.error ?? 'access_denied', error_description: d.description ?? 'The user denied the request.' });
114
+ }
115
+ const grant = d.grant ?? c.scope;
116
+ if (grant.some((s) => !c.scope.includes(s)))
117
+ throw new errors_1.EmulatorError('VALIDATION_FAILED', 'grant_scope can only narrow the requested scopes.', 'grant_scope');
118
+ if (c.scope.includes('openid') && !grant.includes('openid'))
119
+ throw new errors_1.EmulatorError('VALIDATION_FAILED', 'grant_scope must include openid.', 'grant_scope');
120
+ c.status = 'accepted';
121
+ if (d.remember !== false) {
122
+ const key = rememberKey(c.userId, c.clientId);
123
+ flows(e).remembered.set(key, new Set([...(flows(e).remembered.get(key) ?? []), ...grant]));
124
+ }
125
+ return (0, oauth_adv_1.completeAuth)(e, { client, userId: c.userId, scope: grant, redirectUri: c.redirectUri, challenge: c.challenge, nonce: c.nonce, state: c.state, ext: c.ext });
126
+ }
127
+ // ── extension grants on /oauth2/token ────────────────────────────────
128
+ const pendingErr = (error, description) => (0, oauth_1.fail)(400, error, description);
129
+ /** `device_code` and `ciba` grants. Returns undefined for any other grant type. */
130
+ async function extensionGrant(c, client, type, cnf) {
131
+ const e = c.engine;
132
+ const now = e.clock.now();
133
+ if (type !== DEVICE_GRANT && type !== CIBA_GRANT)
134
+ return undefined;
135
+ const isDevice = type === DEVICE_GRANT;
136
+ const rec = isDevice ? flows(e).devices.get(String(c.body.device_code ?? '')) : flows(e).ciba.get(String(c.body.auth_req_id ?? ''));
137
+ if (!rec || rec.clientId !== client.id || rec.status === 'used')
138
+ return (0, oauth_1.fail)(400, 'invalid_grant', isDevice ? 'The device_code is invalid.' : 'The auth_req_id is invalid.');
139
+ // CIBA 10.3: a push-mode client is sent the tokens and never polls.
140
+ if (!isDevice && rec.mode === 'push')
141
+ return (0, oauth_1.fail)(400, 'invalid_request', 'This request uses push delivery; the tokens are sent to the client notification endpoint.');
142
+ if (rec.expiresAt <= now)
143
+ return pendingErr('expired_token', 'The request expired.');
144
+ if (rec.status === 'denied') {
145
+ rec.status = 'used';
146
+ return pendingErr('access_denied', 'The user denied the request.');
147
+ }
148
+ // Polling faster than the interval earns slow_down and a longer interval (RFC 8628 section 3.5).
149
+ if (rec.status === 'pending') {
150
+ if (now - rec.lastPoll < rec.interval * 1000) {
151
+ rec.interval += 5;
152
+ rec.lastPoll = now;
153
+ return pendingErr('slow_down', 'Polling too fast: wait at least the new interval.');
154
+ }
155
+ rec.lastPoll = now;
156
+ return pendingErr('authorization_pending', isDevice ? 'The user has not finished authorizing this device yet.' : 'The user has not answered yet.');
157
+ }
158
+ rec.status = 'used';
159
+ const userId = rec.userId;
160
+ const grant = { id: e.db.newId('oag'), clientId: client.id, userId, scope: rec.scope, revoked: false, jtis: new Set() };
161
+ (0, oauth_1.st)(e).grants.set(grant.id, grant);
162
+ return { body: await (0, oauth_1.issueTokens)(e, client, grant, null, now, undefined, cnf), headers: { 'cache-control': 'no-store', pragma: 'no-cache' } };
163
+ }
164
+ const userCodeOf = () => {
165
+ const bytes = crypto.getRandomValues(new Uint8Array(8));
166
+ const s = [...bytes].map((b) => USER_CODE_ALPHABET[b % USER_CODE_ALPHABET.length]).join('');
167
+ return `${s.slice(0, 4)}-${s.slice(4)}`;
168
+ };
169
+ const normaliseUserCode = (s) => String(s ?? '').toUpperCase().replace(/[^A-Z]/g, '');
170
+ function scopeFor(client, asked) {
171
+ const allowed = client.allowed_scopes ?? [];
172
+ const requested = (0, oauth_1.splitScope)(asked);
173
+ if (!requested.length)
174
+ return allowed;
175
+ const outside = requested.filter((s) => !allowed.includes(s));
176
+ return outside.length ? { error: (0, oauth_1.fail)(400, 'invalid_scope', `Scope not allowed for this client: ${outside.join(' ')}.`) } : requested;
177
+ }
178
+ function oauthFlowHandlers() {
179
+ const cibaView = (r) => ({ id: r.id, scope: r.scope, binding_message: r.bindingMessage, created_at: r.createdAt, expires_at: r.expiresAt });
180
+ const requireClient = async (e, c, needGrant) => {
181
+ const auth = await (0, oauth_1.authenticateClient)(e, c);
182
+ if ('error' in auth)
183
+ return auth;
184
+ if (needGrant && !auth.client.grant_types.includes(needGrant))
185
+ return { error: (0, oauth_1.fail)(400, 'unauthorized_client', `This client is not permitted the ${needGrant} grant.`) };
186
+ return auth;
187
+ };
188
+ return [
189
+ // ── PAR ──
190
+ {
191
+ method: 'POST',
192
+ pattern: '/oauth2/par',
193
+ public: true,
194
+ handler: async (c) => {
195
+ const e = c.engine;
196
+ const auth = await requireClient(e, c);
197
+ if ('error' in auth)
198
+ return auth.error;
199
+ const client = auth.client;
200
+ const b = { ...c.body };
201
+ let rarRaw = b.authorization_details;
202
+ // A signed request object supersedes the body parameters (RFC 9101).
203
+ if (b.request) {
204
+ const loaded = await (0, oauth_adv_1.loadRequestObject)(e, client, { request: String(b.request) });
205
+ if (!loaded.ok)
206
+ return (0, oauth_1.fail)(400, loaded.error === 'invalid_request' ? 'invalid_request' : 'invalid_request_object', loaded.description);
207
+ for (const k of oauth_adv_1.REQUEST_OBJECT_PARAMS)
208
+ if (typeof loaded.claims[k] === 'string')
209
+ b[k] = loaded.claims[k];
210
+ if (loaded.claims.authorization_details !== undefined)
211
+ rarRaw = loaded.claims.authorization_details;
212
+ delete b.request;
213
+ }
214
+ else if (client.require_signed_request_object === true)
215
+ return (0, oauth_1.fail)(400, 'invalid_request', 'This client must send a signed request object.');
216
+ if (b.request_uri)
217
+ return (0, oauth_1.fail)(400, 'invalid_request', 'request_uri is not allowed here.');
218
+ if (b.client_id && b.client_id !== client.id)
219
+ return (0, oauth_1.fail)(400, 'invalid_request', 'client_id does not match the authenticated client.');
220
+ const redirectUri = typeof b.redirect_uri === 'string' ? b.redirect_uri : undefined;
221
+ if (!redirectUri || !client.redirect_uris.includes(redirectUri))
222
+ return (0, oauth_1.fail)(400, 'invalid_request', 'The redirect_uri does not match a registered URI.');
223
+ const rt = (0, oauth_adv_1.parseResponseType)(b.response_type);
224
+ if (!rt)
225
+ return (0, oauth_1.fail)(400, 'unsupported_response_type', 'The response_type is not supported.');
226
+ if (!(0, oauth_adv_1.clientResponseTypes)(client).includes(rt.canonical))
227
+ return (0, oauth_1.fail)(400, 'unauthorized_client', 'This client is not registered for this response_type.');
228
+ const asked = (0, oauth_1.splitScope)(b.scope ?? 'openid');
229
+ const outside = asked.filter((s) => !client.allowed_scopes.includes(s) && !['openid', 'profile', 'email', 'offline_access'].includes(s));
230
+ if (outside.length)
231
+ return (0, oauth_1.fail)(400, 'invalid_scope', `Scope not allowed: ${outside.join(' ')}.`);
232
+ if (b.code_challenge && (b.code_challenge_method ?? 'plain') !== 'S256')
233
+ return (0, oauth_1.fail)(400, 'invalid_request', 'code_challenge_method must be S256.');
234
+ if (!b.code_challenge && rt.code && client.auth_method === 'none')
235
+ return (0, oauth_1.fail)(400, 'invalid_request', 'A public client must use PKCE (code_challenge).');
236
+ const rar = (0, oauth_adv_1.validateAuthorizationDetails)(rarRaw, (0, oauth_adv_1.adv)(e).cfg.authorization_details_types);
237
+ if (!rar.ok)
238
+ return (0, oauth_1.fail)(400, 'invalid_authorization_details', rar.message);
239
+ const gm = (0, oauth_adv_1.parseGrantManagement)(b.grant_management_action, b.grant_id);
240
+ if (!gm.ok)
241
+ return (0, oauth_1.fail)(400, 'invalid_request', gm.message);
242
+ const params = {};
243
+ for (const [k, v] of Object.entries(b))
244
+ if (typeof v === 'string' && !['client_secret', 'client_id'].includes(k))
245
+ params[k] = v;
246
+ if (rar.value)
247
+ params.authorization_details = JSON.stringify(rar.value);
248
+ const uri = `urn:ietf:params:oauth:request_uri:${(0, store_1.randomToken)(24)}`;
249
+ flows(e).par.set(uri, { clientId: client.id, params, expiresAt: e.clock.now() + PAR_TTL_MS, used: false });
250
+ return { status: 201, body: { request_uri: uri, expires_in: PAR_TTL_MS / 1000 }, headers: { 'cache-control': 'no-store' } };
251
+ },
252
+ },
253
+ // ── consent: the built-in screen ──
254
+ {
255
+ method: 'GET',
256
+ pattern: '/oauth2/authorize/consent',
257
+ public: true,
258
+ handler: (c) => {
259
+ const e = c.engine;
260
+ const r = liveConsent(e, c.query.get('consent_token'));
261
+ const client = e.db.oauthClients.get(r.clientId);
262
+ const pub = (0, emu4_oauth_pub_1.publisherDecision)(e, client, r.userId, r.scope);
263
+ return { body: { object: 'oauth_consent_screen', consent_token: r.id, client: { id: client.id, name: client.name, ...(pub.publisherName ? { published_by: pub.publisherName } : {}) }, user_id: r.userId, requested_scope: r.scope, expires_at: r.expiresAt } };
264
+ },
265
+ },
266
+ {
267
+ method: 'POST',
268
+ pattern: '/oauth2/authorize/consent',
269
+ public: true,
270
+ handler: async (c) => {
271
+ const e = c.engine;
272
+ const r = liveConsent(e, typeof c.body.consent_token === 'string' ? c.body.consent_token : null);
273
+ const approve = c.body.decision === 'approve';
274
+ if (!approve && c.body.decision !== 'deny')
275
+ throw new errors_1.EmulatorError('VALIDATION_FAILED', 'decision must be approve or deny.', 'decision');
276
+ return (0, emu4_oauth_auth_1.authReply)(e, e.db.oauthClients.get(r.clientId), r.redirectUri, await settleConsent(e, r, { approve }), r.ext.mode);
277
+ },
278
+ },
279
+ // ── consent: the delegated challenge (a customer's own consent page) ──
280
+ {
281
+ method: 'GET',
282
+ pattern: '/v1/oauth_consent_requests',
283
+ handler: (c) => {
284
+ const e = c.engine;
285
+ const r = liveConsent(e, c.query.get('consent_challenge'));
286
+ const client = e.db.oauthClients.get(r.clientId);
287
+ 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 } };
288
+ },
289
+ },
290
+ {
291
+ method: 'PUT',
292
+ pattern: '/v1/oauth_consent_requests/accept',
293
+ handler: async (c) => {
294
+ const e = c.engine;
295
+ const r = liveConsent(e, c.query.get('consent_challenge'));
296
+ if (c.body.grant_scope !== undefined && (!Array.isArray(c.body.grant_scope) || c.body.grant_scope.some((s) => typeof s !== 'string')))
297
+ throw new errors_1.EmulatorError('VALIDATION_FAILED', 'grant_scope must be a list of scopes.', 'grant_scope');
298
+ return { body: { object: 'oauth_consent_redirect', redirect_to: await settleConsent(e, r, { approve: true, grant: c.body.grant_scope, remember: c.body.remember }) } };
299
+ },
300
+ },
301
+ {
302
+ method: 'PUT',
303
+ pattern: '/v1/oauth_consent_requests/reject',
304
+ handler: async (c) => {
305
+ const e = c.engine;
306
+ const r = liveConsent(e, c.query.get('consent_challenge'));
307
+ return { body: { object: 'oauth_consent_redirect', redirect_to: await settleConsent(e, r, { approve: false, error: c.body.error, description: c.body.error_description }) } };
308
+ },
309
+ },
310
+ // ── device authorization ──
311
+ {
312
+ method: 'POST',
313
+ pattern: '/oauth2/device_authorization',
314
+ public: true,
315
+ handler: async (c) => {
316
+ const e = c.engine;
317
+ const auth = await requireClient(e, c, DEVICE_GRANT);
318
+ if ('error' in auth)
319
+ return auth.error;
320
+ const scope = scopeFor(auth.client, c.body.scope);
321
+ if ('error' in scope)
322
+ return scope.error;
323
+ 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' };
324
+ flows(e).devices.set(rec.deviceCode, rec);
325
+ const uri = `${e.issuer}/oauth2/device`;
326
+ 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' } };
327
+ },
328
+ },
329
+ {
330
+ method: 'GET',
331
+ pattern: '/oauth2/device',
332
+ public: true,
333
+ handler: (c) => {
334
+ const e = c.engine;
335
+ const code = normaliseUserCode(c.query.get('user_code'));
336
+ const rec = [...flows(e).devices.values()].find((d) => normaliseUserCode(d.userCode) === code && d.status === 'pending' && d.expiresAt > e.clock.now());
337
+ if (!rec)
338
+ throw new errors_1.EmulatorError('NOT_FOUND', 'That code is not valid or has expired.');
339
+ const client = e.db.oauthClients.get(rec.clientId);
340
+ return { body: { object: 'oauth_device_verification', user_code: rec.userCode, client: { id: client.id, name: client.name }, scope: rec.scope, expires_at: rec.expiresAt } };
341
+ },
342
+ },
343
+ {
344
+ method: 'POST',
345
+ pattern: '/oauth2/device/verify',
346
+ public: true,
347
+ handler: (c) => {
348
+ const e = c.engine;
349
+ const code = normaliseUserCode(c.body.user_code);
350
+ const rec = [...flows(e).devices.values()].find((d) => normaliseUserCode(d.userCode) === code && d.status === 'pending' && d.expiresAt > e.clock.now());
351
+ if (!rec)
352
+ throw new errors_1.EmulatorError('NOT_FOUND', 'That code is not valid or has expired.');
353
+ if (c.body.decision !== 'approve' && c.body.decision !== 'deny')
354
+ throw new errors_1.EmulatorError('VALIDATION_FAILED', 'decision must be approve or deny.', 'decision');
355
+ if (c.body.decision === 'deny')
356
+ rec.status = 'denied';
357
+ else {
358
+ 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);
359
+ if (!user)
360
+ throw new errors_1.EmulatorError('VALIDATION_FAILED', 'No user to sign in. Pass user_id or POST /__emulator/oauth/login.', 'user_id');
361
+ if (user.banned)
362
+ throw new errors_1.EmulatorError('FORBIDDEN', 'The user is banned.');
363
+ rec.userId = user.id;
364
+ rec.status = 'approved';
365
+ }
366
+ return { body: { object: 'oauth_device_verification', status: rec.status } };
367
+ },
368
+ },
369
+ // ── CIBA ──
370
+ {
371
+ method: 'POST',
372
+ pattern: '/oauth2/backchannel_authentication',
373
+ public: true,
374
+ handler: async (c) => {
375
+ const e = c.engine;
376
+ const auth = await requireClient(e, c, CIBA_GRANT);
377
+ if ('error' in auth)
378
+ return auth.error;
379
+ const client = auth.client;
380
+ if (client.auth_method === 'none')
381
+ return (0, oauth_1.fail)(400, 'invalid_client', 'CIBA requires a confidential client.');
382
+ // A signed authentication request carries the parameters in a JWT (OpenID CIBA 7.1.1).
383
+ let body = { ...c.body };
384
+ if (body.request) {
385
+ const loaded = await (0, oauth_adv_1.loadRequestObject)(e, client, { request: String(body.request) });
386
+ if (!loaded.ok)
387
+ return (0, oauth_1.fail)(400, 'invalid_request_object', loaded.description);
388
+ for (const k of ['scope', 'login_hint', 'id_token_hint', 'binding_message', 'user_code', 'client_notification_token', 'acr_values'])
389
+ if (typeof loaded.claims[k] === 'string')
390
+ body[k] = loaded.claims[k];
391
+ if (loaded.claims.requested_expiry !== undefined)
392
+ body.requested_expiry = String(loaded.claims.requested_expiry);
393
+ delete body.request;
394
+ }
395
+ else if (client.require_signed_request_object === true)
396
+ return (0, oauth_1.fail)(400, 'invalid_request', 'This client must send a signed authentication request.');
397
+ const scope = scopeFor(client, body.scope);
398
+ if ('error' in scope)
399
+ return scope.error;
400
+ const hint = typeof body.login_hint === 'string' ? body.login_hint : '';
401
+ if (!hint)
402
+ return (0, oauth_1.fail)(400, 'invalid_request', 'login_hint is required.');
403
+ const user = resolveUser(e, hint, false);
404
+ if (!user)
405
+ return (0, oauth_1.fail)(400, 'unknown_user_id', 'No user matches the login_hint.');
406
+ if (user.banned)
407
+ return (0, oauth_1.fail)(400, 'access_denied', 'The user is banned.');
408
+ const binding = body.binding_message;
409
+ if (binding !== undefined && (typeof binding !== 'string' || binding.length > 64 || !/^[\x20-\x7e]*$/.test(binding)))
410
+ return (0, oauth_1.fail)(400, 'invalid_binding_message', 'binding_message is up to 64 printable characters.');
411
+ const expiry = body.requested_expiry === undefined ? 120 : Number(body.requested_expiry);
412
+ if (!Number.isInteger(expiry) || expiry < 1 || expiry > 3600)
413
+ return (0, oauth_1.fail)(400, 'invalid_request', 'requested_expiry is a whole number of seconds from 1 to 3600.');
414
+ const mode = client.backchannel_token_delivery_mode ?? 'poll';
415
+ let token = null;
416
+ if (mode !== 'poll') {
417
+ const t = body.client_notification_token;
418
+ // The notification token is the bearer secret of the client's callback: at least 128 bits (22 base64url characters).
419
+ if (typeof t !== 'string' || t.length < 22 || t.length > 1024 || !/^[\x21-\x7e]+$/.test(t))
420
+ return (0, oauth_1.fail)(400, 'invalid_request', 'client_notification_token is required (22 to 1024 printable characters) for ping and push.');
421
+ if (!client.backchannel_client_notification_endpoint)
422
+ return (0, oauth_1.fail)(400, 'invalid_request', 'This client has no notification endpoint registered.');
423
+ token = t;
424
+ }
425
+ const now = e.clock.now();
426
+ 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', mode, notificationToken: token, createdAt: now };
427
+ flows(e).ciba.set(rec.id, rec);
428
+ return { body: { auth_req_id: rec.id, expires_in: expiry, ...(mode === 'push' ? {} : { interval: POLL_INTERVAL_S }) }, headers: { 'cache-control': 'no-store' } };
429
+ },
430
+ },
431
+ {
432
+ method: 'GET',
433
+ pattern: '/v1/client/me/backchannel_requests',
434
+ public: true,
435
+ handler: async (c) => {
436
+ const e = c.engine;
437
+ const { userId } = await (0, support_1.sessionFromBearer)(c);
438
+ const now = e.clock.now();
439
+ const rows = [...flows(e).ciba.values()].filter((r) => r.userId === userId && r.status === 'pending' && r.expiresAt > now);
440
+ return { body: { object: 'list', data: rows.map((r) => ({ ...cibaView(r), client_name: e.db.oauthClients.get(r.clientId)?.name ?? 'An application' })) } };
441
+ },
442
+ },
443
+ {
444
+ method: 'POST',
445
+ pattern: '/v1/client/me/backchannel_requests/:id',
446
+ public: true,
447
+ handler: async (c) => {
448
+ const e = c.engine;
449
+ const { userId } = await (0, support_1.sessionFromBearer)(c);
450
+ const rec = flows(e).ciba.get(c.params.id ?? '');
451
+ // 404 for someone else's or an unknown request: never confirm one exists.
452
+ if (!rec || rec.userId !== userId)
453
+ throw new errors_1.EmulatorError('NOT_FOUND', 'Unknown request.');
454
+ if (rec.status !== 'pending' || rec.expiresAt <= e.clock.now())
455
+ throw new errors_1.EmulatorError('VERIFICATION_FAILED', 'This request is no longer pending.');
456
+ const approve = c.body.decision === 'approve';
457
+ rec.status = approve ? 'approved' : 'denied';
458
+ const client = e.db.oauthClients.get(rec.clientId);
459
+ if (rec.mode !== 'poll' && client?.backchannel_client_notification_endpoint && rec.notificationToken) {
460
+ // Ping carries only the auth_req_id; push carries the token response (or the refusal) itself and is spent by it (CIBA 10.2, 10.3).
461
+ let payload = { auth_req_id: rec.id };
462
+ if (rec.mode === 'push') {
463
+ if (!approve)
464
+ payload = { auth_req_id: rec.id, error: 'access_denied', error_description: 'The user denied the request.' };
465
+ else {
466
+ rec.status = 'used';
467
+ const grant = { id: e.db.newId('oag'), clientId: client.id, userId: rec.userId, scope: rec.scope, revoked: false, jtis: new Set() };
468
+ (0, oauth_1.st)(e).grants.set(grant.id, grant);
469
+ payload = { auth_req_id: rec.id, ...(await (0, oauth_1.issueTokens)(e, client, grant, null, e.clock.now())) };
470
+ }
471
+ }
472
+ // Queued with the real retry schedule: a failing endpoint is retried as the clock advances; a failed ping leaves the request pollable.
473
+ await (0, emu4_oauth_delivery_1.enqueueCiba)(e, { kind: rec.mode === 'push' ? 'ciba_push' : 'ciba_ping', clientId: client.id, requestId: rec.id, endpoint: client.backchannel_client_notification_endpoint, token: rec.notificationToken, payload });
474
+ }
475
+ return { body: { object: 'backchannel_request', id: rec.id, status: approve ? 'approved' : 'denied' } };
476
+ },
477
+ },
478
+ ];
479
+ }
480
+ //# sourceMappingURL=oauth-flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-flows.js","sourceRoot":"","sources":["../../src/handlers/oauth-flows.ts"],"names":[],"mappings":";;;AAoFA,oCAQC;AAeD,8CAQC;AAOD,kCAaC;AAoCD,wCA6BC;AAiBD,8CA2PC;AAldD,sCAA0C;AAE1C,oCAAuC;AACvC,mCAAuG;AACvG,2CAAuN;AACvN,uCAA2D;AAC3D,uDAA8C;AAC9C,qDAAqD;AACrD,+DAAoD;AAEpD;;;;;;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;AAmDlD,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;AACnK,6FAA6F;AACtF,MAAM,WAAW,GAAG,CAAC,CAAS,EAAwB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAAjE,QAAA,WAAW,eAAsD;AAC9E,4EAA4E;AACrE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,MAAc,EAAE,QAAgB,EAA2B,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;AAAzI,QAAA,WAAW,eAA8H;AAC/I,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,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;AAC3J,KAAK,UAAU,WAAW,CAAC,CAAS,EAAE,CAA0L;IACrO,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC;IACxD,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,oBAAQ,CAAC;IAC9B,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,sFAAsF;IACtF,IAAI,CAAC,MAAM,IAAI,IAAA,kCAAiB,EAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACrF,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAA,2BAAS,EAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE,IAAA,mBAAO,EAAC,CAAC,EAAE,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,EAAE,CAAC,CAAC,IAAA,6BAAiB,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAClS,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,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACtO,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,KAAK,UAAU,aAAa,CAAC,CAAS,EAAE,CAAU,EAAE,CAAmG;IACrJ,MAAM,IAAI,GAAG,CAAC,CAAqC,EAAE,EAAE,CAAC,IAAA,mBAAO,EAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAA,6BAAiB,EAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1L,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,IAAA,wBAAY,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,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACrK,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,oEAAoE;IACpE,IAAI,CAAC,QAAQ,IAAK,GAAe,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,2FAA2F,CAAC,CAAC;IACpL,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,KAAK,EAAE,CAAS,EAAE,CAAe,EAAE,SAAkB,EAA+C,EAAE;QAC1H,MAAM,IAAI,GAAG,MAAM,IAAA,0BAAkB,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,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,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvC,IAAI,OAAO,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC3B,MAAM,CAAC,GAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,MAAM,GAAY,CAAC,CAAC,qBAAqB,CAAC;gBAC9C,qEAAqE;gBACrE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAiB,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAClF,IAAI,CAAC,MAAM,CAAC,EAAE;wBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,MAAM,CAAC,KAAK,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,wBAAwB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;oBACxI,KAAK,MAAM,CAAC,IAAI,iCAAqB;wBAAE,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;4BAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACzG,IAAI,MAAM,CAAC,MAAM,CAAC,qBAAqB,KAAK,SAAS;wBAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;oBACpG,OAAO,CAAC,CAAC,OAAO,CAAC;gBACnB,CAAC;qBAAM,IAAI,MAAM,CAAC,6BAA6B,KAAK,IAAI;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,gDAAgD,CAAC,CAAC;gBAChJ,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,MAAM,EAAE,GAAG,IAAA,6BAAiB,EAAC,CAAC,CAAC,aAAa,CAAC,CAAC;gBAC9C,IAAI,CAAC,EAAE;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,2BAA2B,EAAE,qCAAqC,CAAC,CAAC;gBAC9F,IAAI,CAAC,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,qBAAqB,EAAE,uDAAuD,CAAC,CAAC;gBAC1J,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,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,iDAAiD,CAAC,CAAC;gBAC1J,MAAM,GAAG,GAAG,IAAA,wCAA4B,EAAC,MAAM,EAAE,IAAA,eAAG,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBACzF,IAAI,CAAC,GAAG,CAAC,EAAE;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,+BAA+B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5E,MAAM,EAAE,GAAG,IAAA,gCAAoB,EAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACvE,IAAI,CAAC,EAAE,CAAC,EAAE;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC5D,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,IAAI,GAAG,CAAC,KAAK;oBAAE,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxE,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,MAAM,GAAG,GAAG,IAAA,kCAAiB,EAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC5D,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,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;YAClQ,CAAC;SACF;QACD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,2BAA2B;YACpC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,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,IAAA,2BAAS,EAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5H,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,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,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,MAAM,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;YACzK,CAAC;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,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,MAAM,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;YAChL,CAAC;SACF;QACD,6BAA6B;QAC7B;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,8BAA8B;YACvC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;gBACrD,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,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;gBACnD,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,uFAAuF;gBACvF,IAAI,IAAI,GAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAiB,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACrF,IAAI,CAAC,MAAM,CAAC,EAAE;wBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,wBAAwB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC/E,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,2BAA2B,EAAE,YAAY,CAAC;wBAAE,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;4BAAE,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC1M,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS;wBAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;oBACjH,OAAO,IAAI,CAAC,OAAO,CAAC;gBACtB,CAAC;qBAAM,IAAI,MAAM,CAAC,6BAA6B,KAAK,IAAI;oBAAE,OAAO,IAAA,YAAI,EAAC,GAAG,EAAE,iBAAiB,EAAE,wDAAwD,CAAC,CAAC;gBACxJ,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3C,IAAI,OAAO,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC,KAAK,CAAC;gBACzC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,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,IAAI,CAAC,eAAe,CAAC;gBACrC,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,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACzF,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,GAA6B,MAAM,CAAC,+BAA+B,IAAI,MAAM,CAAC;gBACxF,IAAI,KAAK,GAAkB,IAAI,CAAC;gBAChC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;oBACpB,MAAM,CAAC,GAAG,IAAI,CAAC,yBAAyB,CAAC;oBACzC,qHAAqH;oBACrH,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,4FAA4F,CAAC,CAAC;oBAC9N,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,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;gBAChR,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,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,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,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,EAAE,wCAAwC,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;oBACrG,mIAAmI;oBACnI,IAAI,OAAO,GAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;oBAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBACxB,IAAI,CAAC,OAAO;4BAAE,OAAO,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,CAAC;6BACtH,CAAC;4BACJ,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;4BACpB,MAAM,KAAK,GAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;4BAC3I,IAAA,UAAO,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;4BACvC,OAAO,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,IAAA,mBAAW,EAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;wBACnG,CAAC;oBACH,CAAC;oBACD,uIAAuI;oBACvI,MAAM,IAAA,iCAAW,EAAC,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,wCAAwC,EAAE,KAAK,EAAE,GAAG,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5N,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC1G,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,96 @@
1
+ import type { Engine, Reply, RouteContext, RouteDef } from '../engine';
2
+ import { type Obj } from '../openapi';
3
+ import { type AuthExt } from './oauth-adv';
4
+ export interface Grant {
5
+ id: string;
6
+ clientId: string;
7
+ userId: string | null;
8
+ scope: string[];
9
+ revoked: boolean;
10
+ /** Access token jtis minted from this grant, so reuse of a code can revoke them. */
11
+ jtis: Set<string>;
12
+ /** The DPoP key the grant's refresh tokens are bound to (RFC 9449 section 8). */
13
+ jkt?: string;
14
+ /** The OP session (browser session) the grant's ID tokens name in `sid`. */
15
+ sid?: string;
16
+ /** The granted authorization_details (RFC 9396). */
17
+ details?: unknown[] | null;
18
+ /** The OpenID grant-management grant these tokens belong to. */
19
+ managedId?: string;
20
+ }
21
+ export interface OAuthState {
22
+ codes: Map<string, {
23
+ grantId: string;
24
+ redirectUri: string;
25
+ challenge: string | null;
26
+ nonce: string | null;
27
+ authTime: number;
28
+ expiresAt: number;
29
+ used: boolean;
30
+ ext?: AuthExt;
31
+ }>;
32
+ grants: Map<string, Grant>;
33
+ refresh: Map<string, {
34
+ grantId: string;
35
+ rotatedAt?: number;
36
+ successor?: string;
37
+ }>;
38
+ /** jti -> access token record (client_credentials and exchanged tokens have no grant). */
39
+ access: Map<string, {
40
+ clientId: string;
41
+ userId: string | null;
42
+ scope: string[];
43
+ exp: number;
44
+ revoked: boolean;
45
+ grantId: string | null;
46
+ cnf?: Obj;
47
+ }>;
48
+ autoUser: string | null;
49
+ }
50
+ export declare const st: (e: Engine) => OAuthState;
51
+ export declare const resetOAuth: (e: Engine) => void;
52
+ export declare const fail: (status: number, error: string, description: string, extra?: Obj) => Reply;
53
+ export declare function discoveryDocument(e: Engine): Obj;
54
+ /** Client authentication with the method the client is REGISTERED for: Basic, `client_id` (+ `client_secret`) in the body, a signed `client_assertion` (private_key_jwt), or nothing for a public client. */
55
+ export declare function authenticateClient(e: Engine, c: RouteContext): Promise<{
56
+ client: Obj;
57
+ } | {
58
+ error: Reply;
59
+ }>;
60
+ export declare const splitScope: (s: unknown) => string[];
61
+ export declare function mintAccess(e: Engine, input: {
62
+ client: Obj;
63
+ userId: string | null;
64
+ scope: string[];
65
+ grant: Grant | null;
66
+ audience?: string;
67
+ extra?: Obj;
68
+ cnf?: Obj;
69
+ ttl?: number;
70
+ }): Promise<{
71
+ token: string;
72
+ jti: string;
73
+ }>;
74
+ export declare const userClaims: (e: Engine, userId: string, scope: string[]) => Obj;
75
+ export declare function issueTokens(e: Engine, client: Obj, grant: Grant, nonce: string | null, authTime: number, refreshRec?: string, cnf?: Obj): Promise<Obj>;
76
+ export declare function idTokenFor(e: Engine, client: Obj, userId: string, scope: string[], nonce: string | null, authTime: number, sid?: string, extra?: Obj): Promise<string>;
77
+ /** End a grant and every access token minted from it. */
78
+ export declare function revokeGrant(e: Engine, g: Grant): void;
79
+ /** A presented access token for a resource of this provider: signature, revocation and its sender constraint (DPoP proof or client certificate). */
80
+ export declare function checkResourceToken(c: RouteContext, bearer: string, scheme: string): Promise<{
81
+ rec: NonNullable<ReturnType<OAuthState['access']['get']>>;
82
+ } | {
83
+ error: true;
84
+ message: string;
85
+ }>;
86
+ /** Create the grant and the single-use authorization code for an approved request (after login and, when needed, consent). */
87
+ export declare function issueCode(e: Engine, a: {
88
+ client: Obj;
89
+ userId: string;
90
+ scope: string[];
91
+ redirectUri: string;
92
+ challenge: string | null;
93
+ nonce: string | null;
94
+ ext?: AuthExt;
95
+ }): string;
96
+ export declare function oauthHandlers(): RouteDef[];