@tinyrack/issuary-server 0.31.0 → 0.32.2

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 (455) hide show
  1. package/dist/entities/auth-budget.entity.d.ts +20 -0
  2. package/dist/entities/auth-budget.entity.d.ts.map +1 -0
  3. package/dist/entities/auth-budget.entity.js +11 -0
  4. package/dist/entities/auth-budget.entity.js.map +1 -0
  5. package/dist/entities/browser-session.entity.d.ts +32 -0
  6. package/dist/entities/browser-session.entity.d.ts.map +1 -0
  7. package/dist/entities/browser-session.entity.js +12 -0
  8. package/dist/entities/browser-session.entity.js.map +1 -0
  9. package/dist/entities/email-verification.entity.d.ts +18 -0
  10. package/dist/entities/email-verification.entity.d.ts.map +1 -1
  11. package/dist/entities/email-verification.entity.js +2 -0
  12. package/dist/entities/email-verification.entity.js.map +1 -1
  13. package/dist/entities/oauth-client.entity.d.ts +120 -0
  14. package/dist/entities/oauth-client.entity.d.ts.map +1 -1
  15. package/dist/entities/oauth-code.entity.d.ts +120 -0
  16. package/dist/entities/oauth-code.entity.d.ts.map +1 -1
  17. package/dist/entities/oauth-code.entity.js +3 -0
  18. package/dist/entities/oauth-code.entity.js.map +1 -1
  19. package/dist/entities/oauth-device-code.entity.d.ts +120 -0
  20. package/dist/entities/oauth-device-code.entity.d.ts.map +1 -1
  21. package/dist/entities/oauth-device-code.entity.js +3 -0
  22. package/dist/entities/oauth-device-code.entity.js.map +1 -1
  23. package/dist/entities/oauth-grant.entity.d.ts +52 -0
  24. package/dist/entities/oauth-grant.entity.d.ts.map +1 -0
  25. package/dist/entities/oauth-grant.entity.js +19 -0
  26. package/dist/entities/oauth-grant.entity.js.map +1 -0
  27. package/dist/entities/password-reset.entity.d.ts +18 -0
  28. package/dist/entities/password-reset.entity.d.ts.map +1 -1
  29. package/dist/entities/password-reset.entity.js +2 -0
  30. package/dist/entities/password-reset.entity.js.map +1 -1
  31. package/dist/entities/pending-oauth-registration.entity.d.ts +9 -0
  32. package/dist/entities/pending-oauth-registration.entity.d.ts.map +1 -1
  33. package/dist/entities/pending-oauth-registration.entity.js +1 -0
  34. package/dist/entities/pending-oauth-registration.entity.js.map +1 -1
  35. package/dist/entities/revoked-token.entity.d.ts +120 -0
  36. package/dist/entities/revoked-token.entity.d.ts.map +1 -1
  37. package/dist/entities/terms-content.entity.d.ts +36 -0
  38. package/dist/entities/terms-content.entity.d.ts.map +1 -1
  39. package/dist/entities/terms.entity.d.ts +36 -0
  40. package/dist/entities/terms.entity.d.ts.map +1 -1
  41. package/dist/entities/user-consent.entity.d.ts +120 -0
  42. package/dist/entities/user-consent.entity.d.ts.map +1 -1
  43. package/dist/entities/user-terms-consent.entity.d.ts +36 -0
  44. package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
  45. package/dist/entities/user-totp-recovery-code.entity.d.ts +36 -0
  46. package/dist/entities/user-totp-recovery-code.entity.d.ts.map +1 -1
  47. package/dist/entities/user-totp.entity.d.ts +36 -0
  48. package/dist/entities/user-totp.entity.d.ts.map +1 -1
  49. package/dist/entities/user-totp.entity.js +1 -0
  50. package/dist/entities/user-totp.entity.js.map +1 -1
  51. package/dist/entities/user.entity.d.ts +36 -0
  52. package/dist/entities/user.entity.d.ts.map +1 -1
  53. package/dist/entities/user.entity.js +3 -0
  54. package/dist/entities/user.entity.js.map +1 -1
  55. package/dist/entrypoints/app.d.ts +448 -437
  56. package/dist/entrypoints/app.d.ts.map +1 -1
  57. package/dist/entrypoints/app.js +78 -6
  58. package/dist/entrypoints/app.js.map +1 -1
  59. package/dist/entrypoints/database/postgres/compiled-functions.d.ts +326 -200
  60. package/dist/entrypoints/database/postgres/compiled-functions.js +1849 -518
  61. package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
  62. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +326 -200
  63. package/dist/entrypoints/database/sqlite/compiled-functions.js +1849 -518
  64. package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
  65. package/dist/entrypoints/database/sqlite/sqlite.d.ts.map +1 -1
  66. package/dist/entrypoints/database/sqlite/sqlite.js +1 -0
  67. package/dist/entrypoints/database/sqlite/sqlite.js.map +1 -1
  68. package/dist/entrypoints/scheduler/database.d.ts +3 -1
  69. package/dist/entrypoints/scheduler/database.d.ts.map +1 -1
  70. package/dist/entrypoints/scheduler/database.js +13 -2
  71. package/dist/entrypoints/scheduler/database.js.map +1 -1
  72. package/dist/entrypoints/scheduler/distributed-runner.d.ts +4 -0
  73. package/dist/entrypoints/scheduler/distributed-runner.d.ts.map +1 -1
  74. package/dist/entrypoints/scheduler/distributed-runner.js +26 -1
  75. package/dist/entrypoints/scheduler/distributed-runner.js.map +1 -1
  76. package/dist/lib/config/email.d.ts +1 -0
  77. package/dist/lib/config/email.d.ts.map +1 -1
  78. package/dist/lib/config/email.js.map +1 -1
  79. package/dist/lib/database/entities.d.ts.map +1 -1
  80. package/dist/lib/database/entities.js +6 -0
  81. package/dist/lib/database/entities.js.map +1 -1
  82. package/dist/lib/openapi.d.ts +2 -0
  83. package/dist/lib/openapi.d.ts.map +1 -1
  84. package/dist/lib/openapi.js +36 -1
  85. package/dist/lib/openapi.js.map +1 -1
  86. package/dist/lib/request-ip.d.ts +4 -0
  87. package/dist/lib/request-ip.d.ts.map +1 -0
  88. package/dist/lib/request-ip.js +39 -0
  89. package/dist/lib/request-ip.js.map +1 -0
  90. package/dist/middleware/auth-budget.d.ts +3 -0
  91. package/dist/middleware/auth-budget.d.ts.map +1 -0
  92. package/dist/middleware/auth-budget.js +80 -0
  93. package/dist/middleware/auth-budget.js.map +1 -0
  94. package/dist/middleware/session.d.ts +23 -5
  95. package/dist/middleware/session.d.ts.map +1 -1
  96. package/dist/middleware/session.js +152 -12
  97. package/dist/middleware/session.js.map +1 -1
  98. package/dist/middleware/strict-input.d.ts +4 -0
  99. package/dist/middleware/strict-input.d.ts.map +1 -0
  100. package/dist/middleware/strict-input.js +144 -0
  101. package/dist/middleware/strict-input.js.map +1 -0
  102. package/dist/migrations/postgres/Migration20260910120000_api_security.d.ts +6 -0
  103. package/dist/migrations/postgres/Migration20260910120000_api_security.d.ts.map +1 -0
  104. package/dist/migrations/postgres/Migration20260910120000_api_security.js +20 -0
  105. package/dist/migrations/postgres/Migration20260910120000_api_security.js.map +1 -0
  106. package/dist/migrations/postgres/Migration20260910160000_security_followup.d.ts +6 -0
  107. package/dist/migrations/postgres/Migration20260910160000_security_followup.d.ts.map +1 -0
  108. package/dist/migrations/postgres/Migration20260910160000_security_followup.js +23 -0
  109. package/dist/migrations/postgres/Migration20260910160000_security_followup.js.map +1 -0
  110. package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.d.ts +6 -0
  111. package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.d.ts.map +1 -0
  112. package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.js +28 -0
  113. package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.js.map +1 -0
  114. package/dist/migrations/postgres/Migration20260910220000_flow_revocation.d.ts +6 -0
  115. package/dist/migrations/postgres/Migration20260910220000_flow_revocation.d.ts.map +1 -0
  116. package/dist/migrations/postgres/Migration20260910220000_flow_revocation.js +19 -0
  117. package/dist/migrations/postgres/Migration20260910220000_flow_revocation.js.map +1 -0
  118. package/dist/migrations/postgres/index.d.ts.map +1 -1
  119. package/dist/migrations/postgres/index.js +8 -0
  120. package/dist/migrations/postgres/index.js.map +1 -1
  121. package/dist/migrations/sqlite/Migration20260910120000_api_security.d.ts +6 -0
  122. package/dist/migrations/sqlite/Migration20260910120000_api_security.d.ts.map +1 -0
  123. package/dist/migrations/sqlite/Migration20260910120000_api_security.js +20 -0
  124. package/dist/migrations/sqlite/Migration20260910120000_api_security.js.map +1 -0
  125. package/dist/migrations/sqlite/Migration20260910160000_security_followup.d.ts +6 -0
  126. package/dist/migrations/sqlite/Migration20260910160000_security_followup.d.ts.map +1 -0
  127. package/dist/migrations/sqlite/Migration20260910160000_security_followup.js +23 -0
  128. package/dist/migrations/sqlite/Migration20260910160000_security_followup.js.map +1 -0
  129. package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.d.ts +8 -0
  130. package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.d.ts.map +1 -0
  131. package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.js +72 -0
  132. package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.js.map +1 -0
  133. package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.d.ts +6 -0
  134. package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.d.ts.map +1 -0
  135. package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.js +19 -0
  136. package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.js.map +1 -0
  137. package/dist/migrations/sqlite/index.d.ts.map +1 -1
  138. package/dist/migrations/sqlite/index.js +8 -0
  139. package/dist/migrations/sqlite/index.js.map +1 -1
  140. package/dist/repositories/email-verification.repository.d.ts +1 -0
  141. package/dist/repositories/email-verification.repository.d.ts.map +1 -1
  142. package/dist/repositories/email-verification.repository.js +8 -17
  143. package/dist/repositories/email-verification.repository.js.map +1 -1
  144. package/dist/repositories/oauth-code.repository.d.ts +2 -0
  145. package/dist/repositories/oauth-code.repository.d.ts.map +1 -1
  146. package/dist/repositories/oauth-code.repository.js +8 -0
  147. package/dist/repositories/oauth-code.repository.js.map +1 -1
  148. package/dist/repositories/oauth-device-code.repository.d.ts +3 -0
  149. package/dist/repositories/oauth-device-code.repository.d.ts.map +1 -1
  150. package/dist/repositories/oauth-device-code.repository.js +64 -29
  151. package/dist/repositories/oauth-device-code.repository.js.map +1 -1
  152. package/dist/repositories/password-reset.repository.d.ts +1 -0
  153. package/dist/repositories/password-reset.repository.d.ts.map +1 -1
  154. package/dist/repositories/password-reset.repository.js +6 -19
  155. package/dist/repositories/password-reset.repository.js.map +1 -1
  156. package/dist/repositories/pending-oauth-registration.repository.d.ts +2 -0
  157. package/dist/repositories/pending-oauth-registration.repository.d.ts.map +1 -1
  158. package/dist/repositories/pending-oauth-registration.repository.js +16 -2
  159. package/dist/repositories/pending-oauth-registration.repository.js.map +1 -1
  160. package/dist/repositories/terms.repository.d.ts.map +1 -1
  161. package/dist/repositories/terms.repository.js +1 -0
  162. package/dist/repositories/terms.repository.js.map +1 -1
  163. package/dist/repositories/user-consent.repository.d.ts.map +1 -1
  164. package/dist/repositories/user-consent.repository.js +1 -1
  165. package/dist/repositories/user-consent.repository.js.map +1 -1
  166. package/dist/repositories/user-terms-consent.repository.d.ts.map +1 -1
  167. package/dist/repositories/user-terms-consent.repository.js +2 -0
  168. package/dist/repositories/user-terms-consent.repository.js.map +1 -1
  169. package/dist/repositories/user-totp-recovery-code.repository.d.ts +24 -0
  170. package/dist/repositories/user-totp-recovery-code.repository.d.ts.map +1 -1
  171. package/dist/repositories/user-totp.repository.d.ts +36 -0
  172. package/dist/repositories/user-totp.repository.d.ts.map +1 -1
  173. package/dist/routes/.well-known/openid-configuration/get.d.ts.map +1 -1
  174. package/dist/routes/.well-known/openid-configuration/get.js +5 -1
  175. package/dist/routes/.well-known/openid-configuration/get.js.map +1 -1
  176. package/dist/routes/api/admin/console/index.d.ts.map +1 -1
  177. package/dist/routes/api/admin/console/index.js +29 -14
  178. package/dist/routes/api/admin/console/index.js.map +1 -1
  179. package/dist/routes/api/admin/me/get.js +2 -3
  180. package/dist/routes/api/admin/me/get.js.map +1 -1
  181. package/dist/routes/api/admin/users/index.d.ts.map +1 -1
  182. package/dist/routes/api/admin/users/index.js +59 -52
  183. package/dist/routes/api/admin/users/index.js.map +1 -1
  184. package/dist/routes/api/auth/accounts/remove.post.d.ts +5 -5
  185. package/dist/routes/api/auth/email/resend/post.d.ts.map +1 -1
  186. package/dist/routes/api/auth/email/resend/post.js +3 -24
  187. package/dist/routes/api/auth/email/resend/post.js.map +1 -1
  188. package/dist/routes/api/auth/email/verify/post.d.ts.map +1 -1
  189. package/dist/routes/api/auth/email/verify/post.js +29 -12
  190. package/dist/routes/api/auth/email/verify/post.js.map +1 -1
  191. package/dist/routes/api/auth/login/post.d.ts.map +1 -1
  192. package/dist/routes/api/auth/login/post.js +4 -3
  193. package/dist/routes/api/auth/login/post.js.map +1 -1
  194. package/dist/routes/api/auth/passkey/verify/post.d.ts.map +1 -1
  195. package/dist/routes/api/auth/passkey/verify/post.js +25 -11
  196. package/dist/routes/api/auth/passkey/verify/post.js.map +1 -1
  197. package/dist/routes/api/auth/password/forgot/post.d.ts.map +1 -1
  198. package/dist/routes/api/auth/password/forgot/post.js +2 -19
  199. package/dist/routes/api/auth/password/forgot/post.js.map +1 -1
  200. package/dist/routes/api/auth/register/post.d.ts.map +1 -1
  201. package/dist/routes/api/auth/register/post.js +4 -3
  202. package/dist/routes/api/auth/register/post.js.map +1 -1
  203. package/dist/routes/api/auth/totp/recovery/verify/post.d.ts.map +1 -1
  204. package/dist/routes/api/auth/totp/recovery/verify/post.js +7 -5
  205. package/dist/routes/api/auth/totp/recovery/verify/post.js.map +1 -1
  206. package/dist/routes/api/auth/totp/verify/post.d.ts.map +1 -1
  207. package/dist/routes/api/auth/totp/verify/post.js +7 -5
  208. package/dist/routes/api/auth/totp/verify/post.js.map +1 -1
  209. package/dist/routes/api/consent/post.d.ts.map +1 -1
  210. package/dist/routes/api/consent/post.js +141 -120
  211. package/dist/routes/api/consent/post.js.map +1 -1
  212. package/dist/routes/api/docs/get.d.ts.map +1 -1
  213. package/dist/routes/api/docs/get.js +8 -1
  214. package/dist/routes/api/docs/get.js.map +1 -1
  215. package/dist/routes/api/index.d.ts +379 -379
  216. package/dist/routes/api/oauth/_provider/authorize/get.d.ts.map +1 -1
  217. package/dist/routes/api/oauth/_provider/authorize/get.js +5 -1
  218. package/dist/routes/api/oauth/_provider/authorize/get.js.map +1 -1
  219. package/dist/routes/api/oauth/_provider/callback/get.d.ts +9 -9
  220. package/dist/routes/api/oauth/_provider/callback/get.d.ts.map +1 -1
  221. package/dist/routes/api/oauth/_provider/callback/get.js +30 -6
  222. package/dist/routes/api/oauth/_provider/callback/get.js.map +1 -1
  223. package/dist/routes/api/oauth/_provider/callback/post.d.ts.map +1 -1
  224. package/dist/routes/api/oauth/_provider/callback/post.js +31 -31
  225. package/dist/routes/api/oauth/_provider/callback/post.js.map +1 -1
  226. package/dist/routes/api/oauth/_provider/delete.d.ts.map +1 -1
  227. package/dist/routes/api/oauth/_provider/delete.js +14 -11
  228. package/dist/routes/api/oauth/_provider/delete.js.map +1 -1
  229. package/dist/routes/api/oauth/index.d.ts +18 -18
  230. package/dist/routes/api/terms/consent/post.d.ts.map +1 -1
  231. package/dist/routes/api/terms/consent/post.js +59 -43
  232. package/dist/routes/api/terms/consent/post.js.map +1 -1
  233. package/dist/routes/api/user/delete.d.ts.map +1 -1
  234. package/dist/routes/api/user/delete.js +8 -8
  235. package/dist/routes/api/user/delete.js.map +1 -1
  236. package/dist/routes/api/user/passkeys/_id/delete.d.ts.map +1 -1
  237. package/dist/routes/api/user/passkeys/_id/delete.js +17 -29
  238. package/dist/routes/api/user/passkeys/_id/delete.js.map +1 -1
  239. package/dist/routes/api/user/passkeys/_id/patch.d.ts.map +1 -1
  240. package/dist/routes/api/user/passkeys/_id/patch.js +16 -13
  241. package/dist/routes/api/user/passkeys/_id/patch.js.map +1 -1
  242. package/dist/routes/api/user/passkeys/register/verify/post.d.ts.map +1 -1
  243. package/dist/routes/api/user/passkeys/register/verify/post.js +27 -19
  244. package/dist/routes/api/user/passkeys/register/verify/post.js.map +1 -1
  245. package/dist/routes/api/user/password/delete.d.ts.map +1 -1
  246. package/dist/routes/api/user/password/delete.js +13 -10
  247. package/dist/routes/api/user/password/delete.js.map +1 -1
  248. package/dist/routes/api/user/password/post.d.ts.map +1 -1
  249. package/dist/routes/api/user/password/post.js +13 -10
  250. package/dist/routes/api/user/password/post.js.map +1 -1
  251. package/dist/routes/api/user/password/put.d.ts.map +1 -1
  252. package/dist/routes/api/user/password/put.js +13 -10
  253. package/dist/routes/api/user/password/put.js.map +1 -1
  254. package/dist/routes/api/user/totp/confirm/post.d.ts.map +1 -1
  255. package/dist/routes/api/user/totp/confirm/post.js +33 -18
  256. package/dist/routes/api/user/totp/confirm/post.js.map +1 -1
  257. package/dist/routes/api/user/totp/delete.d.ts.map +1 -1
  258. package/dist/routes/api/user/totp/delete.js +13 -18
  259. package/dist/routes/api/user/totp/delete.js.map +1 -1
  260. package/dist/routes/api/user/totp/recovery/regenerate/post.d.ts.map +1 -1
  261. package/dist/routes/api/user/totp/recovery/regenerate/post.js +13 -10
  262. package/dist/routes/api/user/totp/recovery/regenerate/post.js.map +1 -1
  263. package/dist/routes/api/user/totp/setup/post.d.ts.map +1 -1
  264. package/dist/routes/api/user/totp/setup/post.js +13 -8
  265. package/dist/routes/api/user/totp/setup/post.js.map +1 -1
  266. package/dist/routes/api/user/totp/verify/post.d.ts.map +1 -1
  267. package/dist/routes/api/user/totp/verify/post.js +23 -12
  268. package/dist/routes/api/user/totp/verify/post.js.map +1 -1
  269. package/dist/routes/index.d.ts +252 -242
  270. package/dist/routes/index.d.ts.map +1 -1
  271. package/dist/routes/oauth/authorize/get.d.ts.map +1 -1
  272. package/dist/routes/oauth/authorize/get.js +12 -4
  273. package/dist/routes/oauth/authorize/get.js.map +1 -1
  274. package/dist/routes/oauth/device/get-post.d.ts +10 -0
  275. package/dist/routes/oauth/device/get-post.d.ts.map +1 -1
  276. package/dist/routes/oauth/device/get-post.js +32 -3
  277. package/dist/routes/oauth/device/get-post.js.map +1 -1
  278. package/dist/routes/oauth/device-authorization/post.d.ts.map +1 -1
  279. package/dist/routes/oauth/device-authorization/post.js +13 -7
  280. package/dist/routes/oauth/device-authorization/post.js.map +1 -1
  281. package/dist/routes/oauth/end-session/get.d.ts.map +1 -1
  282. package/dist/routes/oauth/end-session/get.js +2 -3
  283. package/dist/routes/oauth/end-session/get.js.map +1 -1
  284. package/dist/routes/oauth/index.d.ts +10 -0
  285. package/dist/routes/oauth/index.d.ts.map +1 -1
  286. package/dist/routes/oauth/revoke/post.d.ts.map +1 -1
  287. package/dist/routes/oauth/revoke/post.js +10 -2
  288. package/dist/routes/oauth/revoke/post.js.map +1 -1
  289. package/dist/routes/oauth/token/post.d.ts.map +1 -1
  290. package/dist/routes/oauth/token/post.js +69 -57
  291. package/dist/routes/oauth/token/post.js.map +1 -1
  292. package/dist/schemas/error.d.ts +75 -0
  293. package/dist/schemas/error.d.ts.map +1 -1
  294. package/dist/schemas/error.js +3 -0
  295. package/dist/schemas/error.js.map +1 -1
  296. package/dist/schemas/field.d.ts.map +1 -1
  297. package/dist/schemas/field.js +3 -0
  298. package/dist/schemas/field.js.map +1 -1
  299. package/dist/seeders/config.seeder.d.ts +1 -1
  300. package/dist/seeders/config.seeder.d.ts.map +1 -1
  301. package/dist/seeders/config.seeder.js +100 -36
  302. package/dist/seeders/config.seeder.js.map +1 -1
  303. package/dist/services/admin-console.service.d.ts.map +1 -1
  304. package/dist/services/admin-console.service.js +137 -100
  305. package/dist/services/admin-console.service.js.map +1 -1
  306. package/dist/services/auth-budget.service.d.ts +6 -0
  307. package/dist/services/auth-budget.service.d.ts.map +1 -0
  308. package/dist/services/auth-budget.service.js +30 -0
  309. package/dist/services/auth-budget.service.js.map +1 -0
  310. package/dist/services/authentication-epoch.d.ts +5 -0
  311. package/dist/services/authentication-epoch.d.ts.map +1 -0
  312. package/dist/services/authentication-epoch.js +22 -0
  313. package/dist/services/authentication-epoch.js.map +1 -0
  314. package/dist/services/authorization-browser.service.d.ts +18 -0
  315. package/dist/services/authorization-browser.service.d.ts.map +1 -0
  316. package/dist/services/authorization-browser.service.js +28 -0
  317. package/dist/services/authorization-browser.service.js.map +1 -0
  318. package/dist/services/browser-security.service.d.ts +14 -0
  319. package/dist/services/browser-security.service.d.ts.map +1 -0
  320. package/dist/services/browser-security.service.js +85 -0
  321. package/dist/services/browser-security.service.js.map +1 -0
  322. package/dist/services/browser-session.service.d.ts +25 -0
  323. package/dist/services/browser-session.service.d.ts.map +1 -0
  324. package/dist/services/browser-session.service.js +102 -0
  325. package/dist/services/browser-session.service.js.map +1 -0
  326. package/dist/services/cleanup.service.d.ts +1 -0
  327. package/dist/services/cleanup.service.d.ts.map +1 -1
  328. package/dist/services/cleanup.service.js +31 -0
  329. package/dist/services/cleanup.service.js.map +1 -1
  330. package/dist/services/client-security.d.ts +641 -0
  331. package/dist/services/client-security.d.ts.map +1 -0
  332. package/dist/services/client-security.js +10 -0
  333. package/dist/services/client-security.js.map +1 -0
  334. package/dist/services/container.d.ts +2 -0
  335. package/dist/services/container.d.ts.map +1 -1
  336. package/dist/services/container.js +6 -2
  337. package/dist/services/container.js.map +1 -1
  338. package/dist/services/email.service.d.ts +2 -14
  339. package/dist/services/email.service.d.ts.map +1 -1
  340. package/dist/services/email.service.js +35 -29
  341. package/dist/services/email.service.js.map +1 -1
  342. package/dist/services/jwt.service.d.ts +1 -0
  343. package/dist/services/jwt.service.d.ts.map +1 -1
  344. package/dist/services/jwt.service.js +13 -1
  345. package/dist/services/jwt.service.js.map +1 -1
  346. package/dist/services/mail-queue.service.d.ts +24 -0
  347. package/dist/services/mail-queue.service.d.ts.map +1 -0
  348. package/dist/services/mail-queue.service.js +223 -0
  349. package/dist/services/mail-queue.service.js.map +1 -0
  350. package/dist/services/mikro.service.d.ts.map +1 -1
  351. package/dist/services/mikro.service.js +2 -0
  352. package/dist/services/mikro.service.js.map +1 -1
  353. package/dist/services/oauth-authorize.service.d.ts +3 -0
  354. package/dist/services/oauth-authorize.service.d.ts.map +1 -1
  355. package/dist/services/oauth-authorize.service.js +131 -101
  356. package/dist/services/oauth-authorize.service.js.map +1 -1
  357. package/dist/services/oauth-browser-security.service.d.ts +7 -0
  358. package/dist/services/oauth-browser-security.service.d.ts.map +1 -0
  359. package/dist/services/oauth-browser-security.service.js +67 -0
  360. package/dist/services/oauth-browser-security.service.js.map +1 -0
  361. package/dist/services/oauth-client.service.d.ts +24 -1
  362. package/dist/services/oauth-client.service.d.ts.map +1 -1
  363. package/dist/services/oauth-client.service.js +52 -13
  364. package/dist/services/oauth-client.service.js.map +1 -1
  365. package/dist/services/oauth-connect.service.d.ts +37 -3
  366. package/dist/services/oauth-connect.service.d.ts.map +1 -1
  367. package/dist/services/oauth-connect.service.js +236 -212
  368. package/dist/services/oauth-connect.service.js.map +1 -1
  369. package/dist/services/oauth-token.service.d.ts +6 -4
  370. package/dist/services/oauth-token.service.d.ts.map +1 -1
  371. package/dist/services/oauth-token.service.js +295 -209
  372. package/dist/services/oauth-token.service.js.map +1 -1
  373. package/dist/services/passkey.service.d.ts +26 -7
  374. package/dist/services/passkey.service.d.ts.map +1 -1
  375. package/dist/services/passkey.service.js +71 -42
  376. package/dist/services/passkey.service.js.map +1 -1
  377. package/dist/services/password-auth.service.d.ts +5 -1
  378. package/dist/services/password-auth.service.d.ts.map +1 -1
  379. package/dist/services/password-auth.service.js +79 -52
  380. package/dist/services/password-auth.service.js.map +1 -1
  381. package/dist/services/password-reset.service.d.ts.map +1 -1
  382. package/dist/services/password-reset.service.js +34 -15
  383. package/dist/services/password-reset.service.js.map +1 -1
  384. package/dist/services/security.service.d.ts +3 -1
  385. package/dist/services/security.service.d.ts.map +1 -1
  386. package/dist/services/security.service.js +11 -2
  387. package/dist/services/security.service.js.map +1 -1
  388. package/dist/services/terms-policy.service.d.ts +7 -0
  389. package/dist/services/terms-policy.service.d.ts.map +1 -0
  390. package/dist/services/terms-policy.service.js +26 -0
  391. package/dist/services/terms-policy.service.js.map +1 -0
  392. package/dist/services/totp.service.d.ts +4 -5
  393. package/dist/services/totp.service.d.ts.map +1 -1
  394. package/dist/services/totp.service.js +116 -86
  395. package/dist/services/totp.service.js.map +1 -1
  396. package/dist/services/user-security.service.d.ts +15 -0
  397. package/dist/services/user-security.service.d.ts.map +1 -0
  398. package/dist/services/user-security.service.js +57 -0
  399. package/dist/services/user-security.service.js.map +1 -0
  400. package/dist/services/user.service.d.ts +6 -4
  401. package/dist/services/user.service.d.ts.map +1 -1
  402. package/dist/services/user.service.js +143 -121
  403. package/dist/services/user.service.js.map +1 -1
  404. package/frontend/client/assets/{auth-layout-BedWIZ7L.js → auth-layout-sea6nww4.js} +1 -1
  405. package/frontend/client/assets/{auth-page-header-C6Z6Air-.js → auth-page-header-CV85AJLW.js} +1 -1
  406. package/frontend/client/assets/document-navigation-FZbb5ldf.js +1 -0
  407. package/frontend/client/assets/i18n-vfKY-byx.js +1 -0
  408. package/frontend/client/assets/{language-selector-CeLHnp1n.js → language-selector-Jso2cQNI.js} +1 -1
  409. package/frontend/client/assets/manifest-90703545.js +1 -0
  410. package/frontend/client/assets/{passkey-Bkqvhjwb.js → passkey-CJhT-7yO.js} +1 -1
  411. package/frontend/client/assets/{promise-CepnkPDw.js → promise-BP9iSIs-.js} +1 -1
  412. package/frontend/client/assets/{root-CM8lJbh5.js → root-BkavuloG.js} +1 -1
  413. package/frontend/client/assets/{route-Y1_yJKhW.js → route-B0udr9eT.js} +1 -1
  414. package/frontend/client/assets/{route-CdPHVY9W.js → route-B3Uv9aTa.js} +1 -1
  415. package/frontend/client/assets/{route-CF1S7UUy.js → route-B6hIfgxz.js} +1 -1
  416. package/frontend/client/assets/{route-BcXtt6V2.js → route-BEWds2g-.js} +1 -1
  417. package/frontend/client/assets/route-Bm9LsorH.js +1 -0
  418. package/frontend/client/assets/route-Btv5Y69z.js +1 -0
  419. package/frontend/client/assets/route-BvyDzziE.js +1 -0
  420. package/frontend/client/assets/route-C6kG9u7j.js +1 -0
  421. package/frontend/client/assets/{route-1rid8j-3.js → route-C7C3Z0vI.js} +1 -1
  422. package/frontend/client/assets/{route-DphbGk_G.js → route-CVyefM3x.js} +1 -1
  423. package/frontend/client/assets/{route-DZvCkU11.js → route-CXth2Wqz.js} +1 -1
  424. package/frontend/client/assets/route-D0IqOurp.js +1 -0
  425. package/frontend/client/assets/route-DHmYUnJR.js +1 -0
  426. package/frontend/client/assets/route-DTjZQ_Fl.js +1 -0
  427. package/frontend/client/assets/route-D_dTeu1b.js +1 -0
  428. package/frontend/client/assets/{route-DkoXJmYM.js → route-Dj8gVemC.js} +1 -1
  429. package/frontend/client/assets/{route-DrtpzI6u.js → route-DnhPlHOi.js} +1 -1
  430. package/frontend/client/assets/route-FY92YQhF.js +1 -0
  431. package/frontend/client/assets/{route-CKiun7AR.js → route-PcLpZHbT.js} +1 -1
  432. package/frontend/client/assets/{route-BwhQptmx.js → route-qpE7i22X.js} +1 -1
  433. package/frontend/client/assets/{route-HA9dma-h.js → route-wK89gmoS.js} +1 -1
  434. package/frontend/client/assets/security-error-message-CMsTsiWf.js +1 -0
  435. package/frontend/client/assets/{shell-header-bar-CjPlfRKT.js → shell-header-bar-DRx10tE5.js} +1 -1
  436. package/frontend/client/assets/{terms-BGJD_l_i.js → terms-Bu9Itxxs.js} +1 -1
  437. package/frontend/client/assets/{use-totp-setup-Cwuds2tR.js → use-totp-setup-CoOXWOcT.js} +1 -1
  438. package/frontend/server/assets/{hydration-B63_G0fd.js → hydration-DWMjpNav.js} +1 -1
  439. package/frontend/server/assets/{root-loader.server-DUIBlg_3.js → root-loader.server-B4OqoLGG.js} +3 -3
  440. package/frontend/server/assets/{route-runtime.server-DiqwWb8W.js → route-runtime.server-03_pjVDT.js} +1 -1
  441. package/frontend/server/assets/{session-BaAt7WMI.js → session-sJkmzJie.js} +36 -24
  442. package/frontend/server/index.js +239 -193
  443. package/package.json +1 -1
  444. package/frontend/client/assets/document-navigation-Cnp3Alf0.js +0 -1
  445. package/frontend/client/assets/i18n-Dzv9HKFm.js +0 -1
  446. package/frontend/client/assets/manifest-71025d92.js +0 -1
  447. package/frontend/client/assets/route-B4jDMFTW.js +0 -1
  448. package/frontend/client/assets/route-C-DecXPL.js +0 -1
  449. package/frontend/client/assets/route-CGTMMDiX.js +0 -1
  450. package/frontend/client/assets/route-CMJbXiDe.js +0 -1
  451. package/frontend/client/assets/route-DBpAiakW.js +0 -1
  452. package/frontend/client/assets/route-DS92RKs5.js +0 -1
  453. package/frontend/client/assets/route-Dc6G2aDX.js +0 -1
  454. package/frontend/client/assets/route-DqAmRSJE.js +0 -1
  455. package/frontend/client/assets/route-Ezzcj26w.js +0 -1
