@hilbras/keystone 1.5.0 → 1.9.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 (559) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +59 -25
  3. package/dist/cli.js +25 -27
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +15 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +45 -8
  8. package/dist/config.js.map +1 -1
  9. package/dist/container.d.ts +4 -1
  10. package/dist/container.d.ts.map +1 -1
  11. package/dist/container.js.map +1 -1
  12. package/dist/db/migrations/0008_flashy_firestar.sql +5 -0
  13. package/dist/db/migrations/0009_daffy_changeling.sql +1 -0
  14. package/dist/db/migrations/0010_wealthy_shadow_king.sql +37 -0
  15. package/dist/db/migrations/0011_overrated_vector.sql +18 -0
  16. package/dist/db/migrations/0012_brave_darkhawk.sql +28 -0
  17. package/dist/db/migrations/0013_wonderful_chimera.sql +5 -0
  18. package/dist/db/migrations/0014_magical_morph.sql +48 -0
  19. package/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
  20. package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
  21. package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
  22. package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
  23. package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
  24. package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
  25. package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
  26. package/dist/db/migrations/meta/_journal.json +49 -0
  27. package/dist/db/reencryptOidcSecrets.d.ts +2 -0
  28. package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
  29. package/dist/db/reencryptOidcSecrets.js +41 -0
  30. package/dist/db/reencryptOidcSecrets.js.map +1 -0
  31. package/dist/db/schema.d.ts +2521 -53
  32. package/dist/db/schema.d.ts.map +1 -1
  33. package/dist/db/schema.js +118 -3
  34. package/dist/db/schema.js.map +1 -1
  35. package/dist/db/seed.js +67 -40
  36. package/dist/db/seed.js.map +1 -1
  37. package/dist/di.d.ts.map +1 -1
  38. package/dist/di.js +11 -3
  39. package/dist/di.js.map +1 -1
  40. package/dist/index.d.ts +2 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +26 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/errors.d.ts +2 -1
  45. package/dist/lib/errors.d.ts.map +1 -1
  46. package/dist/lib/errors.js +10 -0
  47. package/dist/lib/errors.js.map +1 -1
  48. package/dist/plugins/appContext.d.ts.map +1 -1
  49. package/dist/plugins/appContext.js +3 -12
  50. package/dist/plugins/appContext.js.map +1 -1
  51. package/dist/plugins/audit.d.ts.map +1 -1
  52. package/dist/plugins/audit.js +26 -6
  53. package/dist/plugins/audit.js.map +1 -1
  54. package/dist/plugins/auth.d.ts.map +1 -1
  55. package/dist/plugins/auth.js +32 -7
  56. package/dist/plugins/auth.js.map +1 -1
  57. package/dist/plugins/metrics.d.ts.map +1 -1
  58. package/dist/plugins/mtls.d.ts.map +1 -1
  59. package/dist/plugins/permissions.d.ts.map +1 -1
  60. package/dist/plugins/permissions.js +29 -9
  61. package/dist/plugins/permissions.js.map +1 -1
  62. package/dist/plugins/rateLimit.d.ts +15 -0
  63. package/dist/plugins/rateLimit.d.ts.map +1 -1
  64. package/dist/plugins/rateLimit.js +11 -1
  65. package/dist/plugins/rateLimit.js.map +1 -1
  66. package/dist/plugins/requestLogger.d.ts.map +1 -1
  67. package/dist/repositories/apiKey.d.ts.map +1 -1
  68. package/dist/repositories/application.d.ts.map +1 -1
  69. package/dist/repositories/application.js +1 -1
  70. package/dist/repositories/application.js.map +1 -1
  71. package/dist/repositories/audit.d.ts.map +1 -1
  72. package/dist/repositories/index.d.ts +3 -0
  73. package/dist/repositories/index.d.ts.map +1 -1
  74. package/dist/repositories/index.js +3 -0
  75. package/dist/repositories/index.js.map +1 -1
  76. package/dist/repositories/mfaChallenge.d.ts +23 -0
  77. package/dist/repositories/mfaChallenge.d.ts.map +1 -0
  78. package/dist/repositories/mfaChallenge.js +71 -0
  79. package/dist/repositories/mfaChallenge.js.map +1 -0
  80. package/dist/repositories/oidcConnection.d.ts +27 -43
  81. package/dist/repositories/oidcConnection.d.ts.map +1 -1
  82. package/dist/repositories/oidcConnection.js +15 -6
  83. package/dist/repositories/oidcConnection.js.map +1 -1
  84. package/dist/repositories/organization.d.ts +9 -9
  85. package/dist/repositories/organization.d.ts.map +1 -1
  86. package/dist/repositories/organization.js +91 -37
  87. package/dist/repositories/organization.js.map +1 -1
  88. package/dist/repositories/permission.d.ts.map +1 -1
  89. package/dist/repositories/permission.js +27 -5
  90. package/dist/repositories/permission.js.map +1 -1
  91. package/dist/repositories/samlConnection.d.ts +28 -28
  92. package/dist/repositories/samlConnection.d.ts.map +1 -1
  93. package/dist/repositories/samlConnection.js +12 -4
  94. package/dist/repositories/samlConnection.js.map +1 -1
  95. package/dist/repositories/scimConnection.d.ts +38 -0
  96. package/dist/repositories/scimConnection.d.ts.map +1 -0
  97. package/dist/repositories/scimConnection.js +123 -0
  98. package/dist/repositories/scimConnection.js.map +1 -0
  99. package/dist/repositories/scimGroup.d.ts +36 -0
  100. package/dist/repositories/scimGroup.d.ts.map +1 -0
  101. package/dist/repositories/scimGroup.js +113 -0
  102. package/dist/repositories/scimGroup.js.map +1 -0
  103. package/dist/repositories/session.d.ts +23 -13
  104. package/dist/repositories/session.d.ts.map +1 -1
  105. package/dist/repositories/session.js +13 -1
  106. package/dist/repositories/session.js.map +1 -1
  107. package/dist/repositories/types.d.ts +112 -5
  108. package/dist/repositories/types.d.ts.map +1 -1
  109. package/dist/repositories/types.js +7 -1
  110. package/dist/repositories/types.js.map +1 -1
  111. package/dist/repositories/user.d.ts +23 -1
  112. package/dist/repositories/user.d.ts.map +1 -1
  113. package/dist/repositories/user.js +180 -4
  114. package/dist/repositories/user.js.map +1 -1
  115. package/dist/routes/admin/billing.js +4 -4
  116. package/dist/routes/admin/billing.js.map +1 -1
  117. package/dist/routes/admin/helpers.d.ts +16 -20
  118. package/dist/routes/admin/helpers.d.ts.map +1 -1
  119. package/dist/routes/admin/helpers.js +53 -10
  120. package/dist/routes/admin/helpers.js.map +1 -1
  121. package/dist/routes/admin/organizations.d.ts.map +1 -1
  122. package/dist/routes/admin/organizations.js +76 -69
  123. package/dist/routes/admin/organizations.js.map +1 -1
  124. package/dist/routes/admin/permissions.d.ts.map +1 -1
  125. package/dist/routes/admin/permissions.js +48 -14
  126. package/dist/routes/admin/permissions.js.map +1 -1
  127. package/dist/routes/admin/platform.d.ts.map +1 -1
  128. package/dist/routes/admin/platform.js +86 -35
  129. package/dist/routes/admin/platform.js.map +1 -1
  130. package/dist/routes/admin/sso.d.ts.map +1 -1
  131. package/dist/routes/admin/sso.js +143 -12
  132. package/dist/routes/admin/sso.js.map +1 -1
  133. package/dist/routes/admin/webhooks.js +8 -8
  134. package/dist/routes/admin/webhooks.js.map +1 -1
  135. package/dist/routes/apiKeys.d.ts.map +1 -1
  136. package/dist/routes/apiKeys.js +23 -5
  137. package/dist/routes/apiKeys.js.map +1 -1
  138. package/dist/routes/auth.d.ts.map +1 -1
  139. package/dist/routes/auth.js +112 -22
  140. package/dist/routes/auth.js.map +1 -1
  141. package/dist/routes/authz.d.ts.map +1 -1
  142. package/dist/routes/authz.js +16 -4
  143. package/dist/routes/authz.js.map +1 -1
  144. package/dist/routes/config.d.ts.map +1 -1
  145. package/dist/routes/config.js +16 -14
  146. package/dist/routes/config.js.map +1 -1
  147. package/dist/routes/federation.d.ts.map +1 -1
  148. package/dist/routes/federation.js +17 -3
  149. package/dist/routes/federation.js.map +1 -1
  150. package/dist/routes/magicLinks.d.ts.map +1 -1
  151. package/dist/routes/magicLinks.js +15 -3
  152. package/dist/routes/magicLinks.js.map +1 -1
  153. package/dist/routes/oauth.d.ts.map +1 -1
  154. package/dist/routes/oauth.js +22 -3
  155. package/dist/routes/oauth.js.map +1 -1
  156. package/dist/routes/oauth2.d.ts.map +1 -1
  157. package/dist/routes/oauth2.js +104 -11
  158. package/dist/routes/oauth2.js.map +1 -1
  159. package/dist/routes/oidcEnterprise.d.ts.map +1 -1
  160. package/dist/routes/oidcEnterprise.js +67 -21
  161. package/dist/routes/oidcEnterprise.js.map +1 -1
  162. package/dist/routes/password.d.ts.map +1 -1
  163. package/dist/routes/password.js.map +1 -1
  164. package/dist/routes/profile.js +4 -4
  165. package/dist/routes/profile.js.map +1 -1
  166. package/dist/routes/saml.d.ts +9 -0
  167. package/dist/routes/saml.d.ts.map +1 -1
  168. package/dist/routes/saml.js +187 -11
  169. package/dist/routes/saml.js.map +1 -1
  170. package/dist/routes/scim.d.ts +13 -0
  171. package/dist/routes/scim.d.ts.map +1 -1
  172. package/dist/routes/scim.js +885 -110
  173. package/dist/routes/scim.js.map +1 -1
  174. package/dist/routes/sdk.d.ts.map +1 -1
  175. package/dist/routes/sdk.js +24 -8
  176. package/dist/routes/sdk.js.map +1 -1
  177. package/dist/routes/serviceAccounts.d.ts.map +1 -1
  178. package/dist/routes/serviceAccounts.js +2 -1
  179. package/dist/routes/serviceAccounts.js.map +1 -1
  180. package/dist/routes/setup.d.ts.map +1 -1
  181. package/dist/routes/setup.js +15 -16
  182. package/dist/routes/setup.js.map +1 -1
  183. package/dist/routes/smsOtp.js +1 -1
  184. package/dist/routes/smsOtp.js.map +1 -1
  185. package/dist/routes/totp.d.ts.map +1 -1
  186. package/dist/routes/totp.js +113 -23
  187. package/dist/routes/totp.js.map +1 -1
  188. package/dist/routes/webauthn.d.ts.map +1 -1
  189. package/dist/routes/webauthn.js +44 -8
  190. package/dist/routes/webauthn.js.map +1 -1
  191. package/dist/routes/workflows.d.ts.map +1 -1
  192. package/dist/routes/workflows.js +58 -25
  193. package/dist/routes/workflows.js.map +1 -1
  194. package/dist/sdk/index.d.ts.map +1 -1
  195. package/dist/sdk/index.js +141 -40
  196. package/dist/sdk/index.js.map +1 -1
  197. package/dist/sdk/types.d.ts +60 -29
  198. package/dist/sdk/types.d.ts.map +1 -1
  199. package/dist/services/application/authentication.d.ts +39 -1
  200. package/dist/services/application/authentication.d.ts.map +1 -1
  201. package/dist/services/application/authentication.js +43 -1
  202. package/dist/services/application/authentication.js.map +1 -1
  203. package/dist/services/application/identity.d.ts +10 -7
  204. package/dist/services/application/identity.d.ts.map +1 -1
  205. package/dist/services/application/identity.js +13 -10
  206. package/dist/services/application/identity.js.map +1 -1
  207. package/dist/services/application/organization.d.ts +11 -7
  208. package/dist/services/application/organization.d.ts.map +1 -1
  209. package/dist/services/application/organization.js +160 -12
  210. package/dist/services/application/organization.js.map +1 -1
  211. package/dist/services/applications.js +2 -2
  212. package/dist/services/applications.js.map +1 -1
  213. package/dist/services/audit.d.ts +1 -0
  214. package/dist/services/audit.d.ts.map +1 -1
  215. package/dist/services/audit.js +13 -0
  216. package/dist/services/audit.js.map +1 -1
  217. package/dist/services/cache.d.ts.map +1 -1
  218. package/dist/services/configuration/profiles.d.ts +4 -0
  219. package/dist/services/configuration/profiles.d.ts.map +1 -1
  220. package/dist/services/configuration/profiles.js +50 -0
  221. package/dist/services/configuration/profiles.js.map +1 -1
  222. package/dist/services/configuration.d.ts.map +1 -1
  223. package/dist/services/configuration.js.map +1 -1
  224. package/dist/services/connectors/google.d.ts.map +1 -1
  225. package/dist/services/connectors/google.js +3 -2
  226. package/dist/services/connectors/google.js.map +1 -1
  227. package/dist/services/connectors/oidc.d.ts.map +1 -1
  228. package/dist/services/connectors/oidc.js +6 -3
  229. package/dist/services/connectors/oidc.js.map +1 -1
  230. package/dist/services/connectors/zitadel.d.ts.map +1 -1
  231. package/dist/services/connectors/zitadel.js +4 -3
  232. package/dist/services/connectors/zitadel.js.map +1 -1
  233. package/dist/services/domain/authentication.d.ts +43 -4
  234. package/dist/services/domain/authentication.d.ts.map +1 -1
  235. package/dist/services/domain/authentication.js +82 -20
  236. package/dist/services/domain/authentication.js.map +1 -1
  237. package/dist/services/domain/authorization.d.ts +11 -0
  238. package/dist/services/domain/authorization.d.ts.map +1 -1
  239. package/dist/services/domain/authorization.js +36 -1
  240. package/dist/services/domain/authorization.js.map +1 -1
  241. package/dist/services/domain/identity.d.ts +21 -9
  242. package/dist/services/domain/identity.d.ts.map +1 -1
  243. package/dist/services/domain/identity.js +187 -10
  244. package/dist/services/domain/identity.js.map +1 -1
  245. package/dist/services/domain/organization.d.ts +6 -9
  246. package/dist/services/domain/organization.d.ts.map +1 -1
  247. package/dist/services/domain/organization.js +48 -30
  248. package/dist/services/domain/organization.js.map +1 -1
  249. package/dist/services/emailVerification.d.ts +2 -2
  250. package/dist/services/enterpriseSso.d.ts +13 -6
  251. package/dist/services/enterpriseSso.d.ts.map +1 -1
  252. package/dist/services/enterpriseSso.js +75 -6
  253. package/dist/services/enterpriseSso.js.map +1 -1
  254. package/dist/services/events/subscribers/auditLog.js +1 -1
  255. package/dist/services/events/subscribers/auditLog.js.map +1 -1
  256. package/dist/services/events/types.d.ts +7 -1
  257. package/dist/services/events/types.d.ts.map +1 -1
  258. package/dist/services/events/types.js.map +1 -1
  259. package/dist/services/events/validate.d.ts.map +1 -1
  260. package/dist/services/events/validate.js +27 -0
  261. package/dist/services/events/validate.js.map +1 -1
  262. package/dist/services/features.d.ts.map +1 -1
  263. package/dist/services/features.js.map +1 -1
  264. package/dist/services/federation.d.ts +6 -1
  265. package/dist/services/federation.d.ts.map +1 -1
  266. package/dist/services/federation.js +31 -4
  267. package/dist/services/federation.js.map +1 -1
  268. package/dist/services/ipControls.js +2 -2
  269. package/dist/services/ipControls.js.map +1 -1
  270. package/dist/services/magicLinks.d.ts +2 -2
  271. package/dist/services/mfa.d.ts +53 -0
  272. package/dist/services/mfa.d.ts.map +1 -0
  273. package/dist/services/mfa.js +157 -0
  274. package/dist/services/mfa.js.map +1 -0
  275. package/dist/services/oauth2.d.ts +16 -12
  276. package/dist/services/oauth2.d.ts.map +1 -1
  277. package/dist/services/oauth2.js +22 -13
  278. package/dist/services/oauth2.js.map +1 -1
  279. package/dist/services/oidcSecretFormat.d.ts +3 -0
  280. package/dist/services/oidcSecretFormat.d.ts.map +1 -0
  281. package/dist/services/oidcSecretFormat.js +5 -0
  282. package/dist/services/oidcSecretFormat.js.map +1 -0
  283. package/dist/services/organizations.d.ts +4 -16
  284. package/dist/services/organizations.d.ts.map +1 -1
  285. package/dist/services/organizations.js +0 -62
  286. package/dist/services/organizations.js.map +1 -1
  287. package/dist/services/permissions.d.ts.map +1 -1
  288. package/dist/services/permissions.js +9 -1
  289. package/dist/services/permissions.js.map +1 -1
  290. package/dist/services/plugins/registry.d.ts.map +1 -1
  291. package/dist/services/plugins/registry.js.map +1 -1
  292. package/dist/services/plugins/types.d.ts.map +1 -1
  293. package/dist/services/queue/bullmq.d.ts.map +1 -1
  294. package/dist/services/queue/inProcess.d.ts.map +1 -1
  295. package/dist/services/redis.d.ts +1 -1
  296. package/dist/services/redis.d.ts.map +1 -1
  297. package/dist/services/scimCredentials.d.ts +46 -0
  298. package/dist/services/scimCredentials.d.ts.map +1 -0
  299. package/dist/services/scimCredentials.js +123 -0
  300. package/dist/services/scimCredentials.js.map +1 -0
  301. package/dist/services/scimLegacyMigration.d.ts +12 -0
  302. package/dist/services/scimLegacyMigration.d.ts.map +1 -0
  303. package/dist/services/scimLegacyMigration.js +44 -0
  304. package/dist/services/scimLegacyMigration.js.map +1 -0
  305. package/dist/services/secrets/awsKms.d.ts +2 -2
  306. package/dist/services/secrets/awsKms.d.ts.map +1 -1
  307. package/dist/services/secrets/awsKms.js +3 -5
  308. package/dist/services/secrets/awsKms.js.map +1 -1
  309. package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
  310. package/dist/services/secrets/database.d.ts.map +1 -1
  311. package/dist/services/secrets/database.js.map +1 -1
  312. package/dist/services/secrets/environment.d.ts.map +1 -1
  313. package/dist/services/secrets/environment.js.map +1 -1
  314. package/dist/services/secrets/index.d.ts.map +1 -1
  315. package/dist/services/secrets/password.d.ts.map +1 -1
  316. package/dist/services/secrets/password.js +0 -4
  317. package/dist/services/secrets/password.js.map +1 -1
  318. package/dist/services/secrets/provider.d.ts +2 -3
  319. package/dist/services/secrets/provider.d.ts.map +1 -1
  320. package/dist/services/secrets/vault.d.ts.map +1 -1
  321. package/dist/services/setup/configWriter.d.ts.map +1 -1
  322. package/dist/services/setup/configWriter.js.map +1 -1
  323. package/dist/services/ssoEndpointPolicy.d.ts +8 -0
  324. package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
  325. package/dist/services/ssoEndpointPolicy.js +136 -0
  326. package/dist/services/ssoEndpointPolicy.js.map +1 -0
  327. package/dist/services/stepUp.d.ts +35 -0
  328. package/dist/services/stepUp.d.ts.map +1 -0
  329. package/dist/services/stepUp.js +65 -0
  330. package/dist/services/stepUp.js.map +1 -0
  331. package/dist/services/tokens.d.ts +37 -11
  332. package/dist/services/tokens.d.ts.map +1 -1
  333. package/dist/services/tokens.js +75 -14
  334. package/dist/services/tokens.js.map +1 -1
  335. package/dist/services/totp.d.ts +46 -0
  336. package/dist/services/totp.d.ts.map +1 -1
  337. package/dist/services/totp.js +178 -41
  338. package/dist/services/totp.js.map +1 -1
  339. package/dist/services/users.d.ts +20 -12
  340. package/dist/services/users.d.ts.map +1 -1
  341. package/dist/services/users.js +24 -51
  342. package/dist/services/users.js.map +1 -1
  343. package/dist/services/webauthn.d.ts +8 -4
  344. package/dist/services/webauthn.d.ts.map +1 -1
  345. package/dist/services/webauthn.js +4 -4
  346. package/dist/services/webauthn.js.map +1 -1
  347. package/dist/services/webhooks.d.ts +20 -20
  348. package/dist/services/workflows/engine.d.ts +4 -2
  349. package/dist/services/workflows/engine.d.ts.map +1 -1
  350. package/dist/services/workflows/engine.js +181 -12
  351. package/dist/services/workflows/engine.js.map +1 -1
  352. package/dist/services/workflows/steps.d.ts +2 -0
  353. package/dist/services/workflows/steps.d.ts.map +1 -1
  354. package/dist/services/workflows/steps.js +8 -75
  355. package/dist/services/workflows/steps.js.map +1 -1
  356. package/dist/setup-server.js.map +1 -1
  357. package/dist/types.d.ts +33 -4
  358. package/dist/types.d.ts.map +1 -1
  359. package/dist/types.js +26 -2
  360. package/dist/types.js.map +1 -1
  361. package/package.json +26 -3
  362. package/dist/tests/errors.test.d.ts +0 -2
  363. package/dist/tests/errors.test.d.ts.map +0 -1
  364. package/dist/tests/errors.test.js +0 -64
  365. package/dist/tests/errors.test.js.map +0 -1
  366. package/dist/tests/events.test.d.ts +0 -2
  367. package/dist/tests/events.test.d.ts.map +0 -1
  368. package/dist/tests/events.test.js +0 -45
  369. package/dist/tests/events.test.js.map +0 -1
  370. package/dist/tests/featureFlags.test.d.ts +0 -2
  371. package/dist/tests/featureFlags.test.d.ts.map +0 -1
  372. package/dist/tests/featureFlags.test.js +0 -24
  373. package/dist/tests/featureFlags.test.js.map +0 -1
  374. package/dist/tests/integration/queue.test.d.ts +0 -2
  375. package/dist/tests/integration/queue.test.d.ts.map +0 -1
  376. package/dist/tests/integration/queue.test.js +0 -49
  377. package/dist/tests/integration/queue.test.js.map +0 -1
  378. package/dist/tests/plugins.test.d.ts +0 -2
  379. package/dist/tests/plugins.test.d.ts.map +0 -1
  380. package/dist/tests/plugins.test.js +0 -56
  381. package/dist/tests/plugins.test.js.map +0 -1
  382. package/dist/tests/result.test.d.ts +0 -2
  383. package/dist/tests/result.test.d.ts.map +0 -1
  384. package/dist/tests/result.test.js +0 -46
  385. package/dist/tests/result.test.js.map +0 -1
  386. package/dist/tests/setup/configWriter.test.d.ts +0 -2
  387. package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
  388. package/dist/tests/setup/configWriter.test.js +0 -55
  389. package/dist/tests/setup/configWriter.test.js.map +0 -1
  390. package/dist/tests/setup/validation.test.d.ts +0 -2
  391. package/dist/tests/setup/validation.test.d.ts.map +0 -1
  392. package/dist/tests/setup/validation.test.js +0 -26
  393. package/dist/tests/setup/validation.test.js.map +0 -1
  394. package/dist/tests/smoke.test.d.ts +0 -2
  395. package/dist/tests/smoke.test.d.ts.map +0 -1
  396. package/dist/tests/smoke.test.js +0 -124
  397. package/dist/tests/smoke.test.js.map +0 -1
  398. package/src/cli.ts +0 -172
  399. package/src/config.ts +0 -143
  400. package/src/container.ts +0 -48
  401. package/src/db/index.ts +0 -53
  402. package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
  403. package/src/db/migrations/0001_brief_joseph.sql +0 -10
  404. package/src/db/migrations/0002_add_account_lockout.sql +0 -3
  405. package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
  406. package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
  407. package/src/db/migrations/0005_steep_the_call.sql +0 -2
  408. package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
  409. package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
  410. package/src/db/migrations/meta/0000_snapshot.json +0 -2964
  411. package/src/db/migrations/meta/0001_snapshot.json +0 -3031
  412. package/src/db/migrations/meta/0003_snapshot.json +0 -3051
  413. package/src/db/migrations/meta/_journal.json +0 -62
  414. package/src/db/schema.ts +0 -676
  415. package/src/db/seed.ts +0 -146
  416. package/src/di.ts +0 -81
  417. package/src/index.ts +0 -326
  418. package/src/lib/errors.ts +0 -139
  419. package/src/lib/result.ts +0 -44
  420. package/src/lib/webhookSignature.ts +0 -41
  421. package/src/plugins/appContext.ts +0 -76
  422. package/src/plugins/audit.ts +0 -42
  423. package/src/plugins/auth.ts +0 -230
  424. package/src/plugins/metrics.ts +0 -41
  425. package/src/plugins/mtls.ts +0 -94
  426. package/src/plugins/permissions.ts +0 -29
  427. package/src/plugins/rateLimit.ts +0 -133
  428. package/src/plugins/requestLogger.ts +0 -25
  429. package/src/plugins/tracing.ts +0 -22
  430. package/src/repositories/apiKey.ts +0 -158
  431. package/src/repositories/application.ts +0 -70
  432. package/src/repositories/audit.ts +0 -32
  433. package/src/repositories/index.ts +0 -9
  434. package/src/repositories/oidcConnection.ts +0 -111
  435. package/src/repositories/organization.ts +0 -167
  436. package/src/repositories/permission.ts +0 -153
  437. package/src/repositories/samlConnection.ts +0 -96
  438. package/src/repositories/session.ts +0 -86
  439. package/src/repositories/types.ts +0 -134
  440. package/src/repositories/user.ts +0 -161
  441. package/src/routes/admin/billing.ts +0 -48
  442. package/src/routes/admin/helpers.ts +0 -50
  443. package/src/routes/admin/index.ts +0 -16
  444. package/src/routes/admin/organizations.ts +0 -299
  445. package/src/routes/admin/permissions.ts +0 -80
  446. package/src/routes/admin/platform.ts +0 -335
  447. package/src/routes/admin/sso.ts +0 -138
  448. package/src/routes/admin/webhooks.ts +0 -73
  449. package/src/routes/admin.ts +0 -1
  450. package/src/routes/apiKeys.ts +0 -60
  451. package/src/routes/auth.ts +0 -214
  452. package/src/routes/authz.ts +0 -38
  453. package/src/routes/config.ts +0 -67
  454. package/src/routes/emailVerification.ts +0 -73
  455. package/src/routes/federation.ts +0 -156
  456. package/src/routes/helpers.ts +0 -17
  457. package/src/routes/magicLinks.ts +0 -107
  458. package/src/routes/oauth.ts +0 -167
  459. package/src/routes/oauth2.ts +0 -284
  460. package/src/routes/oidcEnterprise.ts +0 -166
  461. package/src/routes/password.ts +0 -90
  462. package/src/routes/profile.ts +0 -44
  463. package/src/routes/saml.ts +0 -209
  464. package/src/routes/scim.ts +0 -199
  465. package/src/routes/sdk.ts +0 -141
  466. package/src/routes/serviceAccounts.ts +0 -124
  467. package/src/routes/sessions.ts +0 -62
  468. package/src/routes/setup.ts +0 -315
  469. package/src/routes/smsOtp.ts +0 -67
  470. package/src/routes/totp.ts +0 -122
  471. package/src/routes/webauthn.ts +0 -147
  472. package/src/routes/workflows.ts +0 -157
  473. package/src/sdk/index.ts +0 -152
  474. package/src/sdk/types.ts +0 -54
  475. package/src/services/anomalyDetection.ts +0 -73
  476. package/src/services/application/authentication.ts +0 -75
  477. package/src/services/application/identity.ts +0 -56
  478. package/src/services/application/index.ts +0 -3
  479. package/src/services/application/organization.ts +0 -77
  480. package/src/services/applications.ts +0 -89
  481. package/src/services/audit.ts +0 -41
  482. package/src/services/auditExport.ts +0 -59
  483. package/src/services/billing.ts +0 -87
  484. package/src/services/cache.ts +0 -131
  485. package/src/services/configuration/profiles.ts +0 -115
  486. package/src/services/configuration.ts +0 -120
  487. package/src/services/connectors/google.ts +0 -92
  488. package/src/services/connectors/oidc.ts +0 -111
  489. package/src/services/connectors/registry.ts +0 -124
  490. package/src/services/connectors/types.ts +0 -38
  491. package/src/services/connectors/zitadel.ts +0 -77
  492. package/src/services/devices.ts +0 -76
  493. package/src/services/domain/authentication.ts +0 -279
  494. package/src/services/domain/authorization.ts +0 -49
  495. package/src/services/domain/identity.ts +0 -108
  496. package/src/services/domain/index.ts +0 -4
  497. package/src/services/domain/organization.ts +0 -114
  498. package/src/services/email.ts +0 -167
  499. package/src/services/emailVerification.ts +0 -75
  500. package/src/services/enterpriseSso.ts +0 -58
  501. package/src/services/events/bus.ts +0 -43
  502. package/src/services/events/subscribers/anomaly.ts +0 -13
  503. package/src/services/events/subscribers/auditLog.ts +0 -21
  504. package/src/services/events/subscribers/webhook.ts +0 -39
  505. package/src/services/events/subscribers/webhookDispatch.ts +0 -14
  506. package/src/services/events/types.ts +0 -106
  507. package/src/services/events/validate.ts +0 -118
  508. package/src/services/featureFlags.ts +0 -90
  509. package/src/services/features.ts +0 -22
  510. package/src/services/federation.ts +0 -30
  511. package/src/services/hibp.ts +0 -28
  512. package/src/services/ipControls.ts +0 -99
  513. package/src/services/magicLinks.ts +0 -51
  514. package/src/services/oauth2.ts +0 -216
  515. package/src/services/organizations.ts +0 -171
  516. package/src/services/permissions.ts +0 -146
  517. package/src/services/plugins/registry.ts +0 -242
  518. package/src/services/plugins/types.ts +0 -98
  519. package/src/services/queue/bullmq.ts +0 -104
  520. package/src/services/queue/inProcess.ts +0 -75
  521. package/src/services/queue/index.ts +0 -19
  522. package/src/services/queue/types.ts +0 -26
  523. package/src/services/redis.ts +0 -16
  524. package/src/services/secrets/awsKms.ts +0 -97
  525. package/src/services/secrets/azureKeyVault.ts +0 -171
  526. package/src/services/secrets/database.ts +0 -166
  527. package/src/services/secrets/environment.ts +0 -117
  528. package/src/services/secrets/index.ts +0 -50
  529. package/src/services/secrets/password.ts +0 -73
  530. package/src/services/secrets/provider.ts +0 -36
  531. package/src/services/secrets/vault.ts +0 -149
  532. package/src/services/secrets.ts +0 -2
  533. package/src/services/serviceAccounts.ts +0 -74
  534. package/src/services/setup/configWriter.ts +0 -200
  535. package/src/services/setup/diagnostics.ts +0 -76
  536. package/src/services/setup/token.ts +0 -42
  537. package/src/services/setup/types.ts +0 -40
  538. package/src/services/setup/validation.ts +0 -205
  539. package/src/services/sms.ts +0 -81
  540. package/src/services/smsOtp.ts +0 -74
  541. package/src/services/tokens.ts +0 -287
  542. package/src/services/totp.ts +0 -113
  543. package/src/services/users.ts +0 -239
  544. package/src/services/webauthn.ts +0 -193
  545. package/src/services/webhooks.ts +0 -190
  546. package/src/services/workflows/engine.ts +0 -125
  547. package/src/services/workflows/steps.ts +0 -129
  548. package/src/services/zitadel.ts +0 -277
  549. package/src/setup-server.ts +0 -71
  550. package/src/tests/errors.test.ts +0 -74
  551. package/src/tests/events.test.ts +0 -52
  552. package/src/tests/featureFlags.test.ts +0 -26
  553. package/src/tests/integration/queue.test.ts +0 -54
  554. package/src/tests/plugins.test.ts +0 -73
  555. package/src/tests/result.test.ts +0 -52
  556. package/src/tests/setup/configWriter.test.ts +0 -69
  557. package/src/tests/setup/validation.test.ts +0 -29
  558. package/src/tests/smoke.test.ts +0 -136
  559. package/src/types.ts +0 -70
