@hilbras/keystone 1.6.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 +239 -0
  2. package/README.md +55 -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
package/src/db/seed.ts DELETED
@@ -1,146 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { eq, and } from "drizzle-orm";
3
- import { db } from "./index.js";
4
- import { organizations, users, orgMemberships, applications, workflows } from "./schema.js";
5
- import { config } from "../config.js";
6
- import { createApplication, hashClientSecret } from "../services/applications.js";
7
- import { hashPassword } from "../services/secrets.js";
8
-
9
- async function seed() {
10
- const clientAppUrl = process.env.CLIENT_APP_URL || "http://localhost:5173";
11
- const aiAppUrl = process.env.AI_APP_URL || "http://localhost:5174";
12
- const landingAppUrl = process.env.LANDING_APP_URL || "http://localhost:5175";
13
-
14
- // Idempotently create the Hilbras organization.
15
- let [hilbrasOrg] = await db.select().from(organizations).where(eq(organizations.slug, "hilbras")).limit(1);
16
- if (!hilbrasOrg) {
17
- [hilbrasOrg] = await db
18
- .insert(organizations)
19
- .values({ name: "Hilbras", slug: "hilbras", plan: "enterprise" })
20
- .returning();
21
- console.log(`[seed] created organization ${hilbrasOrg.id}`);
22
- } else {
23
- console.log(`[seed] organization Hilbras already exists`);
24
- }
25
-
26
- const appDefinitions = [
27
- {
28
- name: "hilbras-os",
29
- clientId: "hilbras-os",
30
- secretEnv: "HILBRAS_OS_CLIENT_SECRET",
31
- defaultSecret: "cs_os_default_secret_replace_in_production",
32
- redirectUris: [`${clientAppUrl}/auth/callback`, `${clientAppUrl}/callback`],
33
- allowedOrigins: [clientAppUrl],
34
- },
35
- {
36
- name: "hilbras-ai",
37
- clientId: "hilbras-ai",
38
- secretEnv: "HILBRAS_AI_CLIENT_SECRET",
39
- defaultSecret: "cs_ai_default_secret_replace_in_production",
40
- redirectUris: [`${aiAppUrl}/auth/callback`, `${aiAppUrl}/callback`],
41
- allowedOrigins: [aiAppUrl],
42
- },
43
- {
44
- name: "hilbras-landing",
45
- clientId: "hilbras-landing",
46
- secretEnv: "HILBRAS_LANDING_CLIENT_SECRET",
47
- defaultSecret: "cs_landing_default_secret_replace_in_production",
48
- redirectUris: [`${landingAppUrl}/auth/callback`, `${landingAppUrl}/callback`],
49
- allowedOrigins: [landingAppUrl],
50
- },
51
- ];
52
-
53
- for (const def of appDefinitions) {
54
- const existing = await db.select().from(applications).where(eq(applications.clientId, def.clientId)).limit(1);
55
- if (existing.length > 0) {
56
- console.log(`[seed] application ${def.clientId} already exists`);
57
- continue;
58
- }
59
-
60
- const secret = process.env[def.secretEnv] || def.defaultSecret;
61
- const app = await createApplication({
62
- orgId: hilbrasOrg.id,
63
- name: def.name,
64
- clientId: def.clientId,
65
- clientSecret: secret,
66
- redirectUris: def.redirectUris,
67
- allowedOrigins: def.allowedOrigins,
68
- });
69
- console.log(`[seed] created application ${app.clientId} (${app.id})`);
70
- }
71
-
72
- // Ensure a seed owner exists and owns the Hilbras org.
73
- const ownerEmail = config.SEED_OWNER_EMAIL;
74
- const ownerPassword = process.env.KEYSTONE_SEED_OWNER_PASSWORD || crypto.randomUUID();
75
- if (ownerEmail) {
76
- let [owner] = await db.select().from(users).where(eq(users.email, ownerEmail.toLowerCase())).limit(1);
77
- if (!owner) {
78
- const username = ownerEmail.split("@")[0].replace(/[^a-z0-9_-]/g, "-").slice(0, 32);
79
- [owner] = await db
80
- .insert(users)
81
- .values({
82
- email: ownerEmail.toLowerCase(),
83
- username,
84
- name: username,
85
- provider: "password",
86
- emailVerified: true,
87
- passwordHash: await hashPassword(ownerPassword),
88
- })
89
- .returning();
90
- console.log(`[seed] created owner user ${owner.id}`);
91
- if (!process.env.KEYSTONE_SEED_OWNER_PASSWORD) {
92
- console.log(`[seed] generated owner password: ${ownerPassword}`);
93
- }
94
- } else {
95
- console.log(`[seed] owner user already exists`);
96
- }
97
-
98
- const existingMembership = await db
99
- .select()
100
- .from(orgMemberships)
101
- .where(and(eq(orgMemberships.orgId, hilbrasOrg.id), eq(orgMemberships.userId, owner.id)))
102
- .limit(1);
103
-
104
- if (existingMembership.length === 0) {
105
- await db.insert(orgMemberships).values({
106
- orgId: hilbrasOrg.id,
107
- userId: owner.id,
108
- role: "owner",
109
- });
110
- console.log(`[seed] added owner membership`);
111
- }
112
- }
113
-
114
- // Seed the default signup workflow.
115
- const [existingWorkflow] = await db.select().from(workflows).where(eq(workflows.trigger, "user_registered")).limit(1);
116
- if (!existingWorkflow) {
117
- await db.insert(workflows).values({
118
- orgId: hilbrasOrg.id,
119
- name: "Default signup",
120
- trigger: "user_registered",
121
- definition: {
122
- steps: [
123
- { type: "assign_role", role: "user" },
124
- { type: "create_organization", orgName: "{{username}}-personal", slug: "{{username}}-personal", outputKey: "personalOrgId" },
125
- { type: "add_membership", orgRef: "personalOrgId", role: "owner" },
126
- { type: "add_app_membership", role: "member" },
127
- { type: "send_welcome_email" },
128
- ],
129
- },
130
- });
131
- console.log("[seed] created default signup workflow");
132
- } else {
133
- console.log("[seed] default signup workflow already exists");
134
- }
135
-
136
- console.log("[seed] done");
137
- }
138
-
139
- seed()
140
- .catch((err) => {
141
- console.error("[seed] failed:", err);
142
- process.exit(1);
143
- })
144
- .finally(async () => {
145
- process.exit(0);
146
- });
package/src/di.ts DELETED
@@ -1,81 +0,0 @@
1
- import { setContainer, type Container } from "./container.js";
2
- import { ConfigurationService } from "./services/configuration.js";
3
- import { DefaultFeatureFlagService } from "./services/features.js";
4
- import {
5
- DrizzleUserRepository,
6
- DrizzleIdentityRepository,
7
- DrizzleOrganizationRepository,
8
- DrizzleApplicationRepository,
9
- DrizzleAuditRepository,
10
- DrizzlePermissionRepository,
11
- DrizzleApiKeyRepository,
12
- DrizzleSamlConnectionRepository,
13
- DrizzleOidcConnectionRepository,
14
- } from "./repositories/index.js";
15
- import { secretsProvider } from "./services/secrets/index.js";
16
- import { queue } from "./services/queue/index.js";
17
- import {
18
- AuthenticationDomainService,
19
- AuthorizationDomainService,
20
- IdentityDomainService,
21
- OrganizationDomainService,
22
- } from "./services/domain/index.js";
23
- import {
24
- AuthenticationApplicationService,
25
- IdentityApplicationService,
26
- OrganizationApplicationService,
27
- } from "./services/application/index.js";
28
-
29
- export function buildContainer(overrides: Partial<Container> = {}): Container {
30
- const config = new ConfigurationService();
31
- const features = new DefaultFeatureFlagService(config);
32
-
33
- const userRepository = new DrizzleUserRepository();
34
- const identityRepository = new DrizzleIdentityRepository();
35
- const organizationRepository = new DrizzleOrganizationRepository();
36
- const applicationRepository = new DrizzleApplicationRepository();
37
- const auditRepository = new DrizzleAuditRepository();
38
- const permissionRepository = new DrizzlePermissionRepository();
39
- const apiKeyRepository = new DrizzleApiKeyRepository();
40
- const samlConnectionRepository = new DrizzleSamlConnectionRepository();
41
- const oidcConnectionRepository = new DrizzleOidcConnectionRepository();
42
-
43
- const container: Container = {
44
- config,
45
- features,
46
- userRepository,
47
- identityRepository,
48
- organizationRepository,
49
- applicationRepository,
50
- auditRepository,
51
- permissionRepository,
52
- apiKeyRepository,
53
- samlConnectionRepository,
54
- oidcConnectionRepository,
55
- secretsProvider,
56
- queue,
57
- ...overrides,
58
- };
59
-
60
- return container;
61
- }
62
-
63
- export function initializeContainer(overrides?: Partial<Container>): Container {
64
- const container = buildContainer(overrides);
65
- setContainer(container);
66
- return container;
67
- }
68
-
69
- export function buildApplicationServices(container: Container) {
70
- const authorizationDomain = new AuthorizationDomainService(container.organizationRepository, container.permissionRepository);
71
- const authenticationDomain = new AuthenticationDomainService(container.userRepository, container.applicationRepository);
72
- const identityDomain = new IdentityDomainService(container.userRepository, container.identityRepository);
73
- const organizationDomain = new OrganizationDomainService(container.organizationRepository, container.applicationRepository, container.userRepository);
74
-
75
- return {
76
- auth: new AuthenticationApplicationService(authenticationDomain),
77
- identity: new IdentityApplicationService(identityDomain),
78
- organization: new OrganizationApplicationService(organizationDomain, authorizationDomain, identityDomain),
79
- authorization: authorizationDomain,
80
- };
81
- }
package/src/index.ts DELETED
@@ -1,326 +0,0 @@
1
- import path from "node:path";
2
- import { fileURLToPath, pathToFileURL } from "node:url";
3
- import fastify, { type FastifyInstance } from "fastify";
4
- import cors from "@fastify/cors";
5
- import cookie from "@fastify/cookie";
6
- import swagger from "@fastify/swagger";
7
- import swaggerUi from "@fastify/swagger-ui";
8
- import { migrate } from "drizzle-orm/postgres-js/migrator";
9
- import { config } from "./config.js";
10
- import { db } from "./db/index.js";
11
- import { initializeContainer } from "./di.js";
12
- import { redis } from "./services/redis.js";
13
- import { loadSigningKeys, getPublicJwks } from "./services/tokens.js";
14
-
15
- import { loadWorkflows } from "./services/workflows/engine.js";
16
- import { startTracing, stopTracing } from "./plugins/tracing.js";
17
- import authPlugin from "./plugins/auth.js";
18
- import auditPlugin from "./plugins/audit.js";
19
- import requestLogger from "./plugins/requestLogger.js";
20
- import { subscribe, subscribeAll } from "./services/events/bus.js";
21
- import { auditLogSubscriber } from "./services/events/subscribers/auditLog.js";
22
- import { webhookSubscriber } from "./services/events/subscribers/webhook.js";
23
- import { webhookDispatchSubscriber } from "./services/events/subscribers/webhookDispatch.js";
24
- import { startWebhookWorker } from "./services/webhooks.js";
25
- import { anomalySubscriber } from "./services/events/subscribers/anomaly.js";
26
- import { queue } from "./services/queue/index.js";
27
- import { cache } from "./services/cache.js";
28
- import { emailProvider } from "./services/email.js";
29
- import { registerPlugin } from "./services/plugins/registry.js";
30
- import type { KeystonePlugin } from "./services/plugins/types.js";
31
- import appContextPlugin from "./plugins/appContext.js";
32
- import permissionsPlugin from "./plugins/permissions.js";
33
- import mtlsPlugin from "./plugins/mtls.js";
34
- import metricsPlugin from "./plugins/metrics.js";
35
- import { globalRateLimit } from "./plugins/rateLimit.js";
36
- import authRoutes from "./routes/auth.js";
37
- import oauthRoutes from "./routes/oauth.js";
38
- import oauth2Routes from "./routes/oauth2.js";
39
- import passwordRoutes from "./routes/password.js";
40
- import apiKeyRoutes from "./routes/apiKeys.js";
41
- import adminRoutes from "./routes/admin.js";
42
- import serviceAccountRoutes from "./routes/serviceAccounts.js";
43
- import magicLinkRoutes from "./routes/magicLinks.js";
44
- import totpRoutes from "./routes/totp.js";
45
- import webauthnRoutes from "./routes/webauthn.js";
46
- import smsOtpRoutes from "./routes/smsOtp.js";
47
- import authzRoutes from "./routes/authz.js";
48
- import samlRoutes from "./routes/saml.js";
49
- import oidcEnterpriseRoutes from "./routes/oidcEnterprise.js";
50
- import scimRoutes from "./routes/scim.js";
51
- import federationRoutes from "./routes/federation.js";
52
- import workflowRoutes from "./routes/workflows.js";
53
- import setupRoutes from "./routes/setup.js";
54
- import sdkRoutes from "./routes/sdk.js";
55
- import configRoutes from "./routes/config.js";
56
- import sessionRoutes from "./routes/sessions.js";
57
- import profileRoutes from "./routes/profile.js";
58
- import emailVerificationRoutes from "./routes/emailVerification.js";
59
- import { generateSetupToken, printSetupToken } from "./services/setup/token.js";
60
-
61
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
62
-
63
- async function loadPluginsFromEnv(app: FastifyInstance) {
64
- const pluginPaths = (config.KEYSTONE_PLUGINS || "")
65
- .split(",")
66
- .map((s) => s.trim())
67
- .filter(Boolean);
68
- for (const pluginPath of pluginPaths) {
69
- try {
70
- const module = await import(pluginPath);
71
- const plugin = module.default || module.plugin || module;
72
- if (plugin && typeof plugin === "object" && "metadata" in plugin) {
73
- registerPlugin(plugin as KeystonePlugin);
74
- app.log.info(`Loaded plugin from ${pluginPath}: ${plugin.metadata.name}`);
75
- } else {
76
- app.log.warn(`Plugin ${pluginPath} did not export a valid KeystonePlugin`);
77
- }
78
- } catch (err) {
79
- app.log.warn({ err }, `Failed to load plugin ${pluginPath}`);
80
- }
81
- }
82
- }
83
-
84
- export async function buildApp() {
85
- const container = initializeContainer();
86
-
87
- const app = fastify({
88
- logger: { level: config.NODE_ENV === "production" ? "info" : "debug" },
89
- trustProxy: true,
90
- genReqId: () => crypto.randomUUID(),
91
- });
92
-
93
- app.decorate("container", container);
94
-
95
- await app.register(requestLogger);
96
-
97
- await app.register(swagger, {
98
- openapi: {
99
- info: {
100
- title: "Hilbras Keystone API",
101
- description: "Identity platform API for Hilbras products and third-party apps.",
102
- version: "1.0.0",
103
- },
104
- servers: [{ url: config.AUTH_API_PUBLIC_URL || `http://localhost:${config.PORT}` }],
105
- tags: [
106
- { name: "Auth", description: "Authentication and session management" },
107
- { name: "Admin", description: "Organization and application management" },
108
- { name: "Discovery", description: "JWKS and health endpoints" },
109
- ],
110
- },
111
- });
112
- await app.register(swaggerUi, {
113
- routePrefix: "/documentation",
114
- });
115
-
116
- await app.register(cors, {
117
- origin: (origin, cb) => {
118
- if (!origin) return cb(null, true);
119
- if (config.ALLOWED_ORIGINS.length === 0) return cb(null, true);
120
- if (config.ALLOWED_ORIGINS.includes(origin)) return cb(null, true);
121
- // In development, allow any localhost origin so external test projects
122
- // can connect without pre-registering them in ALLOWED_ORIGINS.
123
- if (config.NODE_ENV !== "production" && origin?.startsWith("http://localhost:")) {
124
- return cb(null, true);
125
- }
126
- cb(new Error("Origin not allowed"), false);
127
- },
128
- credentials: true,
129
- });
130
-
131
- await app.register(cookie, {
132
- secret: config.INTERNAL_API_KEY || undefined,
133
- parseOptions: {},
134
- });
135
-
136
- await app.register(auditPlugin);
137
-
138
- // Wire up event-bus subscribers.
139
- subscribeAll(auditLogSubscriber);
140
- subscribeAll(webhookSubscriber);
141
- subscribeAll(webhookDispatchSubscriber);
142
- subscribe("user_login_failed", anomalySubscriber);
143
- subscribe("new_device_detected", anomalySubscriber);
144
-
145
- // Register background job processors.
146
- queue.process("email", async (job) => {
147
- const { message } = job.payload as { message: import("./services/email.js").EmailMessage };
148
- await emailProvider.send(message);
149
- });
150
- startWebhookWorker();
151
- queue.process("webhook", async (job) => {
152
- const { url, method, body, headers } = job.payload as {
153
- url: string;
154
- method?: string;
155
- body?: unknown;
156
- headers?: Record<string, string>;
157
- };
158
- await fetch(url, {
159
- method: method || "POST",
160
- headers: { "Content-Type": "application/json", ...(headers || {}) },
161
- body: body ? JSON.stringify(body) : undefined,
162
- });
163
- });
164
- queue.process("workflow_run", async (job) => {
165
- const { runId, workflowId } = job.payload as { runId: string; workflowId: string };
166
- const { executeRunById } = await import("./services/workflows/engine.js");
167
- await executeRunById(runId, workflowId);
168
- });
169
-
170
- // Expose plugin registration on the Fastify instance.
171
- app.decorate("registerPlugin", (plugin: KeystonePlugin) => {
172
- registerPlugin(plugin);
173
- app.log.info(`Registered plugin: ${plugin.metadata.name}`);
174
- });
175
-
176
- // Load plugins configured via env (comma-separated list of module paths).
177
- await loadPluginsFromEnv(app);
178
-
179
- app.addHook("onClose", async () => {
180
- await queue.close?.();
181
- // The cache owns its own Redis connection (opened eagerly when REDIS_URL
182
- // is set); without this it keeps a socket open after shutdown.
183
- await cache.close().catch(() => {});
184
- });
185
-
186
- // Global API rate limiting to protect the platform from abuse.
187
- app.addHook("onRequest", globalRateLimit({
188
- maxRequests: Number(config.GLOBAL_RATE_LIMIT_MAX) || 100,
189
- windowSeconds: Number(config.GLOBAL_RATE_LIMIT_WINDOW) || 60,
190
- }));
191
-
192
- await app.register(appContextPlugin);
193
- await app.register(authPlugin);
194
- await app.register(permissionsPlugin);
195
- await app.register(mtlsPlugin);
196
- await app.register(metricsPlugin);
197
-
198
- await app.register(authRoutes, { prefix: "/auth" });
199
- await app.register(sessionRoutes, { prefix: "/auth" });
200
- await app.register(profileRoutes, { prefix: "/auth" });
201
- await app.register(emailVerificationRoutes, { prefix: "/auth" });
202
- await app.register(oauthRoutes, { prefix: "/auth" });
203
- await app.register(oauth2Routes, { prefix: "/oauth2" });
204
- await app.register(passwordRoutes, { prefix: "/auth" });
205
- await app.register(apiKeyRoutes, { prefix: "/auth" });
206
- await app.register(adminRoutes, { prefix: "/v1/admin" });
207
- await app.register(serviceAccountRoutes, { prefix: "/v1/admin" });
208
- await app.register(magicLinkRoutes, { prefix: "/auth" });
209
- await app.register(totpRoutes, { prefix: "/auth" });
210
- await app.register(webauthnRoutes, { prefix: "/auth" });
211
- await app.register(smsOtpRoutes, { prefix: "/auth" });
212
- await app.register(authzRoutes, { prefix: "/v1" });
213
- await app.register(samlRoutes, { prefix: "/sso" });
214
- await app.register(oidcEnterpriseRoutes, { prefix: "/sso" });
215
- await app.register(scimRoutes, { prefix: "/" });
216
- await app.register(federationRoutes, { prefix: "/federation" });
217
- await app.register(workflowRoutes, { prefix: "/v1/admin" });
218
- await app.register(sdkRoutes, { prefix: "/sdk" });
219
- await app.register(configRoutes, { prefix: "/v1/admin/config" });
220
-
221
- const issuer = config.AUTH_API_PUBLIC_URL || `http://localhost:${config.PORT}`;
222
- app.get("/.well-known/openid-configuration", { schema: { tags: ["Discovery"] } }, async () => ({
223
- issuer,
224
- authorization_endpoint: `${issuer}/oauth2/authorize`,
225
- token_endpoint: `${issuer}/oauth2/token`,
226
- userinfo_endpoint: `${issuer}/oauth2/userinfo`,
227
- revocation_endpoint: `${issuer}/oauth2/revoke`,
228
- jwks_uri: `${issuer}/.well-known/jwks.json`,
229
- response_types_supported: ["code"],
230
- grant_types_supported: ["authorization_code", "refresh_token", "client_credentials"],
231
- subject_types_supported: ["public"],
232
- id_token_signing_alg_values_supported: ["RS256"],
233
- scopes_supported: ["openid", "profile", "email"],
234
- token_endpoint_auth_methods_supported: ["client_secret_post", "client_secret_basic"],
235
- code_challenge_methods_supported: ["S256"],
236
- }));
237
-
238
- app.get("/.well-known/jwks.json", { schema: { tags: ["Discovery"] } }, async () => {
239
- return getPublicJwks();
240
- });
241
-
242
- app.get("/health", { schema: { tags: ["Discovery"] } }, async () => ({ status: "ok" }));
243
-
244
- await app.register(setupRoutes, { prefix: "/setup" });
245
-
246
- app.setErrorHandler((error: unknown, request, reply) => {
247
- if (error && typeof error === "object" && "validation" in error) {
248
- const message = error instanceof Error ? error.message : String(error);
249
- return reply.status(400).send({ error: "Invalid input", details: message });
250
- }
251
-
252
- if (error instanceof Error && "statusCode" in error) {
253
- const statusCode = (error as Error & { statusCode: number }).statusCode;
254
- const code = (error as Error & { code?: string }).code;
255
- if (statusCode >= 400 && statusCode < 600) {
256
- return reply.status(statusCode).send({ error: error.message, code });
257
- }
258
- }
259
-
260
- request.log.error({ err: error }, "Unhandled error");
261
- const message = config.NODE_ENV === "production" ? "Internal server error" : String(error);
262
- return reply.status(500).send({ error: message });
263
- });
264
-
265
- return app;
266
- }
267
-
268
- async function start() {
269
- startTracing();
270
- await redis.connect().catch((err: unknown) => {
271
- console.warn("Redis not available; rate limiting will fail open", err);
272
- });
273
-
274
- const app = await buildApp();
275
-
276
- try {
277
- await migrate(db, { migrationsFolder: path.resolve(__dirname, "./db/migrations") });
278
- app.log.info("Database migrations applied");
279
- } catch (err) {
280
- app.log.error({ err }, "Database migration failed — the application may not work correctly");
281
- }
282
-
283
- try {
284
- await loadSigningKeys();
285
- app.log.info("JWT signing keys loaded");
286
- } catch (err) {
287
- app.log.error({ err }, "JWT signing key loading failed — token signing will not work");
288
- }
289
-
290
- try {
291
- generateSetupToken();
292
- printSetupToken();
293
- } catch (err) {
294
- app.log.warn({ err }, "Could not generate setup token (may already exist)");
295
- }
296
-
297
- try {
298
- await app.container.permissionRepository.ensureRolePermissionsSeeded();
299
- app.log.info("Role permissions seeded");
300
- } catch (err) {
301
- app.log.error({ err }, "Role permission seeding failed — authorization may not work correctly");
302
- }
303
-
304
- try {
305
- await loadWorkflows();
306
- app.log.info("Workflows loaded");
307
- } catch (err) {
308
- app.log.warn({ err }, "Workflow loading failed (workflows feature may be unavailable)");
309
- }
310
-
311
- app.addHook("onClose", async () => {
312
- await stopTracing();
313
- });
314
-
315
- try {
316
- await app.listen({ port: config.PORT, host: config.HOST });
317
- app.log.info(`Hilbras Keystone running on http://${config.HOST}:${config.PORT}`);
318
- } catch (err) {
319
- app.log.error(err);
320
- process.exit(1);
321
- }
322
- }
323
-
324
- if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) {
325
- start();
326
- }
package/src/lib/errors.ts DELETED
@@ -1,139 +0,0 @@
1
- import { config } from "../config.js";
2
-
3
- /**
4
- * Public OAuth/OIDC/Federation error codes. These are the only values we
5
- * expose to browsers or third-party clients; internal failure details stay
6
- * in server logs.
7
- */
8
- export type OAuthErrorCode =
9
- | "invalid_request"
10
- | "invalid_client"
11
- | "invalid_grant"
12
- | "access_denied"
13
- | "server_error"
14
- | "identity_broker_failure";
15
-
16
- export interface OAuthErrorResponse {
17
- statusCode: number;
18
- body: {
19
- error: OAuthErrorCode;
20
- error_description?: string;
21
- };
22
- }
23
-
24
- function isDevelopment(): boolean {
25
- return config.NODE_ENV === "development";
26
- }
27
-
28
- function errorMessage(error: unknown): string | undefined {
29
- return error instanceof Error ? error.message : undefined;
30
- }
31
-
32
- /**
33
- * Map an internal error to a stable public OAuth-style code and HTTP status.
34
- *
35
- * The mapping is intentionally conservative: anything that could reveal
36
- * implementation details or provider-specific behaviour collapses into a
37
- * small set of opaque codes. Detailed diagnostics are written to server logs
38
- * by the caller before this helper is invoked.
39
- */
40
- export function classifyOAuthError(error: unknown): { code: OAuthErrorCode; statusCode: number } {
41
- const message = errorMessage(error)?.toLowerCase() ?? "";
42
-
43
- if (message.includes("state") || message.includes("denied") || message.includes("cancel")) {
44
- return { code: "access_denied", statusCode: 400 };
45
- }
46
-
47
- if (
48
- message.includes("client") &&
49
- (message.includes("unknown") || message.includes("invalid") || message.includes("not found"))
50
- ) {
51
- return { code: "invalid_client", statusCode: 400 };
52
- }
53
-
54
- if (
55
- message.includes("token exchange failed") ||
56
- message.includes("pkce") ||
57
- message.includes("authorization code") ||
58
- message.includes("invalid grant") ||
59
- message.includes("code verifier")
60
- ) {
61
- return { code: "invalid_grant", statusCode: 400 };
62
- }
63
-
64
- if (message.includes("not configured") || message.includes("missing required")) {
65
- return { code: "server_error", statusCode: 500 };
66
- }
67
-
68
- if (
69
- message.includes("connector") ||
70
- message.includes("federation") ||
71
- message.includes("oidc") ||
72
- message.includes("provider") ||
73
- message.includes("userinfo") ||
74
- message.includes("broker") ||
75
- message.includes("idp")
76
- ) {
77
- return { code: "identity_broker_failure", statusCode: 502 };
78
- }
79
-
80
- return { code: "server_error", statusCode: 500 };
81
- }
82
-
83
- export interface OAuthRedirectOptions {
84
- /** OAuth `state` value that must be echoed back to the client. */
85
- state?: string;
86
- /** Override whether to include the original error message. Defaults to `true` only in development. */
87
- includeDescription?: boolean;
88
- }
89
-
90
- /**
91
- * Build a redirect URL that carries only a sanitized error code (and, in
92
- * development, an optional description). Any existing query parameters on
93
- * `redirectUrl` are preserved.
94
- */
95
- export function buildOAuthErrorRedirect(
96
- error: unknown,
97
- redirectUrl: string,
98
- options?: OAuthRedirectOptions
99
- ): string {
100
- const { code } = classifyOAuthError(error);
101
- const url = new URL(redirectUrl);
102
- url.searchParams.set("error", code);
103
-
104
- const includeDescription = options?.includeDescription ?? isDevelopment();
105
- const description = errorMessage(error);
106
- if (includeDescription && description) {
107
- url.searchParams.set("error_description", description);
108
- }
109
-
110
- if (options?.state) {
111
- url.searchParams.set("state", options.state);
112
- }
113
-
114
- return url.toString();
115
- }
116
-
117
- export interface OAuthResponseOptions {
118
- /** Override whether to include the original error message. Defaults to `true` only in development. */
119
- includeDescription?: boolean;
120
- }
121
-
122
- /**
123
- * Build a sanitized JSON error response for endpoints that do not redirect.
124
- */
125
- export function buildOAuthErrorResponse(
126
- error: unknown,
127
- options?: OAuthResponseOptions
128
- ): OAuthErrorResponse {
129
- const { code, statusCode } = classifyOAuthError(error);
130
- const body: OAuthErrorResponse["body"] = { error: code };
131
-
132
- const includeDescription = options?.includeDescription ?? isDevelopment();
133
- const description = errorMessage(error);
134
- if (includeDescription && description) {
135
- body.error_description = description;
136
- }
137
-
138
- return { statusCode, body };
139
- }