@digitaldefiance/node-express-suite 1.0.23 → 1.0.25

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 (632) hide show
  1. package/README.md +8 -0
  2. package/package.json +8 -7
  3. package/src/application-base.d.ts +112 -0
  4. package/src/application-base.d.ts.map +1 -0
  5. package/src/application-base.js +335 -0
  6. package/src/application-base.js.map +1 -0
  7. package/src/application.d.ts +20 -0
  8. package/src/application.d.ts.map +1 -0
  9. package/src/application.js +124 -0
  10. package/src/application.js.map +1 -0
  11. package/src/backup-code.d.ts +67 -0
  12. package/src/backup-code.d.ts.map +1 -0
  13. package/src/backup-code.js +238 -0
  14. package/src/backup-code.js.map +1 -0
  15. package/src/constants.d.ts +16 -0
  16. package/src/constants.d.ts.map +1 -0
  17. package/src/constants.js +54 -0
  18. package/src/constants.js.map +1 -0
  19. package/src/controllers/base.d.ts +63 -0
  20. package/src/controllers/base.d.ts.map +1 -0
  21. package/src/controllers/base.js +272 -0
  22. package/src/controllers/base.js.map +1 -0
  23. package/src/controllers/{index.ts → index.d.ts} +1 -0
  24. package/src/controllers/index.d.ts.map +1 -0
  25. package/src/controllers/index.js +6 -0
  26. package/src/controllers/index.js.map +1 -0
  27. package/src/controllers/user.d.ts +45 -0
  28. package/src/controllers/user.d.ts.map +1 -0
  29. package/src/controllers/user.js +748 -0
  30. package/src/controllers/user.js.map +1 -0
  31. package/src/decorators/base-controller.d.ts +14 -0
  32. package/src/decorators/base-controller.d.ts.map +1 -0
  33. package/src/decorators/base-controller.js +49 -0
  34. package/src/decorators/base-controller.js.map +1 -0
  35. package/src/decorators/controller.d.ts +32 -0
  36. package/src/decorators/controller.d.ts.map +1 -0
  37. package/src/decorators/controller.js +67 -0
  38. package/src/decorators/controller.js.map +1 -0
  39. package/src/decorators/{index.ts → index.d.ts} +1 -0
  40. package/src/decorators/index.d.ts.map +1 -0
  41. package/src/decorators/index.js +7 -0
  42. package/src/decorators/index.js.map +1 -0
  43. package/src/decorators/zod-validation.d.ts +5 -0
  44. package/src/decorators/zod-validation.d.ts.map +1 -0
  45. package/src/decorators/zod-validation.js +47 -0
  46. package/src/decorators/zod-validation.js.map +1 -0
  47. package/src/defaults.d.ts +7 -0
  48. package/src/defaults.d.ts.map +1 -0
  49. package/src/defaults.js +83 -0
  50. package/src/defaults.js.map +1 -0
  51. package/src/documents/base.d.ts +3 -0
  52. package/src/documents/base.d.ts.map +1 -0
  53. package/src/documents/base.js +3 -0
  54. package/src/documents/base.js.map +1 -0
  55. package/src/documents/email-token.d.ts +8 -0
  56. package/src/documents/email-token.d.ts.map +1 -0
  57. package/src/documents/email-token.js +3 -0
  58. package/src/documents/email-token.js.map +1 -0
  59. package/src/documents/{index.ts → index.d.ts} +1 -0
  60. package/src/documents/index.d.ts.map +1 -0
  61. package/src/documents/index.js +3 -0
  62. package/src/documents/index.js.map +1 -0
  63. package/src/documents/{mnemonic.ts → mnemonic.d.ts} +2 -5
  64. package/src/documents/mnemonic.d.ts.map +1 -0
  65. package/src/documents/mnemonic.js +3 -0
  66. package/src/documents/mnemonic.js.map +1 -0
  67. package/src/documents/{role.ts → role.d.ts} +2 -5
  68. package/src/documents/role.d.ts.map +1 -0
  69. package/src/documents/role.js +3 -0
  70. package/src/documents/role.js.map +1 -0
  71. package/src/documents/used-direct-login-token.d.ts +5 -0
  72. package/src/documents/used-direct-login-token.d.ts.map +1 -0
  73. package/src/documents/used-direct-login-token.js +3 -0
  74. package/src/documents/used-direct-login-token.js.map +1 -0
  75. package/src/documents/{user-role.ts → user-role.d.ts} +2 -5
  76. package/src/documents/user-role.d.ts.map +1 -0
  77. package/src/documents/user-role.js +3 -0
  78. package/src/documents/user-role.js.map +1 -0
  79. package/src/documents/{user.ts → user.d.ts} +2 -4
  80. package/src/documents/user.d.ts.map +1 -0
  81. package/src/documents/user.js +3 -0
  82. package/src/documents/user.js.map +1 -0
  83. package/src/enumerations/base-model-name.d.ts +38 -0
  84. package/src/enumerations/base-model-name.d.ts.map +1 -0
  85. package/src/enumerations/base-model-name.js +34 -0
  86. package/src/enumerations/base-model-name.js.map +1 -0
  87. package/src/enumerations/{index.ts → index.d.ts} +1 -0
  88. package/src/enumerations/index.d.ts.map +1 -0
  89. package/src/enumerations/index.js +8 -0
  90. package/src/enumerations/index.js.map +1 -0
  91. package/src/enumerations/length-encoding-type.d.ts +7 -0
  92. package/src/enumerations/length-encoding-type.d.ts.map +1 -0
  93. package/src/enumerations/length-encoding-type.js +11 -0
  94. package/src/enumerations/length-encoding-type.js.map +1 -0
  95. package/src/enumerations/schema-collection.d.ts +34 -0
  96. package/src/enumerations/schema-collection.d.ts.map +1 -0
  97. package/src/enumerations/schema-collection.js +38 -0
  98. package/src/enumerations/schema-collection.js.map +1 -0
  99. package/src/enumerations/symmetric-error-type.d.ts +5 -0
  100. package/src/enumerations/symmetric-error-type.d.ts.map +1 -0
  101. package/src/enumerations/symmetric-error-type.js +9 -0
  102. package/src/enumerations/symmetric-error-type.js.map +1 -0
  103. package/src/environment.d.ts +189 -0
  104. package/src/environment.d.ts.map +1 -0
  105. package/src/environment.js +620 -0
  106. package/src/environment.js.map +1 -0
  107. package/src/errors/express-validation.d.ts +9 -0
  108. package/src/errors/express-validation.d.ts.map +1 -0
  109. package/src/errors/express-validation.js +18 -0
  110. package/src/errors/express-validation.js.map +1 -0
  111. package/src/errors/{index.ts → index.d.ts} +1 -0
  112. package/src/errors/index.d.ts.map +1 -0
  113. package/src/errors/index.js +16 -0
  114. package/src/errors/index.js.map +1 -0
  115. package/src/errors/invalid-backup-code-version.d.ts +6 -0
  116. package/src/errors/invalid-backup-code-version.d.ts.map +1 -0
  117. package/src/errors/invalid-backup-code-version.js +15 -0
  118. package/src/errors/invalid-backup-code-version.js.map +1 -0
  119. package/src/errors/invalid-jwt-token.d.ts +5 -0
  120. package/src/errors/invalid-jwt-token.d.ts.map +1 -0
  121. package/src/errors/invalid-jwt-token.js +11 -0
  122. package/src/errors/invalid-jwt-token.js.map +1 -0
  123. package/src/errors/invalid-model.d.ts +6 -0
  124. package/src/errors/invalid-model.d.ts.map +1 -0
  125. package/src/errors/invalid-model.js +14 -0
  126. package/src/errors/invalid-model.js.map +1 -0
  127. package/src/errors/invalid-new-password.d.ts +5 -0
  128. package/src/errors/invalid-new-password.d.ts.map +1 -0
  129. package/src/errors/invalid-new-password.js +14 -0
  130. package/src/errors/invalid-new-password.js.map +1 -0
  131. package/src/errors/invalid-password.d.ts +5 -0
  132. package/src/errors/invalid-password.d.ts.map +1 -0
  133. package/src/errors/invalid-password.js +14 -0
  134. package/src/errors/invalid-password.js.map +1 -0
  135. package/src/errors/missing-validated-data.d.ts +7 -0
  136. package/src/errors/missing-validated-data.d.ts.map +1 -0
  137. package/src/errors/missing-validated-data.js +36 -0
  138. package/src/errors/missing-validated-data.js.map +1 -0
  139. package/src/errors/mnemonic-or-password-required.d.ts +5 -0
  140. package/src/errors/mnemonic-or-password-required.d.ts.map +1 -0
  141. package/src/errors/mnemonic-or-password-required.js +13 -0
  142. package/src/errors/mnemonic-or-password-required.js.map +1 -0
  143. package/src/errors/model-not-registered.d.ts +5 -0
  144. package/src/errors/model-not-registered.d.ts.map +1 -0
  145. package/src/errors/model-not-registered.js +12 -0
  146. package/src/errors/model-not-registered.js.map +1 -0
  147. package/src/errors/mongoose-validation.d.ts +11 -0
  148. package/src/errors/mongoose-validation.d.ts.map +1 -0
  149. package/src/errors/mongoose-validation.js +17 -0
  150. package/src/errors/mongoose-validation.js.map +1 -0
  151. package/src/errors/symmetric.d.ts +8 -0
  152. package/src/errors/symmetric.d.ts.map +1 -0
  153. package/src/errors/symmetric.js +23 -0
  154. package/src/errors/symmetric.js.map +1 -0
  155. package/src/errors/token-expired.d.ts +5 -0
  156. package/src/errors/token-expired.d.ts.map +1 -0
  157. package/src/errors/token-expired.js +11 -0
  158. package/src/errors/token-expired.js.map +1 -0
  159. package/src/get-language.d.ts +2 -0
  160. package/src/get-language.d.ts.map +1 -0
  161. package/src/get-language.js +30 -0
  162. package/src/get-language.js.map +1 -0
  163. package/src/get-timezone.d.ts +3 -0
  164. package/src/get-timezone.d.ts.map +1 -0
  165. package/src/get-timezone.js +31 -0
  166. package/src/get-timezone.js.map +1 -0
  167. package/src/{index.ts → index.d.ts} +1 -1
  168. package/src/index.d.ts.map +1 -0
  169. package/src/index.js +28 -0
  170. package/src/index.js.map +1 -0
  171. package/src/interfaces/{api-error-response.ts → api-error-response.d.ts} +2 -2
  172. package/src/interfaces/api-error-response.d.ts.map +1 -0
  173. package/src/interfaces/api-error-response.js +3 -0
  174. package/src/interfaces/api-error-response.js.map +1 -0
  175. package/src/interfaces/api-express-validation-error-response.d.ts +7 -0
  176. package/src/interfaces/api-express-validation-error-response.d.ts.map +1 -0
  177. package/src/interfaces/api-express-validation-error-response.js +3 -0
  178. package/src/interfaces/api-express-validation-error-response.js.map +1 -0
  179. package/src/interfaces/api-message-response.d.ts +4 -0
  180. package/src/interfaces/api-message-response.d.ts.map +1 -0
  181. package/src/interfaces/api-message-response.js +3 -0
  182. package/src/interfaces/api-message-response.js.map +1 -0
  183. package/src/interfaces/{api-mongo-validation-error-response.ts → api-mongo-validation-error-response.d.ts} +2 -2
  184. package/src/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
  185. package/src/interfaces/api-mongo-validation-error-response.js +3 -0
  186. package/src/interfaces/api-mongo-validation-error-response.js.map +1 -0
  187. package/src/interfaces/api-responses/{backup-codes-response.ts → backup-codes-response.d.ts} +2 -2
  188. package/src/interfaces/api-responses/backup-codes-response.d.ts.map +1 -0
  189. package/src/interfaces/api-responses/backup-codes-response.js +3 -0
  190. package/src/interfaces/api-responses/backup-codes-response.js.map +1 -0
  191. package/src/interfaces/api-responses/{challenge-response.ts → challenge-response.d.ts} +3 -3
  192. package/src/interfaces/api-responses/challenge-response.d.ts.map +1 -0
  193. package/src/interfaces/api-responses/challenge-response.js +3 -0
  194. package/src/interfaces/api-responses/challenge-response.js.map +1 -0
  195. package/src/interfaces/api-responses/{code-count-response.ts → code-count-response.d.ts} +2 -2
  196. package/src/interfaces/api-responses/code-count-response.d.ts.map +1 -0
  197. package/src/interfaces/api-responses/code-count-response.js +3 -0
  198. package/src/interfaces/api-responses/code-count-response.js.map +1 -0
  199. package/src/interfaces/api-responses/{index.ts → index.d.ts} +1 -0
  200. package/src/interfaces/api-responses/index.d.ts.map +1 -0
  201. package/src/interfaces/api-responses/index.js +11 -0
  202. package/src/interfaces/api-responses/index.js.map +1 -0
  203. package/src/interfaces/api-responses/{login-response.ts → login-response.d.ts} +4 -4
  204. package/src/interfaces/api-responses/login-response.d.ts.map +1 -0
  205. package/src/interfaces/api-responses/login-response.js +3 -0
  206. package/src/interfaces/api-responses/login-response.js.map +1 -0
  207. package/src/interfaces/api-responses/{mnemonic-response.ts → mnemonic-response.d.ts} +2 -2
  208. package/src/interfaces/api-responses/mnemonic-response.d.ts.map +1 -0
  209. package/src/interfaces/api-responses/mnemonic-response.js +3 -0
  210. package/src/interfaces/api-responses/mnemonic-response.js.map +1 -0
  211. package/src/interfaces/api-responses/{registration-response.ts → registration-response.d.ts} +3 -3
  212. package/src/interfaces/api-responses/registration-response.d.ts.map +1 -0
  213. package/src/interfaces/api-responses/registration-response.js +3 -0
  214. package/src/interfaces/api-responses/registration-response.js.map +1 -0
  215. package/src/interfaces/api-responses/{request-user-response.ts → request-user-response.d.ts} +2 -2
  216. package/src/interfaces/api-responses/request-user-response.d.ts.map +1 -0
  217. package/src/interfaces/api-responses/request-user-response.js +3 -0
  218. package/src/interfaces/api-responses/request-user-response.js.map +1 -0
  219. package/src/interfaces/{application.ts → application.d.ts} +7 -7
  220. package/src/interfaces/application.d.ts.map +1 -0
  221. package/src/interfaces/application.js +3 -0
  222. package/src/interfaces/application.js.map +1 -0
  223. package/src/interfaces/backend-objects/email-token.d.ts +4 -0
  224. package/src/interfaces/backend-objects/email-token.d.ts.map +1 -0
  225. package/src/interfaces/backend-objects/email-token.js +3 -0
  226. package/src/interfaces/backend-objects/email-token.js.map +1 -0
  227. package/src/interfaces/backend-objects/{index.ts → index.d.ts} +1 -0
  228. package/src/interfaces/backend-objects/index.d.ts.map +1 -0
  229. package/src/interfaces/backend-objects/index.js +8 -0
  230. package/src/interfaces/backend-objects/index.js.map +1 -0
  231. package/src/interfaces/backend-objects/{request-user.ts → request-user.d.ts} +2 -7
  232. package/src/interfaces/backend-objects/request-user.d.ts.map +1 -0
  233. package/src/interfaces/backend-objects/request-user.js +3 -0
  234. package/src/interfaces/backend-objects/request-user.js.map +1 -0
  235. package/src/interfaces/backend-objects/{role.ts → role.d.ts} +1 -1
  236. package/src/interfaces/backend-objects/role.d.ts.map +1 -0
  237. package/src/interfaces/backend-objects/role.js +3 -0
  238. package/src/interfaces/backend-objects/role.js.map +1 -0
  239. package/src/interfaces/backend-objects/user.d.ts +4 -0
  240. package/src/interfaces/backend-objects/user.d.ts.map +1 -0
  241. package/src/interfaces/backend-objects/user.js +3 -0
  242. package/src/interfaces/backend-objects/user.js.map +1 -0
  243. package/src/interfaces/checksum-config.d.ts +5 -0
  244. package/src/interfaces/checksum-config.d.ts.map +1 -0
  245. package/src/interfaces/checksum-config.js +3 -0
  246. package/src/interfaces/checksum-config.js.map +1 -0
  247. package/src/interfaces/checksum-consts.d.ts +11 -0
  248. package/src/interfaces/checksum-consts.d.ts.map +1 -0
  249. package/src/interfaces/checksum-consts.js +3 -0
  250. package/src/interfaces/checksum-consts.js.map +1 -0
  251. package/src/interfaces/{constants.ts → constants.d.ts} +5 -5
  252. package/src/interfaces/constants.d.ts.map +1 -0
  253. package/src/interfaces/constants.js +3 -0
  254. package/src/interfaces/constants.js.map +1 -0
  255. package/src/interfaces/create-user-basics.d.ts +18 -0
  256. package/src/interfaces/create-user-basics.d.ts.map +1 -0
  257. package/src/interfaces/create-user-basics.js +3 -0
  258. package/src/interfaces/create-user-basics.js.map +1 -0
  259. package/src/interfaces/csp-config.d.ts +14 -0
  260. package/src/interfaces/csp-config.d.ts.map +1 -0
  261. package/src/interfaces/csp-config.js +3 -0
  262. package/src/interfaces/csp-config.js.map +1 -0
  263. package/src/interfaces/deep-partial.d.ts +4 -0
  264. package/src/interfaces/deep-partial.d.ts.map +1 -0
  265. package/src/interfaces/deep-partial.js +3 -0
  266. package/src/interfaces/deep-partial.js.map +1 -0
  267. package/src/interfaces/{discriminator-collections.ts → discriminator-collections.d.ts} +3 -3
  268. package/src/interfaces/discriminator-collections.d.ts.map +1 -0
  269. package/src/interfaces/discriminator-collections.js +3 -0
  270. package/src/interfaces/discriminator-collections.js.map +1 -0
  271. package/src/interfaces/email-service.d.ts +4 -0
  272. package/src/interfaces/email-service.d.ts.map +1 -0
  273. package/src/interfaces/email-service.js +3 -0
  274. package/src/interfaces/email-service.js.map +1 -0
  275. package/src/interfaces/environment-mongo.d.ts +76 -0
  276. package/src/interfaces/environment-mongo.d.ts.map +1 -0
  277. package/src/interfaces/environment-mongo.js +3 -0
  278. package/src/interfaces/environment-mongo.js.map +1 -0
  279. package/src/interfaces/environment.d.ts +181 -0
  280. package/src/interfaces/environment.d.ts.map +1 -0
  281. package/src/interfaces/environment.js +3 -0
  282. package/src/interfaces/environment.js.map +1 -0
  283. package/src/interfaces/failable-result.d.ts +7 -0
  284. package/src/interfaces/failable-result.d.ts.map +1 -0
  285. package/src/interfaces/failable-result.js +3 -0
  286. package/src/interfaces/failable-result.js.map +1 -0
  287. package/src/interfaces/fec-consts.d.ts +5 -0
  288. package/src/interfaces/fec-consts.d.ts.map +1 -0
  289. package/src/interfaces/fec-consts.js +3 -0
  290. package/src/interfaces/fec-consts.js.map +1 -0
  291. package/src/interfaces/handleable-error-options.d.ts +7 -0
  292. package/src/interfaces/handleable-error-options.d.ts.map +1 -0
  293. package/src/interfaces/handleable-error-options.js +3 -0
  294. package/src/interfaces/handleable-error-options.js.map +1 -0
  295. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  296. package/src/interfaces/index.d.ts.map +1 -0
  297. package/src/interfaces/index.js +33 -0
  298. package/src/interfaces/index.js.map +1 -0
  299. package/src/interfaces/jwt-consts.d.ts +11 -0
  300. package/src/interfaces/jwt-consts.d.ts.map +1 -0
  301. package/src/interfaces/jwt-consts.js +3 -0
  302. package/src/interfaces/jwt-consts.js.map +1 -0
  303. package/src/interfaces/jwt-sign-response.d.ts +11 -0
  304. package/src/interfaces/jwt-sign-response.d.ts.map +1 -0
  305. package/src/interfaces/jwt-sign-response.js +3 -0
  306. package/src/interfaces/jwt-sign-response.js.map +1 -0
  307. package/src/interfaces/mongo-errors.d.ts +5 -0
  308. package/src/interfaces/mongo-errors.d.ts.map +1 -0
  309. package/src/interfaces/mongo-errors.js +3 -0
  310. package/src/interfaces/mongo-errors.js.map +1 -0
  311. package/src/interfaces/request-user.d.ts +42 -0
  312. package/src/interfaces/request-user.d.ts.map +1 -0
  313. package/src/interfaces/request-user.js +3 -0
  314. package/src/interfaces/request-user.js.map +1 -0
  315. package/src/interfaces/required-string-keys.d.ts +22 -0
  316. package/src/interfaces/required-string-keys.d.ts.map +1 -0
  317. package/src/interfaces/required-string-keys.js +3 -0
  318. package/src/interfaces/required-string-keys.js.map +1 -0
  319. package/src/interfaces/schema.d.ts +29 -0
  320. package/src/interfaces/schema.d.ts.map +1 -0
  321. package/src/interfaces/schema.js +3 -0
  322. package/src/interfaces/schema.js.map +1 -0
  323. package/src/interfaces/server-init-result.d.ts +35 -0
  324. package/src/interfaces/server-init-result.d.ts.map +1 -0
  325. package/src/interfaces/server-init-result.js +3 -0
  326. package/src/interfaces/server-init-result.js.map +1 -0
  327. package/src/interfaces/status-code-response.d.ts +7 -0
  328. package/src/interfaces/status-code-response.d.ts.map +1 -0
  329. package/src/interfaces/status-code-response.js +3 -0
  330. package/src/interfaces/status-code-response.js.map +1 -0
  331. package/src/interfaces/symmetric-encryption-results.d.ts +3 -3
  332. package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -1
  333. package/src/interfaces/symmetric-encryption-results.js.map +1 -1
  334. package/src/interfaces/{token-response.ts → token-response.d.ts} +2 -2
  335. package/src/interfaces/token-response.d.ts.map +1 -0
  336. package/src/interfaces/token-response.js +3 -0
  337. package/src/interfaces/token-response.js.map +1 -0
  338. package/src/middlewares/authenticate-crypto.d.ts +13 -0
  339. package/src/middlewares/authenticate-crypto.d.ts.map +1 -0
  340. package/src/middlewares/authenticate-crypto.js +146 -0
  341. package/src/middlewares/authenticate-crypto.js.map +1 -0
  342. package/src/middlewares/authenticate-token.d.ts +24 -0
  343. package/src/middlewares/authenticate-token.d.ts.map +1 -0
  344. package/src/middlewares/authenticate-token.js +102 -0
  345. package/src/middlewares/authenticate-token.js.map +1 -0
  346. package/src/middlewares/cleanup-crypto.d.ts +7 -0
  347. package/src/middlewares/cleanup-crypto.d.ts.map +1 -0
  348. package/src/middlewares/cleanup-crypto.js +32 -0
  349. package/src/middlewares/cleanup-crypto.js.map +1 -0
  350. package/src/middlewares/{index.ts → index.d.ts} +1 -0
  351. package/src/middlewares/index.d.ts.map +1 -0
  352. package/src/middlewares/index.js +8 -0
  353. package/src/middlewares/index.js.map +1 -0
  354. package/src/middlewares/set-global-context-language.d.ts +3 -0
  355. package/src/middlewares/set-global-context-language.d.ts.map +1 -0
  356. package/src/middlewares/set-global-context-language.js +14 -0
  357. package/src/middlewares/set-global-context-language.js.map +1 -0
  358. package/src/middlewares.d.ts +18 -0
  359. package/src/middlewares.d.ts.map +1 -0
  360. package/src/middlewares.js +74 -0
  361. package/src/middlewares.js.map +1 -0
  362. package/src/model-registry.d.ts +23 -0
  363. package/src/model-registry.d.ts.map +1 -0
  364. package/src/model-registry.js +47 -0
  365. package/src/model-registry.js.map +1 -0
  366. package/src/models/email-token.d.ts +11 -0
  367. package/src/models/email-token.d.ts.map +1 -0
  368. package/src/models/email-token.js +11 -0
  369. package/src/models/email-token.js.map +1 -0
  370. package/src/models/{index.ts → index.d.ts} +1 -0
  371. package/src/models/index.d.ts.map +1 -0
  372. package/src/models/index.js +10 -0
  373. package/src/models/index.js.map +1 -0
  374. package/src/models/mnemonic.d.ts +11 -0
  375. package/src/models/mnemonic.d.ts.map +1 -0
  376. package/src/models/mnemonic.js +11 -0
  377. package/src/models/mnemonic.js.map +1 -0
  378. package/src/models/role.d.ts +11 -0
  379. package/src/models/role.d.ts.map +1 -0
  380. package/src/models/role.js +11 -0
  381. package/src/models/role.js.map +1 -0
  382. package/src/models/used-direct-login-token.d.ts +11 -0
  383. package/src/models/used-direct-login-token.d.ts.map +1 -0
  384. package/src/models/used-direct-login-token.js +11 -0
  385. package/src/models/used-direct-login-token.js.map +1 -0
  386. package/src/models/user-role.d.ts +6 -0
  387. package/src/models/user-role.d.ts.map +1 -0
  388. package/src/models/user-role.js +10 -0
  389. package/src/models/user-role.js.map +1 -0
  390. package/src/models/user.d.ts +7 -0
  391. package/src/models/user.d.ts.map +1 -0
  392. package/src/models/user.js +11 -0
  393. package/src/models/user.js.map +1 -0
  394. package/src/registry/email-service-registry.d.ts +9 -0
  395. package/src/registry/email-service-registry.d.ts.map +1 -0
  396. package/src/registry/email-service-registry.js +18 -0
  397. package/src/registry/email-service-registry.js.map +1 -0
  398. package/src/registry/{index.ts → index.d.ts} +1 -0
  399. package/src/registry/index.d.ts.map +1 -0
  400. package/src/registry/index.js +6 -0
  401. package/src/registry/index.js.map +1 -0
  402. package/src/routers/api.d.ts +27 -0
  403. package/src/routers/api.d.ts.map +1 -0
  404. package/src/routers/api.js +52 -0
  405. package/src/routers/api.js.map +1 -0
  406. package/src/routers/app.d.ts +28 -0
  407. package/src/routers/app.d.ts.map +1 -0
  408. package/src/routers/app.js +186 -0
  409. package/src/routers/app.js.map +1 -0
  410. package/src/routers/base.d.ts +12 -0
  411. package/src/routers/base.d.ts.map +1 -0
  412. package/src/routers/base.js +14 -0
  413. package/src/routers/base.js.map +1 -0
  414. package/src/routers/{index.ts → index.d.ts} +1 -0
  415. package/src/routers/index.d.ts.map +1 -0
  416. package/src/routers/index.js +7 -0
  417. package/src/routers/index.js.map +1 -0
  418. package/src/schemas/email-token.d.ts +38 -0
  419. package/src/schemas/email-token.d.ts.map +1 -0
  420. package/src/schemas/email-token.js +54 -0
  421. package/src/schemas/email-token.js.map +1 -0
  422. package/src/schemas/{index.ts → index.d.ts} +2 -1
  423. package/src/schemas/index.d.ts.map +1 -0
  424. package/src/schemas/index.js +11 -0
  425. package/src/schemas/index.js.map +1 -0
  426. package/src/schemas/mnemonic.d.ts +20 -0
  427. package/src/schemas/mnemonic.d.ts.map +1 -0
  428. package/src/schemas/mnemonic.js +30 -0
  429. package/src/schemas/mnemonic.js.map +1 -0
  430. package/src/schemas/role.d.ts +32 -0
  431. package/src/schemas/role.d.ts.map +1 -0
  432. package/src/schemas/role.js +86 -0
  433. package/src/schemas/role.js.map +1 -0
  434. package/src/schemas/schema.d.ts +40 -0
  435. package/src/schemas/schema.d.ts.map +1 -0
  436. package/src/schemas/schema.js +62 -0
  437. package/src/schemas/schema.js.map +1 -0
  438. package/src/schemas/used-direct-login-token.d.ts +27 -0
  439. package/src/schemas/used-direct-login-token.d.ts.map +1 -0
  440. package/src/schemas/used-direct-login-token.js +23 -0
  441. package/src/schemas/used-direct-login-token.js.map +1 -0
  442. package/src/schemas/user-role.d.ts +29 -0
  443. package/src/schemas/user-role.d.ts.map +1 -0
  444. package/src/schemas/user-role.js +54 -0
  445. package/src/schemas/user-role.js.map +1 -0
  446. package/src/schemas/user.d.ts +21 -0
  447. package/src/schemas/user.d.ts.map +1 -0
  448. package/src/schemas/user.js +176 -0
  449. package/src/schemas/user.js.map +1 -0
  450. package/src/services/backup-code.d.ts +78 -0
  451. package/src/services/backup-code.d.ts.map +1 -0
  452. package/src/services/backup-code.js +184 -0
  453. package/src/services/backup-code.js.map +1 -0
  454. package/src/services/base.d.ts +13 -0
  455. package/src/services/base.d.ts.map +1 -0
  456. package/src/services/base.js +15 -0
  457. package/src/services/base.js.map +1 -0
  458. package/src/services/checksum.d.ts +67 -0
  459. package/src/services/checksum.d.ts.map +1 -0
  460. package/src/services/checksum.js +143 -0
  461. package/src/services/checksum.js.map +1 -0
  462. package/src/services/crc.d.ts +87 -0
  463. package/src/services/crc.d.ts.map +1 -0
  464. package/src/services/crc.js +198 -0
  465. package/src/services/crc.js.map +1 -0
  466. package/src/services/database-initialization.d.ts +105 -0
  467. package/src/services/database-initialization.d.ts.map +1 -0
  468. package/src/services/database-initialization.js +782 -0
  469. package/src/services/database-initialization.js.map +1 -0
  470. package/src/services/db-init-cache.d.ts +7 -13
  471. package/src/services/db-init-cache.d.ts.map +1 -0
  472. package/src/services/db-init-cache.js +3 -0
  473. package/src/services/db-init-cache.js.map +1 -0
  474. package/src/services/direct-login-token.d.ts +9 -0
  475. package/src/services/direct-login-token.d.ts.map +1 -0
  476. package/src/services/direct-login-token.js +41 -0
  477. package/src/services/direct-login-token.js.map +1 -0
  478. package/src/services/fec-usage-example.d.ts +38 -0
  479. package/src/services/fec-usage-example.d.ts.map +1 -0
  480. package/src/services/fec-usage-example.js +75 -0
  481. package/src/services/fec-usage-example.js.map +1 -0
  482. package/src/services/fec.d.ts +46 -0
  483. package/src/services/fec.d.ts.map +1 -0
  484. package/src/services/fec.js +192 -0
  485. package/src/services/fec.js.map +1 -0
  486. package/src/services/{index.ts → index.d.ts} +1 -0
  487. package/src/services/index.d.ts.map +1 -0
  488. package/src/services/index.js +22 -0
  489. package/src/services/index.js.map +1 -0
  490. package/src/services/jwt.d.ts +33 -0
  491. package/src/services/jwt.d.ts.map +1 -0
  492. package/src/services/jwt.js +91 -0
  493. package/src/services/jwt.js.map +1 -0
  494. package/src/services/key-wrapping.d.ts +60 -0
  495. package/src/services/key-wrapping.d.ts.map +1 -0
  496. package/src/services/key-wrapping.js +311 -0
  497. package/src/services/key-wrapping.js.map +1 -0
  498. package/src/services/mnemonic.d.ts +61 -0
  499. package/src/services/mnemonic.d.ts.map +1 -0
  500. package/src/services/mnemonic.js +115 -0
  501. package/src/services/mnemonic.js.map +1 -0
  502. package/src/services/request-user.d.ts +20 -0
  503. package/src/services/request-user.d.ts.map +1 -0
  504. package/src/services/request-user.js +50 -0
  505. package/src/services/request-user.js.map +1 -0
  506. package/src/services/role.d.ts +88 -0
  507. package/src/services/role.d.ts.map +1 -0
  508. package/src/services/role.js +263 -0
  509. package/src/services/role.js.map +1 -0
  510. package/src/services/symmetric.d.ts +42 -0
  511. package/src/services/symmetric.d.ts.map +1 -0
  512. package/src/services/symmetric.js +101 -0
  513. package/src/services/symmetric.js.map +1 -0
  514. package/src/services/system-user.d.ts +17 -0
  515. package/src/services/system-user.d.ts.map +1 -0
  516. package/src/services/system-user.js +46 -0
  517. package/src/services/system-user.js.map +1 -0
  518. package/src/services/user.d.ts +320 -0
  519. package/src/services/user.d.ts.map +1 -0
  520. package/src/services/user.js +1378 -0
  521. package/src/services/user.js.map +1 -0
  522. package/src/services/xor.d.ts +24 -0
  523. package/src/services/xor.d.ts.map +1 -0
  524. package/src/services/xor.js +37 -0
  525. package/src/services/xor.js.map +1 -0
  526. package/src/types.d.ts +66 -40
  527. package/src/types.d.ts.map +1 -0
  528. package/src/types.js +14 -0
  529. package/src/types.js.map +1 -0
  530. package/src/utils.d.ts +202 -0
  531. package/src/utils.d.ts.map +1 -0
  532. package/src/utils.js +784 -0
  533. package/src/utils.js.map +1 -0
  534. package/LICENSE +0 -21
  535. package/src/application-base.ts +0 -492
  536. package/src/application.ts +0 -254
  537. package/src/backup-code.ts +0 -336
  538. package/src/constants.ts +0 -69
  539. package/src/controllers/base.ts +0 -440
  540. package/src/controllers/user.ts +0 -1451
  541. package/src/decorators/base-controller.ts +0 -61
  542. package/src/decorators/controller.ts +0 -109
  543. package/src/decorators/zod-validation.ts +0 -57
  544. package/src/defaults.ts +0 -94
  545. package/src/documents/base.ts +0 -7
  546. package/src/documents/email-token.ts +0 -14
  547. package/src/documents/used-direct-login-token.ts +0 -7
  548. package/src/enumerations/base-model-name.ts +0 -41
  549. package/src/enumerations/length-encoding-type.ts +0 -6
  550. package/src/enumerations/schema-collection.ts +0 -33
  551. package/src/enumerations/symmetric-error-type.ts +0 -4
  552. package/src/environment.ts +0 -770
  553. package/src/errors/express-validation.ts +0 -21
  554. package/src/errors/invalid-backup-code-version.ts +0 -14
  555. package/src/errors/invalid-jwt-token.ts +0 -10
  556. package/src/errors/invalid-model.ts +0 -11
  557. package/src/errors/invalid-new-password.ts +0 -18
  558. package/src/errors/invalid-password.ts +0 -13
  559. package/src/errors/missing-validated-data.ts +0 -36
  560. package/src/errors/mnemonic-or-password-required.ts +0 -12
  561. package/src/errors/model-not-registered.ts +0 -11
  562. package/src/errors/mongoose-validation.ts +0 -34
  563. package/src/errors/symmetric.ts +0 -41
  564. package/src/errors/token-expired.ts +0 -10
  565. package/src/get-language.ts +0 -53
  566. package/src/get-timezone.ts +0 -45
  567. package/src/interfaces/api-express-validation-error-response.ts +0 -8
  568. package/src/interfaces/api-message-response.ts +0 -3
  569. package/src/interfaces/backend-objects/email-token.ts +0 -11
  570. package/src/interfaces/backend-objects/user.ts +0 -9
  571. package/src/interfaces/checksum-config.ts +0 -4
  572. package/src/interfaces/checksum-consts.ts +0 -13
  573. package/src/interfaces/create-user-basics.ts +0 -17
  574. package/src/interfaces/csp-config.ts +0 -35
  575. package/src/interfaces/deep-partial.ts +0 -3
  576. package/src/interfaces/email-service.ts +0 -8
  577. package/src/interfaces/environment-mongo.ts +0 -76
  578. package/src/interfaces/environment.ts +0 -181
  579. package/src/interfaces/failable-result.ts +0 -6
  580. package/src/interfaces/fec-consts.ts +0 -4
  581. package/src/interfaces/handleable-error-options.ts +0 -6
  582. package/src/interfaces/jwt-consts.ts +0 -23
  583. package/src/interfaces/jwt-sign-response.ts +0 -19
  584. package/src/interfaces/mongo-errors.ts +0 -5
  585. package/src/interfaces/request-user.ts +0 -50
  586. package/src/interfaces/required-string-keys.ts +0 -26
  587. package/src/interfaces/schema.ts +0 -31
  588. package/src/interfaces/server-init-result.ts +0 -37
  589. package/src/interfaces/status-code-response.ts +0 -7
  590. package/src/interfaces/symmetric-encryption-results.ts +0 -4
  591. package/src/middlewares/authenticate-crypto.ts +0 -243
  592. package/src/middlewares/authenticate-token.ts +0 -152
  593. package/src/middlewares/cleanup-crypto.ts +0 -40
  594. package/src/middlewares/set-global-context-language.ts +0 -24
  595. package/src/middlewares.ts +0 -120
  596. package/src/model-registry.ts +0 -75
  597. package/src/models/email-token.ts +0 -19
  598. package/src/models/mnemonic.ts +0 -19
  599. package/src/models/role.ts +0 -19
  600. package/src/models/used-direct-login-token.ts +0 -23
  601. package/src/models/user-role.ts +0 -17
  602. package/src/models/user.ts +0 -19
  603. package/src/registry/email-service-registry.ts +0 -24
  604. package/src/routers/api.ts +0 -151
  605. package/src/routers/app.ts +0 -258
  606. package/src/routers/base.ts +0 -17
  607. package/src/schemas/email-token.ts +0 -91
  608. package/src/schemas/mnemonic.ts +0 -37
  609. package/src/schemas/role.ts +0 -127
  610. package/src/schemas/schema.ts +0 -140
  611. package/src/schemas/used-direct-login-token.ts +0 -38
  612. package/src/schemas/user-role.ts +0 -75
  613. package/src/schemas/user.ts +0 -202
  614. package/src/services/backup-code.ts +0 -316
  615. package/src/services/base.ts +0 -33
  616. package/src/services/checksum.ts +0 -161
  617. package/src/services/crc.ts +0 -213
  618. package/src/services/database-initialization.ts +0 -1479
  619. package/src/services/direct-login-token.ts +0 -62
  620. package/src/services/fec-usage-example.ts +0 -102
  621. package/src/services/fec.ts +0 -296
  622. package/src/services/jwt.ts +0 -134
  623. package/src/services/key-wrapping.ts +0 -434
  624. package/src/services/mnemonic.ts +0 -167
  625. package/src/services/request-user.ts +0 -62
  626. package/src/services/role.ts +0 -396
  627. package/src/services/symmetric.ts +0 -139
  628. package/src/services/system-user.ts +0 -82
  629. package/src/services/user.ts +0 -2137
  630. package/src/services/xor.ts +0 -34
  631. package/src/types.ts +0 -128
  632. package/src/utils.ts +0 -1022