@@ -1,90 +0,0 @@
1
- import { eq } from "drizzle-orm";
2
- import { db } from "../db/index.js";
3
- import { featureFlags } from "../db/schema.js";
4
- import { configurationService } from "./configuration.js";
5
-
6
- const cache = new Map<string, boolean>();
7
- let cacheLoaded = false;
8
-
9
- async function loadIntoCache() {
10
- if (cacheLoaded) return;
11
- const rows = await db.select({ key: featureFlags.key, enabled: featureFlags.enabled }).from(featureFlags);
12
- for (const row of rows) {
13
- cache.set(row.key, row.enabled);
14
- }
15
- cacheLoaded = true;
16
- }
17
-
18
- export async function isFeatureEnabled(flag: string): Promise<boolean> {
19
- await loadIntoCache();
20
- if (cache.has(flag)) return cache.get(flag)!;
21
- return configurationService.isEnabled(flag);
22
- }
23
-
24
- export async function requireFeatureEnabled(flag: string): Promise<void> {
25
- const enabled = await isFeatureEnabled(flag);
26
- if (!enabled) {
27
- const error = new Error(`Feature '${flag}' is not enabled`) as Error & { statusCode: number };
28
- error.statusCode = 403;
29
- throw error;
30
- }
31
- }
32
-
33
- export async function listFeatureFlags(): Promise<
34
- Array<{ key: string; enabled: boolean; description: string | null; source: "database" | "environment" }>
35
- > {
36
- await loadIntoCache();
37
- const dbRows = await db.select().from(featureFlags).orderBy(featureFlags.key);
38
- const envFlags = configurationService.get().featureFlags;
39
-
40
- const merged = new Map<string, { key: string; enabled: boolean; description: string | null; source: "database" | "environment" }>();
41
-
42
- for (const row of dbRows) {
43
- merged.set(row.key, { key: row.key, enabled: row.enabled, description: row.description, source: "database" });
44
- }
45
-
46
- for (const [key, enabled] of Object.entries(envFlags)) {
47
- if (!merged.has(key)) {
48
- merged.set(key, { key, enabled, description: null, source: "environment" });
49
- }
50
- }
51
-
52
- return Array.from(merged.values()).sort((a, b) => a.key.localeCompare(b.key));
53
- }
54
-
55
- export async function setFeatureFlag(
56
- key: string,
57
- enabled: boolean,
58
- description?: string
59
- ): Promise<{ key: string; enabled: boolean }> {
60
- const existing = await db.select().from(featureFlags).where(eq(featureFlags.key, key)).limit(1);
61
- if (existing.length > 0) {
62
- const [row] = await db
63
- .update(featureFlags)
64
- .set({ enabled, description: description ?? existing[0].description, updatedAt: new Date() })
65
- .where(eq(featureFlags.key, key))
66
- .returning();
67
- cache.set(row.key, row.enabled);
68
- return { key: row.key, enabled: row.enabled };
69
- }
70
-
71
- const [row] = await db
72
- .insert(featureFlags)
73
- .values({ key, enabled, description: description || null })
74
- .returning();
75
- cache.set(row.key, row.enabled);
76
- return { key: row.key, enabled: row.enabled };
77
- }
78
-
79
- export async function deleteFeatureFlag(key: string): Promise<boolean> {
80
- const [row] = await db.delete(featureFlags).where(eq(featureFlags.key, key)).returning();
81
- if (row) {
82
- cache.delete(row.key);
83
- }
84
- return !!row;
85
- }
86
-
87
- export function clearFeatureFlagCache(): void {
88
- cache.clear();
89
- cacheLoaded = false;
90
- }
@@ -1,22 +0,0 @@
1
- import type { ConfigurationService } from "./configuration.js";
2
-
3
- export interface FeatureFlagService {
4
- isEnabled(flag: string): boolean;
5
- requireEnabled(flag: string): void;
6
- }
7
-
8
- export class DefaultFeatureFlagService implements FeatureFlagService {
9
- constructor(private readonly config: ConfigurationService) {}
10
-
11
- isEnabled(flag: string): boolean {
12
- return this.config.isEnabled(flag);
13
- }
14
-
15
- requireEnabled(flag: string): void {
16
- if (!this.isEnabled(flag)) {
17
- const error = new Error(`Feature '${flag}' is not enabled`) as Error & { statusCode: number };
18
- error.statusCode = 403;
19
- throw error;
20
- }
21
- }
22
- }
@@ -1,30 +0,0 @@
1
- import { buildConnector } from "./connectors/registry.js";
2
- import { upsertOAuthUser } from "./users.js";
3
- import { createTokenSet } from "./tokens.js";
4
- import type { User } from "../db/schema.js";
5
- import type { IdentityConnector } from "./connectors/types.js";
6
-
7
- export function getFederationConnector(providerType: string): IdentityConnector {
8
- return buildConnector(providerType);
9
- }
10
-
11
- export async function getFederationAuthorizeUrl(providerType: string, state: string, redirectUri: string): Promise<string> {
12
- const connector = getFederationConnector(providerType);
13
- return connector.getAuthorizeUrl({
14
- state,
15
- redirectUri,
16
- scopes: ["openid", "profile", "email"],
17
- });
18
- }
19
-
20
- export async function completeFederationLogin(
21
- providerType: string,
22
- code: string,
23
- redirectUri: string
24
- ): Promise<{ user: User; tokens: { accessToken: string; refreshToken: string } }> {
25
- const connector = getFederationConnector(providerType);
26
- const identity = await connector.exchangeCode(code, redirectUri);
27
- const user = await upsertOAuthUser(identity, providerType);
28
- const tokens = await createTokenSet(user);
29
- return { user, tokens: { accessToken: tokens.accessToken, refreshToken: tokens.refreshToken } };
30
- }
@@ -1,28 +0,0 @@
1
- import crypto from "node:crypto";
2
-
3
- export async function isPasswordBreached(password: string): Promise<boolean> {
4
- const hash = crypto.createHash("sha1").update(password).digest("hex").toUpperCase();
5
- const prefix = hash.slice(0, 5);
6
- const suffix = hash.slice(5);
7
-
8
- try {
9
- const response = await fetch(`https://api.pwnedpasswords.com/range/${prefix}`, {
10
- headers: { "Add-Padding": "true" },
11
- });
12
- if (!response.ok) {
13
- return false;
14
- }
15
- const text = await response.text();
16
- const lines = text.split("\r\n");
17
- for (const line of lines) {
18
- const [lineSuffix, countStr] = line.split(":");
19
- if (!lineSuffix || !countStr) continue;
20
- if (lineSuffix === suffix && Number(countStr) > 0) {
21
- return true;
22
- }
23
- }
24
- return false;
25
- } catch {
26
- return false;
27
- }
28
- }
@@ -1,99 +0,0 @@
1
- import { db } from "../db/index.js";
2
- import { applications } from "../db/schema.js";
3
- import { eq } from "drizzle-orm";
4
-
5
- /**
6
- * Per-application IP allow/block lists.
7
- *
8
- * Entries may be exact IPs ("203.0.113.10") or CIDR ranges
9
- * ("203.0.113.0/24", "2001:db8::/32"). When `allowedIps` is non-empty only
10
- * matching IPs may authenticate; `blockedIps` always wins.
11
- */
12
-
13
- function ipToBigInt(ip: string): { value: bigint; bits: number } | null {
14
- if (ip.includes(".")) {
15
- const parts = ip.split(".");
16
- if (parts.length !== 4) return null;
17
- let value = 0n;
18
- for (const part of parts) {
19
- const n = Number(part);
20
- if (!Number.isInteger(n) || n < 0 || n > 255) return null;
21
- value = (value << 8n) | BigInt(n);
22
- }
23
- return { value, bits: 32 };
24
- }
25
-
26
- if (ip.includes(":")) {
27
- // Expand :: shorthand and parse 8 hextets.
28
- const [head, tail] = ip.split("::");
29
- let hextets: string[];
30
- if (tail !== undefined) {
31
- const headParts = head ? head.split(":") : [];
32
- const tailParts = tail ? tail.split(":") : [];
33
- const missing = 8 - headParts.length - tailParts.length;
34
- if (missing < 0) return null;
35
- hextets = [...headParts, ...Array(missing).fill("0"), ...tailParts];
36
- } else {
37
- hextets = ip.split(":");
38
- }
39
- if (hextets.length !== 8) return null;
40
- let value = 0n;
41
- for (const hex of hextets) {
42
- const n = parseInt(hex || "0", 16);
43
- if (Number.isNaN(n) || n < 0 || n > 0xffff) return null;
44
- value = (value << 16n) | BigInt(n);
45
- }
46
- return { value, bits: 128 };
47
- }
48
-
49
- return null;
50
- }
51
-
52
- export function ipMatchesEntry(ip: string, entry: string): boolean {
53
- const target = ipToBigInt(ip);
54
- if (!target) return false;
55
-
56
- const [networkIp, prefixStr] = entry.split("/");
57
- const network = ipToBigInt(networkIp.trim());
58
- if (!network || network.bits !== target.bits) return false;
59
-
60
- if (prefixStr === undefined) {
61
- return target.value === network.value;
62
- }
63
-
64
- const prefix = Number(prefixStr);
65
- if (!Number.isInteger(prefix) || prefix < 0 || prefix > network.bits) return false;
66
- if (prefix === 0) return true;
67
-
68
- const shift = BigInt(network.bits - prefix);
69
- return target.value >> shift === network.value >> shift;
70
- }
71
-
72
- export interface IpCheckResult {
73
- allowed: boolean;
74
- reason?: string;
75
- }
76
-
77
- export async function checkIpAllowed(clientId: string | undefined, ip: string | undefined): Promise<IpCheckResult> {
78
- if (!clientId || !ip) return { allowed: true };
79
-
80
- const [app] = await db
81
- .select({ allowedIps: applications.allowedIps, blockedIps: applications.blockedIps })
82
- .from(applications)
83
- .where(eq(applications.clientId, clientId))
84
- .limit(1);
85
-
86
- if (!app) return { allowed: true };
87
-
88
- const blocked = app.blockedIps || [];
89
- if (blocked.some((entry) => ipMatchesEntry(ip, entry))) {
90
- return { allowed: false, reason: "Your IP address is blocked for this application." };
91
- }
92
-
93
- const allowed = app.allowedIps || [];
94
- if (allowed.length > 0 && !allowed.some((entry) => ipMatchesEntry(ip, entry))) {
95
- return { allowed: false, reason: "Your IP address is not allowed for this application." };
96
- }
97
-
98
- return { allowed: true };
99
- }
@@ -1,51 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { eq, and, gt, isNull } from "drizzle-orm";
3
- import { db } from "../db/index.js";
4
- import { magicLinks, users, type User } from "../db/schema.js";
5
- import { config } from "../config.js";
6
-
7
- export function generateMagicLink(): { token: string; tokenHash: string } {
8
- const token = crypto.randomBytes(48).toString("base64url");
9
- const tokenHash = crypto.createHash("sha256").update(token).digest("hex");
10
- return { token, tokenHash };
11
- }
12
-
13
- export async function storeMagicLink(userId: string, tokenHash: string, expiresAt: Date) {
14
- const [record] = await db
15
- .insert(magicLinks)
16
- .values({
17
- userId,
18
- tokenHash,
19
- expiresAt,
20
- })
21
- .returning();
22
- return record;
23
- }
24
-
25
- export async function consumeMagicLink(token: string): Promise<User | undefined> {
26
- const tokenHash = crypto.createHash("sha256").update(token).digest("hex");
27
- const now = new Date();
28
-
29
- const [record] = await db
30
- .select()
31
- .from(magicLinks)
32
- .where(
33
- and(
34
- eq(magicLinks.tokenHash, tokenHash),
35
- gt(magicLinks.expiresAt, now),
36
- isNull(magicLinks.usedAt)
37
- )
38
- )
39
- .limit(1);
40
-
41
- if (!record) return undefined;
42
-
43
- await db.update(magicLinks).set({ usedAt: now }).where(eq(magicLinks.id, record.id));
44
-
45
- const [user] = await db.select().from(users).where(eq(users.id, record.userId)).limit(1);
46
- return user;
47
- }
48
-
49
- export function magicLinkExpiresAt(): Date {
50
- return new Date(Date.now() + config.MAGIC_LINK_TTL_SECONDS * 1000);
51
- }
@@ -1,216 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { eq, and, gt, isNull, inArray } from "drizzle-orm";
3
- import { db } from "../db/index.js";
4
- import {
5
- oauth2AuthorizationCodes,
6
- oauth2Consents,
7
- applications,
8
- users,
9
- type User,
10
- type Application,
11
- } from "../db/schema.js";
12
- import { config } from "../config.js";
13
- import { createTokenSet, createIdToken, type AccessTokenOptions } from "./tokens.js";
14
-
15
- export interface AuthorizationCodeInput {
16
- appId: string;
17
- userId: string;
18
- challenge?: string;
19
- challengeMethod?: string;
20
- redirectUri?: string;
21
- scopes?: string[];
22
- nonce?: string;
23
- }
24
-
25
- export function generateAuthorizationCode(): { code: string; codeHash: string } {
26
- const code = crypto.randomBytes(48).toString("base64url");
27
- const codeHash = crypto.createHash("sha256").update(code).digest("hex");
28
- return { code, codeHash };
29
- }
30
-
31
- export async function storeAuthorizationCode(input: AuthorizationCodeInput) {
32
- const { code, codeHash } = generateAuthorizationCode();
33
- const expiresAt = new Date(Date.now() + config.OAUTH_CODE_TTL_SECONDS * 1000);
34
-
35
- const [record] = await db
36
- .insert(oauth2AuthorizationCodes)
37
- .values({
38
- appId: input.appId,
39
- userId: input.userId,
40
- codeHash,
41
- challenge: input.challenge ?? null,
42
- challengeMethod: input.challengeMethod ?? null,
43
- redirectUri: input.redirectUri ?? null,
44
- scopes: input.scopes ?? [],
45
- nonce: input.nonce ?? null,
46
- expiresAt,
47
- })
48
- .returning();
49
-
50
- return { ...record, code };
51
- }
52
-
53
- export async function consumeAuthorizationCode(
54
- code: string,
55
- appId: string,
56
- redirectUri?: string
57
- ): Promise<typeof oauth2AuthorizationCodes.$inferSelect | undefined> {
58
- const codeHash = crypto.createHash("sha256").update(code).digest("hex");
59
- const now = new Date();
60
-
61
- const [record] = await db
62
- .select()
63
- .from(oauth2AuthorizationCodes)
64
- .where(
65
- and(
66
- eq(oauth2AuthorizationCodes.codeHash, codeHash),
67
- eq(oauth2AuthorizationCodes.appId, appId),
68
- gt(oauth2AuthorizationCodes.expiresAt, now),
69
- isNull(oauth2AuthorizationCodes.usedAt)
70
- )
71
- )
72
- .limit(1);
73
-
74
- if (!record) return undefined;
75
- if (redirectUri && record.redirectUri && record.redirectUri !== redirectUri) {
76
- return undefined;
77
- }
78
-
79
- await db
80
- .update(oauth2AuthorizationCodes)
81
- .set({ usedAt: now })
82
- .where(eq(oauth2AuthorizationCodes.id, record.id));
83
-
84
- return record;
85
- }
86
-
87
- export function verifyPKCE(
88
- challenge: string | null | undefined,
89
- method: string | null | undefined,
90
- verifier: string
91
- ): boolean {
92
- if (!challenge) return true;
93
- if (method?.toLowerCase() !== "s256") return false;
94
- const hash = crypto.createHash("sha256").update(verifier).digest("base64url");
95
- return hash === challenge;
96
- }
97
-
98
- export async function hasConsent(
99
- userId: string,
100
- appId: string,
101
- requestedScopes: string[]
102
- ): Promise<boolean> {
103
- if (requestedScopes.length === 0) return true;
104
-
105
- const [consent] = await db
106
- .select()
107
- .from(oauth2Consents)
108
- .where(
109
- and(
110
- eq(oauth2Consents.appId, appId),
111
- eq(oauth2Consents.userId, userId),
112
- isNull(oauth2Consents.revokedAt)
113
- )
114
- )
115
- .limit(1);
116
-
117
- if (!consent) return false;
118
- const granted = new Set(consent.scopes);
119
- return requestedScopes.every((scope) => granted.has(scope));
120
- }
121
-
122
- export async function grantConsent(userId: string, appId: string, scopes: string[]) {
123
- const now = new Date();
124
- const [record] = await db
125
- .insert(oauth2Consents)
126
- .values({
127
- appId,
128
- userId,
129
- scopes,
130
- grantedAt: now,
131
- })
132
- .onConflictDoUpdate({
133
- target: [oauth2Consents.appId, oauth2Consents.userId],
134
- set: {
135
- scopes,
136
- grantedAt: now,
137
- revokedAt: null,
138
- },
139
- })
140
- .returning();
141
- return record;
142
- }
143
-
144
- export async function revokeConsent(userId: string, appId: string): Promise<void> {
145
- await db
146
- .update(oauth2Consents)
147
- .set({ revokedAt: new Date() })
148
- .where(and(eq(oauth2Consents.appId, appId), eq(oauth2Consents.userId, userId)));
149
- }
150
-
151
- export async function listConsentsByAppId(appId: string) {
152
- return db
153
- .select()
154
- .from(oauth2Consents)
155
- .where(and(eq(oauth2Consents.appId, appId), isNull(oauth2Consents.revokedAt)));
156
- }
157
-
158
- export async function createTokenResponse(
159
- user: User,
160
- app: Application,
161
- scopes: string[],
162
- opts: { ip?: string; userAgent?: string; deviceFingerprint?: string; nonce?: string } = {}
163
- ) {
164
- const tokenOpts: AccessTokenOptions = {
165
- appId: app.id,
166
- orgId: app.orgId,
167
- clientId: app.clientId,
168
- };
169
-
170
- const tokenSet = await createTokenSet(
171
- user,
172
- opts.ip,
173
- opts.userAgent,
174
- tokenOpts,
175
- opts.deviceFingerprint
176
- );
177
-
178
- const response: Record<string, unknown> = {
179
- access_token: tokenSet.accessToken,
180
- refresh_token: tokenSet.refreshToken,
181
- token_type: "Bearer",
182
- expires_in: config.ACCESS_TOKEN_TTL_SECONDS,
183
- scope: scopes.join(" "),
184
- };
185
-
186
- if (scopes.includes("openid")) {
187
- response.id_token = await createIdToken(user, app, opts.nonce);
188
- }
189
-
190
- return response;
191
- }
192
-
193
- export async function findApplicationByClientId(clientId: string): Promise<Application | undefined> {
194
- const [app] = await db
195
- .select()
196
- .from(applications)
197
- .where(and(eq(applications.clientId, clientId), eq(applications.isActive, true)))
198
- .limit(1);
199
- return app;
200
- }
201
-
202
- export async function verifyClientSecret(
203
- clientId: string,
204
- secret: string
205
- ): Promise<Application | undefined> {
206
- const [app] = await db
207
- .select()
208
- .from(applications)
209
- .where(and(eq(applications.clientId, clientId), eq(applications.isActive, true)))
210
- .limit(1);
211
-
212
- if (!app) return undefined;
213
- const hash = crypto.createHash("sha256").update(secret).digest("hex");
214
- if (app.clientSecretHash !== hash) return undefined;
215
- return app;
216
- }