@nauth-toolkit/core 0.1.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 (778) hide show
  1. package/dist/adapters/database-columns.d.ts +10 -0
  2. package/dist/adapters/database-columns.d.ts.map +1 -0
  3. package/dist/adapters/database-columns.js +85 -0
  4. package/dist/adapters/database-columns.js.map +1 -0
  5. package/dist/adapters/express.adapter.d.ts +41 -0
  6. package/dist/adapters/express.adapter.d.ts.map +1 -0
  7. package/dist/adapters/express.adapter.js +188 -0
  8. package/dist/adapters/express.adapter.js.map +1 -0
  9. package/dist/adapters/fastify.adapter.d.ts +33 -0
  10. package/dist/adapters/fastify.adapter.d.ts.map +1 -0
  11. package/dist/adapters/fastify.adapter.js +223 -0
  12. package/dist/adapters/fastify.adapter.js.map +1 -0
  13. package/dist/adapters/index.d.ts +5 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +25 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/storage.factory.d.ts +7 -0
  18. package/dist/adapters/storage.factory.d.ts.map +1 -0
  19. package/dist/adapters/storage.factory.js +24 -0
  20. package/dist/adapters/storage.factory.js.map +1 -0
  21. package/dist/bootstrap.d.ts +41 -0
  22. package/dist/bootstrap.d.ts.map +1 -0
  23. package/dist/bootstrap.js +113 -0
  24. package/dist/bootstrap.js.map +1 -0
  25. package/dist/dto/auth-challenge.dto.d.ts +19 -0
  26. package/dist/dto/auth-challenge.dto.d.ts.map +1 -0
  27. package/dist/dto/auth-challenge.dto.js +86 -0
  28. package/dist/dto/auth-challenge.dto.js.map +1 -0
  29. package/dist/dto/auth-response.dto.d.ts +31 -0
  30. package/dist/dto/auth-response.dto.d.ts.map +1 -0
  31. package/dist/dto/auth-response.dto.js +18 -0
  32. package/dist/dto/auth-response.dto.js.map +1 -0
  33. package/dist/dto/challenge-response.dto.d.ts +36 -0
  34. package/dist/dto/challenge-response.dto.d.ts.map +1 -0
  35. package/dist/dto/challenge-response.dto.js +3 -0
  36. package/dist/dto/challenge-response.dto.js.map +1 -0
  37. package/dist/dto/change-password-request.dto.d.ts +5 -0
  38. package/dist/dto/change-password-request.dto.d.ts.map +1 -0
  39. package/dist/dto/change-password-request.dto.js +30 -0
  40. package/dist/dto/change-password-request.dto.js.map +1 -0
  41. package/dist/dto/change-password-response.dto.d.ts +4 -0
  42. package/dist/dto/change-password-response.dto.d.ts.map +1 -0
  43. package/dist/dto/change-password-response.dto.js +8 -0
  44. package/dist/dto/change-password-response.dto.js.map +1 -0
  45. package/dist/dto/change-password.dto.d.ts +5 -0
  46. package/dist/dto/change-password.dto.d.ts.map +1 -0
  47. package/dist/dto/change-password.dto.js +29 -0
  48. package/dist/dto/change-password.dto.js.map +1 -0
  49. package/dist/dto/error-response.dto.d.ts +9 -0
  50. package/dist/dto/error-response.dto.d.ts.map +1 -0
  51. package/dist/dto/error-response.dto.js +59 -0
  52. package/dist/dto/error-response.dto.js.map +1 -0
  53. package/dist/dto/get-available-methods.dto.d.ts +7 -0
  54. package/dist/dto/get-available-methods.dto.d.ts.map +1 -0
  55. package/dist/dto/get-available-methods.dto.js +33 -0
  56. package/dist/dto/get-available-methods.dto.js.map +1 -0
  57. package/dist/dto/get-challenge-data-response.dto.d.ts +4 -0
  58. package/dist/dto/get-challenge-data-response.dto.d.ts.map +1 -0
  59. package/dist/dto/get-challenge-data-response.dto.js +8 -0
  60. package/dist/dto/get-challenge-data-response.dto.js.map +1 -0
  61. package/dist/dto/get-challenge-data.dto.d.ts +8 -0
  62. package/dist/dto/get-challenge-data.dto.d.ts.map +1 -0
  63. package/dist/dto/get-challenge-data.dto.js +40 -0
  64. package/dist/dto/get-challenge-data.dto.js.map +1 -0
  65. package/dist/dto/get-client-info.dto.d.ts +17 -0
  66. package/dist/dto/get-client-info.dto.d.ts.map +1 -0
  67. package/dist/dto/get-client-info.dto.js +20 -0
  68. package/dist/dto/get-client-info.dto.js.map +1 -0
  69. package/dist/dto/get-device-token-response.dto.d.ts +4 -0
  70. package/dist/dto/get-device-token-response.dto.d.ts.map +1 -0
  71. package/dist/dto/get-device-token-response.dto.js +8 -0
  72. package/dist/dto/get-device-token-response.dto.js.map +1 -0
  73. package/dist/dto/get-events-by-type.dto.d.ts +17 -0
  74. package/dist/dto/get-events-by-type.dto.d.ts.map +1 -0
  75. package/dist/dto/get-events-by-type.dto.js +20 -0
  76. package/dist/dto/get-events-by-type.dto.js.map +1 -0
  77. package/dist/dto/get-ip-address-response.dto.d.ts +4 -0
  78. package/dist/dto/get-ip-address-response.dto.d.ts.map +1 -0
  79. package/dist/dto/get-ip-address-response.dto.js +8 -0
  80. package/dist/dto/get-ip-address-response.dto.js.map +1 -0
  81. package/dist/dto/get-mfa-status.dto.d.ts +16 -0
  82. package/dist/dto/get-mfa-status.dto.d.ts.map +1 -0
  83. package/dist/dto/get-mfa-status.dto.js +41 -0
  84. package/dist/dto/get-mfa-status.dto.js.map +1 -0
  85. package/dist/dto/get-risk-assessment-history.dto.d.ts +9 -0
  86. package/dist/dto/get-risk-assessment-history.dto.d.ts.map +1 -0
  87. package/dist/dto/get-risk-assessment-history.dto.js +13 -0
  88. package/dist/dto/get-risk-assessment-history.dto.js.map +1 -0
  89. package/dist/dto/get-session-id-response.dto.d.ts +4 -0
  90. package/dist/dto/get-session-id-response.dto.d.ts.map +1 -0
  91. package/dist/dto/get-session-id-response.dto.js +8 -0
  92. package/dist/dto/get-session-id-response.dto.js.map +1 -0
  93. package/dist/dto/get-setup-data-response.dto.d.ts +4 -0
  94. package/dist/dto/get-setup-data-response.dto.d.ts.map +1 -0
  95. package/dist/dto/get-setup-data-response.dto.js +8 -0
  96. package/dist/dto/get-setup-data-response.dto.js.map +1 -0
  97. package/dist/dto/get-setup-data.dto.d.ts +7 -0
  98. package/dist/dto/get-setup-data.dto.d.ts.map +1 -0
  99. package/dist/dto/get-setup-data.dto.js +43 -0
  100. package/dist/dto/get-setup-data.dto.js.map +1 -0
  101. package/dist/dto/get-suspicious-activity.dto.d.ts +9 -0
  102. package/dist/dto/get-suspicious-activity.dto.d.ts.map +1 -0
  103. package/dist/dto/get-suspicious-activity.dto.js +13 -0
  104. package/dist/dto/get-suspicious-activity.dto.js.map +1 -0
  105. package/dist/dto/get-user-agent-response.dto.d.ts +4 -0
  106. package/dist/dto/get-user-agent-response.dto.d.ts.map +1 -0
  107. package/dist/dto/get-user-agent-response.dto.js +8 -0
  108. package/dist/dto/get-user-agent-response.dto.js.map +1 -0
  109. package/dist/dto/get-user-auth-history.dto.d.ts +20 -0
  110. package/dist/dto/get-user-auth-history.dto.d.ts.map +1 -0
  111. package/dist/dto/get-user-auth-history.dto.js +22 -0
  112. package/dist/dto/get-user-auth-history.dto.js.map +1 -0
  113. package/dist/dto/get-user-by-email.dto.d.ts +5 -0
  114. package/dist/dto/get-user-by-email.dto.d.ts.map +1 -0
  115. package/dist/dto/get-user-by-email.dto.js +36 -0
  116. package/dist/dto/get-user-by-email.dto.js.map +1 -0
  117. package/dist/dto/get-user-by-id.dto.d.ts +4 -0
  118. package/dist/dto/get-user-by-id.dto.d.ts.map +1 -0
  119. package/dist/dto/get-user-by-id.dto.js +29 -0
  120. package/dist/dto/get-user-by-id.dto.js.map +1 -0
  121. package/dist/dto/get-user-devices.dto.d.ts +8 -0
  122. package/dist/dto/get-user-devices.dto.d.ts.map +1 -0
  123. package/dist/dto/get-user-devices.dto.js +33 -0
  124. package/dist/dto/get-user-devices.dto.js.map +1 -0
  125. package/dist/dto/get-user-response.dto.d.ts +2 -0
  126. package/dist/dto/get-user-response.dto.d.ts.map +1 -0
  127. package/dist/dto/get-user-response.dto.js +6 -0
  128. package/dist/dto/get-user-response.dto.js.map +1 -0
  129. package/dist/dto/has-provider.dto.d.ts +7 -0
  130. package/dist/dto/has-provider.dto.d.ts.map +1 -0
  131. package/dist/dto/has-provider.dto.js +38 -0
  132. package/dist/dto/has-provider.dto.js.map +1 -0
  133. package/dist/dto/index.d.ts +51 -0
  134. package/dist/dto/index.d.ts.map +1 -0
  135. package/dist/dto/index.js +67 -0
  136. package/dist/dto/index.js.map +1 -0
  137. package/dist/dto/is-trusted-device-response.dto.d.ts +4 -0
  138. package/dist/dto/is-trusted-device-response.dto.d.ts.map +1 -0
  139. package/dist/dto/is-trusted-device-response.dto.js +8 -0
  140. package/dist/dto/is-trusted-device-response.dto.js.map +1 -0
  141. package/dist/dto/list-providers-response.dto.d.ts +4 -0
  142. package/dist/dto/list-providers-response.dto.d.ts.map +1 -0
  143. package/dist/dto/list-providers-response.dto.js +8 -0
  144. package/dist/dto/list-providers-response.dto.js.map +1 -0
  145. package/dist/dto/login.dto.d.ts +7 -0
  146. package/dist/dto/login.dto.d.ts.map +1 -0
  147. package/dist/dto/login.dto.js +68 -0
  148. package/dist/dto/login.dto.js.map +1 -0
  149. package/dist/dto/logout-all-response.dto.d.ts +4 -0
  150. package/dist/dto/logout-all-response.dto.d.ts.map +1 -0
  151. package/dist/dto/logout-all-response.dto.js +8 -0
  152. package/dist/dto/logout-all-response.dto.js.map +1 -0
  153. package/dist/dto/logout-all.dto.d.ts +5 -0
  154. package/dist/dto/logout-all.dto.d.ts.map +1 -0
  155. package/dist/dto/logout-all.dto.js +42 -0
  156. package/dist/dto/logout-all.dto.js.map +1 -0
  157. package/dist/dto/logout-response.dto.d.ts +4 -0
  158. package/dist/dto/logout-response.dto.d.ts.map +1 -0
  159. package/dist/dto/logout-response.dto.js +8 -0
  160. package/dist/dto/logout-response.dto.js.map +1 -0
  161. package/dist/dto/logout.dto.d.ts +5 -0
  162. package/dist/dto/logout.dto.d.ts.map +1 -0
  163. package/dist/dto/logout.dto.js +36 -0
  164. package/dist/dto/logout.dto.js.map +1 -0
  165. package/dist/dto/refresh-token.dto.d.ts +4 -0
  166. package/dist/dto/refresh-token.dto.d.ts.map +1 -0
  167. package/dist/dto/refresh-token.dto.js +24 -0
  168. package/dist/dto/refresh-token.dto.js.map +1 -0
  169. package/dist/dto/remove-devices.dto.d.ts +9 -0
  170. package/dist/dto/remove-devices.dto.d.ts.map +1 -0
  171. package/dist/dto/remove-devices.dto.js +50 -0
  172. package/dist/dto/remove-devices.dto.js.map +1 -0
  173. package/dist/dto/resend-code-response.dto.d.ts +4 -0
  174. package/dist/dto/resend-code-response.dto.d.ts.map +1 -0
  175. package/dist/dto/resend-code-response.dto.js +8 -0
  176. package/dist/dto/resend-code-response.dto.js.map +1 -0
  177. package/dist/dto/resend-code.dto.d.ts +4 -0
  178. package/dist/dto/resend-code.dto.d.ts.map +1 -0
  179. package/dist/dto/resend-code.dto.js +29 -0
  180. package/dist/dto/resend-code.dto.js.map +1 -0
  181. package/dist/dto/reset-password.dto.d.ts +8 -0
  182. package/dist/dto/reset-password.dto.d.ts.map +1 -0
  183. package/dist/dto/reset-password.dto.js +61 -0
  184. package/dist/dto/reset-password.dto.js.map +1 -0
  185. package/dist/dto/respond-challenge.dto.d.ts +33 -0
  186. package/dist/dto/respond-challenge.dto.d.ts.map +1 -0
  187. package/dist/dto/respond-challenge.dto.js +131 -0
  188. package/dist/dto/respond-challenge.dto.js.map +1 -0
  189. package/dist/dto/set-mfa-exemption.dto.d.ts +12 -0
  190. package/dist/dto/set-mfa-exemption.dto.d.ts.map +1 -0
  191. package/dist/dto/set-mfa-exemption.dto.js +66 -0
  192. package/dist/dto/set-mfa-exemption.dto.js.map +1 -0
  193. package/dist/dto/set-must-change-password-response.dto.d.ts +4 -0
  194. package/dist/dto/set-must-change-password-response.dto.d.ts.map +1 -0
  195. package/dist/dto/set-must-change-password-response.dto.js +8 -0
  196. package/dist/dto/set-must-change-password-response.dto.js.map +1 -0
  197. package/dist/dto/set-must-change-password.dto.d.ts +4 -0
  198. package/dist/dto/set-must-change-password.dto.d.ts.map +1 -0
  199. package/dist/dto/set-must-change-password.dto.js +29 -0
  200. package/dist/dto/set-must-change-password.dto.js.map +1 -0
  201. package/dist/dto/set-preferred-method.dto.d.ts +8 -0
  202. package/dist/dto/set-preferred-method.dto.d.ts.map +1 -0
  203. package/dist/dto/set-preferred-method.dto.js +49 -0
  204. package/dist/dto/set-preferred-method.dto.js.map +1 -0
  205. package/dist/dto/setup-mfa.dto.d.ts +9 -0
  206. package/dist/dto/setup-mfa.dto.d.ts.map +1 -0
  207. package/dist/dto/setup-mfa.dto.js +55 -0
  208. package/dist/dto/setup-mfa.dto.js.map +1 -0
  209. package/dist/dto/signup.dto.d.ts +10 -0
  210. package/dist/dto/signup.dto.d.ts.map +1 -0
  211. package/dist/dto/signup.dto.js +109 -0
  212. package/dist/dto/signup.dto.js.map +1 -0
  213. package/dist/dto/social-auth.dto.d.ts +54 -0
  214. package/dist/dto/social-auth.dto.d.ts.map +1 -0
  215. package/dist/dto/social-auth.dto.js +232 -0
  216. package/dist/dto/social-auth.dto.js.map +1 -0
  217. package/dist/dto/trust-device-response.dto.d.ts +4 -0
  218. package/dist/dto/trust-device-response.dto.d.ts.map +1 -0
  219. package/dist/dto/trust-device-response.dto.js +8 -0
  220. package/dist/dto/trust-device-response.dto.js.map +1 -0
  221. package/dist/dto/trust-device.dto.d.ts +1 -0
  222. package/dist/dto/trust-device.dto.d.ts.map +1 -0
  223. package/dist/dto/trust-device.dto.js +2 -0
  224. package/dist/dto/trust-device.dto.js.map +1 -0
  225. package/dist/dto/update-user-attributes-request.dto.d.ts +5 -0
  226. package/dist/dto/update-user-attributes-request.dto.d.ts.map +1 -0
  227. package/dist/dto/update-user-attributes-request.dto.js +30 -0
  228. package/dist/dto/update-user-attributes-request.dto.js.map +1 -0
  229. package/dist/dto/user-response.dto.d.ts +20 -0
  230. package/dist/dto/user-response.dto.d.ts.map +1 -0
  231. package/dist/dto/user-response.dto.js +42 -0
  232. package/dist/dto/user-response.dto.js.map +1 -0
  233. package/dist/dto/user-update.dto.d.ts +12 -0
  234. package/dist/dto/user-update.dto.d.ts.map +1 -0
  235. package/dist/dto/user-update.dto.js +119 -0
  236. package/dist/dto/user-update.dto.js.map +1 -0
  237. package/dist/dto/verify-email.dto.d.ts +29 -0
  238. package/dist/dto/verify-email.dto.d.ts.map +1 -0
  239. package/dist/dto/verify-email.dto.js +161 -0
  240. package/dist/dto/verify-email.dto.js.map +1 -0
  241. package/dist/dto/verify-mfa-code.dto.d.ts +10 -0
  242. package/dist/dto/verify-mfa-code.dto.d.ts.map +1 -0
  243. package/dist/dto/verify-mfa-code.dto.js +56 -0
  244. package/dist/dto/verify-mfa-code.dto.js.map +1 -0
  245. package/dist/dto/verify-phone-by-sub.dto.d.ts +6 -0
  246. package/dist/dto/verify-phone-by-sub.dto.d.ts.map +1 -0
  247. package/dist/dto/verify-phone-by-sub.dto.js +49 -0
  248. package/dist/dto/verify-phone-by-sub.dto.js.map +1 -0
  249. package/dist/dto/verify-phone.dto.d.ts +24 -0
  250. package/dist/dto/verify-phone.dto.d.ts.map +1 -0
  251. package/dist/dto/verify-phone.dto.js +124 -0
  252. package/dist/dto/verify-phone.dto.js.map +1 -0
  253. package/dist/entities/auth-audit.entity.d.ts +31 -0
  254. package/dist/entities/auth-audit.entity.d.ts.map +1 -0
  255. package/dist/entities/auth-audit.entity.js +33 -0
  256. package/dist/entities/auth-audit.entity.js.map +1 -0
  257. package/dist/entities/challenge-session.entity.d.ts +17 -0
  258. package/dist/entities/challenge-session.entity.d.ts.map +1 -0
  259. package/dist/entities/challenge-session.entity.js +21 -0
  260. package/dist/entities/challenge-session.entity.js.map +1 -0
  261. package/dist/entities/index.d.ts +12 -0
  262. package/dist/entities/index.d.ts.map +1 -0
  263. package/dist/entities/index.js +26 -0
  264. package/dist/entities/index.js.map +1 -0
  265. package/dist/entities/login-attempt.entity.d.ts +13 -0
  266. package/dist/entities/login-attempt.entity.d.ts.map +1 -0
  267. package/dist/entities/login-attempt.entity.js +17 -0
  268. package/dist/entities/login-attempt.entity.js.map +1 -0
  269. package/dist/entities/mfa-device.entity.d.ts +22 -0
  270. package/dist/entities/mfa-device.entity.d.ts.map +1 -0
  271. package/dist/entities/mfa-device.entity.js +25 -0
  272. package/dist/entities/mfa-device.entity.js.map +1 -0
  273. package/dist/entities/rate-limit.entity.d.ts +9 -0
  274. package/dist/entities/rate-limit.entity.d.ts.map +1 -0
  275. package/dist/entities/rate-limit.entity.js +13 -0
  276. package/dist/entities/rate-limit.entity.js.map +1 -0
  277. package/dist/entities/session.entity.d.ts +32 -0
  278. package/dist/entities/session.entity.d.ts.map +1 -0
  279. package/dist/entities/session.entity.js +36 -0
  280. package/dist/entities/session.entity.js.map +1 -0
  281. package/dist/entities/social-account.entity.d.ts +13 -0
  282. package/dist/entities/social-account.entity.d.ts.map +1 -0
  283. package/dist/entities/social-account.entity.js +17 -0
  284. package/dist/entities/social-account.entity.js.map +1 -0
  285. package/dist/entities/storage-lock.entity.d.ts +8 -0
  286. package/dist/entities/storage-lock.entity.d.ts.map +1 -0
  287. package/dist/entities/storage-lock.entity.js +12 -0
  288. package/dist/entities/storage-lock.entity.js.map +1 -0
  289. package/dist/entities/trusted-device.entity.d.ts +17 -0
  290. package/dist/entities/trusted-device.entity.d.ts.map +1 -0
  291. package/dist/entities/trusted-device.entity.js +21 -0
  292. package/dist/entities/trusted-device.entity.js.map +1 -0
  293. package/dist/entities/user.entity.d.ts +41 -0
  294. package/dist/entities/user.entity.d.ts.map +1 -0
  295. package/dist/entities/user.entity.js +45 -0
  296. package/dist/entities/user.entity.js.map +1 -0
  297. package/dist/entities/verification-token.entity.d.ts +19 -0
  298. package/dist/entities/verification-token.entity.d.ts.map +1 -0
  299. package/dist/entities/verification-token.entity.js +29 -0
  300. package/dist/entities/verification-token.entity.js.map +1 -0
  301. package/dist/enums/auth-audit-event-type.enum.d.ts +55 -0
  302. package/dist/enums/auth-audit-event-type.enum.d.ts.map +1 -0
  303. package/dist/enums/auth-audit-event-type.enum.js +59 -0
  304. package/dist/enums/auth-audit-event-type.enum.js.map +1 -0
  305. package/dist/enums/error-codes.enum.d.ts +53 -0
  306. package/dist/enums/error-codes.enum.d.ts.map +1 -0
  307. package/dist/enums/error-codes.enum.js +57 -0
  308. package/dist/enums/error-codes.enum.js.map +1 -0
  309. package/dist/enums/mfa-method.enum.d.ts +11 -0
  310. package/dist/enums/mfa-method.enum.d.ts.map +1 -0
  311. package/dist/enums/mfa-method.enum.js +18 -0
  312. package/dist/enums/mfa-method.enum.js.map +1 -0
  313. package/dist/enums/risk-factor.enum.d.ts +14 -0
  314. package/dist/enums/risk-factor.enum.d.ts.map +1 -0
  315. package/dist/enums/risk-factor.enum.js +18 -0
  316. package/dist/enums/risk-factor.enum.js.map +1 -0
  317. package/dist/exceptions/nauth.exception.d.ts +18 -0
  318. package/dist/exceptions/nauth.exception.d.ts.map +1 -0
  319. package/dist/exceptions/nauth.exception.js +64 -0
  320. package/dist/exceptions/nauth.exception.js.map +1 -0
  321. package/dist/handlers/auth.handler.d.ts +18 -0
  322. package/dist/handlers/auth.handler.d.ts.map +1 -0
  323. package/dist/handlers/auth.handler.js +173 -0
  324. package/dist/handlers/auth.handler.js.map +1 -0
  325. package/dist/handlers/client-info.handler.d.ts +12 -0
  326. package/dist/handlers/client-info.handler.d.ts.map +1 -0
  327. package/dist/handlers/client-info.handler.js +61 -0
  328. package/dist/handlers/client-info.handler.js.map +1 -0
  329. package/dist/handlers/csrf.handler.d.ts +13 -0
  330. package/dist/handlers/csrf.handler.d.ts.map +1 -0
  331. package/dist/handlers/csrf.handler.js +84 -0
  332. package/dist/handlers/csrf.handler.js.map +1 -0
  333. package/dist/handlers/token-delivery.handler.d.ts +12 -0
  334. package/dist/handlers/token-delivery.handler.d.ts.map +1 -0
  335. package/dist/handlers/token-delivery.handler.js +86 -0
  336. package/dist/handlers/token-delivery.handler.js.map +1 -0
  337. package/dist/index.d.ts +27 -0
  338. package/dist/index.d.ts.map +1 -0
  339. package/dist/index.js +51 -0
  340. package/dist/index.js.map +1 -0
  341. package/dist/interfaces/client-info.interface.d.ts +16 -0
  342. package/dist/interfaces/client-info.interface.d.ts.map +1 -0
  343. package/dist/interfaces/client-info.interface.js +3 -0
  344. package/dist/interfaces/client-info.interface.js.map +1 -0
  345. package/dist/interfaces/config.interface.d.ts +279 -0
  346. package/dist/interfaces/config.interface.d.ts.map +1 -0
  347. package/dist/interfaces/config.interface.js +3 -0
  348. package/dist/interfaces/config.interface.js.map +1 -0
  349. package/dist/interfaces/entities.interface.d.ts +169 -0
  350. package/dist/interfaces/entities.interface.d.ts.map +1 -0
  351. package/dist/interfaces/entities.interface.js +3 -0
  352. package/dist/interfaces/entities.interface.js.map +1 -0
  353. package/dist/interfaces/index.d.ts +11 -0
  354. package/dist/interfaces/index.d.ts.map +1 -0
  355. package/dist/interfaces/index.js +27 -0
  356. package/dist/interfaces/index.js.map +1 -0
  357. package/dist/interfaces/logger.interface.d.ts +43 -0
  358. package/dist/interfaces/logger.interface.d.ts.map +1 -0
  359. package/dist/interfaces/logger.interface.js +12 -0
  360. package/dist/interfaces/logger.interface.js.map +1 -0
  361. package/dist/interfaces/mfa-provider.interface.d.ts +12 -0
  362. package/dist/interfaces/mfa-provider.interface.d.ts.map +1 -0
  363. package/dist/interfaces/mfa-provider.interface.js +3 -0
  364. package/dist/interfaces/mfa-provider.interface.js.map +1 -0
  365. package/dist/interfaces/oauth.interface.d.ts +24 -0
  366. package/dist/interfaces/oauth.interface.d.ts.map +1 -0
  367. package/dist/interfaces/oauth.interface.js +3 -0
  368. package/dist/interfaces/oauth.interface.js.map +1 -0
  369. package/dist/interfaces/provider.interface.d.ts +12 -0
  370. package/dist/interfaces/provider.interface.d.ts.map +1 -0
  371. package/dist/interfaces/provider.interface.js +3 -0
  372. package/dist/interfaces/provider.interface.js.map +1 -0
  373. package/dist/interfaces/social-auth-provider.interface.d.ts +13 -0
  374. package/dist/interfaces/social-auth-provider.interface.d.ts.map +1 -0
  375. package/dist/interfaces/social-auth-provider.interface.js +3 -0
  376. package/dist/interfaces/social-auth-provider.interface.js.map +1 -0
  377. package/dist/interfaces/storage-adapter.interface.d.ts +39 -0
  378. package/dist/interfaces/storage-adapter.interface.d.ts.map +1 -0
  379. package/dist/interfaces/storage-adapter.interface.js +3 -0
  380. package/dist/interfaces/storage-adapter.interface.js.map +1 -0
  381. package/dist/interfaces/template.interface.d.ts +99 -0
  382. package/dist/interfaces/template.interface.d.ts.map +1 -0
  383. package/dist/interfaces/template.interface.js +15 -0
  384. package/dist/interfaces/template.interface.js.map +1 -0
  385. package/dist/interfaces/token-verifier.interface.d.ts +7 -0
  386. package/dist/interfaces/token-verifier.interface.d.ts.map +1 -0
  387. package/dist/interfaces/token-verifier.interface.js +3 -0
  388. package/dist/interfaces/token-verifier.interface.js.map +1 -0
  389. package/dist/internal.d.ts +20 -0
  390. package/dist/internal.d.ts.map +1 -0
  391. package/dist/internal.js +53 -0
  392. package/dist/internal.js.map +1 -0
  393. package/dist/platform/interfaces.d.ts +56 -0
  394. package/dist/platform/interfaces.d.ts.map +1 -0
  395. package/dist/platform/interfaces.js +3 -0
  396. package/dist/platform/interfaces.js.map +1 -0
  397. package/dist/schemas/auth-config.schema.d.ts +3411 -0
  398. package/dist/schemas/auth-config.schema.d.ts.map +1 -0
  399. package/dist/schemas/auth-config.schema.js +428 -0
  400. package/dist/schemas/auth-config.schema.js.map +1 -0
  401. package/dist/services/adaptive-mfa-decision.service.d.ts +39 -0
  402. package/dist/services/adaptive-mfa-decision.service.d.ts.map +1 -0
  403. package/dist/services/adaptive-mfa-decision.service.js +223 -0
  404. package/dist/services/adaptive-mfa-decision.service.js.map +1 -0
  405. package/dist/services/auth-audit.service.d.ts +44 -0
  406. package/dist/services/auth-audit.service.d.ts.map +1 -0
  407. package/dist/services/auth-audit.service.js +241 -0
  408. package/dist/services/auth-audit.service.js.map +1 -0
  409. package/dist/services/auth-challenge-helper.service.d.ts +48 -0
  410. package/dist/services/auth-challenge-helper.service.d.ts.map +1 -0
  411. package/dist/services/auth-challenge-helper.service.js +425 -0
  412. package/dist/services/auth-challenge-helper.service.js.map +1 -0
  413. package/dist/services/auth-flow-context-builder.service.d.ts +31 -0
  414. package/dist/services/auth-flow-context-builder.service.d.ts.map +1 -0
  415. package/dist/services/auth-flow-context-builder.service.js +253 -0
  416. package/dist/services/auth-flow-context-builder.service.js.map +1 -0
  417. package/dist/services/auth-flow-rules.d.ts +18 -0
  418. package/dist/services/auth-flow-rules.d.ts.map +1 -0
  419. package/dist/services/auth-flow-rules.js +55 -0
  420. package/dist/services/auth-flow-rules.js.map +1 -0
  421. package/dist/services/auth-flow-state-definitions.d.ts +5 -0
  422. package/dist/services/auth-flow-state-definitions.d.ts.map +1 -0
  423. package/dist/services/auth-flow-state-definitions.js +87 -0
  424. package/dist/services/auth-flow-state-definitions.js.map +1 -0
  425. package/dist/services/auth-flow-state-machine.service.d.ts +17 -0
  426. package/dist/services/auth-flow-state-machine.service.d.ts.map +1 -0
  427. package/dist/services/auth-flow-state-machine.service.js +91 -0
  428. package/dist/services/auth-flow-state-machine.service.js.map +1 -0
  429. package/dist/services/auth-flow-state-machine.types.d.ts +55 -0
  430. package/dist/services/auth-flow-state-machine.types.d.ts.map +1 -0
  431. package/dist/services/auth-flow-state-machine.types.js +16 -0
  432. package/dist/services/auth-flow-state-machine.types.js.map +1 -0
  433. package/dist/services/auth.service.d.ts +87 -0
  434. package/dist/services/auth.service.d.ts.map +1 -0
  435. package/dist/services/auth.service.js +2356 -0
  436. package/dist/services/auth.service.js.map +1 -0
  437. package/dist/services/challenge.service.d.ts +32 -0
  438. package/dist/services/challenge.service.d.ts.map +1 -0
  439. package/dist/services/challenge.service.js +293 -0
  440. package/dist/services/challenge.service.js.map +1 -0
  441. package/dist/services/client-info.service.d.ts +20 -0
  442. package/dist/services/client-info.service.d.ts.map +1 -0
  443. package/dist/services/client-info.service.js +202 -0
  444. package/dist/services/client-info.service.js.map +1 -0
  445. package/dist/services/csrf.service.d.ts +13 -0
  446. package/dist/services/csrf.service.d.ts.map +1 -0
  447. package/dist/services/csrf.service.js +67 -0
  448. package/dist/services/csrf.service.js.map +1 -0
  449. package/dist/services/email-verification.service.d.ts +30 -0
  450. package/dist/services/email-verification.service.d.ts.map +1 -0
  451. package/dist/services/email-verification.service.js +373 -0
  452. package/dist/services/email-verification.service.js.map +1 -0
  453. package/dist/services/geo-location.service.d.ts +85 -0
  454. package/dist/services/geo-location.service.d.ts.map +1 -0
  455. package/dist/services/geo-location.service.js +338 -0
  456. package/dist/services/geo-location.service.js.map +1 -0
  457. package/dist/services/index.d.ts +14 -0
  458. package/dist/services/index.d.ts.map +1 -0
  459. package/dist/services/index.js +30 -0
  460. package/dist/services/index.js.map +1 -0
  461. package/dist/services/jwt.service.d.ts +62 -0
  462. package/dist/services/jwt.service.d.ts.map +1 -0
  463. package/dist/services/jwt.service.js +261 -0
  464. package/dist/services/jwt.service.js.map +1 -0
  465. package/dist/services/mfa-base.service.d.ts +37 -0
  466. package/dist/services/mfa-base.service.d.ts.map +1 -0
  467. package/dist/services/mfa-base.service.js +297 -0
  468. package/dist/services/mfa-base.service.js.map +1 -0
  469. package/dist/services/mfa.service.d.ts +35 -0
  470. package/dist/services/mfa.service.d.ts.map +1 -0
  471. package/dist/services/mfa.service.js +449 -0
  472. package/dist/services/mfa.service.js.map +1 -0
  473. package/dist/services/password.service.d.ts +19 -0
  474. package/dist/services/password.service.d.ts.map +1 -0
  475. package/dist/services/password.service.js +150 -0
  476. package/dist/services/password.service.js.map +1 -0
  477. package/dist/services/phone-verification.service.d.ts +32 -0
  478. package/dist/services/phone-verification.service.d.ts.map +1 -0
  479. package/dist/services/phone-verification.service.js +474 -0
  480. package/dist/services/phone-verification.service.js.map +1 -0
  481. package/dist/services/risk-detection.service.d.ts +30 -0
  482. package/dist/services/risk-detection.service.d.ts.map +1 -0
  483. package/dist/services/risk-detection.service.js +518 -0
  484. package/dist/services/risk-detection.service.js.map +1 -0
  485. package/dist/services/risk-scoring.service.d.ts +12 -0
  486. package/dist/services/risk-scoring.service.d.ts.map +1 -0
  487. package/dist/services/risk-scoring.service.js +44 -0
  488. package/dist/services/risk-scoring.service.js.map +1 -0
  489. package/dist/services/session.service.d.ts +64 -0
  490. package/dist/services/session.service.d.ts.map +1 -0
  491. package/dist/services/session.service.js +455 -0
  492. package/dist/services/session.service.js.map +1 -0
  493. package/dist/services/social-auth-base.service.d.ts +57 -0
  494. package/dist/services/social-auth-base.service.d.ts.map +1 -0
  495. package/dist/services/social-auth-base.service.js +340 -0
  496. package/dist/services/social-auth-base.service.js.map +1 -0
  497. package/dist/services/social-auth.service.d.ts +31 -0
  498. package/dist/services/social-auth.service.d.ts.map +1 -0
  499. package/dist/services/social-auth.service.js +172 -0
  500. package/dist/services/social-auth.service.js.map +1 -0
  501. package/dist/services/social-provider-registry.service.d.ts +9 -0
  502. package/dist/services/social-provider-registry.service.d.ts.map +1 -0
  503. package/dist/services/social-provider-registry.service.js +30 -0
  504. package/dist/services/social-provider-registry.service.js.map +1 -0
  505. package/dist/services/trusted-device.service.d.ts +29 -0
  506. package/dist/services/trusted-device.service.d.ts.map +1 -0
  507. package/dist/services/trusted-device.service.js +190 -0
  508. package/dist/services/trusted-device.service.js.map +1 -0
  509. package/dist/storage/account-lockout-storage.service.d.ts +16 -0
  510. package/dist/storage/account-lockout-storage.service.d.ts.map +1 -0
  511. package/dist/storage/account-lockout-storage.service.js +50 -0
  512. package/dist/storage/account-lockout-storage.service.js.map +1 -0
  513. package/dist/storage/index.d.ts +4 -0
  514. package/dist/storage/index.d.ts.map +1 -0
  515. package/dist/storage/index.js +20 -0
  516. package/dist/storage/index.js.map +1 -0
  517. package/dist/storage/memory-storage.adapter.d.ts +33 -0
  518. package/dist/storage/memory-storage.adapter.d.ts.map +1 -0
  519. package/dist/storage/memory-storage.adapter.js +195 -0
  520. package/dist/storage/memory-storage.adapter.js.map +1 -0
  521. package/dist/storage/rate-limit-storage.service.d.ts +11 -0
  522. package/dist/storage/rate-limit-storage.service.d.ts.map +1 -0
  523. package/dist/storage/rate-limit-storage.service.js +33 -0
  524. package/dist/storage/rate-limit-storage.service.js.map +1 -0
  525. package/dist/templates/html-template.engine.d.ts +16 -0
  526. package/dist/templates/html-template.engine.d.ts.map +1 -0
  527. package/dist/templates/html-template.engine.js +502 -0
  528. package/dist/templates/html-template.engine.js.map +1 -0
  529. package/dist/templates/index.d.ts +2 -0
  530. package/dist/templates/index.d.ts.map +1 -0
  531. package/dist/templates/index.js +18 -0
  532. package/dist/templates/index.js.map +1 -0
  533. package/dist/utils/common-passwords.d.ts +4 -0
  534. package/dist/utils/common-passwords.d.ts.map +1 -0
  535. package/dist/utils/common-passwords.js +108 -0
  536. package/dist/utils/common-passwords.js.map +1 -0
  537. package/dist/utils/context-storage.d.ts +13 -0
  538. package/dist/utils/context-storage.d.ts.map +1 -0
  539. package/dist/utils/context-storage.js +54 -0
  540. package/dist/utils/context-storage.js.map +1 -0
  541. package/dist/utils/cookie-names.util.d.ts +7 -0
  542. package/dist/utils/cookie-names.util.d.ts.map +1 -0
  543. package/dist/utils/cookie-names.util.js +30 -0
  544. package/dist/utils/cookie-names.util.js.map +1 -0
  545. package/dist/utils/cookies.util.d.ts +12 -0
  546. package/dist/utils/cookies.util.d.ts.map +1 -0
  547. package/dist/utils/cookies.util.js +48 -0
  548. package/dist/utils/cookies.util.js.map +1 -0
  549. package/dist/utils/index.d.ts +8 -0
  550. package/dist/utils/index.d.ts.map +1 -0
  551. package/dist/utils/index.js +24 -0
  552. package/dist/utils/index.js.map +1 -0
  553. package/dist/utils/ip-extractor.d.ts +12 -0
  554. package/dist/utils/ip-extractor.d.ts.map +1 -0
  555. package/dist/utils/ip-extractor.js +88 -0
  556. package/dist/utils/ip-extractor.js.map +1 -0
  557. package/dist/utils/nauth-logger.d.ts +20 -0
  558. package/dist/utils/nauth-logger.d.ts.map +1 -0
  559. package/dist/utils/nauth-logger.js +129 -0
  560. package/dist/utils/nauth-logger.js.map +1 -0
  561. package/dist/utils/pii-redactor.d.ts +16 -0
  562. package/dist/utils/pii-redactor.d.ts.map +1 -0
  563. package/dist/utils/pii-redactor.js +147 -0
  564. package/dist/utils/pii-redactor.js.map +1 -0
  565. package/dist/utils/setup/get-repositories.d.ts +16 -0
  566. package/dist/utils/setup/get-repositories.d.ts.map +1 -0
  567. package/dist/utils/setup/get-repositories.js +36 -0
  568. package/dist/utils/setup/get-repositories.js.map +1 -0
  569. package/dist/utils/setup/init-services.d.ts +41 -0
  570. package/dist/utils/setup/init-services.d.ts.map +1 -0
  571. package/dist/utils/setup/init-services.js +107 -0
  572. package/dist/utils/setup/init-services.js.map +1 -0
  573. package/dist/utils/setup/init-social.d.ts +13 -0
  574. package/dist/utils/setup/init-social.d.ts.map +1 -0
  575. package/dist/utils/setup/init-social.js +77 -0
  576. package/dist/utils/setup/init-social.js.map +1 -0
  577. package/dist/utils/setup/init-storage.d.ts +4 -0
  578. package/dist/utils/setup/init-storage.d.ts.map +1 -0
  579. package/dist/utils/setup/init-storage.js +79 -0
  580. package/dist/utils/setup/init-storage.js.map +1 -0
  581. package/dist/utils/setup/register-mfa.d.ts +5 -0
  582. package/dist/utils/setup/register-mfa.d.ts.map +1 -0
  583. package/dist/utils/setup/register-mfa.js +85 -0
  584. package/dist/utils/setup/register-mfa.js.map +1 -0
  585. package/dist/utils/setup/run-nauth-migrations.d.ts +5 -0
  586. package/dist/utils/setup/run-nauth-migrations.d.ts.map +1 -0
  587. package/dist/utils/setup/run-nauth-migrations.js +67 -0
  588. package/dist/utils/setup/run-nauth-migrations.js.map +1 -0
  589. package/dist/utils/token-delivery-policy.d.ts +6 -0
  590. package/dist/utils/token-delivery-policy.d.ts.map +1 -0
  591. package/dist/utils/token-delivery-policy.js +15 -0
  592. package/dist/utils/token-delivery-policy.js.map +1 -0
  593. package/dist/validators/template.validator.d.ts +7 -0
  594. package/dist/validators/template.validator.d.ts.map +1 -0
  595. package/dist/validators/template.validator.js +95 -0
  596. package/dist/validators/template.validator.js.map +1 -0
  597. package/jest.config.js +15 -0
  598. package/jest.setup.ts +6 -0
  599. package/package.json +73 -0
  600. package/src/adapters/database-columns.ts +165 -0
  601. package/src/adapters/express.adapter.ts +385 -0
  602. package/src/adapters/fastify.adapter.ts +416 -0
  603. package/src/adapters/index.ts +16 -0
  604. package/src/adapters/storage.factory.ts +143 -0
  605. package/src/bootstrap.ts +374 -0
  606. package/src/dto/auth-challenge.dto.ts +231 -0
  607. package/src/dto/auth-response.dto.ts +253 -0
  608. package/src/dto/challenge-response.dto.ts +234 -0
  609. package/src/dto/change-password-request.dto.ts +50 -0
  610. package/src/dto/change-password-response.dto.ts +29 -0
  611. package/src/dto/change-password.dto.ts +57 -0
  612. package/src/dto/error-response.dto.ts +136 -0
  613. package/src/dto/get-available-methods.dto.ts +55 -0
  614. package/src/dto/get-challenge-data-response.dto.ts +28 -0
  615. package/src/dto/get-challenge-data.dto.ts +69 -0
  616. package/src/dto/get-client-info.dto.ts +104 -0
  617. package/src/dto/get-device-token-response.dto.ts +25 -0
  618. package/src/dto/get-events-by-type.dto.ts +76 -0
  619. package/src/dto/get-ip-address-response.dto.ts +24 -0
  620. package/src/dto/get-mfa-status.dto.ts +94 -0
  621. package/src/dto/get-risk-assessment-history.dto.ts +39 -0
  622. package/src/dto/get-session-id-response.dto.ts +25 -0
  623. package/src/dto/get-setup-data-response.dto.ts +31 -0
  624. package/src/dto/get-setup-data.dto.ts +75 -0
  625. package/src/dto/get-suspicious-activity.dto.ts +42 -0
  626. package/src/dto/get-user-agent-response.dto.ts +23 -0
  627. package/src/dto/get-user-auth-history.dto.ts +95 -0
  628. package/src/dto/get-user-by-email.dto.ts +61 -0
  629. package/src/dto/get-user-by-id.dto.ts +46 -0
  630. package/src/dto/get-user-devices.dto.ts +53 -0
  631. package/src/dto/get-user-response.dto.ts +17 -0
  632. package/src/dto/has-provider.dto.ts +56 -0
  633. package/src/dto/index.ts +57 -0
  634. package/src/dto/is-trusted-device-response.dto.ts +34 -0
  635. package/src/dto/list-providers-response.dto.ts +23 -0
  636. package/src/dto/login.dto.ts +95 -0
  637. package/src/dto/logout-all-response.dto.ts +24 -0
  638. package/src/dto/logout-all.dto.ts +65 -0
  639. package/src/dto/logout-response.dto.ts +25 -0
  640. package/src/dto/logout.dto.ts +64 -0
  641. package/src/dto/refresh-token.dto.ts +36 -0
  642. package/src/dto/remove-devices.dto.ts +85 -0
  643. package/src/dto/resend-code-response.dto.ts +32 -0
  644. package/src/dto/resend-code.dto.ts +51 -0
  645. package/src/dto/reset-password.dto.ts +115 -0
  646. package/src/dto/respond-challenge.dto.ts +272 -0
  647. package/src/dto/set-mfa-exemption.dto.ts +112 -0
  648. package/src/dto/set-must-change-password-response.dto.ts +27 -0
  649. package/src/dto/set-must-change-password.dto.ts +46 -0
  650. package/src/dto/set-preferred-method.dto.ts +80 -0
  651. package/src/dto/setup-mfa.dto.ts +98 -0
  652. package/src/dto/signup.dto.ts +174 -0
  653. package/src/dto/social-auth.dto.ts +422 -0
  654. package/src/dto/trust-device-response.dto.ts +30 -0
  655. package/src/dto/trust-device.dto.ts +9 -0
  656. package/src/dto/update-user-attributes-request.dto.ts +51 -0
  657. package/src/dto/user-response.dto.ts +138 -0
  658. package/src/dto/user-update.dto.ts +222 -0
  659. package/src/dto/verify-email.dto.ts +313 -0
  660. package/src/dto/verify-mfa-code.dto.ts +103 -0
  661. package/src/dto/verify-phone-by-sub.dto.ts +78 -0
  662. package/src/dto/verify-phone.dto.ts +245 -0
  663. package/src/entities/auth-audit.entity.ts +232 -0
  664. package/src/entities/challenge-session.entity.ts +116 -0
  665. package/src/entities/index.ts +29 -0
  666. package/src/entities/login-attempt.entity.ts +64 -0
  667. package/src/entities/mfa-device.entity.ts +151 -0
  668. package/src/entities/rate-limit.entity.ts +44 -0
  669. package/src/entities/session.entity.ts +180 -0
  670. package/src/entities/social-account.entity.ts +96 -0
  671. package/src/entities/storage-lock.entity.ts +39 -0
  672. package/src/entities/trusted-device.entity.ts +112 -0
  673. package/src/entities/user.entity.ts +243 -0
  674. package/src/entities/verification-token.entity.ts +141 -0
  675. package/src/enums/auth-audit-event-type.enum.ts +360 -0
  676. package/src/enums/error-codes.enum.ts +420 -0
  677. package/src/enums/mfa-method.enum.ts +97 -0
  678. package/src/enums/risk-factor.enum.ts +111 -0
  679. package/src/exceptions/nauth.exception.ts +231 -0
  680. package/src/handlers/auth.handler.ts +260 -0
  681. package/src/handlers/client-info.handler.ts +101 -0
  682. package/src/handlers/csrf.handler.ts +156 -0
  683. package/src/handlers/token-delivery.handler.ts +118 -0
  684. package/src/index.ts +118 -0
  685. package/src/interfaces/client-info.interface.ts +85 -0
  686. package/src/interfaces/config.interface.ts +2135 -0
  687. package/src/interfaces/entities.interface.ts +226 -0
  688. package/src/interfaces/index.ts +15 -0
  689. package/src/interfaces/logger.interface.ts +283 -0
  690. package/src/interfaces/mfa-provider.interface.ts +154 -0
  691. package/src/interfaces/oauth.interface.ts +148 -0
  692. package/src/interfaces/provider.interface.ts +47 -0
  693. package/src/interfaces/social-auth-provider.interface.ts +131 -0
  694. package/src/interfaces/storage-adapter.interface.ts +82 -0
  695. package/src/interfaces/template.interface.ts +510 -0
  696. package/src/interfaces/token-verifier.interface.ts +110 -0
  697. package/src/internal.ts +178 -0
  698. package/src/platform/interfaces.ts +299 -0
  699. package/src/schemas/auth-config.schema.ts +646 -0
  700. package/src/services/adaptive-mfa-decision.service.spec.ts +1058 -0
  701. package/src/services/adaptive-mfa-decision.service.ts +457 -0
  702. package/src/services/auth-audit.service.spec.ts +675 -0
  703. package/src/services/auth-audit.service.ts +558 -0
  704. package/src/services/auth-challenge-helper.service.spec.ts +3227 -0
  705. package/src/services/auth-challenge-helper.service.ts +825 -0
  706. package/src/services/auth-flow-context-builder.service.ts +520 -0
  707. package/src/services/auth-flow-rules.ts +202 -0
  708. package/src/services/auth-flow-state-definitions.ts +190 -0
  709. package/src/services/auth-flow-state-machine.service.ts +207 -0
  710. package/src/services/auth-flow-state-machine.types.ts +316 -0
  711. package/src/services/auth.service.spec.ts +4195 -0
  712. package/src/services/auth.service.ts +3727 -0
  713. package/src/services/challenge.service.spec.ts +1363 -0
  714. package/src/services/challenge.service.ts +696 -0
  715. package/src/services/client-info.service.spec.ts +572 -0
  716. package/src/services/client-info.service.ts +374 -0
  717. package/src/services/csrf.service.ts +54 -0
  718. package/src/services/email-verification.service.spec.ts +1229 -0
  719. package/src/services/email-verification.service.ts +578 -0
  720. package/src/services/geo-location.service.spec.ts +603 -0
  721. package/src/services/geo-location.service.ts +599 -0
  722. package/src/services/index.ts +13 -0
  723. package/src/services/jwt.service.spec.ts +882 -0
  724. package/src/services/jwt.service.ts +621 -0
  725. package/src/services/mfa-base.service.spec.ts +246 -0
  726. package/src/services/mfa-base.service.ts +611 -0
  727. package/src/services/mfa.service.spec.ts +693 -0
  728. package/src/services/mfa.service.ts +960 -0
  729. package/src/services/password.service.spec.ts +166 -0
  730. package/src/services/password.service.ts +309 -0
  731. package/src/services/phone-verification.service.spec.ts +1120 -0
  732. package/src/services/phone-verification.service.ts +751 -0
  733. package/src/services/risk-detection.service.spec.ts +1292 -0
  734. package/src/services/risk-detection.service.ts +1012 -0
  735. package/src/services/risk-scoring.service.spec.ts +204 -0
  736. package/src/services/risk-scoring.service.ts +131 -0
  737. package/src/services/session.service.spec.ts +1293 -0
  738. package/src/services/session.service.ts +803 -0
  739. package/src/services/social-account.service.spec.ts +725 -0
  740. package/src/services/social-auth-base.service.spec.ts +418 -0
  741. package/src/services/social-auth-base.service.ts +581 -0
  742. package/src/services/social-auth.service.spec.ts +238 -0
  743. package/src/services/social-auth.service.ts +436 -0
  744. package/src/services/social-provider-registry.service.spec.ts +238 -0
  745. package/src/services/social-provider-registry.service.ts +122 -0
  746. package/src/services/trusted-device.service.spec.ts +505 -0
  747. package/src/services/trusted-device.service.ts +339 -0
  748. package/src/storage/account-lockout-storage.service.spec.ts +310 -0
  749. package/src/storage/account-lockout-storage.service.ts +89 -0
  750. package/src/storage/index.ts +3 -0
  751. package/src/storage/memory-storage.adapter.ts +443 -0
  752. package/src/storage/rate-limit-storage.service.spec.ts +247 -0
  753. package/src/storage/rate-limit-storage.service.ts +38 -0
  754. package/src/templates/html-template.engine.spec.ts +161 -0
  755. package/src/templates/html-template.engine.ts +688 -0
  756. package/src/templates/index.ts +7 -0
  757. package/src/utils/common-passwords.spec.ts +230 -0
  758. package/src/utils/common-passwords.ts +170 -0
  759. package/src/utils/context-storage.ts +188 -0
  760. package/src/utils/cookie-names.util.ts +67 -0
  761. package/src/utils/cookies.util.ts +94 -0
  762. package/src/utils/index.ts +12 -0
  763. package/src/utils/ip-extractor.spec.ts +330 -0
  764. package/src/utils/ip-extractor.ts +220 -0
  765. package/src/utils/nauth-logger.spec.ts +388 -0
  766. package/src/utils/nauth-logger.ts +215 -0
  767. package/src/utils/pii-redactor.spec.ts +130 -0
  768. package/src/utils/pii-redactor.ts +288 -0
  769. package/src/utils/setup/get-repositories.ts +140 -0
  770. package/src/utils/setup/init-services.ts +422 -0
  771. package/src/utils/setup/init-social.ts +189 -0
  772. package/src/utils/setup/init-storage.ts +94 -0
  773. package/src/utils/setup/register-mfa.ts +165 -0
  774. package/src/utils/setup/run-nauth-migrations.ts +61 -0
  775. package/src/utils/token-delivery-policy.ts +38 -0
  776. package/src/validators/template.validator.ts +219 -0
  777. package/tsconfig.json +37 -0
  778. package/tsconfig.lint.json +6 -0