@@ -1,434 +0,0 @@
1
- import { SecureBuffer, SecureString } from '@digitaldefiance/ecies-lib';
2
- import {
3
- Constants as ApiConstants,
4
- Pbkdf2Service,
5
- } from '@digitaldefiance/node-ecies-lib';
6
- import {
7
- createCipheriv,
8
- createDecipheriv,
9
- createHash,
10
- randomBytes,
11
- } from 'crypto';
12
- import { Constants as AppConstants } from '../constants';
13
- import { InvalidNewPasswordError, InvalidPasswordError } from '../errors';
14
-
15
- function createPbkdf2Service(): Pbkdf2Service {
16
- return Pbkdf2Service.fromConstants(ApiConstants);
17
- }
18
-
19
- export interface WrappedKey {
20
- salt: string;
21
- iv: string;
22
- authTag: string;
23
- encryptedMasterKey: string;
24
- iterations: number;
25
- }
26
-
27
- // Generic password-wrapped secret payload shape
28
- export interface PasswordWrappedSecret {
29
- salt: string;
30
- iv: string;
31
- authTag: string;
32
- ciphertext: string;
33
- iterations: number;
34
- }
35
-
36
- export class KeyWrappingService {
37
- // In-flight de-duplication map to share PBKDF2 work across concurrent identical requests
38
- // Store a promise of the raw master key bytes, so each caller can get an independent SecureBuffer
39
- private static inFlightUnwraps: Map<string, Promise<string>> = new Map();
40
-
41
- /**
42
- * Generates a new master key and wraps it with the user's password
43
- */
44
- public wrapNewMasterKey(password: SecureString): {
45
- masterKey: SecureBuffer;
46
- wrappedKey: WrappedKey;
47
- } {
48
- const masterKey = new SecureBuffer(
49
- randomBytes(ApiConstants.WRAPPED_KEY.MASTER_KEY_SIZE),
50
- );
51
- const wrappedKey = this.wrapMasterKey(masterKey, password);
52
- return { masterKey, wrappedKey };
53
- }
54
-
55
- /**
56
- * Wraps an existing master key with a password-derived key
57
- */
58
- public wrapMasterKey(
59
- masterKey: SecureBuffer,
60
- password: SecureString,
61
- ): WrappedKey {
62
- if (AppConstants.PasswordRegex.test(password.value ?? '') === false) {
63
- throw new InvalidNewPasswordError();
64
- }
65
- const salt = randomBytes(ApiConstants.WRAPPED_KEY.SALT_SIZE);
66
- const iterations = ApiConstants.WRAPPED_KEY.MIN_ITERATIONS;
67
- const pbkdf2Service = createPbkdf2Service();
68
-
69
- // Derive key from password using centralized PBKDF2 service
70
- const derivedKey = pbkdf2Service.deriveKeyFromPassword(
71
- Buffer.from(password.valueAsUint8Array),
72
- salt,
73
- iterations,
74
- ApiConstants.WRAPPED_KEY.SALT_SIZE,
75
- 32, // AES-256 key size
76
- 'sha256', // Keep existing algorithm for compatibility
77
- );
78
- const passwordKeySecure = new SecureBuffer(derivedKey.hash);
79
-
80
- // Encrypt master key
81
- const iv = randomBytes(ApiConstants.WRAPPED_KEY.IV_SIZE);
82
- const cipher = createCipheriv('aes-256-gcm', passwordKeySecure.value, iv);
83
-
84
- const encrypted = Buffer.concat([
85
- cipher.update(masterKey.value),
86
- cipher.final(),
87
- ]);
88
-
89
- const authTag = cipher.getAuthTag();
90
-
91
- passwordKeySecure.dispose();
92
-
93
- return {
94
- salt: salt.toString('hex'),
95
- iv: iv.toString('hex'),
96
- authTag: authTag.toString('hex'),
97
- encryptedMasterKey: encrypted.toString('hex'),
98
- iterations,
99
- };
100
- }
101
-
102
- /**
103
- * Unwraps a master key using the user's password
104
- */
105
- public unwrapMasterKey(
106
- wrappedKey: WrappedKey,
107
- password: SecureString,
108
- ): SecureBuffer {
109
- const salt = Buffer.from(wrappedKey.salt, 'hex');
110
- const iv = Buffer.from(wrappedKey.iv, 'hex');
111
- const authTag = Buffer.from(wrappedKey.authTag, 'hex');
112
- const encrypted = Buffer.from(wrappedKey.encryptedMasterKey, 'hex');
113
- const pbkdf2Service = createPbkdf2Service();
114
-
115
- // Derive the same key from password using centralized PBKDF2 service
116
- const derivedKey = pbkdf2Service.deriveKeyFromPassword(
117
- Buffer.from(password.valueAsUint8Array),
118
- salt,
119
- wrappedKey.iterations,
120
- salt.length, // Use actual salt size
121
- 32, // AES-256 key size
122
- 'sha256', // Keep existing algorithm for compatibility
123
- );
124
- const passwordKeySecure = new SecureBuffer(derivedKey.hash);
125
-
126
- try {
127
- const decipher = createDecipheriv(
128
- 'aes-256-gcm',
129
- passwordKeySecure.value,
130
- iv,
131
- );
132
- decipher.setAuthTag(authTag);
133
-
134
- const decrypted = Buffer.concat([
135
- decipher.update(encrypted),
136
- decipher.final(),
137
- ]);
138
-
139
- return new SecureBuffer(decrypted);
140
- } catch {
141
- throw new InvalidPasswordError();
142
- } finally {
143
- passwordKeySecure.dispose();
144
- }
145
- }
146
-
147
- /**
148
- * Async version of unwrapMasterKey that uses libuv threadpool via crypto.pbkdf2
149
- * to avoid blocking the event loop during password verification.
150
- */
151
- public async unwrapMasterKeyAsync(
152
- wrappedKey: WrappedKey,
153
- password: SecureString | string,
154
- ): Promise<SecureBuffer> {
155
- const __perfEnabled = process.env['PERF_LOGS'] === '1';
156
- const _t0 = __perfEnabled ? Date.now() : 0;
157
- const salt = Buffer.from(wrappedKey.salt, 'hex');
158
- const iv = Buffer.from(wrappedKey.iv, 'hex');
159
- const authTag = Buffer.from(wrappedKey.authTag, 'hex');
160
- const encrypted = Buffer.from(wrappedKey.encryptedMasterKey, 'hex');
161
-
162
- // Accept either a SecureString (preferred) or a raw password string to avoid
163
- // expensive SecureString construction in the hot login path.
164
- const pwdBuffer =
165
- // amazonq-ignore-next-line false positive
166
- typeof password === 'string'
167
- ? Buffer.from(password, 'utf8')
168
- : Buffer.from(password.valueAsUint8Array);
169
- const pbkdf2Service = createPbkdf2Service();
170
-
171
- // Use centralized PBKDF2 service for async key derivation
172
- const derivedKey = await pbkdf2Service.deriveKeyFromPasswordAsync(
173
- pwdBuffer,
174
- salt,
175
- wrappedKey.iterations,
176
- salt.length, // Use actual salt size
177
- 32, // AES-256 key size
178
- 'sha256', // Keep existing algorithm for compatibility
179
- );
180
- const passwordKeySecure = new SecureBuffer(derivedKey.hash);
181
-
182
- try {
183
- const decipher = createDecipheriv(
184
- 'aes-256-gcm',
185
- passwordKeySecure.value,
186
- iv,
187
- );
188
- decipher.setAuthTag(authTag);
189
-
190
- const decrypted = Buffer.concat([
191
- decipher.update(encrypted),
192
- decipher.final(),
193
- ]);
194
- if (__perfEnabled)
195
- console.warn(
196
- '[perf] unwrapMasterKeyAsync pbkdf2',
197
- 'iters=' + String(wrappedKey.iterations).replace(/[\r\n]/g, ''),
198
- 'dt=' + (Date.now() - _t0) + 'ms',
199
- );
200
-
201
- return new SecureBuffer(decrypted);
202
- } catch {
203
- throw new InvalidPasswordError();
204
- } finally {
205
- // Best-effort zero the temporary password buffer
206
- try {
207
- pwdBuffer.fill(0);
208
- } catch {
209
- // ignore
210
- }
211
- passwordKeySecure.dispose();
212
- }
213
- }
214
-
215
- /**
216
- * Deduplicated async unwrap that coalesces concurrent identical PBKDF2 operations.
217
- * Keyed by salt + iterations + a short hash of the password. Entry is removed after resolve/reject.
218
- */
219
- public async unwrapMasterKeyAsyncDedup(
220
- wrappedKey: WrappedKey,
221
- password: string,
222
- ): Promise<SecureBuffer> {
223
- // Derive a short cache key; avoid storing raw password by hashing
224
- const pwdKey = createHash('sha256')
225
- .update(password, 'utf8')
226
- .digest('hex')
227
- .slice(0, 24);
228
- const cacheKey = `${wrappedKey.salt}:${wrappedKey.iterations}:${pwdKey}`;
229
- let p = KeyWrappingService.inFlightUnwraps.get(cacheKey);
230
- if (!p) {
231
- // Compute once, extract raw bytes, dispose the shared SecureBuffer, and cache the bytes
232
- p = (async () => {
233
- const mk = await this.unwrapMasterKeyAsync(wrappedKey, password);
234
- try {
235
- const copy = Buffer.from(mk.value);
236
- const b64 = copy.toString('base64');
237
- // zeroize copy
238
- copy.fill(0);
239
- return b64;
240
- } finally {
241
- mk.dispose();
242
- }
243
- })().finally(() => {
244
- // Best-effort cleanup
245
- KeyWrappingService.inFlightUnwraps.delete(cacheKey);
246
- }) as Promise<string>;
247
- KeyWrappingService.inFlightUnwraps.set(cacheKey, p);
248
- }
249
- const b64 = await p;
250
- // Return a fresh SecureBuffer per caller to avoid cross-disposal races
251
- const buf = Buffer.from(b64, 'base64');
252
- const secure = new SecureBuffer(Buffer.from(buf));
253
- buf.fill(0);
254
- return secure;
255
- }
256
-
257
- /**
258
- * Changes password by re-wrapping the master key
259
- */
260
- public changePassword(
261
- wrappedKey: WrappedKey,
262
- oldPassword: SecureString,
263
- newPassword: SecureString,
264
- ): WrappedKey {
265
- // Unwrap with old password
266
- const masterKey = this.unwrapMasterKey(wrappedKey, oldPassword);
267
-
268
- try {
269
- // Re-wrap with new password
270
- return this.wrapMasterKey(masterKey, newPassword);
271
- } catch (error: unknown) {
272
- throw error;
273
- } finally {
274
- masterKey.dispose();
275
- }
276
- }
277
-
278
- /**
279
- * Wraps arbitrary secret bytes with a password-derived key (AES-256-GCM)
280
- */
281
- public wrapSecret(
282
- secret: SecureBuffer,
283
- password: SecureString,
284
- ): PasswordWrappedSecret {
285
- if (AppConstants.PasswordRegex.test(password.value ?? '') === false) {
286
- throw new InvalidNewPasswordError();
287
- }
288
- const salt = randomBytes(ApiConstants.WRAPPED_KEY.SALT_SIZE);
289
- const iterations = ApiConstants.WRAPPED_KEY.MIN_ITERATIONS;
290
- const pbkdf2Service = createPbkdf2Service();
291
-
292
- // Derive key from password using centralized PBKDF2 service
293
- const derivedKey = pbkdf2Service.deriveKeyFromPassword(
294
- Buffer.from(password.valueAsUint8Array),
295
- salt,
296
- iterations,
297
- ApiConstants.WRAPPED_KEY.SALT_SIZE,
298
- 32, // AES-256 key size
299
- 'sha256', // Keep existing algorithm for compatibility
300
- );
301
- const passwordKeySecure = new SecureBuffer(derivedKey.hash);
302
-
303
- try {
304
- const iv = randomBytes(ApiConstants.WRAPPED_KEY.IV_SIZE);
305
- const cipher = createCipheriv('aes-256-gcm', passwordKeySecure.value, iv);
306
- const encrypted = Buffer.concat([
307
- cipher.update(secret.value),
308
- cipher.final(),
309
- ]);
310
- const authTag = cipher.getAuthTag();
311
- return {
312
- salt: salt.toString('hex'),
313
- iv: iv.toString('hex'),
314
- authTag: authTag.toString('hex'),
315
- ciphertext: encrypted.toString('hex'),
316
- iterations,
317
- };
318
- } finally {
319
- passwordKeySecure.dispose();
320
- }
321
- }
322
-
323
- /**
324
- * Unwraps a password-wrapped secret (sync)
325
- */
326
- public unwrapSecret(
327
- wrapped: PasswordWrappedSecret,
328
- password: SecureString,
329
- ): SecureBuffer {
330
- const salt = Buffer.from(wrapped.salt, 'hex');
331
- const iv = Buffer.from(wrapped.iv, 'hex');
332
- const authTag = Buffer.from(wrapped.authTag, 'hex');
333
- const encrypted = Buffer.from(wrapped.ciphertext, 'hex');
334
- const pbkdf2Service = createPbkdf2Service();
335
-
336
- // Derive key from password using centralized PBKDF2 service
337
- const derivedKey = pbkdf2Service.deriveKeyFromPassword(
338
- Buffer.from(password.valueAsUint8Array),
339
- salt,
340
- wrapped.iterations,
341
- salt.length, // Use actual salt size
342
- 32, // AES-256 key size
343
- 'sha256', // Keep existing algorithm for compatibility
344
- );
345
- const passwordKeySecure = new SecureBuffer(derivedKey.hash);
346
- try {
347
- const decipher = createDecipheriv(
348
- 'aes-256-gcm',
349
- passwordKeySecure.value,
350
- iv,
351
- );
352
- decipher.setAuthTag(authTag);
353
- const decrypted = Buffer.concat([
354
- decipher.update(encrypted),
355
- decipher.final(),
356
- ]);
357
- return new SecureBuffer(decrypted);
358
- } catch {
359
- throw new InvalidPasswordError();
360
- } finally {
361
- passwordKeySecure.dispose();
362
- }
363
- }
364
-
365
- /**
366
- * Unwraps a password-wrapped secret (async PBKDF2)
367
- */
368
- public async unwrapSecretAsync(
369
- wrapped: PasswordWrappedSecret,
370
- password: SecureString | string,
371
- ): Promise<SecureBuffer> {
372
- const salt = Buffer.from(wrapped.salt, 'hex');
373
- const iv = Buffer.from(wrapped.iv, 'hex');
374
- const authTag = Buffer.from(wrapped.authTag, 'hex');
375
- const encrypted = Buffer.from(wrapped.ciphertext, 'hex');
376
-
377
- // Validate password parameter before using it
378
- // amazonq-ignore-next-line false positive
379
- if (typeof password === 'string') {
380
- if (password === undefined || password === null) {
381
- throw new Error('Password cannot be undefined or null');
382
- }
383
- } else if (!(password instanceof SecureString)) {
384
- throw new Error('Password must be provided as string or SecureString');
385
- }
386
-
387
- const pwdBuffer =
388
- // amazonq-ignore-next-line false positive
389
- typeof password === 'string'
390
- ? Buffer.from(password, 'utf8')
391
- : await (async () => password.valueAsUint8Array)();
392
-
393
- // Additional safety check
394
- if (!pwdBuffer) {
395
- throw new Error(
396
- 'Failed to create password buffer - password may be invalid',
397
- );
398
- }
399
- const pbkdf2Service = createPbkdf2Service();
400
-
401
- // Use centralized PBKDF2 service for async key derivation
402
- const derivedKey = await pbkdf2Service.deriveKeyFromPasswordAsync(
403
- Buffer.from(pwdBuffer),
404
- salt,
405
- wrapped.iterations,
406
- salt.length, // Use actual salt size
407
- 32, // AES-256 key size
408
- 'sha256', // Keep existing algorithm for compatibility
409
- );
410
- const passwordKeySecure = new SecureBuffer(derivedKey.hash);
411
- try {
412
- const decipher = createDecipheriv(
413
- 'aes-256-gcm',
414
- passwordKeySecure.value,
415
- iv,
416
- );
417
- decipher.setAuthTag(authTag);
418
- const decrypted = Buffer.concat([
419
- decipher.update(encrypted),
420
- decipher.final(),
421
- ]);
422
- return new SecureBuffer(decrypted);
423
- } catch {
424
- throw new InvalidPasswordError();
425
- } finally {
426
- try {
427
- pwdBuffer.fill(0);
428
- } catch {
429
- // ignore
430
- }
431
- passwordKeySecure.dispose();
432
- }
433
- }
434
- }
@@ -1,167 +0,0 @@
1
- import { SecureBuffer, SecureString } from '@digitaldefiance/ecies-lib';
2
- import {
3
- SuiteCoreStringKey,
4
- TranslatableSuiteError,
5
- } from '@digitaldefiance/suite-core-lib';
6
- import { createHmac } from 'crypto';
7
- import { ClientSession, Model } from 'mongoose';
8
- import { Constants as AppConstants } from '../constants';
9
- import { IMnemonicDocument } from '../documents/mnemonic';
10
- import { KeyWrappingService } from './key-wrapping';
11
-
12
- /**
13
- * Encrypts and stores mnemonics securely, using an HMAC to check for
14
- * uniqueness without exposing the mnemonic itself.
15
- */
16
- export class MnemonicService {
17
- private readonly keyWrappingService: KeyWrappingService;
18
- private readonly hmacSecret: SecureBuffer;
19
- private readonly MnemonicModel: Model<IMnemonicDocument>;
20
-
21
- constructor(
22
- mnemonicModel: Model<IMnemonicDocument>,
23
- hmacSecret: SecureBuffer,
24
- keyWrappingService: KeyWrappingService,
25
- ) {
26
- this.MnemonicModel = mnemonicModel;
27
- // Immediately wrap secrets in secure containers
28
- this.hmacSecret = hmacSecret;
29
- this.keyWrappingService = keyWrappingService;
30
- }
31
-
32
- /**
33
- * Disposes of the secure secrets held by this service.
34
- */
35
- public dispose(): void {
36
- this.hmacSecret.dispose();
37
- }
38
-
39
- /**
40
- * Creates a non-reversible HMAC of the mnemonic for fast, indexed lookups.
41
- * @param mnemonic The mnemonic to hash, wrapped in a SecureString.
42
- */
43
- public getMnemonicHmac(mnemonic: SecureString): string {
44
- // Use the raw secret buffer for the HMAC
45
- return createHmac('sha256', this.hmacSecret.value)
46
- .update(mnemonic.valueAsUint8Array) // Use the raw buffer for consistency
47
- .digest('hex');
48
- }
49
-
50
- /**
51
- * Checks if a mnemonic already exists in the database using its HMAC.
52
- * @param mnemonic The mnemonic to check, wrapped in a SecureString.
53
- * @param session Optional Mongoose session for transaction support.
54
- */
55
- public async mnemonicExists(
56
- mnemonic: SecureString,
57
- session?: ClientSession,
58
- ): Promise<boolean> {
59
- const hmac = this.getMnemonicHmac(mnemonic);
60
- const count = await this.MnemonicModel.countDocuments({ hmac }).session(
61
- session ?? null,
62
- );
63
- return count > 0;
64
- }
65
-
66
- /**
67
- * Adds a new, unique mnemonic to the database with password-based key wrapping.
68
- * @param mnemonic The mnemonic to add, wrapped in a SecureString.
69
- * @param password User's password for key wrapping.
70
- * @param session Optional Mongoose session for transaction support.
71
- */
72
- public async addMnemonicWithPassword(
73
- mnemonic: SecureString,
74
- _password: SecureString,
75
- session?: ClientSession,
76
- ): Promise<{
77
- document: IMnemonicDocument | null;
78
- }> {
79
- if (!mnemonic.value || !AppConstants.MnemonicRegex.test(mnemonic.value)) {
80
- throw new TranslatableSuiteError(
81
- SuiteCoreStringKey.Validation_MnemonicRegex,
82
- );
83
- }
84
-
85
- if (await this.mnemonicExists(mnemonic, session)) {
86
- return { document: null };
87
- }
88
-
89
- try {
90
- const hmac = this.getMnemonicHmac(mnemonic);
91
- const [newDoc] = await this.MnemonicModel.create(
92
- [
93
- {
94
- hmac: hmac,
95
- },
96
- ],
97
- { session },
98
- );
99
- return { document: newDoc };
100
- } finally {
101
- // nothing to dispose
102
- }
103
- }
104
-
105
- /**
106
- * Adds a new, unique mnemonic to the database.
107
- * @param mnemonic The mnemonic to add, wrapped in a SecureString.
108
- * @param session Optional Mongoose session for transaction support.
109
- */
110
- public async addMnemonic(
111
- mnemonic: SecureString,
112
- session?: ClientSession,
113
- ): Promise<IMnemonicDocument | null> {
114
- if (!mnemonic.value || !AppConstants.MnemonicRegex.test(mnemonic.value)) {
115
- throw new TranslatableSuiteError(
116
- SuiteCoreStringKey.Validation_MnemonicRegex,
117
- );
118
- }
119
-
120
- if (await this.mnemonicExists(mnemonic, session)) {
121
- return null;
122
- }
123
- const hmac = this.getMnemonicHmac(mnemonic);
124
- const [newDoc] = await this.MnemonicModel.create(
125
- [
126
- {
127
- hmac: hmac,
128
- },
129
- ],
130
- { session },
131
- );
132
- return newDoc;
133
- }
134
-
135
- /**
136
- * Retrieves a mnemonic document by ID.
137
- * @param mnemonicId The ID of the mnemonic document.
138
- * @param session Optional Mongoose session for transaction support.
139
- */
140
- public async getMnemonicDocument(
141
- mnemonicId: string,
142
- session?: ClientSession,
143
- ): Promise<IMnemonicDocument | null> {
144
- return await this.MnemonicModel.findById(mnemonicId).session(
145
- session ?? null,
146
- );
147
- }
148
-
149
- /**
150
- * Decrypts a mnemonic from a document using the service's master encryption key.
151
- * @param doc The mnemonic document.
152
- */
153
-
154
- /**
155
- * Deletes a mnemonic document by ID.
156
- * @param mnemonicId The ID of the mnemonic document.
157
- * @param session Optional Mongoose session for transaction support.
158
- */
159
- public async deleteMnemonicDocument(
160
- mnemonicId: string,
161
- session?: ClientSession,
162
- ): Promise<void> {
163
- await this.MnemonicModel.findByIdAndDelete(mnemonicId).session(
164
- session ?? null,
165
- );
166
- }
167
- }
@@ -1,62 +0,0 @@
1
- import { IRequestUserDTO, ITokenRole } from '@digitaldefiance/suite-core-lib';
2
- import { Types } from 'mongoose';
3
- import { IUserDocument } from '../documents';
4
- import { IRequestUserBackendObject } from '../interfaces/backend-objects/request-user';
5
- import { RoleService } from './role';
6
-
7
- export class RequestUserService<I, TTokenRole extends ITokenRole<I>> {
8
- /**
9
- * Given a user document and an array of role documents, create the IRequestUser
10
- * @param userDoc
11
- * @returns
12
- */
13
- public static makeRequestUserDTO<
14
- I,
15
- TTokenRole extends ITokenRole<I>,
16
- TRequestUserDTO extends IRequestUserDTO,
17
- >(userDoc: IUserDocument, roles: TTokenRole[]): TRequestUserDTO {
18
- if (!userDoc._id) {
19
- throw new Error('User document is missing _id');
20
- }
21
- return {
22
- id: userDoc._id.toString(),
23
- email: userDoc.email,
24
- roles: roles.map((r) => RoleService.roleToRoleDTO(r)),
25
- username: userDoc.username,
26
- timezone: userDoc.timezone,
27
- ...(userDoc.lastLogin && { lastLogin: userDoc.lastLogin.toString() }),
28
- emailVerified: userDoc.emailVerified,
29
- siteLanguage: userDoc.siteLanguage as string,
30
- } as TRequestUserDTO;
31
- }
32
-
33
- /**
34
- * Given a request user, reconstitute dates, objectids, and enums
35
- * @param requestUser a RequestUser DTO
36
- * @returns An IRequestUserBackendObject
37
- */
38
- public static hydrateRequestUser<
39
- S extends string,
40
- TRequestUserDTO extends IRequestUserDTO & { siteLanguage: S },
41
- >(requestUser: TRequestUserDTO): IRequestUserBackendObject<S> {
42
- const hydratedRoles = requestUser.roles.map((role) =>
43
- RoleService.hydrateRoleDTOToBackend(role),
44
- );
45
-
46
- const hydratedUser: IRequestUserBackendObject<S> = {
47
- id: new Types.ObjectId(requestUser.id),
48
- email: requestUser.email,
49
- roles: hydratedRoles,
50
- username: requestUser.username,
51
- timezone: requestUser.timezone,
52
- emailVerified: requestUser.emailVerified,
53
- siteLanguage: requestUser.siteLanguage,
54
- };
55
-
56
- if (requestUser.lastLogin) {
57
- hydratedUser.lastLogin = new Date(requestUser.lastLogin);
58
- }
59
-
60
- return hydratedUser;
61
- }
62
- }