@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
@@ -1,117 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { importPKCS8, importSPKI, exportPKCS8, exportSPKI, generateKeyPair } from "jose";
3
- import { config } from "../../config.js";
4
- import type { SecretsProvider, SigningKeyPair } from "./provider.js";
5
- import { hashPassword, verifyPassword } from "./password.js";
6
-
7
- let envKeyPair: SigningKeyPair | null = null;
8
- let envEncryptionKey: Buffer | null = null;
9
-
10
- export class EnvironmentSecretsProvider implements SecretsProvider {
11
- readonly name = "environment";
12
-
13
- hashPassword = hashPassword;
14
- verifyPassword = verifyPassword;
15
-
16
- hashApiKey(key: string): string {
17
- return crypto.createHash("sha256").update(key).digest("hex");
18
- }
19
-
20
- hashClientSecret(secret: string): string {
21
- return crypto.createHash("sha256").update(secret).digest("hex");
22
- }
23
-
24
- generateClientSecret(): string {
25
- return `cs_${crypto.randomBytes(32).toString("base64url")}`;
26
- }
27
-
28
- generateApiKey(): { key: string; prefix: string } {
29
- const key = `ks_${crypto.randomBytes(32).toString("base64url")}`;
30
- const prefix = key.slice(0, 7);
31
- return { key, prefix };
32
- }
33
-
34
- async getActiveSigningKey(): Promise<SigningKeyPair> {
35
- if (envKeyPair) return envKeyPair;
36
-
37
- if (config.JWT_PRIVATE_KEY && config.JWT_PUBLIC_KEY) {
38
- const privateKey = await importPKCS8(config.JWT_PRIVATE_KEY, "RS256");
39
- const publicKey = await importSPKI(config.JWT_PUBLIC_KEY, "RS256");
40
- envKeyPair = { keyId: "env", privateKey, publicKey };
41
- return envKeyPair;
42
- }
43
-
44
- if (config.NODE_ENV === "production") {
45
- throw new Error("EnvironmentSecretsProvider requires JWT_PRIVATE_KEY and JWT_PUBLIC_KEY in production");
46
- }
47
-
48
- const pair = await generateKeyPair("RS256", { extractable: true });
49
- const privatePem = await exportPKCS8(pair.privateKey);
50
- const publicPem = await exportSPKI(pair.publicKey);
51
- // eslint-disable-next-line no-console
52
- console.warn("[secrets] Generated ephemeral JWT keys. Set JWT_PRIVATE_KEY/JWT_PUBLIC_KEY in production.");
53
- // eslint-disable-next-line no-console
54
- console.warn("[secrets] JWT_PRIVATE_KEY\n", privatePem);
55
- // eslint-disable-next-line no-console
56
- console.warn("[secrets] JWT_PUBLIC_KEY\n", publicPem);
57
- envKeyPair = { keyId: "env-generated", privateKey: pair.privateKey, publicKey: pair.publicKey };
58
- return envKeyPair;
59
- }
60
-
61
- async getSigningKeyById(keyId: string): Promise<SigningKeyPair | undefined> {
62
- const active = await this.getActiveSigningKey();
63
- if (active.keyId === keyId) return active;
64
- return undefined;
65
- }
66
-
67
- async rotateSigningKeys(): Promise<SigningKeyPair> {
68
- envKeyPair = null;
69
- return this.getActiveSigningKey();
70
- }
71
-
72
- async listActiveSigningKeys(): Promise<{ keyId: string; createdAt: Date; expiresAt?: Date | null }[]> {
73
- const active = await this.getActiveSigningKey();
74
- return [{ keyId: active.keyId, createdAt: new Date(), expiresAt: null }];
75
- }
76
-
77
- async listValidSigningKeys(): Promise<SigningKeyPair[]> {
78
- const active = await this.getActiveSigningKey();
79
- return [active];
80
- }
81
-
82
- async getEncryptionKey(): Promise<Buffer> {
83
- if (envEncryptionKey) return envEncryptionKey;
84
- if (config.KEYSTONE_ENCRYPTION_KEY) {
85
- envEncryptionKey = crypto.createHash("sha256").update(config.KEYSTONE_ENCRYPTION_KEY).digest();
86
- return envEncryptionKey;
87
- }
88
- envEncryptionKey = crypto.randomBytes(32);
89
- // eslint-disable-next-line no-console
90
- console.warn("[secrets] Generated ephemeral encryption key. Set KEYSTONE_ENCRYPTION_KEY in production.");
91
- return envEncryptionKey;
92
- }
93
-
94
- async encryptSecret(plain: string): Promise<string> {
95
- const key = await this.getEncryptionKey();
96
- const iv = crypto.randomBytes(16);
97
- const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
98
- const encrypted = Buffer.concat([cipher.update(plain, "utf8"), cipher.final()]);
99
- const tag = cipher.getAuthTag();
100
- const payload = Buffer.concat([iv, tag, encrypted]);
101
- return `aes-256-gcm$${payload.toString("base64url")}`;
102
- }
103
-
104
- async decryptSecret(cipherText: string): Promise<string> {
105
- if (!cipherText.startsWith("aes-256-gcm$")) {
106
- throw new Error("Unsupported cipher format");
107
- }
108
- const key = await this.getEncryptionKey();
109
- const payload = Buffer.from(cipherText.slice("aes-256-gcm$".length), "base64url");
110
- const iv = payload.subarray(0, 16);
111
- const tag = payload.subarray(16, 32);
112
- const encrypted = payload.subarray(32);
113
- const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
114
- decipher.setAuthTag(tag);
115
- return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString("utf8");
116
- }
117
- }
@@ -1,50 +0,0 @@
1
- import { config } from "../../config.js";
2
- import { DatabaseSecretsProvider } from "./database.js";
3
- import { EnvironmentSecretsProvider } from "./environment.js";
4
- import { VaultSecretsProvider } from "./vault.js";
5
- import { AwsKmsSecretsProvider } from "./awsKms.js";
6
- import { AzureKeyVaultSecretsProvider } from "./azureKeyVault.js";
7
- import type { SecretsProvider } from "./provider.js";
8
-
9
- function createProvider(): SecretsProvider {
10
- const providerName = config.KEYSTONE_SECRETS_PROVIDER || "database";
11
- switch (providerName) {
12
- case "environment":
13
- return new EnvironmentSecretsProvider();
14
- case "vault":
15
- return new VaultSecretsProvider();
16
- case "aws-kms":
17
- return new AwsKmsSecretsProvider();
18
- case "azure-key-vault":
19
- return new AzureKeyVaultSecretsProvider();
20
- case "database":
21
- default:
22
- return new DatabaseSecretsProvider();
23
- }
24
- }
25
-
26
- export const secretsProvider: SecretsProvider = createProvider();
27
-
28
- // Re-export everything for backwards compatibility.
29
- export * from "./provider.js";
30
- export { DatabaseSecretsProvider } from "./database.js";
31
- export { EnvironmentSecretsProvider } from "./environment.js";
32
- export { VaultSecretsProvider } from "./vault.js";
33
- export { AwsKmsSecretsProvider } from "./awsKms.js";
34
- export { AzureKeyVaultSecretsProvider } from "./azureKeyVault.js";
35
-
36
- // Convenience re-exports of the active provider's methods.
37
- export const hashPassword = secretsProvider.hashPassword.bind(secretsProvider);
38
- export const verifyPassword = secretsProvider.verifyPassword.bind(secretsProvider);
39
- export const hashApiKey = secretsProvider.hashApiKey.bind(secretsProvider);
40
- export const hashClientSecret = secretsProvider.hashClientSecret.bind(secretsProvider);
41
- export const generateClientSecret = secretsProvider.generateClientSecret.bind(secretsProvider);
42
- export const generateApiKey = secretsProvider.generateApiKey.bind(secretsProvider);
43
- export const getActiveSigningKey = secretsProvider.getActiveSigningKey.bind(secretsProvider);
44
- export const getSigningKeyById = secretsProvider.getSigningKeyById.bind(secretsProvider);
45
- export const rotateSigningKeys = secretsProvider.rotateSigningKeys.bind(secretsProvider);
46
- export const listActiveSigningKeys = secretsProvider.listActiveSigningKeys.bind(secretsProvider);
47
- export const listValidSigningKeys = secretsProvider.listValidSigningKeys.bind(secretsProvider);
48
- export const getEncryptionKey = secretsProvider.getEncryptionKey.bind(secretsProvider);
49
- export const encryptSecret = secretsProvider.encryptSecret.bind(secretsProvider);
50
- export const decryptSecret = secretsProvider.decryptSecret.bind(secretsProvider);
@@ -1,73 +0,0 @@
1
- import crypto from "node:crypto";
2
- import * as argon2 from "argon2";
3
-
4
- // OWASP-recommended minimum parameters for argon2id (as of 2023).
5
- const ARGON2_MEMORY_COST = 65536;
6
- const ARGON2_TIME_COST = 3;
7
- const ARGON2_PARALLELISM = 4;
8
-
9
- // Legacy scrypt parameters used by early Keystone deployments.
10
- const SCRYPT_N = 16384;
11
- const SCRYPT_R = 8;
12
- const SCRYPT_P = 1;
13
-
14
- function scryptPromise(
15
- password: string,
16
- salt: Buffer,
17
- keylen: number,
18
- options: crypto.ScryptOptions
19
- ): Promise<Buffer> {
20
- return new Promise((resolve, reject) => {
21
- crypto.scrypt(password, salt, keylen, options, (err, derived) => {
22
- if (err) return reject(err);
23
- resolve(derived);
24
- });
25
- });
26
- }
27
-
28
- async function verifyScryptPassword(plain: string, hash: string): Promise<boolean> {
29
- const parts = hash.split("$");
30
- if (parts.length !== 6) return false;
31
- const [, nStr, rStr, pStr, saltB64, derivedB64] = parts;
32
- const salt = Buffer.from(saltB64, "base64url");
33
- const expected = Buffer.from(derivedB64, "base64url");
34
- const derived = await scryptPromise(plain, salt, expected.length, {
35
- N: Number(nStr),
36
- r: Number(rStr),
37
- p: Number(pStr),
38
- });
39
- return crypto.timingSafeEqual(derived, expected);
40
- }
41
-
42
- /**
43
- * Hash a password using argon2id. The encoded string contains the salt and
44
- * parameters, so verification does not need external storage.
45
- */
46
- export async function hashPassword(plain: string): Promise<string> {
47
- return argon2.hash(plain, {
48
- type: argon2.argon2id,
49
- memoryCost: ARGON2_MEMORY_COST,
50
- timeCost: ARGON2_TIME_COST,
51
- parallelism: ARGON2_PARALLELISM,
52
- });
53
- }
54
-
55
- /**
56
- * Verify a password against an argon2id or legacy scrypt hash.
57
- */
58
- export async function verifyPassword(
59
- plain: string,
60
- hash: string | null | undefined
61
- ): Promise<boolean> {
62
- if (!hash) return false;
63
-
64
- if (hash.startsWith("scrypt$")) {
65
- return verifyScryptPassword(plain, hash);
66
- }
67
-
68
- try {
69
- return await argon2.verify(hash, plain);
70
- } catch {
71
- return false;
72
- }
73
- }
@@ -1,36 +0,0 @@
1
- export interface SigningKeyPair {
2
- keyId: string;
3
- privateKey: CryptoKey | Uint8Array;
4
- publicKey: CryptoKey;
5
- }
6
-
7
- export interface SecretsProvider {
8
- readonly name: string;
9
-
10
- // Password hashing
11
- hashPassword(plain: string): Promise<string>;
12
- verifyPassword(plain: string, hash: string | null | undefined): Promise<boolean>;
13
-
14
- // API key / client secret hashing
15
- hashApiKey(key: string): string;
16
- hashClientSecret(secret: string): string;
17
- generateClientSecret(): string;
18
- generateApiKey(): { key: string; prefix: string };
19
-
20
- // JWT signing keys
21
- getActiveSigningKey(): Promise<SigningKeyPair>;
22
- getSigningKeyById(keyId: string): Promise<SigningKeyPair | undefined>;
23
- rotateSigningKeys(): Promise<SigningKeyPair>;
24
- listActiveSigningKeys(): Promise<{ keyId: string; createdAt: Date; expiresAt?: Date | null }[]>;
25
- /**
26
- * Return all signing keys that are currently valid: the active key plus any
27
- * recently rotated keys still within the grace period. Used to verify tokens
28
- * after a key rotation.
29
- */
30
- listValidSigningKeys(): Promise<SigningKeyPair[]>;
31
-
32
- // Symmetric encryption
33
- getEncryptionKey(): Promise<Buffer>;
34
- encryptSecret(plain: string): Promise<string>;
35
- decryptSecret(cipherText: string): Promise<string>;
36
- }
@@ -1,149 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { importPKCS8, importSPKI, exportPKCS8, exportSPKI, generateKeyPair } from "jose";
3
- import type { SecretsProvider, SigningKeyPair } from "./provider.js";
4
- import { hashPassword, verifyPassword } from "./password.js";
5
-
6
- /**
7
- * HashiCorp Vault secrets provider.
8
- *
9
- * This is a reference implementation. In production it should call the
10
- * Vault HTTP API (or use a Vault client library) to retrieve signing keys,
11
- * encryption keys, and credentials. The password hashing helpers are reused
12
- * locally because they are compute-bound and do not need external storage.
13
- */
14
- export class VaultSecretsProvider implements SecretsProvider {
15
- readonly name = "vault";
16
-
17
- hashPassword = hashPassword;
18
- verifyPassword = verifyPassword;
19
-
20
- private vaultAddr: string;
21
- private vaultToken: string;
22
- private mountPath: string;
23
-
24
- constructor() {
25
- this.vaultAddr = (process.env.VAULT_ADDR || "").replace(/\/$/, "");
26
- this.vaultToken = process.env.VAULT_TOKEN || "";
27
- this.mountPath = (process.env.VAULT_MOUNT_PATH || "secret").replace(/(^\/)|(\/$)/g, "");
28
-
29
- if (!this.vaultAddr || !this.vaultToken) {
30
- throw new Error("VaultSecretsProvider requires VAULT_ADDR and VAULT_TOKEN");
31
- }
32
- }
33
-
34
- hashApiKey(key: string): string {
35
- return crypto.createHash("sha256").update(key).digest("hex");
36
- }
37
-
38
- hashClientSecret(secret: string): string {
39
- return crypto.createHash("sha256").update(secret).digest("hex");
40
- }
41
-
42
- generateClientSecret(): string {
43
- return `cs_${crypto.randomBytes(32).toString("base64url")}`;
44
- }
45
-
46
- generateApiKey(): { key: string; prefix: string } {
47
- const key = `ks_${crypto.randomBytes(32).toString("base64url")}`;
48
- return { key, prefix: key.slice(0, 7) };
49
- }
50
-
51
- async getActiveSigningKey(): Promise<SigningKeyPair> {
52
- const stored = await this.readPath("jwt/active");
53
- if (stored?.private && stored?.public) {
54
- const privateKey = await importPKCS8(String(stored.private), "RS256");
55
- const publicKey = await importSPKI(String(stored.public), "RS256");
56
- return { keyId: String(stored.keyId ?? "vault-active"), privateKey, publicKey };
57
- }
58
- return this.rotateSigningKeys();
59
- }
60
-
61
- async getSigningKeyById(keyId: string): Promise<SigningKeyPair | undefined> {
62
- const active = await this.getActiveSigningKey();
63
- if (active.keyId === keyId) return active;
64
- const stored = await this.readPath(`jwt/${keyId}`);
65
- if (!stored?.private) return undefined;
66
- const privateKey = await importPKCS8(String(stored.private), "RS256");
67
- const publicKey = await importSPKI(String(stored.public), "RS256");
68
- return { keyId, privateKey, publicKey };
69
- }
70
-
71
- async rotateSigningKeys(): Promise<SigningKeyPair> {
72
- const pair = await generateKeyPair("RS256", { extractable: true });
73
- const privatePem = await exportPKCS8(pair.privateKey);
74
- const publicPem = await exportSPKI(pair.publicKey);
75
- const keyId = `vault-${crypto.randomBytes(8).toString("base64url")}`;
76
-
77
- await this.writePath("jwt/active", { keyId, private: privatePem, public: publicPem, rotatedAt: new Date().toISOString() });
78
-
79
- return { keyId, privateKey: pair.privateKey, publicKey: pair.publicKey };
80
- }
81
-
82
- async listActiveSigningKeys(): Promise<{ keyId: string; createdAt: Date; expiresAt?: Date | null }[]> {
83
- const active = await this.getActiveSigningKey();
84
- return [{ keyId: active.keyId, createdAt: new Date(), expiresAt: null }];
85
- }
86
-
87
- async listValidSigningKeys(): Promise<SigningKeyPair[]> {
88
- const active = await this.getActiveSigningKey();
89
- return [active];
90
- }
91
-
92
- async getEncryptionKey(): Promise<Buffer> {
93
- const stored = await this.readPath("encryption/active");
94
- if (stored?.value) {
95
- return Buffer.from(String(stored.value), "base64url");
96
- }
97
- const value = crypto.randomBytes(32);
98
- await this.writePath("encryption/active", { value: value.toString("base64url") });
99
- return value;
100
- }
101
-
102
- async encryptSecret(plain: string): Promise<string> {
103
- const key = await this.getEncryptionKey();
104
- const iv = crypto.randomBytes(16);
105
- const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
106
- const encrypted = Buffer.concat([cipher.update(plain, "utf8"), cipher.final()]);
107
- const tag = cipher.getAuthTag();
108
- const payload = Buffer.concat([iv, tag, encrypted]);
109
- return `aes-256-gcm$${payload.toString("base64url")}`;
110
- }
111
-
112
- async decryptSecret(cipherText: string): Promise<string> {
113
- if (!cipherText.startsWith("aes-256-gcm$")) {
114
- throw new Error("Unsupported cipher format");
115
- }
116
- const key = await this.getEncryptionKey();
117
- const payload = Buffer.from(cipherText.slice("aes-256-gcm$".length), "base64url");
118
- const iv = payload.subarray(0, 16);
119
- const tag = payload.subarray(16, 32);
120
- const encrypted = payload.subarray(32);
121
- const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
122
- decipher.setAuthTag(tag);
123
- return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString("utf8");
124
- }
125
-
126
- private async readPath(path: string): Promise<Record<string, unknown> | undefined> {
127
- const url = `${this.vaultAddr}/v1/${this.mountPath}/data/${path}`;
128
- const res = await fetch(url, {
129
- headers: { "X-Vault-Token": this.vaultToken },
130
- });
131
- if (res.status === 404) return undefined;
132
- if (!res.ok) throw new Error(`Vault read failed: ${res.status}`);
133
- const data = (await res.json()) as { data?: { data?: Record<string, unknown> } };
134
- return data.data?.data;
135
- }
136
-
137
- private async writePath(path: string, data: Record<string, unknown>): Promise<void> {
138
- const url = `${this.vaultAddr}/v1/${this.mountPath}/data/${path}`;
139
- const res = await fetch(url, {
140
- method: "POST",
141
- headers: {
142
- "X-Vault-Token": this.vaultToken,
143
- "Content-Type": "application/json",
144
- },
145
- body: JSON.stringify({ data }),
146
- });
147
- if (!res.ok) throw new Error(`Vault write failed: ${res.status}`);
148
- }
149
- }
@@ -1,2 +0,0 @@
1
- // Backwards-compatible re-export of the secrets provider layer.
2
- export * from "./secrets/index.js";
@@ -1,74 +0,0 @@
1
- import { eq, and, sql } from "drizzle-orm";
2
- import { db } from "../db/index.js";
3
- import { serviceAccounts, apiKeys, type ServiceAccount } from "../db/schema.js";
4
-
5
- export async function createServiceAccount(input: {
6
- orgId: string;
7
- name: string;
8
- description?: string;
9
- }): Promise<ServiceAccount> {
10
- const [record] = await db
11
- .insert(serviceAccounts)
12
- .values({
13
- orgId: input.orgId,
14
- name: input.name,
15
- description: input.description ?? null,
16
- })
17
- .returning();
18
- return record;
19
- }
20
-
21
- export async function findServiceAccountsByOrgId(orgId: string): Promise<ServiceAccount[]> {
22
- return db
23
- .select()
24
- .from(serviceAccounts)
25
- .where(and(eq(serviceAccounts.orgId, orgId), eq(serviceAccounts.isActive, true)))
26
- .orderBy(serviceAccounts.name);
27
- }
28
-
29
- export async function findServiceAccountById(
30
- id: string,
31
- orgId: string
32
- ): Promise<ServiceAccount | undefined> {
33
- const [record] = await db
34
- .select()
35
- .from(serviceAccounts)
36
- .where(
37
- and(
38
- eq(serviceAccounts.id, id),
39
- eq(serviceAccounts.orgId, orgId),
40
- eq(serviceAccounts.isActive, true)
41
- )
42
- )
43
- .limit(1);
44
- return record;
45
- }
46
-
47
- export async function updateServiceAccount(
48
- id: string,
49
- orgId: string,
50
- updates: Partial<{ name: string; description: string; isActive: boolean }>
51
- ): Promise<ServiceAccount | undefined> {
52
- const [updated] = await db
53
- .update(serviceAccounts)
54
- .set({ ...updates, updatedAt: sql`now()` })
55
- .where(and(eq(serviceAccounts.id, id), eq(serviceAccounts.orgId, orgId)))
56
- .returning();
57
- return updated;
58
- }
59
-
60
- export async function listServiceAccountApiKeys(serviceAccountId: string) {
61
- return db
62
- .select({
63
- id: apiKeys.id,
64
- name: apiKeys.name,
65
- prefix: apiKeys.prefix,
66
- scopes: apiKeys.scopes,
67
- lastUsedAt: apiKeys.lastUsedAt,
68
- expiresAt: apiKeys.expiresAt,
69
- revokedAt: apiKeys.revokedAt,
70
- createdAt: apiKeys.createdAt,
71
- })
72
- .from(apiKeys)
73
- .where(eq(apiKeys.serviceAccountId, serviceAccountId));
74
- }