@@ -0,0 +1,611 @@
1
+ import { Repository } from 'typeorm';
2
+ import { BaseMFADevice, BaseUser } from '../entities';
3
+ import { randomBytes } from 'crypto';
4
+ import { IUser, IMFADevice } from '../interfaces/entities.interface';
5
+ import { NAuthConfig } from '../interfaces/config.interface';
6
+ import { NAuthLogger } from '../utils/nauth-logger';
7
+ import { InternalAuthAuditService as AuthAuditService } from './auth-audit.service';
8
+ import { AuthAuditEventType } from '../enums/auth-audit-event-type.enum';
9
+ import { ClientInfoService } from './client-info.service';
10
+ import { NAuthException } from '../exceptions/nauth.exception';
11
+ import { AuthErrorCode } from '../enums/error-codes.enum';
12
+ import { IMFAProviderService } from '../interfaces/mfa-provider.interface';
13
+ import { MFADeviceMethod, MFADeviceMethods } from '../enums/mfa-method.enum';
14
+ import { ChallengeService } from './challenge.service';
15
+
16
+ /**
17
+ * Base MFA Provider Service
18
+ *
19
+ * Abstract base class that provides common functionality for all MFA providers.
20
+ * Provider-specific services (TOTP, SMS, Passkey, etc.) should extend this class
21
+ * and implement the IMFAProviderService interface methods.
22
+ *
23
+ * This base class handles:
24
+ * - Device repository access
25
+ * - User repository access
26
+ * - Common device management operations
27
+ * - Backup codes generation and verification
28
+ * - MFA enforcement checks
29
+ * - Helper methods
30
+ *
31
+ * **Key Design:**
32
+ * - No hardcoded method names - works with any provider
33
+ * - Provider config accessed dynamically via `methodName`
34
+ * - Future developers can add new providers without modifying this class
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * @Injectable()
39
+ * export class TOTPMFAProviderService extends BaseMFAProviderService implements IMFAProviderService {
40
+ * readonly methodName = 'totp';
41
+ *
42
+ * constructor(
43
+ * // ... base dependencies injected via super()
44
+ * private readonly totpService: TOTPService,
45
+ * ) {
46
+ * super(/* ... base dependencies *\/);
47
+ * }
48
+ *
49
+ * async setup(user: IUser): Promise<unknown> {
50
+ * // TOTP-specific setup logic
51
+ * }
52
+ *
53
+ * async verify(user: IUser, code: unknown): Promise<boolean> {
54
+ * // TOTP verification logic
55
+ * }
56
+ * }
57
+ * ```
58
+ */
59
+ export abstract class BaseMFAProviderService implements IMFAProviderService {
60
+ abstract readonly methodName: string;
61
+
62
+ constructor(
63
+ protected readonly mfaDeviceRepository: Repository<BaseMFADevice>,
64
+ protected readonly userRepository: Repository<BaseUser>,
65
+ protected readonly config: NAuthConfig,
66
+ protected readonly logger: NAuthLogger,
67
+ protected readonly passwordService?: unknown, // Optional - from @nauth-toolkit/core
68
+ protected readonly challengeService?: ChallengeService,
69
+ protected readonly auditService?: AuthAuditService,
70
+ protected readonly clientInfoService?: ClientInfoService,
71
+ ) {}
72
+
73
+ /**
74
+ * Check if this MFA method is allowed by configuration
75
+ *
76
+ * @returns True if method is allowed
77
+ */
78
+ isMethodAllowed(): boolean {
79
+ const allowedMethods = this.config.mfa?.allowedMethods || [...MFADeviceMethods];
80
+ return allowedMethods.includes(this.methodName as MFADeviceMethod);
81
+ }
82
+
83
+ // Abstract methods to be implemented by providers
84
+ abstract setup(user: IUser, setupData?: unknown): Promise<unknown>;
85
+ abstract verifySetup(user: IUser, verificationData: unknown, deviceName?: string): Promise<number>;
86
+ abstract verify(user: IUser, code: unknown, deviceId?: number): Promise<boolean>;
87
+ // sendChallenge is optional - only providers like SMS need it
88
+ // TOTP doesn't need it (user generates code locally)
89
+
90
+ // ============================================================================
91
+ // Device Management (Common Logic)
92
+ // ============================================================================
93
+
94
+ /**
95
+ * Get user's MFA devices
96
+ *
97
+ * @param userId - Internal user ID
98
+ * @returns Array of MFA devices
99
+ *
100
+ * @protected
101
+ */
102
+ protected async getUserDevices(userId: number): Promise<IMFADevice[]> {
103
+ const devices = await this.mfaDeviceRepository.find({
104
+ where: { userId },
105
+ order: { isPrimary: 'DESC', createdAt: 'DESC' },
106
+ } as Record<string, unknown>);
107
+
108
+ return devices as unknown as IMFADevice[];
109
+ }
110
+
111
+ /**
112
+ * Create MFA device for user
113
+ *
114
+ * Creates a new MFA device with proper duplicate prevention and transaction safety.
115
+ * Uses database-level unique constraint (userId, type) to prevent race conditions.
116
+ *
117
+ * **Race Condition Prevention:**
118
+ * - Checks for existing device before creation
119
+ * - Wraps in transaction with pessimistic write lock on user row
120
+ * - Database unique constraint provides final safety net
121
+ *
122
+ * **Transaction Flow:**
123
+ * 1. Lock user row (prevents concurrent MFA setup)
124
+ * 2. Check for existing device of this type
125
+ * 3. Create device if none exists
126
+ * 4. Update user MFA flags
127
+ * 5. Commit transaction
128
+ *
129
+ * @param userId - Internal user ID
130
+ * @param deviceData - Device data to create
131
+ * @returns Created device (or existing device if already present)
132
+ * @protected
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * const device = await this.createDevice(user.id, {
137
+ * name: 'SMS Phone',
138
+ * phoneNumber: '+1234567890',
139
+ * isActive: true,
140
+ * isPrimary: !user.mfaEnabled,
141
+ * });
142
+ * ```
143
+ */
144
+ protected async createDevice(userId: number, deviceData: Partial<IMFADevice>): Promise<IMFADevice> {
145
+ // ============================================================================
146
+ // Transaction-Safe Device Creation with Race Condition Prevention
147
+ // ============================================================================
148
+ // Use TypeORM transaction manager to ensure atomicity across all database adapters
149
+ // Pessimistic write lock prevents concurrent MFA device creation for same user
150
+ const device = await this.userRepository.manager.transaction(async (transactionalEntityManager) => {
151
+ // Step 1: Lock user row to prevent concurrent MFA setup
152
+ // This works across MySQL and PostgreSQL (TypeORM translates to FOR UPDATE)
153
+ await transactionalEntityManager
154
+ .createQueryBuilder()
155
+ .select('user.id')
156
+ .from(this.userRepository.target, 'user')
157
+ .where('user.id = :userId', { userId })
158
+ .setLock('pessimistic_write')
159
+ .getOne();
160
+
161
+ // Step 2: Check for existing device of this type (within transaction)
162
+ // This prevents duplicates even if called concurrently
163
+ const existingDevice = await transactionalEntityManager
164
+ .getRepository(this.mfaDeviceRepository.target)
165
+ .createQueryBuilder('device')
166
+ .where('device.userId = :userId', { userId })
167
+ .andWhere('device.type = :type', { type: this.methodName })
168
+ .getOne();
169
+
170
+ if (existingDevice) {
171
+ this.logger?.log?.(
172
+ `MFA device of type '${this.methodName}' already exists for user ${userId}, returning existing device`,
173
+ );
174
+ return existingDevice as unknown as IMFADevice;
175
+ }
176
+
177
+ // Step 3: Create new device (no duplicate exists)
178
+ const newDevice = transactionalEntityManager.getRepository(this.mfaDeviceRepository.target).create({
179
+ userId,
180
+ type: this.methodName,
181
+ ...deviceData,
182
+ } as Record<string, unknown>);
183
+
184
+ // Step 4: Save device (unique constraint provides final safety net)
185
+ const saved = await transactionalEntityManager.getRepository(this.mfaDeviceRepository.target).save(newDevice);
186
+
187
+ this.logger?.log?.(`Created new MFA device: type='${this.methodName}', userId=${userId}, deviceId=${saved.id}`);
188
+
189
+ return saved as unknown as IMFADevice;
190
+ });
191
+
192
+ // ============================================================================
193
+ // Audit: Record MFA device added
194
+ // ============================================================================
195
+ if (this.auditService && this.clientInfoService) {
196
+ try {
197
+ await this.auditService.recordEvent({
198
+ userId,
199
+ eventType: AuthAuditEventType.MFA_DEVICE_ADDED,
200
+ eventStatus: 'SUCCESS',
201
+ metadata: {
202
+ // Client info automatically included from context
203
+ mfaMethod: this.methodName,
204
+ deviceId: device.id,
205
+ deviceName: device.name,
206
+ isPrimary: device.isPrimary,
207
+ },
208
+ });
209
+ } catch (auditError) {
210
+ // Non-blocking: Log but continue
211
+ const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
212
+ this.logger?.error?.(`Failed to record MFA_DEVICE_ADDED audit event: ${errorMessage}`, {
213
+ error: auditError,
214
+ userId,
215
+ methodName: this.methodName,
216
+ });
217
+ }
218
+ }
219
+
220
+ return device;
221
+ }
222
+
223
+ /**
224
+ * Find active device for user by method
225
+ *
226
+ * @param userId - Internal user ID
227
+ * @param deviceId - Optional device ID
228
+ * @returns Device if found, null otherwise
229
+ * @protected
230
+ */
231
+ protected async findDevice(userId: number, deviceId?: number): Promise<IMFADevice | null> {
232
+ const where: Record<string, unknown> = {
233
+ userId,
234
+ type: this.methodName,
235
+ isActive: true,
236
+ };
237
+
238
+ if (deviceId) {
239
+ where.id = deviceId;
240
+ }
241
+
242
+ const device = await this.mfaDeviceRepository.findOne({
243
+ where,
244
+ order: { isPrimary: 'DESC', lastUsedAt: 'DESC' },
245
+ } as Record<string, unknown>);
246
+
247
+ return device ? (device as unknown as IMFADevice) : null;
248
+ }
249
+
250
+ /**
251
+ * Update device usage statistics
252
+ *
253
+ * @param deviceId - Device ID
254
+ * @protected
255
+ */
256
+ protected async updateDeviceUsage(deviceId: number): Promise<void> {
257
+ const device = await this.mfaDeviceRepository.findOne({ where: { id: deviceId } });
258
+ if (device) {
259
+ device.lastUsedAt = new Date();
260
+ device.usageCount = (device.usageCount || 0) + 1;
261
+ await this.mfaDeviceRepository.save(device);
262
+ }
263
+ }
264
+
265
+ /**
266
+ * Enable MFA for user
267
+ *
268
+ * Sets mfaEnabled flag and updates mfaMethods array.
269
+ * Called automatically when first device is registered.
270
+ * Automatically clears MFA_SETUP_REQUIRED challenges if they exist.
271
+ *
272
+ * @param user - User to enable MFA for
273
+ * @protected
274
+ */
275
+ protected async enableMFAForUser(user: IUser): Promise<void> {
276
+ // Reload user from database to ensure we have the latest state
277
+ // This prevents overwriting fields like isPhoneVerified that may have been updated
278
+ // between when the user object was loaded and when MFA is enabled
279
+ const userId = (user as unknown as Record<string, unknown>).id as number;
280
+ const userEntity = await this.userRepository.findOne({ where: { id: userId } });
281
+ if (!userEntity) {
282
+ throw new NAuthException(AuthErrorCode.NOT_FOUND, 'User not found when enabling MFA');
283
+ }
284
+
285
+ const userEntityRecord = userEntity as unknown as Record<string, unknown>;
286
+ const isFirstDevice = !userEntityRecord.mfaEnabled;
287
+
288
+ if (!userEntityRecord.mfaEnabled) {
289
+ userEntityRecord.mfaEnabled = true;
290
+ userEntityRecord.mfaEnforcedAt = new Date();
291
+ }
292
+
293
+ // Update mfaMethods array
294
+ const devices = await this.getUserDevices(userId);
295
+ const methods = [...new Set(devices.filter((d) => d.isActive).map((d) => d.type))];
296
+ userEntityRecord.mfaMethods = methods;
297
+
298
+ // Set preferred method if not set
299
+ if (!userEntityRecord.preferredMfaMethod && methods.length > 0) {
300
+ const primaryDevice = devices.find((d) => d.isPrimary && d.isActive);
301
+ userEntityRecord.preferredMfaMethod = primaryDevice?.type || methods[0];
302
+ }
303
+
304
+ await this.userRepository.save(userEntity);
305
+
306
+ // If this is the first MFA device being set up, clear any MFA_SETUP_REQUIRED challenges
307
+ // This prevents phantom challenges when user sets up MFA while logged in
308
+ // if (isFirstDevice && this.challengeService) {
309
+ // try {
310
+ // await this.challengeService.deleteUserChallengeSessions(userId, AuthChallenge.MFA_SETUP_REQUIRED);
311
+ // this.logger?.log?.(`Cleared MFA_SETUP_REQUIRED challenge for user ${user.sub} after MFA setup`);
312
+ // } catch (error) {
313
+ // // Log but don't fail MFA setup if challenge clearing fails
314
+ // this.logger?.warn?.(`Failed to clear MFA_SETUP_REQUIRED challenge after MFA setup: ${error}`);
315
+ // }
316
+ // }
317
+
318
+ // ============================================================================
319
+ // Audit: Record MFA enabled (only for first device)
320
+ // ============================================================================
321
+ if (isFirstDevice && this.auditService && this.clientInfoService) {
322
+ try {
323
+ await this.auditService?.recordEvent({
324
+ userId: user.id,
325
+ eventType: AuthAuditEventType.MFA_ENABLED,
326
+ eventStatus: 'SUCCESS',
327
+ metadata: {
328
+ // Client info automatically included from context
329
+ mfaMethod: this.methodName,
330
+ mfaMethods: methods,
331
+ },
332
+ });
333
+ } catch (auditError) {
334
+ // Non-blocking: Log but continue
335
+ const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
336
+ this.logger?.error?.(`Failed to record MFA_ENABLED audit event: ${errorMessage}`, {
337
+ error: auditError,
338
+ userId: user.id,
339
+ methodName: this.methodName,
340
+ });
341
+ }
342
+ }
343
+ }
344
+
345
+ // ============================================================================
346
+ // Backup Codes (Common Logic)
347
+ // ============================================================================
348
+
349
+ /**
350
+ * Generate backup codes for user
351
+ *
352
+ * Creates single-use recovery codes that can be used when MFA devices are unavailable.
353
+ * Exposed as optional method in IMFAProviderService interface.
354
+ *
355
+ * @param user - User to generate codes for
356
+ * @returns Generated backup codes (plain text - shown only once)
357
+ */
358
+ async generateBackupCodes(user: IUser): Promise<string[]> {
359
+ const userEntity = user as unknown as Record<string, unknown>;
360
+ const config = this.config.mfa?.backup;
361
+ const codeCount = config?.codeCount || 10;
362
+ const codeLength = config?.codeLength || 8;
363
+
364
+ // Generate random codes
365
+ const codes: string[] = [];
366
+ for (let i = 0; i < codeCount; i++) {
367
+ const code = this.generateRandomCode(codeLength);
368
+ codes.push(code);
369
+ }
370
+
371
+ // Check if password service is available
372
+ if (!this.passwordService || typeof (this.passwordService as Record<string, unknown>).hashPassword !== 'function') {
373
+ throw new NAuthException(AuthErrorCode.VALIDATION_FAILED, 'Password service is not available');
374
+ }
375
+
376
+ // Hash codes for storage
377
+ const passwordService = this.passwordService as { hashPassword: (password: string) => Promise<string> };
378
+ const hashedCodes = await Promise.all(codes.map((code) => passwordService.hashPassword(code)));
379
+
380
+ // Store hashed codes
381
+ userEntity.backupCodes = hashedCodes;
382
+ await this.userRepository.save(userEntity);
383
+
384
+ this.logger?.log?.(`Generated ${codeCount} backup codes for user: ${user.sub}`);
385
+
386
+ // ============================================================================
387
+ // Audit: Record backup codes generation
388
+ // ============================================================================
389
+ if (this.auditService && this.clientInfoService) {
390
+ try {
391
+ await this.auditService?.recordEvent({
392
+ userId: user.id,
393
+ eventType: AuthAuditEventType.MFA_BACKUP_CODES_GENERATED,
394
+ eventStatus: 'INFO',
395
+ metadata: {
396
+ // Client info automatically included from context
397
+ codeCount,
398
+ codeLength,
399
+ },
400
+ });
401
+ } catch (auditError) {
402
+ // Non-blocking: Log but continue
403
+ const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
404
+ this.logger?.error?.(`Failed to record MFA_BACKUP_CODES_GENERATED audit event: ${errorMessage}`, {
405
+ error: auditError,
406
+ userId: user.id,
407
+ });
408
+ }
409
+ }
410
+
411
+ return codes;
412
+ }
413
+
414
+ /**
415
+ * Verify backup code
416
+ *
417
+ * Validates backup code and removes it after use (single-use).
418
+ *
419
+ * @param user - User being authenticated
420
+ * @param code - Backup code to verify
421
+ * @returns True if code is valid
422
+ * @protected
423
+ */
424
+ protected async verifyBackupCode(user: IUser, code: string): Promise<boolean> {
425
+ const userEntity = user as unknown as Record<string, unknown>;
426
+
427
+ const backupCodes = userEntity.backupCodes as string[] | undefined;
428
+ if (!backupCodes || backupCodes.length === 0) {
429
+ this.logger?.warn?.('No backup codes available');
430
+ return false;
431
+ }
432
+
433
+ // Check if password service is available
434
+ if (
435
+ !this.passwordService ||
436
+ typeof (this.passwordService as Record<string, unknown>).verifyPassword !== 'function'
437
+ ) {
438
+ this.logger?.warn?.('Backup code verification attempted but password service is not available');
439
+ return false;
440
+ }
441
+
442
+ // Check code against all stored hashed codes
443
+ const passwordService = this.passwordService as {
444
+ verifyPassword: (plain: string, hash: string) => Promise<boolean>;
445
+ };
446
+ for (let i = 0; i < backupCodes.length; i++) {
447
+ const isValid = await passwordService.verifyPassword(code, backupCodes[i]);
448
+ if (isValid) {
449
+ // Remove used code
450
+ backupCodes.splice(i, 1);
451
+ userEntity.backupCodes = backupCodes;
452
+ await this.userRepository.save(userEntity);
453
+
454
+ this.logger?.log?.(`Backup code verified and removed for user: ${user.sub}`);
455
+
456
+ // ============================================================================
457
+ // Audit: Record backup code usage
458
+ // ============================================================================
459
+ if (this.auditService && this.clientInfoService) {
460
+ try {
461
+ await this.auditService?.recordEvent({
462
+ userId: user.id,
463
+ eventType: AuthAuditEventType.MFA_BACKUP_CODE_USED,
464
+ eventStatus: 'SUCCESS',
465
+ authMethod: 'backup',
466
+ metadata: {
467
+ // Client info automatically included from context
468
+ remainingCodes: backupCodes.length,
469
+ },
470
+ });
471
+ } catch (auditError) {
472
+ // Non-blocking: Log but continue
473
+ const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
474
+ this.logger?.error?.(`Failed to record MFA_BACKUP_CODE_USED audit event: ${errorMessage}`, {
475
+ error: auditError,
476
+ userId: user.id,
477
+ });
478
+ }
479
+ }
480
+
481
+ return true;
482
+ }
483
+ }
484
+
485
+ this.logger?.warn?.('Backup code verification failed');
486
+ return false;
487
+ }
488
+
489
+ // ============================================================================
490
+ // Helper Methods
491
+ // ============================================================================
492
+
493
+ /**
494
+ * Generate random alphanumeric code
495
+ *
496
+ * @param length - Code length
497
+ * @returns Random code
498
+ * @protected
499
+ */
500
+ protected generateRandomCode(length: number): string {
501
+ const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; // Exclude ambiguous characters
502
+ let code = '';
503
+ const bytes = randomBytes(length);
504
+ for (let i = 0; i < length; i++) {
505
+ code += chars[bytes[i] % chars.length];
506
+ }
507
+ return code;
508
+ }
509
+
510
+ /**
511
+ * Mask phone number for display
512
+ *
513
+ * @param phone - Phone number
514
+ * @returns Masked phone number
515
+ * @protected
516
+ */
517
+ protected maskPhone(phone: string): string {
518
+ const digits = phone.replace(/\D/g, '');
519
+ if (digits.length < 4) return phone;
520
+ return `***-***-${digits.slice(-4)}`;
521
+ }
522
+
523
+ /**
524
+ * Mask email address for display
525
+ *
526
+ * Masks the local part of the email while showing the domain.
527
+ * Example: user@example.com → u***r@example.com
528
+ *
529
+ * @param email - Email address
530
+ * @returns Masked email address
531
+ * @protected
532
+ *
533
+ * @example
534
+ * ```typescript
535
+ * const masked = this.maskEmail('user@example.com');
536
+ * // Returns: 'u***r@example.com'
537
+ * ```
538
+ */
539
+ protected maskEmail(email: string): string {
540
+ const [localPart, domain] = email.split('@');
541
+ if (!localPart || !domain) return email;
542
+ if (localPart.length <= 2) {
543
+ return `${localPart[0]}***@${domain}`;
544
+ }
545
+ return `${localPart[0]}***${localPart[localPart.length - 1]}@${domain}`;
546
+ }
547
+
548
+ /**
549
+ * Check if MFA is required for a user
550
+ *
551
+ * Determines MFA requirement based on:
552
+ * - User-level MFA exemption (admin override)
553
+ * - Global enforcement policy (OPTIONAL, REQUIRED, ADAPTIVE)
554
+ * - Grace period for REQUIRED enforcement
555
+ * - User's MFA enrollment date
556
+ *
557
+ * ⚠️ ADAPTIVE enforcement currently behaves like REQUIRED (placeholder for future risk-based logic)
558
+ *
559
+ * @param user - User to check
560
+ * @returns True if MFA is required
561
+ * @protected
562
+ */
563
+ protected async isMFARequired(user: IUser): Promise<boolean> {
564
+ // ============================================================================
565
+ // SECURITY: Check user-level MFA exemption FIRST
566
+ // ============================================================================
567
+ // Exemption allows bypassing MFA requirements
568
+ // This is checked early to ensure exempt users can always login
569
+ // Handle different database representations (boolean true, MySQL tinyint 1, etc.)
570
+ const mfaExempt = user.mfaExempt;
571
+ // Check for boolean true (handle numeric 1 case at runtime if needed)
572
+ if (mfaExempt === true || (mfaExempt as unknown) === 1) {
573
+ return false;
574
+ }
575
+
576
+ const mfaConfig = this.config.mfa;
577
+
578
+ if (!mfaConfig?.enabled) {
579
+ return false;
580
+ }
581
+
582
+ const enforcement = mfaConfig.enforcement || 'OPTIONAL';
583
+
584
+ if (enforcement === 'OPTIONAL') {
585
+ return false;
586
+ }
587
+
588
+ if (enforcement === 'REQUIRED' || enforcement === 'ADAPTIVE') {
589
+ // Check grace period
590
+ const gracePeriod = mfaConfig.gracePeriod || 7;
591
+ const gracePeriodEnd = new Date();
592
+ gracePeriodEnd.setDate(gracePeriodEnd.getDate() - gracePeriod);
593
+
594
+ // If user has enrolled in MFA, check if they're within grace period
595
+ const userWithDates = user as IUser & { mfaEnforcedAt?: Date; createdAt: Date };
596
+ if (userWithDates.mfaEnforcedAt) {
597
+ return userWithDates.mfaEnforcedAt <= gracePeriodEnd;
598
+ }
599
+
600
+ // User hasn't enrolled - check account creation date
601
+ if (userWithDates.createdAt) {
602
+ return userWithDates.createdAt <= gracePeriodEnd;
603
+ }
604
+
605
+ // No dates available - require MFA immediately
606
+ return true;
607
+ }
608
+
609
+ return false;
610
+ }
611
+ }