@hilbras/keystone 1.6.0 → 2.5.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 (604) hide show
  1. package/CHANGELOG.md +625 -0
  2. package/README.md +198 -50
  3. package/dist/cli.js +25 -27
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +23 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +53 -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/dist/db/migrations/0015_chief_vargas.sql +7 -0
  20. package/dist/db/migrations/0016_gorgeous_charles_xavier.sql +5 -0
  21. package/dist/db/migrations/0017_flashy_nekra.sql +1 -0
  22. package/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
  23. package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
  24. package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
  25. package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
  26. package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
  27. package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
  28. package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
  29. package/dist/db/migrations/meta/0015_snapshot.json +4340 -0
  30. package/dist/db/migrations/meta/0016_snapshot.json +4363 -0
  31. package/dist/db/migrations/meta/0017_snapshot.json +4370 -0
  32. package/dist/db/migrations/meta/_journal.json +70 -0
  33. package/dist/db/reencryptOidcSecrets.d.ts +2 -0
  34. package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
  35. package/dist/db/reencryptOidcSecrets.js +41 -0
  36. package/dist/db/reencryptOidcSecrets.js.map +1 -0
  37. package/dist/db/schema.d.ts +2693 -88
  38. package/dist/db/schema.d.ts.map +1 -1
  39. package/dist/db/schema.js +157 -4
  40. package/dist/db/schema.js.map +1 -1
  41. package/dist/db/seed.js +67 -40
  42. package/dist/db/seed.js.map +1 -1
  43. package/dist/di.d.ts.map +1 -1
  44. package/dist/di.js +11 -3
  45. package/dist/di.js.map +1 -1
  46. package/dist/index.d.ts +2 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +34 -3
  49. package/dist/index.js.map +1 -1
  50. package/dist/lib/errors.d.ts +2 -1
  51. package/dist/lib/errors.d.ts.map +1 -1
  52. package/dist/lib/errors.js +10 -0
  53. package/dist/lib/errors.js.map +1 -1
  54. package/dist/plugins/appContext.d.ts.map +1 -1
  55. package/dist/plugins/appContext.js +3 -12
  56. package/dist/plugins/appContext.js.map +1 -1
  57. package/dist/plugins/audit.d.ts.map +1 -1
  58. package/dist/plugins/audit.js +26 -6
  59. package/dist/plugins/audit.js.map +1 -1
  60. package/dist/plugins/auth.d.ts.map +1 -1
  61. package/dist/plugins/auth.js +32 -7
  62. package/dist/plugins/auth.js.map +1 -1
  63. package/dist/plugins/headerSanitization.d.ts +15 -0
  64. package/dist/plugins/headerSanitization.d.ts.map +1 -0
  65. package/dist/plugins/headerSanitization.js +39 -0
  66. package/dist/plugins/headerSanitization.js.map +1 -0
  67. package/dist/plugins/metrics.d.ts.map +1 -1
  68. package/dist/plugins/mtls.d.ts +21 -2
  69. package/dist/plugins/mtls.d.ts.map +1 -1
  70. package/dist/plugins/mtls.js +94 -47
  71. package/dist/plugins/mtls.js.map +1 -1
  72. package/dist/plugins/permissions.d.ts.map +1 -1
  73. package/dist/plugins/permissions.js +29 -9
  74. package/dist/plugins/permissions.js.map +1 -1
  75. package/dist/plugins/rateLimit.d.ts +16 -0
  76. package/dist/plugins/rateLimit.d.ts.map +1 -1
  77. package/dist/plugins/rateLimit.js +16 -3
  78. package/dist/plugins/rateLimit.js.map +1 -1
  79. package/dist/plugins/requestLogger.d.ts.map +1 -1
  80. package/dist/repositories/apiKey.d.ts.map +1 -1
  81. package/dist/repositories/application.d.ts +1 -1
  82. package/dist/repositories/application.d.ts.map +1 -1
  83. package/dist/repositories/application.js +9 -3
  84. package/dist/repositories/application.js.map +1 -1
  85. package/dist/repositories/audit.d.ts.map +1 -1
  86. package/dist/repositories/index.d.ts +3 -0
  87. package/dist/repositories/index.d.ts.map +1 -1
  88. package/dist/repositories/index.js +3 -0
  89. package/dist/repositories/index.js.map +1 -1
  90. package/dist/repositories/mfaChallenge.d.ts +23 -0
  91. package/dist/repositories/mfaChallenge.d.ts.map +1 -0
  92. package/dist/repositories/mfaChallenge.js +71 -0
  93. package/dist/repositories/mfaChallenge.js.map +1 -0
  94. package/dist/repositories/oidcConnection.d.ts +27 -43
  95. package/dist/repositories/oidcConnection.d.ts.map +1 -1
  96. package/dist/repositories/oidcConnection.js +15 -6
  97. package/dist/repositories/oidcConnection.js.map +1 -1
  98. package/dist/repositories/organization.d.ts +9 -9
  99. package/dist/repositories/organization.d.ts.map +1 -1
  100. package/dist/repositories/organization.js +91 -37
  101. package/dist/repositories/organization.js.map +1 -1
  102. package/dist/repositories/permission.d.ts.map +1 -1
  103. package/dist/repositories/permission.js +27 -5
  104. package/dist/repositories/permission.js.map +1 -1
  105. package/dist/repositories/samlConnection.d.ts +28 -28
  106. package/dist/repositories/samlConnection.d.ts.map +1 -1
  107. package/dist/repositories/samlConnection.js +12 -4
  108. package/dist/repositories/samlConnection.js.map +1 -1
  109. package/dist/repositories/scimConnection.d.ts +38 -0
  110. package/dist/repositories/scimConnection.d.ts.map +1 -0
  111. package/dist/repositories/scimConnection.js +123 -0
  112. package/dist/repositories/scimConnection.js.map +1 -0
  113. package/dist/repositories/scimGroup.d.ts +36 -0
  114. package/dist/repositories/scimGroup.d.ts.map +1 -0
  115. package/dist/repositories/scimGroup.js +113 -0
  116. package/dist/repositories/scimGroup.js.map +1 -0
  117. package/dist/repositories/session.d.ts +24 -13
  118. package/dist/repositories/session.d.ts.map +1 -1
  119. package/dist/repositories/session.js +13 -1
  120. package/dist/repositories/session.js.map +1 -1
  121. package/dist/repositories/types.d.ts +117 -6
  122. package/dist/repositories/types.d.ts.map +1 -1
  123. package/dist/repositories/types.js +7 -1
  124. package/dist/repositories/types.js.map +1 -1
  125. package/dist/repositories/user.d.ts +23 -1
  126. package/dist/repositories/user.d.ts.map +1 -1
  127. package/dist/repositories/user.js +180 -4
  128. package/dist/repositories/user.js.map +1 -1
  129. package/dist/routes/admin/billing.js +4 -4
  130. package/dist/routes/admin/billing.js.map +1 -1
  131. package/dist/routes/admin/helpers.d.ts +16 -20
  132. package/dist/routes/admin/helpers.d.ts.map +1 -1
  133. package/dist/routes/admin/helpers.js +53 -10
  134. package/dist/routes/admin/helpers.js.map +1 -1
  135. package/dist/routes/admin/organizations.d.ts.map +1 -1
  136. package/dist/routes/admin/organizations.js +105 -69
  137. package/dist/routes/admin/organizations.js.map +1 -1
  138. package/dist/routes/admin/permissions.d.ts.map +1 -1
  139. package/dist/routes/admin/permissions.js +48 -14
  140. package/dist/routes/admin/permissions.js.map +1 -1
  141. package/dist/routes/admin/platform.d.ts.map +1 -1
  142. package/dist/routes/admin/platform.js +86 -35
  143. package/dist/routes/admin/platform.js.map +1 -1
  144. package/dist/routes/admin/sso.d.ts.map +1 -1
  145. package/dist/routes/admin/sso.js +143 -12
  146. package/dist/routes/admin/sso.js.map +1 -1
  147. package/dist/routes/admin/webhooks.js +8 -8
  148. package/dist/routes/admin/webhooks.js.map +1 -1
  149. package/dist/routes/apiKeys.d.ts.map +1 -1
  150. package/dist/routes/apiKeys.js +23 -5
  151. package/dist/routes/apiKeys.js.map +1 -1
  152. package/dist/routes/auth.d.ts.map +1 -1
  153. package/dist/routes/auth.js +112 -22
  154. package/dist/routes/auth.js.map +1 -1
  155. package/dist/routes/authz.d.ts.map +1 -1
  156. package/dist/routes/authz.js +16 -4
  157. package/dist/routes/authz.js.map +1 -1
  158. package/dist/routes/config.d.ts.map +1 -1
  159. package/dist/routes/config.js +16 -14
  160. package/dist/routes/config.js.map +1 -1
  161. package/dist/routes/federation.d.ts.map +1 -1
  162. package/dist/routes/federation.js +17 -3
  163. package/dist/routes/federation.js.map +1 -1
  164. package/dist/routes/magicLinks.d.ts.map +1 -1
  165. package/dist/routes/magicLinks.js +15 -3
  166. package/dist/routes/magicLinks.js.map +1 -1
  167. package/dist/routes/oauth.d.ts.map +1 -1
  168. package/dist/routes/oauth.js +60 -5
  169. package/dist/routes/oauth.js.map +1 -1
  170. package/dist/routes/oauth2.d.ts.map +1 -1
  171. package/dist/routes/oauth2.js +188 -22
  172. package/dist/routes/oauth2.js.map +1 -1
  173. package/dist/routes/oidcEnterprise.d.ts.map +1 -1
  174. package/dist/routes/oidcEnterprise.js +67 -21
  175. package/dist/routes/oidcEnterprise.js.map +1 -1
  176. package/dist/routes/password.d.ts.map +1 -1
  177. package/dist/routes/password.js.map +1 -1
  178. package/dist/routes/profile.js +4 -4
  179. package/dist/routes/profile.js.map +1 -1
  180. package/dist/routes/saml.d.ts +33 -0
  181. package/dist/routes/saml.d.ts.map +1 -1
  182. package/dist/routes/saml.js +217 -12
  183. package/dist/routes/saml.js.map +1 -1
  184. package/dist/routes/scim.d.ts +13 -0
  185. package/dist/routes/scim.d.ts.map +1 -1
  186. package/dist/routes/scim.js +885 -110
  187. package/dist/routes/scim.js.map +1 -1
  188. package/dist/routes/sdk.d.ts.map +1 -1
  189. package/dist/routes/sdk.js +24 -8
  190. package/dist/routes/sdk.js.map +1 -1
  191. package/dist/routes/serviceAccounts.d.ts.map +1 -1
  192. package/dist/routes/serviceAccounts.js +63 -2
  193. package/dist/routes/serviceAccounts.js.map +1 -1
  194. package/dist/routes/setup.d.ts.map +1 -1
  195. package/dist/routes/setup.js +15 -16
  196. package/dist/routes/setup.js.map +1 -1
  197. package/dist/routes/smsOtp.js +1 -1
  198. package/dist/routes/smsOtp.js.map +1 -1
  199. package/dist/routes/totp.d.ts.map +1 -1
  200. package/dist/routes/totp.js +112 -23
  201. package/dist/routes/totp.js.map +1 -1
  202. package/dist/routes/webauthn.d.ts.map +1 -1
  203. package/dist/routes/webauthn.js +44 -8
  204. package/dist/routes/webauthn.js.map +1 -1
  205. package/dist/routes/workflows.d.ts.map +1 -1
  206. package/dist/routes/workflows.js +58 -25
  207. package/dist/routes/workflows.js.map +1 -1
  208. package/dist/sdk/index.d.ts.map +1 -1
  209. package/dist/sdk/index.js +141 -40
  210. package/dist/sdk/index.js.map +1 -1
  211. package/dist/sdk/types.d.ts +64 -30
  212. package/dist/sdk/types.d.ts.map +1 -1
  213. package/dist/services/application/authentication.d.ts +39 -1
  214. package/dist/services/application/authentication.d.ts.map +1 -1
  215. package/dist/services/application/authentication.js +43 -1
  216. package/dist/services/application/authentication.js.map +1 -1
  217. package/dist/services/application/identity.d.ts +10 -7
  218. package/dist/services/application/identity.d.ts.map +1 -1
  219. package/dist/services/application/identity.js +13 -10
  220. package/dist/services/application/identity.js.map +1 -1
  221. package/dist/services/application/organization.d.ts +16 -8
  222. package/dist/services/application/organization.d.ts.map +1 -1
  223. package/dist/services/application/organization.js +160 -12
  224. package/dist/services/application/organization.js.map +1 -1
  225. package/dist/services/applications.js +2 -2
  226. package/dist/services/applications.js.map +1 -1
  227. package/dist/services/audit.d.ts +1 -0
  228. package/dist/services/audit.d.ts.map +1 -1
  229. package/dist/services/audit.js +13 -0
  230. package/dist/services/audit.js.map +1 -1
  231. package/dist/services/cache.d.ts.map +1 -1
  232. package/dist/services/configuration/profiles.d.ts +4 -0
  233. package/dist/services/configuration/profiles.d.ts.map +1 -1
  234. package/dist/services/configuration/profiles.js +50 -0
  235. package/dist/services/configuration/profiles.js.map +1 -1
  236. package/dist/services/configuration.d.ts.map +1 -1
  237. package/dist/services/configuration.js.map +1 -1
  238. package/dist/services/connectors/google.d.ts +18 -1
  239. package/dist/services/connectors/google.d.ts.map +1 -1
  240. package/dist/services/connectors/google.js +27 -4
  241. package/dist/services/connectors/google.js.map +1 -1
  242. package/dist/services/connectors/oidc.d.ts +14 -2
  243. package/dist/services/connectors/oidc.d.ts.map +1 -1
  244. package/dist/services/connectors/oidc.js +35 -6
  245. package/dist/services/connectors/oidc.js.map +1 -1
  246. package/dist/services/connectors/types.d.ts +13 -1
  247. package/dist/services/connectors/types.d.ts.map +1 -1
  248. package/dist/services/connectors/zitadel.d.ts.map +1 -1
  249. package/dist/services/connectors/zitadel.js +4 -3
  250. package/dist/services/connectors/zitadel.js.map +1 -1
  251. package/dist/services/domain/authentication.d.ts +43 -4
  252. package/dist/services/domain/authentication.d.ts.map +1 -1
  253. package/dist/services/domain/authentication.js +119 -40
  254. package/dist/services/domain/authentication.js.map +1 -1
  255. package/dist/services/domain/authorization.d.ts +11 -0
  256. package/dist/services/domain/authorization.d.ts.map +1 -1
  257. package/dist/services/domain/authorization.js +36 -1
  258. package/dist/services/domain/authorization.js.map +1 -1
  259. package/dist/services/domain/identity.d.ts +21 -9
  260. package/dist/services/domain/identity.d.ts.map +1 -1
  261. package/dist/services/domain/identity.js +187 -10
  262. package/dist/services/domain/identity.js.map +1 -1
  263. package/dist/services/domain/organization.d.ts +11 -10
  264. package/dist/services/domain/organization.d.ts.map +1 -1
  265. package/dist/services/domain/organization.js +48 -30
  266. package/dist/services/domain/organization.js.map +1 -1
  267. package/dist/services/emailVerification.d.ts +2 -2
  268. package/dist/services/enterpriseSso.d.ts +13 -6
  269. package/dist/services/enterpriseSso.d.ts.map +1 -1
  270. package/dist/services/enterpriseSso.js +75 -6
  271. package/dist/services/enterpriseSso.js.map +1 -1
  272. package/dist/services/events/subscribers/auditLog.js +1 -1
  273. package/dist/services/events/subscribers/auditLog.js.map +1 -1
  274. package/dist/services/events/types.d.ts +7 -1
  275. package/dist/services/events/types.d.ts.map +1 -1
  276. package/dist/services/events/types.js.map +1 -1
  277. package/dist/services/events/validate.d.ts.map +1 -1
  278. package/dist/services/events/validate.js +33 -0
  279. package/dist/services/events/validate.js.map +1 -1
  280. package/dist/services/features.d.ts.map +1 -1
  281. package/dist/services/features.js.map +1 -1
  282. package/dist/services/federation.d.ts +6 -1
  283. package/dist/services/federation.d.ts.map +1 -1
  284. package/dist/services/federation.js +31 -4
  285. package/dist/services/federation.js.map +1 -1
  286. package/dist/services/ipControls.js +2 -2
  287. package/dist/services/ipControls.js.map +1 -1
  288. package/dist/services/magicLinks.d.ts +2 -2
  289. package/dist/services/magicLinks.d.ts.map +1 -1
  290. package/dist/services/magicLinks.js +13 -9
  291. package/dist/services/magicLinks.js.map +1 -1
  292. package/dist/services/mfa.d.ts +53 -0
  293. package/dist/services/mfa.d.ts.map +1 -0
  294. package/dist/services/mfa.js +157 -0
  295. package/dist/services/mfa.js.map +1 -0
  296. package/dist/services/oauth2.d.ts +88 -14
  297. package/dist/services/oauth2.d.ts.map +1 -1
  298. package/dist/services/oauth2.js +125 -16
  299. package/dist/services/oauth2.js.map +1 -1
  300. package/dist/services/oidcSecretFormat.d.ts +3 -0
  301. package/dist/services/oidcSecretFormat.d.ts.map +1 -0
  302. package/dist/services/oidcSecretFormat.js +5 -0
  303. package/dist/services/oidcSecretFormat.js.map +1 -0
  304. package/dist/services/organizations.d.ts +4 -16
  305. package/dist/services/organizations.d.ts.map +1 -1
  306. package/dist/services/organizations.js +0 -62
  307. package/dist/services/organizations.js.map +1 -1
  308. package/dist/services/permissions.d.ts.map +1 -1
  309. package/dist/services/permissions.js +9 -1
  310. package/dist/services/permissions.js.map +1 -1
  311. package/dist/services/plugins/registry.d.ts.map +1 -1
  312. package/dist/services/plugins/registry.js.map +1 -1
  313. package/dist/services/plugins/types.d.ts.map +1 -1
  314. package/dist/services/queue/bullmq.d.ts.map +1 -1
  315. package/dist/services/queue/inProcess.d.ts.map +1 -1
  316. package/dist/services/redirectUri.d.ts +56 -0
  317. package/dist/services/redirectUri.d.ts.map +1 -0
  318. package/dist/services/redirectUri.js +129 -0
  319. package/dist/services/redirectUri.js.map +1 -0
  320. package/dist/services/redis.d.ts +1 -1
  321. package/dist/services/redis.d.ts.map +1 -1
  322. package/dist/services/scimCredentials.d.ts +46 -0
  323. package/dist/services/scimCredentials.d.ts.map +1 -0
  324. package/dist/services/scimCredentials.js +123 -0
  325. package/dist/services/scimCredentials.js.map +1 -0
  326. package/dist/services/scimLegacyMigration.d.ts +12 -0
  327. package/dist/services/scimLegacyMigration.d.ts.map +1 -0
  328. package/dist/services/scimLegacyMigration.js +44 -0
  329. package/dist/services/scimLegacyMigration.js.map +1 -0
  330. package/dist/services/secrets/awsKms.d.ts +2 -2
  331. package/dist/services/secrets/awsKms.d.ts.map +1 -1
  332. package/dist/services/secrets/awsKms.js +3 -5
  333. package/dist/services/secrets/awsKms.js.map +1 -1
  334. package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
  335. package/dist/services/secrets/database.d.ts.map +1 -1
  336. package/dist/services/secrets/database.js.map +1 -1
  337. package/dist/services/secrets/environment.d.ts.map +1 -1
  338. package/dist/services/secrets/environment.js.map +1 -1
  339. package/dist/services/secrets/index.d.ts.map +1 -1
  340. package/dist/services/secrets/password.d.ts.map +1 -1
  341. package/dist/services/secrets/password.js +0 -4
  342. package/dist/services/secrets/password.js.map +1 -1
  343. package/dist/services/secrets/provider.d.ts +2 -3
  344. package/dist/services/secrets/provider.d.ts.map +1 -1
  345. package/dist/services/secrets/vault.d.ts.map +1 -1
  346. package/dist/services/serviceAccounts.d.ts +20 -0
  347. package/dist/services/serviceAccounts.d.ts.map +1 -1
  348. package/dist/services/serviceAccounts.js +47 -1
  349. package/dist/services/serviceAccounts.js.map +1 -1
  350. package/dist/services/sessionRevocation.d.ts +76 -0
  351. package/dist/services/sessionRevocation.d.ts.map +1 -0
  352. package/dist/services/sessionRevocation.js +86 -0
  353. package/dist/services/sessionRevocation.js.map +1 -0
  354. package/dist/services/setup/configWriter.d.ts.map +1 -1
  355. package/dist/services/setup/configWriter.js.map +1 -1
  356. package/dist/services/singleUse.d.ts +68 -0
  357. package/dist/services/singleUse.d.ts.map +1 -0
  358. package/dist/services/singleUse.js +54 -0
  359. package/dist/services/singleUse.js.map +1 -0
  360. package/dist/services/smsOtp.d.ts.map +1 -1
  361. package/dist/services/smsOtp.js +12 -8
  362. package/dist/services/smsOtp.js.map +1 -1
  363. package/dist/services/ssoEndpointPolicy.d.ts +8 -0
  364. package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
  365. package/dist/services/ssoEndpointPolicy.js +136 -0
  366. package/dist/services/ssoEndpointPolicy.js.map +1 -0
  367. package/dist/services/stepUp.d.ts +35 -0
  368. package/dist/services/stepUp.d.ts.map +1 -0
  369. package/dist/services/stepUp.js +65 -0
  370. package/dist/services/stepUp.js.map +1 -0
  371. package/dist/services/tokens.d.ts +39 -11
  372. package/dist/services/tokens.d.ts.map +1 -1
  373. package/dist/services/tokens.js +80 -14
  374. package/dist/services/tokens.js.map +1 -1
  375. package/dist/services/totp.d.ts +46 -0
  376. package/dist/services/totp.d.ts.map +1 -1
  377. package/dist/services/totp.js +178 -41
  378. package/dist/services/totp.js.map +1 -1
  379. package/dist/services/trustedProxies.d.ts +90 -0
  380. package/dist/services/trustedProxies.d.ts.map +1 -0
  381. package/dist/services/trustedProxies.js +283 -0
  382. package/dist/services/trustedProxies.js.map +1 -0
  383. package/dist/services/users.d.ts +20 -12
  384. package/dist/services/users.d.ts.map +1 -1
  385. package/dist/services/users.js +24 -51
  386. package/dist/services/users.js.map +1 -1
  387. package/dist/services/webauthn.d.ts +8 -4
  388. package/dist/services/webauthn.d.ts.map +1 -1
  389. package/dist/services/webauthn.js +4 -4
  390. package/dist/services/webauthn.js.map +1 -1
  391. package/dist/services/webhooks.d.ts +20 -20
  392. package/dist/services/workflows/engine.d.ts +4 -2
  393. package/dist/services/workflows/engine.d.ts.map +1 -1
  394. package/dist/services/workflows/engine.js +181 -12
  395. package/dist/services/workflows/engine.js.map +1 -1
  396. package/dist/services/workflows/steps.d.ts +2 -0
  397. package/dist/services/workflows/steps.d.ts.map +1 -1
  398. package/dist/services/workflows/steps.js +8 -75
  399. package/dist/services/workflows/steps.js.map +1 -1
  400. package/dist/setup-server.js +2 -1
  401. package/dist/setup-server.js.map +1 -1
  402. package/dist/types.d.ts +33 -4
  403. package/dist/types.d.ts.map +1 -1
  404. package/dist/types.js +26 -2
  405. package/dist/types.js.map +1 -1
  406. package/package.json +25 -3
  407. package/dist/tests/errors.test.d.ts +0 -2
  408. package/dist/tests/errors.test.d.ts.map +0 -1
  409. package/dist/tests/errors.test.js +0 -64
  410. package/dist/tests/errors.test.js.map +0 -1
  411. package/dist/tests/events.test.d.ts +0 -2
  412. package/dist/tests/events.test.d.ts.map +0 -1
  413. package/dist/tests/events.test.js +0 -45
  414. package/dist/tests/events.test.js.map +0 -1
  415. package/dist/tests/featureFlags.test.d.ts +0 -2
  416. package/dist/tests/featureFlags.test.d.ts.map +0 -1
  417. package/dist/tests/featureFlags.test.js +0 -24
  418. package/dist/tests/featureFlags.test.js.map +0 -1
  419. package/dist/tests/integration/queue.test.d.ts +0 -2
  420. package/dist/tests/integration/queue.test.d.ts.map +0 -1
  421. package/dist/tests/integration/queue.test.js +0 -49
  422. package/dist/tests/integration/queue.test.js.map +0 -1
  423. package/dist/tests/plugins.test.d.ts +0 -2
  424. package/dist/tests/plugins.test.d.ts.map +0 -1
  425. package/dist/tests/plugins.test.js +0 -56
  426. package/dist/tests/plugins.test.js.map +0 -1
  427. package/dist/tests/result.test.d.ts +0 -2
  428. package/dist/tests/result.test.d.ts.map +0 -1
  429. package/dist/tests/result.test.js +0 -46
  430. package/dist/tests/result.test.js.map +0 -1
  431. package/dist/tests/setup/configWriter.test.d.ts +0 -2
  432. package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
  433. package/dist/tests/setup/configWriter.test.js +0 -55
  434. package/dist/tests/setup/configWriter.test.js.map +0 -1
  435. package/dist/tests/setup/validation.test.d.ts +0 -2
  436. package/dist/tests/setup/validation.test.d.ts.map +0 -1
  437. package/dist/tests/setup/validation.test.js +0 -26
  438. package/dist/tests/setup/validation.test.js.map +0 -1
  439. package/dist/tests/smoke.test.d.ts +0 -2
  440. package/dist/tests/smoke.test.d.ts.map +0 -1
  441. package/dist/tests/smoke.test.js +0 -124
  442. package/dist/tests/smoke.test.js.map +0 -1
  443. package/src/cli.ts +0 -172
  444. package/src/config.ts +0 -143
  445. package/src/container.ts +0 -48
  446. package/src/db/index.ts +0 -53
  447. package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
  448. package/src/db/migrations/0001_brief_joseph.sql +0 -10
  449. package/src/db/migrations/0002_add_account_lockout.sql +0 -3
  450. package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
  451. package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
  452. package/src/db/migrations/0005_steep_the_call.sql +0 -2
  453. package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
  454. package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
  455. package/src/db/migrations/meta/0000_snapshot.json +0 -2964
  456. package/src/db/migrations/meta/0001_snapshot.json +0 -3031
  457. package/src/db/migrations/meta/0003_snapshot.json +0 -3051
  458. package/src/db/migrations/meta/_journal.json +0 -62
  459. package/src/db/schema.ts +0 -676
  460. package/src/db/seed.ts +0 -146
  461. package/src/di.ts +0 -81
  462. package/src/index.ts +0 -326
  463. package/src/lib/errors.ts +0 -139
  464. package/src/lib/result.ts +0 -44
  465. package/src/lib/webhookSignature.ts +0 -41
  466. package/src/plugins/appContext.ts +0 -76
  467. package/src/plugins/audit.ts +0 -42
  468. package/src/plugins/auth.ts +0 -230
  469. package/src/plugins/metrics.ts +0 -41
  470. package/src/plugins/mtls.ts +0 -94
  471. package/src/plugins/permissions.ts +0 -29
  472. package/src/plugins/rateLimit.ts +0 -133
  473. package/src/plugins/requestLogger.ts +0 -25
  474. package/src/plugins/tracing.ts +0 -22
  475. package/src/repositories/apiKey.ts +0 -158
  476. package/src/repositories/application.ts +0 -70
  477. package/src/repositories/audit.ts +0 -32
  478. package/src/repositories/index.ts +0 -9
  479. package/src/repositories/oidcConnection.ts +0 -111
  480. package/src/repositories/organization.ts +0 -167
  481. package/src/repositories/permission.ts +0 -153
  482. package/src/repositories/samlConnection.ts +0 -96
  483. package/src/repositories/session.ts +0 -86
  484. package/src/repositories/types.ts +0 -134
  485. package/src/repositories/user.ts +0 -161
  486. package/src/routes/admin/billing.ts +0 -48
  487. package/src/routes/admin/helpers.ts +0 -50
  488. package/src/routes/admin/index.ts +0 -16
  489. package/src/routes/admin/organizations.ts +0 -299
  490. package/src/routes/admin/permissions.ts +0 -80
  491. package/src/routes/admin/platform.ts +0 -335
  492. package/src/routes/admin/sso.ts +0 -138
  493. package/src/routes/admin/webhooks.ts +0 -73
  494. package/src/routes/admin.ts +0 -1
  495. package/src/routes/apiKeys.ts +0 -60
  496. package/src/routes/auth.ts +0 -214
  497. package/src/routes/authz.ts +0 -38
  498. package/src/routes/config.ts +0 -67
  499. package/src/routes/emailVerification.ts +0 -73
  500. package/src/routes/federation.ts +0 -156
  501. package/src/routes/helpers.ts +0 -17
  502. package/src/routes/magicLinks.ts +0 -107
  503. package/src/routes/oauth.ts +0 -167
  504. package/src/routes/oauth2.ts +0 -284
  505. package/src/routes/oidcEnterprise.ts +0 -166
  506. package/src/routes/password.ts +0 -90
  507. package/src/routes/profile.ts +0 -44
  508. package/src/routes/saml.ts +0 -209
  509. package/src/routes/scim.ts +0 -199
  510. package/src/routes/sdk.ts +0 -141
  511. package/src/routes/serviceAccounts.ts +0 -124
  512. package/src/routes/sessions.ts +0 -62
  513. package/src/routes/setup.ts +0 -315
  514. package/src/routes/smsOtp.ts +0 -67
  515. package/src/routes/totp.ts +0 -122
  516. package/src/routes/webauthn.ts +0 -147
  517. package/src/routes/workflows.ts +0 -157
  518. package/src/sdk/index.ts +0 -152
  519. package/src/sdk/types.ts +0 -54
  520. package/src/services/anomalyDetection.ts +0 -73
  521. package/src/services/application/authentication.ts +0 -75
  522. package/src/services/application/identity.ts +0 -56
  523. package/src/services/application/index.ts +0 -3
  524. package/src/services/application/organization.ts +0 -77
  525. package/src/services/applications.ts +0 -89
  526. package/src/services/audit.ts +0 -41
  527. package/src/services/auditExport.ts +0 -59
  528. package/src/services/billing.ts +0 -87
  529. package/src/services/cache.ts +0 -131
  530. package/src/services/configuration/profiles.ts +0 -115
  531. package/src/services/configuration.ts +0 -120
  532. package/src/services/connectors/google.ts +0 -92
  533. package/src/services/connectors/oidc.ts +0 -111
  534. package/src/services/connectors/registry.ts +0 -124
  535. package/src/services/connectors/types.ts +0 -38
  536. package/src/services/connectors/zitadel.ts +0 -77
  537. package/src/services/devices.ts +0 -76
  538. package/src/services/domain/authentication.ts +0 -279
  539. package/src/services/domain/authorization.ts +0 -49
  540. package/src/services/domain/identity.ts +0 -108
  541. package/src/services/domain/index.ts +0 -4
  542. package/src/services/domain/organization.ts +0 -114
  543. package/src/services/email.ts +0 -167
  544. package/src/services/emailVerification.ts +0 -75
  545. package/src/services/enterpriseSso.ts +0 -58
  546. package/src/services/events/bus.ts +0 -43
  547. package/src/services/events/subscribers/anomaly.ts +0 -13
  548. package/src/services/events/subscribers/auditLog.ts +0 -21
  549. package/src/services/events/subscribers/webhook.ts +0 -39
  550. package/src/services/events/subscribers/webhookDispatch.ts +0 -14
  551. package/src/services/events/types.ts +0 -106
  552. package/src/services/events/validate.ts +0 -118
  553. package/src/services/featureFlags.ts +0 -90
  554. package/src/services/features.ts +0 -22
  555. package/src/services/federation.ts +0 -30
  556. package/src/services/hibp.ts +0 -28
  557. package/src/services/ipControls.ts +0 -99
  558. package/src/services/magicLinks.ts +0 -51
  559. package/src/services/oauth2.ts +0 -216
  560. package/src/services/organizations.ts +0 -171
  561. package/src/services/permissions.ts +0 -146
  562. package/src/services/plugins/registry.ts +0 -242
  563. package/src/services/plugins/types.ts +0 -98
  564. package/src/services/queue/bullmq.ts +0 -104
  565. package/src/services/queue/inProcess.ts +0 -75
  566. package/src/services/queue/index.ts +0 -19
  567. package/src/services/queue/types.ts +0 -26
  568. package/src/services/redis.ts +0 -16
  569. package/src/services/secrets/awsKms.ts +0 -97
  570. package/src/services/secrets/azureKeyVault.ts +0 -171
  571. package/src/services/secrets/database.ts +0 -166
  572. package/src/services/secrets/environment.ts +0 -117
  573. package/src/services/secrets/index.ts +0 -50
  574. package/src/services/secrets/password.ts +0 -73
  575. package/src/services/secrets/provider.ts +0 -36
  576. package/src/services/secrets/vault.ts +0 -149
  577. package/src/services/secrets.ts +0 -2
  578. package/src/services/serviceAccounts.ts +0 -74
  579. package/src/services/setup/configWriter.ts +0 -200
  580. package/src/services/setup/diagnostics.ts +0 -76
  581. package/src/services/setup/token.ts +0 -42
  582. package/src/services/setup/types.ts +0 -40
  583. package/src/services/setup/validation.ts +0 -205
  584. package/src/services/sms.ts +0 -81
  585. package/src/services/smsOtp.ts +0 -74
  586. package/src/services/tokens.ts +0 -287
  587. package/src/services/totp.ts +0 -113
  588. package/src/services/users.ts +0 -239
  589. package/src/services/webauthn.ts +0 -193
  590. package/src/services/webhooks.ts +0 -190
  591. package/src/services/workflows/engine.ts +0 -125
  592. package/src/services/workflows/steps.ts +0 -129
  593. package/src/services/zitadel.ts +0 -277
  594. package/src/setup-server.ts +0 -71
  595. package/src/tests/errors.test.ts +0 -74
  596. package/src/tests/events.test.ts +0 -52
  597. package/src/tests/featureFlags.test.ts +0 -26
  598. package/src/tests/integration/queue.test.ts +0 -54
  599. package/src/tests/plugins.test.ts +0 -73
  600. package/src/tests/result.test.ts +0 -52
  601. package/src/tests/setup/configWriter.test.ts +0 -69
  602. package/src/tests/setup/validation.test.ts +0 -29
  603. package/src/tests/smoke.test.ts +0 -136
  604. 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
- }