@@ -1,4 +1,5 @@
1
1
  import { e } from '../schemas/error.js';
2
+ import { withUserSecurity } from './user-security.service.js';
2
3
  export class PasswordResetService {
3
4
  mikro;
4
5
  passwordAuthService;
@@ -11,11 +12,14 @@ export class PasswordResetService {
11
12
  * Invalidates all previous unused tokens
12
13
  */
13
14
  async generateToken(params) {
14
- const token = await this.mikro.passwordReset.generateToken({
15
- userSub: params.userSub,
16
- expiresInHours: params.expiresInHours || 1,
15
+ return withUserSecurity(this.mikro, params.userSub, async (user) => {
16
+ const token = await this.mikro.passwordReset.generateToken({
17
+ userSub: params.userSub,
18
+ userEpoch: user.token_epoch,
19
+ expiresInHours: params.expiresInHours || 1,
20
+ });
21
+ return token;
17
22
  });
18
- return token;
19
23
  }
20
24
  /**
21
25
  * Request password reset for an email
@@ -37,18 +41,33 @@ export class PasswordResetService {
37
41
  * Verifies token and updates user password
38
42
  */
39
43
  async resetPassword(params) {
40
- const resetEntity = await this.mikro.passwordReset.verifyToken(params.token);
41
- if (!resetEntity) {
42
- throw new e.InvalidPasswordResetToken.Error();
43
- }
44
- const user = await resetEntity.user.loadOrFail({
45
- failHandler: () => new e.UserNotFound.Error(),
44
+ const candidate = await this.mikro.passwordReset.findOne({
45
+ token: params.token,
46
+ used: false,
47
+ revoked_at: null,
48
+ expiresAt: { $gt: new Date() },
46
49
  });
47
- if (user.managed_by === 'config') {
48
- throw new e.UserNotEditable.Error();
49
- }
50
- await this.passwordAuthService.replacePassword(user, params.password);
51
- return user;
50
+ if (!candidate)
51
+ throw new e.InvalidPasswordResetToken.Error();
52
+ return withUserSecurity(this.mikro, candidate.user.sub, async (freshUser) => {
53
+ if (freshUser.deleted_at ||
54
+ candidate.user_epoch !== freshUser.token_epoch)
55
+ throw new e.InvalidPasswordResetToken.Error();
56
+ const resetEntity = await this.mikro.passwordReset.verifyToken(params.token);
57
+ if (!resetEntity) {
58
+ throw new e.InvalidPasswordResetToken.Error();
59
+ }
60
+ const user = await resetEntity.user.loadOrFail({
61
+ failHandler: () => new e.UserNotFound.Error(),
62
+ });
63
+ if (user.deleted_at)
64
+ throw new e.InvalidPasswordResetToken.Error();
65
+ if (user.managed_by === 'config') {
66
+ throw new e.UserNotEditable.Error();
67
+ }
68
+ await this.passwordAuthService.replacePassword(user, params.password);
69
+ return user;
70
+ }, { includeDeleted: true });
52
71
  }
53
72
  }
54
73
  //# sourceMappingURL=password-reset.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"password-reset.service.js","sourceRoot":"","sources":["../../src/services/password-reset.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AAIxC,MAAM,OAAO,oBAAoB;IACd,KAAK,CAAe;IACpB,mBAAmB,CAAsB;IAC1D,YACE,KAAmB,EACnB,mBAAwC;QAExC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,MAGnB;QACC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC;YACzD,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,oBAAoB,CACxB,KAAa;QAEb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAC9C,EAAE,KAAK,EAAE,EACT;YACE,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE;SAC9C,CACF,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAE5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,MAGnB;QACC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAC5D,MAAM,CAAC,KAAK,CACb,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE;SAC9C,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEtE,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
1
+ {"version":3,"file":"password-reset.service.js","sourceRoot":"","sources":["../../src/services/password-reset.service.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import type { IssuaryRuntimeConfig } from '../lib/config/index.ts';
2
- export type OpaquePurpose = 'oauth-code' | 'oauth-device-code' | 'oauth-device-user-code' | 'totp-recovery';
2
+ export type OpaquePurpose = 'oauth-client-authentication' | 'oauth-code' | 'oauth-device-code' | 'oauth-device-user-code' | 'totp-recovery' | 'auth-budget' | 'mail-queue';
3
3
  export declare class SecurityService {
4
4
  private readonly hashMasterSecret;
5
5
  private readonly pbkdf2Iterations;
6
6
  private readonly purposeKeyCache;
7
7
  constructor(config: IssuaryRuntimeConfig);
8
+ sealMailPayload(payload: string): Promise<string>;
9
+ openMailPayload(payload: string): Promise<string | null>;
8
10
  private resolvePurposeKey;
9
11
  private hashPbkdf2Secret;
10
12
  private verifyPbkdf2Secret;
@@ -1 +1 @@
1
- {"version":3,"file":"security.service.d.ts","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAmBnE,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,mBAAmB,GACnB,wBAAwB,GACxB,eAAe,CAAC;AAepB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;IAE1E,YAAmB,MAAM,EAAE,oBAAoB,EAQ9C;YAEa,iBAAiB;YAiBjB,gBAAgB;YAyBhB,kBAAkB;IAyBnB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3D;IAEY,cAAc,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAElB;IAEY,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;IAEY,kBAAkB,CAC7B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAElB;IAEY,eAAe,CAC1B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CASjB;CACF"}
1
+ {"version":3,"file":"security.service.d.ts","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAqBnE,MAAM,MAAM,aAAa,GACrB,6BAA6B,GAC7B,YAAY,GACZ,mBAAmB,GACnB,wBAAwB,GACxB,eAAe,GACf,aAAa,GACb,YAAY,CAAC;AAkBjB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;IAE1E,YAAmB,MAAM,EAAE,oBAAoB,EAQ9C;IAEY,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7D;IACY,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKpE;YAEa,iBAAiB;YAiBjB,gBAAgB;YAyBhB,kBAAkB;IAyBnB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3D;IAEY,cAAc,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAElB;IAEY,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;IAEY,kBAAkB,CAC7B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAElB;IAEY,eAAe,CAC1B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CASjB;CACF"}
@@ -1,5 +1,5 @@
1
- import { fromBase64Url } from '../lib/base64url.js';
2
- import { derivePbkdf2Bytes, derivePurposeKeyBytes, formatOpaqueHash, formatPbkdf2Hash, getRandomBytes, parsePbkdf2Hash, signOpaqueValue, timingSafeEqualBytes, } from '../lib/crypto.js';
1
+ import { bytesToHex, fromBase64Url } from '../lib/base64url.js';
2
+ import { decrypt, derivePbkdf2Bytes, derivePurposeKeyBytes, encrypt, formatOpaqueHash, formatPbkdf2Hash, getRandomBytes, parsePbkdf2Hash, signOpaqueValue, timingSafeEqualBytes, } from '../lib/crypto.js';
3
3
  const PBKDF2_ALGORITHM = 'pbkdf2-sha256';
4
4
  const HMAC_ALGORITHM = 'hmac-sha256';
5
5
  const CURRENT_HASH_FORMAT_VERSION = 2;
@@ -11,9 +11,12 @@ const HASH_POLICY = {
11
11
  password: 'password-v2',
12
12
  'client-secret': 'client-secret-v2',
13
13
  'oauth-code': 'oauth-code-v2',
14
+ 'oauth-client-authentication': 'oauth-client-authentication-v1',
14
15
  'oauth-device-code': 'oauth-device-code-v2',
15
16
  'oauth-device-user-code': 'oauth-device-user-code-v2',
16
17
  'totp-recovery': 'totp-recovery-v2',
18
+ 'auth-budget': 'auth-budget-v1',
19
+ 'mail-queue': 'mail-queue-v1',
17
20
  },
18
21
  };
19
22
  export class SecurityService {
@@ -28,6 +31,12 @@ export class SecurityService {
28
31
  this.hashMasterSecret = decodedSecret;
29
32
  this.pbkdf2Iterations = config.security.pbkdf2_iterations;
30
33
  }
34
+ async sealMailPayload(payload) {
35
+ return encrypt(payload, bytesToHex(await this.resolvePurposeKey('mail-queue')));
36
+ }
37
+ async openMailPayload(payload) {
38
+ return decrypt(payload, bytesToHex(await this.resolvePurposeKey('mail-queue')));
39
+ }
31
40
  async resolvePurposeKey(purpose) {
32
41
  const cached = this.purposeKeyCache.get(purpose);
33
42
  if (cached) {
@@ -1 +1 @@
1
- {"version":3,"file":"security.service.js","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.service.js","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,qBAAqB,EACrB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,gBAAgB,GAAG,eAAe,CAAC;AACzC,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AACtC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAapC,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,qBAAqB;IAC9B,aAAa,EAAE;QACb,QAAQ,EAAE,aAAa;QACvB,eAAe,EAAE,kBAAkB;QACnC,YAAY,EAAE,eAAe;QAC7B,6BAA6B,EAAE,gCAAgC;QAC/D,mBAAmB,EAAE,sBAAsB;QAC3C,wBAAwB,EAAE,2BAA2B;QACrD,eAAe,EAAE,kBAAkB;QACnC,aAAa,EAAE,gBAAgB;QAC/B,YAAY,EAAE,eAAe;KACI;CACpC,CAAC;AAEF,MAAM,OAAO,eAAe;IACT,gBAAgB,CAAa;IAC7B,gBAAgB,CAAS;IACzB,eAAe,GAAG,IAAI,GAAG,EAA+B,CAAC;IAE1E,YAAmB,MAA4B;QAC7C,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,aAAa,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC5D,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAAe;QAC1C,OAAO,OAAO,CACZ,OAAO,EACP,UAAU,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CACvD,CAAC;IACJ,CAAC;IACM,KAAK,CAAC,eAAe,CAAC,OAAe;QAC1C,OAAO,OAAO,CACZ,OAAO,EACP,UAAU,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CACvD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,OAAgB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,qBAAqB,CACtC,UAAU,CAAC,MAAM,EACjB,IAAI,CAAC,gBAAgB,EACrB,WAAW,CAAC,OAAO,EACnB,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,EAClC,wBAAwB,CACzB,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,OAAsB,EACtB,MAAc;QAEd,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,MAAM,EACN,UAAU,EACV,MAAM,EACN,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,wBAAwB,CACzB,CAAC;QAEF,OAAO,gBAAgB,CAAC;YACtB,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,2BAA2B;YACpC,UAAU,EAAE,IAAI,CAAC,gBAAgB;YACjC,IAAI;YACJ,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,OAAsB,EACtB,IAAY,EACZ,MAAc;QAEd,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAEvD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,2BAA2B,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CACrC,MAAM,EACN,UAAU,EACV,MAAM,EACN,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,UAAU,EACjB,wBAAwB,CACzB,CAAC;QAEF,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,QAAgB;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,IAAY,EACZ,QAAgB;QAEhB,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QAChD,OAAO,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAC7B,IAAY,EACZ,YAAoB;QAEpB,OAAO,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACtE,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,OAAsB,EACtB,KAAa;QAEb,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,gBAAgB,CAAC;YACtB,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,2BAA2B;YACpC,MAAM;SACP,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { type EntityManager } from '@mikro-orm/core';
2
+ export type TermsPolicyAccess = 'read' | 'write';
3
+ /** Initialize before serving requests, even when config seeding is disabled. */
4
+ export declare function initializeTermsPolicy(em: EntityManager): Promise<void>;
5
+ /** Acquire before user/session/client locks; the transaction owns its lifetime. */
6
+ export declare function lockTermsPolicy(em: EntityManager, access: TermsPolicyAccess): Promise<void>;
7
+ //# sourceMappingURL=terms-policy.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terms-policy.service.d.ts","sourceRoot":"","sources":["../../src/services/terms-policy.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAKpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,gFAAgF;AAChF,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5E;AAED,mFAAmF;AACnF,wBAAsB,eAAe,CACnC,EAAE,EAAE,aAAa,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -0,0 +1,26 @@
1
+ import { LockMode, raw } from '@mikro-orm/core';
2
+ import { PostgreSqlPlatform } from '@mikro-orm/postgresql';
3
+ import { BootstrapStateEntitySchema } from '../entities/bootstrap-state.entity.js';
4
+ const TERMS_POLICY_LOCK = 'terms-policy-lock';
5
+ /** Initialize before serving requests, even when config seeding is disabled. */
6
+ export async function initializeTermsPolicy(em) {
7
+ await em.upsert(BootstrapStateEntitySchema, { id: TERMS_POLICY_LOCK, value: '1' }, { onConflictFields: ['id'], onConflictAction: 'ignore' });
8
+ }
9
+ /** Acquire before user/session/client locks; the transaction owns its lifetime. */
10
+ export async function lockTermsPolicy(em, access) {
11
+ if (!em.isInTransaction())
12
+ throw new Error('Terms policy requires a transaction');
13
+ if (em.getPlatform() instanceof PostgreSqlPlatform) {
14
+ await em.findOneOrFail(BootstrapStateEntitySchema, { id: TERMS_POLICY_LOCK }, {
15
+ refresh: true,
16
+ lockMode: access === 'read'
17
+ ? LockMode.PESSIMISTIC_READ
18
+ : LockMode.PESSIMISTIC_WRITE,
19
+ });
20
+ return;
21
+ }
22
+ const changed = await em.nativeUpdate(BootstrapStateEntitySchema, { id: TERMS_POLICY_LOCK }, { value: raw('value') });
23
+ if (changed !== 1)
24
+ throw new Error('Terms policy lock is not initialized');
25
+ }
26
+ //# sourceMappingURL=terms-policy.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terms-policy.service.js","sourceRoot":"","sources":["../../src/services/terms-policy.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAEnF,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAG9C,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAiB;IAC3D,MAAM,EAAE,CAAC,MAAM,CACb,0BAA0B,EAC1B,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,EACrC,EAAE,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CACzD,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAiB,EACjB,MAAyB;IAEzB,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,kBAAkB,EAAE,CAAC;QACnD,MAAM,EAAE,CAAC,aAAa,CACpB,0BAA0B,EAC1B,EAAE,EAAE,EAAE,iBAAiB,EAAE,EACzB;YACE,OAAO,EAAE,IAAI;YACb,QAAQ,EACN,MAAM,KAAK,MAAM;gBACf,CAAC,CAAC,QAAQ,CAAC,gBAAgB;gBAC3B,CAAC,CAAC,QAAQ,CAAC,iBAAiB;SACjC,CACF,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CACnC,0BAA0B,EAC1B,EAAE,EAAE,EAAE,iBAAiB,EAAE,EACzB,EAAE,KAAK,EAAE,GAAG,CAAS,OAAO,CAAC,EAAE,CAChC,CAAC;IACF,IAAI,OAAO,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC7E,CAAC"}
@@ -35,6 +35,7 @@ export declare class TotpService {
35
35
  * Verify a TOTP token against a secret
36
36
  */
37
37
  verifyToken(token: string, secret: string): boolean;
38
+ private consumeToken;
38
39
  /**
39
40
  * Generate a TOTP token for a secret (used for testing)
40
41
  */
@@ -43,7 +44,8 @@ export declare class TotpService {
43
44
  * Start TOTP setup for a user
44
45
  * Creates or updates unverified TOTP record
45
46
  */
46
- startSetup(user: UserEntity): Promise<TotpSetupData>;
47
+ prepareSetup(user: UserEntity): Promise<TotpSetupData>;
48
+ startSetup(user: UserEntity, prepared?: TotpSetupData): Promise<TotpSetupData>;
47
49
  /**
48
50
  * Verify and complete TOTP setup.
49
51
  * Also generates recovery codes upon successful verification.
@@ -60,10 +62,7 @@ export declare class TotpService {
60
62
  * Disable TOTP for a user
61
63
  * Also deletes all recovery codes
62
64
  */
63
- disable(userId: string, token: string, options: {
64
- secondFactorRequired: boolean;
65
- hasOtherSecondFactor: boolean;
66
- }): Promise<void>;
65
+ disable(userId: string, token: string): Promise<void>;
67
66
  verifyForAuth(userId: string, token: string): Promise<void>;
68
67
  /**
69
68
  * Generate a single recovery code in the format XXXX-XXXX-XXXX-XXXX.
@@ -1 +1 @@
1
- {"version":3,"file":"totp.service.d.ts","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,YACE,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,oBAAoB,EAC5B,eAAe,EAAE,eAAe,EAKjC;IAED;;OAEG;IACI,cAAc,IAAI,MAAM,CAE9B;IAED;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ/D;IAED;;OAEG;IACU,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/D;IAED;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUzD;IAED;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3C;IAED;;;OAGG;IACU,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAiChE;IAED;;;;;OAKG;IACU,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BzE;IAED;;;OAGG;IACU,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYvD;IAED;;;OAGG;IACU,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QACP,oBAAoB,EAAE,OAAO,CAAC;QAC9B,oBAAoB,EAAE,OAAO,CAAC;KAC/B,GACA,OAAO,CAAC,IAAI,CAAC,CAiBf;IAEY,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;IAED;;OAEG;IACI,0BAA0B,IAAI,MAAM,CAe1C;IAED;;;;;OAKG;IACU,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BtE;IAED;;;OAGG;IACU,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC3E;IAEY,uBAAuB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;CACF"}
1
+ {"version":3,"file":"totp.service.d.ts","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,YACE,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,oBAAoB,EAC5B,eAAe,EAAE,eAAe,EAKjC;IAED;;OAEG;IACI,cAAc,IAAI,MAAM,CAE9B;IAED;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ/D;IAED;;OAEG;IACU,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/D;IAED;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUzD;YAEa,YAAY;IAyB1B;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3C;IAED;;;OAGG;IACU,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAMlE;IAEY,UAAU,CACrB,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,aAAa,CAAC,CAoCxB;IAED;;;;;OAKG;IACU,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BzE;IAED;;;OAGG;IACU,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvD;IAED;;;OAGG;IACU,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjE;IAEY,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;IAED;;OAEG;IACI,0BAA0B,IAAI,MAAM,CAe1C;IAED;;;;;OAKG;IACU,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BtE;IAED;;;OAGG;IACU,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3E;IAEY,uBAAuB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB;CACF"}
@@ -2,6 +2,7 @@ import { generateSecret, generateSync, generateURI, verifySync } from 'otplib';
2
2
  import qrcode from 'qrcode';
3
3
  import { getRandomBytes } from '../lib/crypto.js';
4
4
  import { e } from '../schemas/error.js';
5
+ import { withUserSecurity } from './user-security.service.js';
5
6
  /** Number of recovery codes to generate */
6
7
  const RECOVERY_CODE_COUNT = 8;
7
8
  const RECOVERY_CODE_ALPHABET = 'ABCDEFGHJKMNPQRSTVWXYZ23456789';
@@ -54,6 +55,25 @@ export class TotpService {
54
55
  throw new e.InvalidTotpCode.Error();
55
56
  }
56
57
  }
58
+ async consumeToken(token, totp) {
59
+ const result = verifySync({
60
+ token,
61
+ secret: totp.secret,
62
+ epochTolerance: 1,
63
+ });
64
+ if (!result.valid || !('timeStep' in result))
65
+ throw new e.InvalidTotpCode.Error();
66
+ const changed = await this.mikro.userTotp.nativeUpdate({
67
+ id: totp.id,
68
+ secret: totp.secret,
69
+ $or: [
70
+ { last_used_step: null },
71
+ { last_used_step: { $lt: result.timeStep } },
72
+ ],
73
+ }, { last_used_step: result.timeStep });
74
+ if (changed !== 1)
75
+ throw new e.InvalidTotpCode.Error();
76
+ }
57
77
  /**
58
78
  * Generate a TOTP token for a secret (used for testing)
59
79
  */
@@ -64,34 +84,42 @@ export class TotpService {
64
84
  * Start TOTP setup for a user
65
85
  * Creates or updates unverified TOTP record
66
86
  */
67
- async startSetup(user) {
68
- const existingTotp = await this.mikro.userTotp.findByUserSub(user.sub);
69
- // Only throw if TOTP is fully registered (verified AND recovery confirmed)
70
- // If user verified but didn't confirm recovery codes, allow re-setup
71
- if (existingTotp?.verified && existingTotp?.recovery_confirmed) {
72
- throw new e.TotpAlreadyEnabled.Error();
73
- }
87
+ async prepareSetup(user) {
74
88
  const secret = this.generateSecret();
75
89
  const otpauthUrl = this.generateOtpAuthUrl(user.email, secret);
76
90
  const qrCodeDataUrl = await this.generateQrCode(otpauthUrl);
77
- // If there's an existing unverified TOTP, delete it first to avoid
78
- // unique constraint violation (handles race conditions and retries)
79
- if (existingTotp) {
80
- await this.mikro.userTotp.nativeDelete({ user: { sub: user.sub } });
81
- this.mikro.em.clear();
82
- }
83
- // Create new TOTP record
84
- const totp = this.mikro.userTotp.create({
85
- user: user.sub,
86
- secret: secret,
91
+ return { secret, otpauthUrl, qrCodeDataUrl };
92
+ }
93
+ async startSetup(user, prepared) {
94
+ const { secret, otpauthUrl, qrCodeDataUrl } = prepared ?? (await this.prepareSetup(user));
95
+ return withUserSecurity(this.mikro, user.sub, async (freshUser) => {
96
+ user = freshUser;
97
+ const existingTotp = await this.mikro.userTotp.findByUserSub(user.sub);
98
+ // Only throw if TOTP is fully registered (verified AND recovery confirmed)
99
+ // If user verified but didn't confirm recovery codes, allow re-setup
100
+ if (existingTotp?.verified && existingTotp?.recovery_confirmed) {
101
+ throw new e.TotpAlreadyEnabled.Error();
102
+ }
103
+ // If there's an existing unverified TOTP, delete it first to avoid
104
+ // unique constraint violation (handles race conditions and retries)
105
+ if (existingTotp) {
106
+ await this.mikro.userTotp.nativeDelete({ user: { sub: user.sub } });
107
+ this.mikro.em.clear();
108
+ }
109
+ await this.mikro.userTotpRecoveryCode.deleteByUserSub(user.sub);
110
+ // Create new TOTP record
111
+ const totp = this.mikro.userTotp.create({
112
+ user: user.sub,
113
+ secret: secret,
114
+ });
115
+ this.mikro.em.persist(totp);
116
+ await this.mikro.em.flush();
117
+ return {
118
+ secret,
119
+ otpauthUrl,
120
+ qrCodeDataUrl,
121
+ };
87
122
  });
88
- this.mikro.em.persist(totp);
89
- await this.mikro.em.flush();
90
- return {
91
- secret,
92
- otpauthUrl,
93
- qrCodeDataUrl,
94
- };
95
123
  }
96
124
  /**
97
125
  * Verify and complete TOTP setup.
@@ -100,70 +128,74 @@ export class TotpService {
100
128
  * @returns Array of plain-text recovery codes (shown only once)
101
129
  */
102
130
  async verifySetup(userId, token) {
103
- const totp = await this.mikro.userTotp.findByUserSub(userId);
104
- if (!totp) {
105
- throw new e.TotpNotSetup.Error();
106
- }
107
- // Only throw if TOTP is fully registered (verified AND recovery confirmed)
108
- // If user verified but didn't confirm recovery codes, allow re-verification
109
- if (totp.verified && totp.recovery_confirmed) {
110
- throw new e.TotpAlreadyEnabled.Error();
111
- }
112
- if (!this.verifyToken(token, totp.secret)) {
113
- throw new e.InvalidTotpCode.Error();
114
- }
115
- // Flush verified status before generating recovery codes,
116
- // because generateRecoveryCodes calls em.clear() which
117
- // would discard the pending verified change.
118
- totp.verified = true;
119
- await this.mikro.em.flush();
120
- // Generate recovery codes on TOTP setup completion
121
- const user = await this.mikro.user.findOneOrFail({
122
- sub: userId,
131
+ return withUserSecurity(this.mikro, userId, async () => {
132
+ const totp = await this.mikro.userTotp.findByUserSub(userId);
133
+ if (!totp) {
134
+ throw new e.TotpNotSetup.Error();
135
+ }
136
+ // Only throw if TOTP is fully registered (verified AND recovery confirmed)
137
+ // If user verified but didn't confirm recovery codes, allow re-verification
138
+ if (totp.verified && totp.recovery_confirmed) {
139
+ throw new e.TotpAlreadyEnabled.Error();
140
+ }
141
+ await this.consumeToken(token, totp);
142
+ // Flush verified status before generating recovery codes,
143
+ // because generateRecoveryCodes calls em.clear() which
144
+ // would discard the pending verified change.
145
+ totp.verified = true;
146
+ await this.mikro.em.flush();
147
+ // Generate recovery codes on TOTP setup completion
148
+ const user = await this.mikro.user.findOneOrFail({
149
+ sub: userId,
150
+ });
151
+ const recoveryCodes = await this.generateRecoveryCodes(user);
152
+ return recoveryCodes;
123
153
  });
124
- const recoveryCodes = await this.generateRecoveryCodes(user);
125
- return recoveryCodes;
126
154
  }
127
155
  /**
128
156
  * Confirm TOTP setup by acknowledging recovery codes.
129
157
  * This marks the TOTP setup as fully complete.
130
158
  */
131
159
  async confirmSetup(userId) {
132
- const totp = await this.mikro.userTotp.findVerifiedByUserSub(userId);
133
- if (!totp) {
134
- throw new e.TotpNotSetup.Error();
135
- }
136
- if (totp.recovery_confirmed) {
137
- throw new e.TotpAlreadyEnabled.Error();
138
- }
139
- totp.recovery_confirmed = true;
140
- await this.mikro.em.flush();
160
+ return withUserSecurity(this.mikro, userId, async () => {
161
+ const totp = await this.mikro.userTotp.findVerifiedByUserSub(userId);
162
+ if (!totp) {
163
+ throw new e.TotpNotSetup.Error();
164
+ }
165
+ if (totp.recovery_confirmed) {
166
+ throw new e.TotpAlreadyEnabled.Error();
167
+ }
168
+ totp.recovery_confirmed = true;
169
+ await this.mikro.em.flush();
170
+ });
141
171
  }
142
172
  /**
143
173
  * Disable TOTP for a user
144
174
  * Also deletes all recovery codes
145
175
  */
146
- async disable(userId, token, options) {
147
- const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
148
- if (!totp) {
149
- throw new e.TotpNotEnabled.Error();
150
- }
151
- if (!this.verifyToken(token, totp.secret)) {
152
- throw new e.InvalidTotpCode.Error();
153
- }
154
- // Prevent disabling TOTP when 2FA is required and no other 2FA method exists
155
- if (options.secondFactorRequired && !options.hasOtherSecondFactor) {
156
- throw new e.CannotRemoveLastSecondFactor.Error();
157
- }
158
- await this.mikro.userTotp.deleteByUserSub(userId);
159
- await this.mikro.userTotpRecoveryCode.deleteByUserSub(userId);
176
+ async disable(userId, token) {
177
+ return withUserSecurity(this.mikro, userId, async () => {
178
+ const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
179
+ if (!totp) {
180
+ throw new e.TotpNotEnabled.Error();
181
+ }
182
+ await this.consumeToken(token, totp);
183
+ // Prevent disabling TOTP when 2FA is required and no other 2FA method exists
184
+ if (this.config.auth.password.two_factor.enrollment_required &&
185
+ !(this.config.auth.passkey.enabled &&
186
+ (await this.mikro.userPasskey.countByUserSub(userId)) > 0)) {
187
+ throw new e.CannotRemoveLastSecondFactor.Error();
188
+ }
189
+ await this.mikro.userTotp.deleteByUserSub(userId);
190
+ await this.mikro.userTotpRecoveryCode.deleteByUserSub(userId);
191
+ });
160
192
  }
161
193
  async verifyForAuth(userId, token) {
162
194
  const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
163
195
  if (!totp) {
164
196
  throw new e.TotpNotEnabled.Error();
165
197
  }
166
- this.verifyToken(token, totp.secret);
198
+ await this.consumeToken(token, totp);
167
199
  }
168
200
  /**
169
201
  * Generate a single recovery code in the format XXXX-XXXX-XXXX-XXXX.
@@ -219,26 +251,24 @@ export class TotpService {
219
251
  throw new e.NoRecoveryCodesAvailable.Error();
220
252
  }
221
253
  const codeHash = await this.securityService.hashOpaqueToken('totp-recovery', normalizedCode);
222
- const recoveryCode = await this.mikro.userTotpRecoveryCode.findUnusedByUserSubAndCodeHash(userId, codeHash);
223
- if (!recoveryCode) {
254
+ const consumed = await this.mikro.userTotpRecoveryCode.nativeUpdate({ user: userId, code_hash: codeHash, used: false }, { used: true, used_at: new Date() });
255
+ if (consumed !== 1)
224
256
  throw new e.InvalidRecoveryCode.Error();
225
- }
226
- recoveryCode.used = true;
227
- recoveryCode.used_at = new Date();
228
- await this.mikro.em.flush();
229
257
  }
230
258
  async regenerateRecoveryCodes(userId, token) {
231
- const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
232
- if (!totp) {
233
- throw new e.TotpNotEnabled.Error();
234
- }
235
- this.verifyToken(token, totp.secret);
236
- const user = await this.mikro.user.findOneOrFail({
237
- sub: userId,
238
- }, {
239
- failHandler: () => new e.UserNotFound.Error(),
259
+ return withUserSecurity(this.mikro, userId, async () => {
260
+ const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
261
+ if (!totp) {
262
+ throw new e.TotpNotEnabled.Error();
263
+ }
264
+ await this.consumeToken(token, totp);
265
+ const user = await this.mikro.user.findOneOrFail({
266
+ sub: userId,
267
+ }, {
268
+ failHandler: () => new e.UserNotFound.Error(),
269
+ });
270
+ return this.generateRecoveryCodes(user);
240
271
  });
241
- return this.generateRecoveryCodes(user);
242
272
  }
243
273
  }
244
274
  //# sourceMappingURL=totp.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"totp.service.js","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AAiBxC,2CAA2C;AAC3C,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,sBAAsB,GAAG,gCAAgC,CAAC;AAChE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAErC,MAAM,OAAO,WAAW;IACL,KAAK,CAAe;IACpB,MAAM,CAAuB;IAC7B,eAAe,CAAkB;IAClD,YACE,KAAmB,EACnB,MAA4B,EAC5B,eAAgC;QAEhC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,cAAc;QACnB,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,KAAa,EAAE,MAAc;QACrD,OAAO,WAAW,CAAC;YACjB,MAAM,EACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM;gBACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK;YACZ,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAC,UAAkB;QAC5C,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,KAAa,EAAE,MAAc;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YACtC,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,MAAc;QACjC,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,UAAU,CAAC,IAAgB;QACtC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvE,2EAA2E;QAC3E,qEAAqE;QACrE,IAAI,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,kBAAkB,EAAE,CAAC;YAC/D,MAAM,IAAI,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAE5D,mEAAmE;QACnE,oEAAoE;QACpE,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,yBAAyB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtC,IAAI,EAAE,IAAI,CAAC,GAAG;YACd,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAE5B,OAAO;YACL,MAAM;YACN,UAAU;YACV,aAAa;SACd,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,KAAa;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC;QAED,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,0DAA0D;QAC1D,uDAAuD;QACvD,6CAA6C;QAC7C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAE5B,mDAAmD;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;YAC/C,GAAG,EAAE,MAAM;SACZ,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE7D,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,YAAY,CAAC,MAAc;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,OAAO,CAClB,MAAc,EACd,KAAa,EACb,OAGC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,6EAA6E;QAC7E,IAAI,OAAO,CAAC,oBAAoB,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAClE,MAAM,IAAI,CAAC,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;QACnD,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,KAAa;QACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,0BAA0B;QAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;aAC3B,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,GAAG,sBAAsB,CAAC,MAAM,CAAC,CACvE;aACA,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,KAAK,CAAC,IAAI,CACf,EAAE,MAAM,EAAE,oBAAoB,GAAG,0BAA0B,EAAE,EAC7D,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CACX,IAAI,CAAC,KAAK,CACR,KAAK,GAAG,0BAA0B,EAClC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,0BAA0B,CACzC,CACJ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,qBAAqB,CAAC,IAAgB;QACjD,qCAAqC;QACrC,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAEtB,4CAA4C;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;YACpD,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QAEH,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CACzD,eAAe,EACf,IAAI,CACL,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC;gBACpD,IAAI,EAAE,SAAS,CAAC,GAAG;gBACnB,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAE5B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,kBAAkB,CAAC,MAAc,EAAE,IAAY;QAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1C,sDAAsD;QACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,eAAe,GACnB,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAErE,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CACzD,eAAe,EACf,cAAc,CACf,CAAC;QACF,MAAM,YAAY,GAChB,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,8BAA8B,CAClE,MAAM,EACN,QAAQ,CACT,CAAC;QAEJ,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAC1C,CAAC;QAED,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,YAAY,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,MAAc,EACd,KAAa;QAEb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAC9C;YACE,GAAG,EAAE,MAAM;SACZ,EACD;YACE,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE;SAC9C,CACF,CAAC;QAEF,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF"}
1
+ {"version":3,"file":"totp.service.js","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { UserEntity } from '../entities/user.entity.js';
2
+ import type { IssuaryRuntimeConfig } from '../lib/config/index.js';
3
+ import type { MikroService } from './mikro.service.js';
4
+ export declare function isSecurityConflict(error: unknown): boolean;
5
+ /** The write precedes every policy read, including on SQLite's deferred transactions. */
6
+ export declare function withUserSecurity<T>(mikro: MikroService, sub: string, operation: (user: UserEntity) => Promise<T>, options?: {
7
+ includeDeleted?: boolean;
8
+ }): Promise<T>;
9
+ export declare function authenticationMethods(mikro: MikroService, config: IssuaryRuntimeConfig, user: UserEntity): Promise<{
10
+ oauth: number;
11
+ passkeys: number;
12
+ totp: boolean;
13
+ password: boolean;
14
+ }>;
15
+ //# sourceMappingURL=user-security.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-security.service.d.ts","sourceRoot":"","sources":["../../src/services/user-security.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgB1D;AAED,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3C,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,UAAU;;;;;GAuBjB"}