@digitaldefiance/node-express-suite 1.0.23 → 1.0.24

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 (629) hide show
  1. package/README.md +4 -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/direct-login-token.d.ts +9 -0
  471. package/src/services/direct-login-token.d.ts.map +1 -0
  472. package/src/services/direct-login-token.js +41 -0
  473. package/src/services/direct-login-token.js.map +1 -0
  474. package/src/services/fec-usage-example.d.ts +38 -0
  475. package/src/services/fec-usage-example.d.ts.map +1 -0
  476. package/src/services/fec-usage-example.js +75 -0
  477. package/src/services/fec-usage-example.js.map +1 -0
  478. package/src/services/fec.d.ts +46 -0
  479. package/src/services/fec.d.ts.map +1 -0
  480. package/src/services/fec.js +192 -0
  481. package/src/services/fec.js.map +1 -0
  482. package/src/services/{index.ts → index.d.ts} +1 -0
  483. package/src/services/index.d.ts.map +1 -0
  484. package/src/services/index.js +22 -0
  485. package/src/services/index.js.map +1 -0
  486. package/src/services/jwt.d.ts +33 -0
  487. package/src/services/jwt.d.ts.map +1 -0
  488. package/src/services/jwt.js +91 -0
  489. package/src/services/jwt.js.map +1 -0
  490. package/src/services/key-wrapping.d.ts +60 -0
  491. package/src/services/key-wrapping.d.ts.map +1 -0
  492. package/src/services/key-wrapping.js +311 -0
  493. package/src/services/key-wrapping.js.map +1 -0
  494. package/src/services/mnemonic.d.ts +61 -0
  495. package/src/services/mnemonic.d.ts.map +1 -0
  496. package/src/services/mnemonic.js +115 -0
  497. package/src/services/mnemonic.js.map +1 -0
  498. package/src/services/request-user.d.ts +20 -0
  499. package/src/services/request-user.d.ts.map +1 -0
  500. package/src/services/request-user.js +50 -0
  501. package/src/services/request-user.js.map +1 -0
  502. package/src/services/role.d.ts +88 -0
  503. package/src/services/role.d.ts.map +1 -0
  504. package/src/services/role.js +263 -0
  505. package/src/services/role.js.map +1 -0
  506. package/src/services/symmetric.d.ts +42 -0
  507. package/src/services/symmetric.d.ts.map +1 -0
  508. package/src/services/symmetric.js +101 -0
  509. package/src/services/symmetric.js.map +1 -0
  510. package/src/services/system-user.d.ts +17 -0
  511. package/src/services/system-user.d.ts.map +1 -0
  512. package/src/services/system-user.js +46 -0
  513. package/src/services/system-user.js.map +1 -0
  514. package/src/services/user.d.ts +320 -0
  515. package/src/services/user.d.ts.map +1 -0
  516. package/src/services/user.js +1378 -0
  517. package/src/services/user.js.map +1 -0
  518. package/src/services/xor.d.ts +24 -0
  519. package/src/services/xor.d.ts.map +1 -0
  520. package/src/services/xor.js +37 -0
  521. package/src/services/xor.js.map +1 -0
  522. package/src/types.d.ts +66 -40
  523. package/src/types.d.ts.map +1 -0
  524. package/src/types.js +14 -0
  525. package/src/types.js.map +1 -0
  526. package/src/utils.d.ts +202 -0
  527. package/src/utils.d.ts.map +1 -0
  528. package/src/utils.js +784 -0
  529. package/src/utils.js.map +1 -0
  530. package/LICENSE +0 -21
  531. package/src/application-base.ts +0 -492
  532. package/src/application.ts +0 -254
  533. package/src/backup-code.ts +0 -336
  534. package/src/constants.ts +0 -69
  535. package/src/controllers/base.ts +0 -440
  536. package/src/controllers/user.ts +0 -1451
  537. package/src/decorators/base-controller.ts +0 -61
  538. package/src/decorators/controller.ts +0 -109
  539. package/src/decorators/zod-validation.ts +0 -57
  540. package/src/defaults.ts +0 -94
  541. package/src/documents/base.ts +0 -7
  542. package/src/documents/email-token.ts +0 -14
  543. package/src/documents/used-direct-login-token.ts +0 -7
  544. package/src/enumerations/base-model-name.ts +0 -41
  545. package/src/enumerations/length-encoding-type.ts +0 -6
  546. package/src/enumerations/schema-collection.ts +0 -33
  547. package/src/enumerations/symmetric-error-type.ts +0 -4
  548. package/src/environment.ts +0 -770
  549. package/src/errors/express-validation.ts +0 -21
  550. package/src/errors/invalid-backup-code-version.ts +0 -14
  551. package/src/errors/invalid-jwt-token.ts +0 -10
  552. package/src/errors/invalid-model.ts +0 -11
  553. package/src/errors/invalid-new-password.ts +0 -18
  554. package/src/errors/invalid-password.ts +0 -13
  555. package/src/errors/missing-validated-data.ts +0 -36
  556. package/src/errors/mnemonic-or-password-required.ts +0 -12
  557. package/src/errors/model-not-registered.ts +0 -11
  558. package/src/errors/mongoose-validation.ts +0 -34
  559. package/src/errors/symmetric.ts +0 -41
  560. package/src/errors/token-expired.ts +0 -10
  561. package/src/get-language.ts +0 -53
  562. package/src/get-timezone.ts +0 -45
  563. package/src/interfaces/api-express-validation-error-response.ts +0 -8
  564. package/src/interfaces/api-message-response.ts +0 -3
  565. package/src/interfaces/backend-objects/email-token.ts +0 -11
  566. package/src/interfaces/backend-objects/user.ts +0 -9
  567. package/src/interfaces/checksum-config.ts +0 -4
  568. package/src/interfaces/checksum-consts.ts +0 -13
  569. package/src/interfaces/create-user-basics.ts +0 -17
  570. package/src/interfaces/csp-config.ts +0 -35
  571. package/src/interfaces/deep-partial.ts +0 -3
  572. package/src/interfaces/email-service.ts +0 -8
  573. package/src/interfaces/environment-mongo.ts +0 -76
  574. package/src/interfaces/environment.ts +0 -181
  575. package/src/interfaces/failable-result.ts +0 -6
  576. package/src/interfaces/fec-consts.ts +0 -4
  577. package/src/interfaces/handleable-error-options.ts +0 -6
  578. package/src/interfaces/jwt-consts.ts +0 -23
  579. package/src/interfaces/jwt-sign-response.ts +0 -19
  580. package/src/interfaces/mongo-errors.ts +0 -5
  581. package/src/interfaces/request-user.ts +0 -50
  582. package/src/interfaces/required-string-keys.ts +0 -26
  583. package/src/interfaces/schema.ts +0 -31
  584. package/src/interfaces/server-init-result.ts +0 -37
  585. package/src/interfaces/status-code-response.ts +0 -7
  586. package/src/interfaces/symmetric-encryption-results.ts +0 -4
  587. package/src/middlewares/authenticate-crypto.ts +0 -243
  588. package/src/middlewares/authenticate-token.ts +0 -152
  589. package/src/middlewares/cleanup-crypto.ts +0 -40
  590. package/src/middlewares/set-global-context-language.ts +0 -24
  591. package/src/middlewares.ts +0 -120
  592. package/src/model-registry.ts +0 -75
  593. package/src/models/email-token.ts +0 -19
  594. package/src/models/mnemonic.ts +0 -19
  595. package/src/models/role.ts +0 -19
  596. package/src/models/used-direct-login-token.ts +0 -23
  597. package/src/models/user-role.ts +0 -17
  598. package/src/models/user.ts +0 -19
  599. package/src/registry/email-service-registry.ts +0 -24
  600. package/src/routers/api.ts +0 -151
  601. package/src/routers/app.ts +0 -258
  602. package/src/routers/base.ts +0 -17
  603. package/src/schemas/email-token.ts +0 -91
  604. package/src/schemas/mnemonic.ts +0 -37
  605. package/src/schemas/role.ts +0 -127
  606. package/src/schemas/schema.ts +0 -140
  607. package/src/schemas/used-direct-login-token.ts +0 -38
  608. package/src/schemas/user-role.ts +0 -75
  609. package/src/schemas/user.ts +0 -202
  610. package/src/services/backup-code.ts +0 -316
  611. package/src/services/base.ts +0 -33
  612. package/src/services/checksum.ts +0 -161
  613. package/src/services/crc.ts +0 -213
  614. package/src/services/database-initialization.ts +0 -1479
  615. package/src/services/db-init-cache.d.ts +0 -16
  616. package/src/services/direct-login-token.ts +0 -62
  617. package/src/services/fec-usage-example.ts +0 -102
  618. package/src/services/fec.ts +0 -296
  619. package/src/services/jwt.ts +0 -134
  620. package/src/services/key-wrapping.ts +0 -434
  621. package/src/services/mnemonic.ts +0 -167
  622. package/src/services/request-user.ts +0 -62
  623. package/src/services/role.ts +0 -396
  624. package/src/services/symmetric.ts +0 -139
  625. package/src/services/system-user.ts +0 -82
  626. package/src/services/user.ts +0 -2137
  627. package/src/services/xor.ts +0 -34
  628. package/src/types.ts +0 -128
  629. package/src/utils.ts +0 -1022
@@ -1,254 +0,0 @@
1
- import { HandleableError } from '@digitaldefiance/i18n-lib';
2
- import {
3
- Constants,
4
- getSuiteCoreI18nEngine,
5
- SuiteCoreComponentId,
6
- SuiteCoreStringKey,
7
- TranslatableSuiteError,
8
- } from '@digitaldefiance/suite-core-lib';
9
- import express, {
10
- Application as ExpressApplication,
11
- NextFunction,
12
- Request,
13
- Response,
14
- } from 'express';
15
- import { readFileSync } from 'fs';
16
- import { Server } from 'http';
17
- import { createServer } from 'https';
18
- import mongoose, { Types } from 'mongoose';
19
- import { isAbsolute, normalize, resolve } from 'path';
20
- import { BaseApplication } from './application-base';
21
- import { IBaseDocument } from './documents/base';
22
- import { Environment } from './environment';
23
- import { IApplication, ICSPConfig, IFailableResult } from './interfaces';
24
- import { IConstants } from './interfaces/constants';
25
- import { Middlewares } from './middlewares';
26
- import { AppRouter } from './routers/app';
27
- import { BaseRouter } from './routers/base';
28
- import { SchemaMap } from './types';
29
- import { debugLog, handleError, sendApiMessageResponse } from './utils';
30
-
31
- /**
32
- * Application class
33
- */
34
- type ServerWithOptionalClose = Server & { closeAllConnections?: () => void };
35
-
36
- export class Application<
37
- T,
38
- I extends Types.ObjectId | string,
39
- TInitResults,
40
- TModelDocs extends Record<string, IBaseDocument<any>>,
41
- TBaseDocument extends IBaseDocument<T, I> = IBaseDocument<T, I>,
42
- TEnvironment extends Environment = Environment,
43
- TConstants extends IConstants = IConstants,
44
- >
45
- extends BaseApplication<TModelDocs, TInitResults, TConstants>
46
- implements IApplication<T, I, TBaseDocument, TEnvironment, TConstants>
47
- {
48
- public readonly expressApp: ExpressApplication;
49
- private server: ServerWithOptionalClose | null = null;
50
- private readonly _cspConfig: ICSPConfig;
51
- private readonly _apiRouter: BaseRouter;
52
-
53
- public override get environment(): TEnvironment {
54
- return super.environment as TEnvironment;
55
- }
56
-
57
- constructor(
58
- environment: TEnvironment,
59
- apiRouter: BaseRouter,
60
- schemaMapFactory: (
61
- connection: mongoose.Connection,
62
- ) => SchemaMap<TModelDocs>,
63
- databaseInitFunction: (
64
- application: BaseApplication<TModelDocs, TInitResults>,
65
- ) => Promise<IFailableResult<TInitResults>>,
66
- initResultHashFunction: (initResults: TInitResults) => string,
67
- cspConfig: ICSPConfig = {
68
- corsWhitelist: [],
69
- csp: {
70
- defaultSrc: [],
71
- imgSrc: [],
72
- connectSrc: [],
73
- scriptSrc: [],
74
- styleSrc: [],
75
- fontSrc: [],
76
- frameSrc: [],
77
- },
78
- },
79
- constants: TConstants = Constants as TConstants,
80
- ) {
81
- super(
82
- environment,
83
- schemaMapFactory,
84
- databaseInitFunction,
85
- initResultHashFunction,
86
- constants,
87
- );
88
- this._apiRouter = apiRouter;
89
- this.expressApp = express();
90
- this.server = null;
91
- this._cspConfig = cspConfig;
92
- }
93
-
94
- public override async start(mongoUri?: string): Promise<void> {
95
- const engine = getSuiteCoreI18nEngine();
96
- await super.start(mongoUri, true);
97
- try {
98
- Middlewares.init(
99
- this.expressApp,
100
- this._cspConfig.corsWhitelist,
101
- this._cspConfig.csp,
102
- );
103
- const appRouter = new AppRouter(this._apiRouter);
104
-
105
- appRouter.init(this.expressApp);
106
- this.expressApp.use(
107
- (
108
- err: HandleableError | Error,
109
- req: Request,
110
- res: Response,
111
- next: NextFunction,
112
- ) => {
113
- const handleableError =
114
- err instanceof HandleableError
115
- ? err
116
- : new HandleableError(
117
- new Error(
118
- err.message ||
119
- engine.translate(
120
- SuiteCoreComponentId,
121
- SuiteCoreStringKey.Common_UnexpectedError,
122
- ),
123
- ),
124
- { cause: err },
125
- );
126
- handleError(handleableError, res, sendApiMessageResponse, next);
127
- },
128
- );
129
-
130
- const serversReady: Promise<void>[] = [];
131
- serversReady.push(
132
- new Promise<void>((resolve) => {
133
- this.server = this.expressApp.listen(
134
- this.environment.port,
135
- this.environment.host,
136
- () => {
137
- debugLog(
138
- this.environment.debug,
139
- 'log',
140
- `[ ${engine.translate(
141
- SuiteCoreComponentId,
142
- SuiteCoreStringKey.Common_Ready,
143
- )} ] http://${this.environment.host}:${this.environment.port}`,
144
- );
145
- resolve();
146
- },
147
- ) as ServerWithOptionalClose;
148
- }),
149
- );
150
-
151
- if (this.environment.httpsDevCertRoot) {
152
- try {
153
- const certRoot = normalize(this.environment.httpsDevCertRoot);
154
- if (!isAbsolute(certRoot) || certRoot.includes('..')) {
155
- throw new TranslatableSuiteError(
156
- SuiteCoreStringKey.Error_InvalidCertificatePathMustBeAbsolute,
157
- );
158
- }
159
- const certPath = normalize(resolve(certRoot + '.pem'));
160
- const keyPath = normalize(resolve(certRoot + '-key.pem'));
161
- if (certPath.includes('..') || keyPath.includes('..')) {
162
- throw new TranslatableSuiteError(
163
- SuiteCoreStringKey.Error_InvalidCertificatePathAfterResolution,
164
- );
165
- }
166
- const options = {
167
- // amazonq-ignore-next-line fixed above
168
- key: readFileSync(keyPath),
169
- // amazonq-ignore-next-line fixed above
170
- cert: readFileSync(certPath),
171
- };
172
-
173
- serversReady.push(
174
- new Promise<void>((resolve) => {
175
- createServer(options, this.expressApp).listen(
176
- this.environment.httpsDevPort,
177
- () => {
178
- console.log(
179
- `[ ${engine.translate(
180
- SuiteCoreComponentId,
181
- SuiteCoreStringKey.Common_Ready,
182
- )} ] https://${this.environment.host}:${
183
- this.environment.httpsDevPort
184
- }`,
185
- );
186
- resolve();
187
- },
188
- );
189
- }),
190
- );
191
- } catch (err) {
192
- console.error('Failed to start HTTPS server:', err);
193
- }
194
- }
195
-
196
- await Promise.all(serversReady);
197
- this._ready = true;
198
- } catch (err) {
199
- console.error(
200
- engine.translate(
201
- SuiteCoreComponentId,
202
- SuiteCoreStringKey.Error_FailedToStartApplication,
203
- ),
204
- err,
205
- );
206
- if (process.env['NODE_ENV'] === 'test') {
207
- throw err;
208
- }
209
- process.exit(1);
210
- }
211
- }
212
-
213
- public override async stop(): Promise<void> {
214
- const engine = getSuiteCoreI18nEngine();
215
- if (this.server) {
216
- debugLog(
217
- this.environment.debug,
218
- 'log',
219
- `[ ${engine.translate(
220
- SuiteCoreComponentId,
221
- SuiteCoreStringKey.Common_Stopping,
222
- )} ] ${engine.translate(
223
- SuiteCoreComponentId,
224
- SuiteCoreStringKey.Common_ApplicationAndDatabase,
225
- )}`,
226
- );
227
- await new Promise<void>((resolve, reject) => {
228
- this.server!.closeAllConnections?.();
229
- this.server!.close((err) => {
230
- if (err) {
231
- reject(err);
232
- } else {
233
- resolve();
234
- }
235
- });
236
- });
237
- this.server = null;
238
- }
239
-
240
- await super.stop();
241
- this._ready = false;
242
- debugLog(
243
- this.environment.debug,
244
- 'log',
245
- `[ ${engine.translate(
246
- SuiteCoreComponentId,
247
- SuiteCoreStringKey.Common_Stopped,
248
- )} ] ${engine.translate(
249
- SuiteCoreComponentId,
250
- SuiteCoreStringKey.Common_ApplicationAndDatabase,
251
- )}`,
252
- );
253
- }
254
- }
@@ -1,336 +0,0 @@
1
- import { MemberType } from '@digitaldefiance/ecies-lib';
2
- import {
3
- Constants as ApiConstants,
4
- Member as BackendMember,
5
- } from '@digitaldefiance/node-ecies-lib';
6
- import {
7
- BackupCodeString,
8
- IBackupCode,
9
- InvalidBackupCodeError,
10
- PrivateKeyRequiredError,
11
- } from '@digitaldefiance/suite-core-lib';
12
- import * as argon2 from 'argon2';
13
- import { createHmac, randomBytes, timingSafeEqual } from 'crypto';
14
- import { Constants } from './constants';
15
- import { InvalidBackupCodeVersionError } from './errors/invalid-backup-code-version';
16
- import { IConstants } from './interfaces';
17
- import { SymmetricService } from './services/symmetric';
18
-
19
- /**
20
- * Class representing a backup code string with associated operations.
21
- *
22
- * v1 scheme:
23
- * - Code: 32 lowercase alphanumerics (a–z0–9), displayed as 8 groups of 4: xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx
24
- * - Checksum/tag: HKDF-SHA256(codeUtf8, salt, "backup-checksum") → 32 bytes (stored as hex)
25
- * - KDF for encryption key: Argon2id(codeUtf8, salt) → 32 bytes
26
- * - Encryption: SymmetricService AEAD (encryptedData must embed IV + authTag + ciphertext)
27
- * - Wrapping: AEAD blob wrapped with system user's asymmetric key (ECIES)
28
- */
29
- export class BackupCode extends BackupCodeString {
30
- /** Current backup code scheme version implemented by this service. */
31
- public static readonly BackupCodeVersion = '1.0.0';
32
- // Centralized Argon2id parameters (tunable)
33
- private static readonly Argon2Params = {
34
- type: argon2.argon2id,
35
- hashLength: 32, // derive AES-256 key
36
- timeCost: 3,
37
- memoryCost: 65536, // 64 MiB
38
- parallelism: 1,
39
- raw: true as const,
40
- } as const;
41
-
42
- constructor(code: string) {
43
- super(code);
44
- }
45
-
46
- /**
47
- * Generate the configured number of backup codes.
48
- * Note: If generation alphabet/length is controlled elsewhere, prefer that path.
49
- */
50
- public static override generateBackupCodes(
51
- constants: IConstants = Constants,
52
- ): Array<BackupCode> {
53
- const codes: Array<BackupCode> = [];
54
- for (let i = 0; i < constants.BACKUP_CODES.Count; i++) {
55
- codes.push(new BackupCode(BackupCode.generateBackupCode()));
56
- }
57
- return codes;
58
- }
59
-
60
- /**
61
- * HKDF-Extract-and-Expand using HMAC-SHA-256.
62
- *
63
- * PRK = HMAC(salt, ikm)
64
- * T(0) = empty
65
- * T(i) = HMAC(PRK, T(i-1) || info || i)
66
- * OKM = first 'length' bytes of T(1) || T(2) || ...
67
- */
68
- public static hkdfSha256(
69
- ikm: Buffer,
70
- salt: Buffer,
71
- info: Buffer,
72
- length: number,
73
- ): Buffer {
74
- if (length === 0) {
75
- return Buffer.alloc(0);
76
- }
77
-
78
- // HKDF-Extract: PRK = HMAC-Hash(salt, IKM)
79
- // If salt is empty, use a string of HashLen zeros
80
- const actualSalt = salt.length === 0 ? Buffer.alloc(32, 0) : salt;
81
- const prk = createHmac('sha256', actualSalt).update(ikm).digest();
82
-
83
- // HKDF-Expand
84
- const blocks: Buffer[] = [];
85
- let prev = Buffer.alloc(0);
86
- const n = Math.ceil(length / 32);
87
-
88
- for (let i = 1; i <= n; i++) {
89
- const hmac = createHmac('sha256', prk);
90
- hmac.update(prev);
91
- hmac.update(info);
92
- hmac.update(Buffer.from([i]));
93
- prev = Buffer.from(hmac.digest());
94
- blocks.push(prev);
95
- }
96
-
97
- return Buffer.concat(blocks).subarray(0, length);
98
- }
99
-
100
- /**
101
- * v1: Derive a 32-byte encryption key from a normalized backup code using Argon2id and the per-code salt.
102
- * Uses UTF-8 bytes of the normalized code (not hex).
103
- */
104
- public static async getBackupKeyV1(
105
- checksumSaltHex: string,
106
- normalizedCode: string,
107
- constants: IConstants = Constants,
108
- ): Promise<Buffer> {
109
- if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
110
- throw new InvalidBackupCodeError();
111
- }
112
- const codeBytes = Buffer.from(normalizedCode, 'utf8');
113
- const checksumSalt = Buffer.from(checksumSaltHex, 'hex');
114
- try {
115
- const key = (await argon2.hash(codeBytes, {
116
- ...BackupCode.Argon2Params,
117
- salt: checksumSalt,
118
- })) as unknown as Buffer;
119
- return key; // 32-byte Buffer
120
- } finally {
121
- codeBytes.fill(0);
122
- }
123
- }
124
-
125
- /**
126
- * v1: Compute a 32-byte checksum/tag for a normalized code using HKDF-SHA256(codeUtf8, salt, "backup-checksum").
127
- */
128
- private static computeChecksumV1(
129
- normalizedCode: string,
130
- checksumSalt: Buffer,
131
- ): Buffer {
132
- const codeBytes = Buffer.from(normalizedCode, 'utf8');
133
- try {
134
- return BackupCode.hkdfSha256(
135
- codeBytes,
136
- checksumSalt,
137
- Buffer.from('backup-checksum'),
138
- 32,
139
- );
140
- } finally {
141
- codeBytes.fill(0);
142
- }
143
- }
144
-
145
- public async encrypt(
146
- backupUser: BackendMember,
147
- systemUser: BackendMember,
148
- constants: IConstants = Constants,
149
- ): Promise<IBackupCode> {
150
- if (!backupUser.hasPrivateKey) {
151
- throw new PrivateKeyRequiredError();
152
- }
153
- if (systemUser.type !== MemberType.System) {
154
- throw new Error('System user must be of MemberType.System');
155
- }
156
- const raw = this.value ?? '';
157
- const normalized = BackupCode.normalizeCode(raw);
158
- if (
159
- !(
160
- constants.BACKUP_CODES.DisplayRegex.test(raw) ||
161
- constants.BACKUP_CODES.NormalizedHexRegex.test(normalized)
162
- )
163
- ) {
164
- throw new InvalidBackupCodeError();
165
- }
166
-
167
- const checksumSalt = randomBytes(ApiConstants.PBKDF2.SALT_BYTES);
168
- const checksumBuf = BackupCode.computeChecksumV1(normalized, checksumSalt);
169
- const encryptionKey = await BackupCode.getBackupKeyV1(
170
- checksumSalt.toString('hex'),
171
- normalized,
172
- );
173
-
174
- try {
175
- const sealed = SymmetricService.encryptBuffer(
176
- Buffer.from(backupUser.privateKey!.value),
177
- encryptionKey,
178
- );
179
- const wrappedEncryptedPrivateKey = systemUser
180
- .encryptData(sealed.encryptedData)
181
- .toString('hex');
182
-
183
- return {
184
- version: BackupCode.BackupCodeVersion,
185
- checksumSalt: checksumSalt.toString('hex'),
186
- checksum: checksumBuf.toString('hex'),
187
- encrypted: wrappedEncryptedPrivateKey,
188
- } as IBackupCode;
189
- } finally {
190
- encryptionKey.fill(0);
191
- checksumBuf.fill(0);
192
- }
193
- }
194
-
195
- /**
196
- * v1: Encrypt and wrap backup codes for a user.
197
- * - Validates code format (display or normalized)
198
- * - Computes HKDF checksum/tag
199
- * - Derives Argon2id encryption key (32 bytes) from UTF-8 code
200
- * - Encrypts the private key with AEAD and wraps with system user
201
- */
202
- public static async encryptBackupCodesV1(
203
- backupUser: BackendMember,
204
- systemUser: BackendMember,
205
- codes: Array<BackupCode>,
206
- ): Promise<Array<IBackupCode>> {
207
- const encryptedCodes: Array<IBackupCode> = [];
208
- for (const code of codes) {
209
- encryptedCodes.push(await code.encrypt(backupUser, systemUser));
210
- }
211
- return encryptedCodes;
212
- }
213
-
214
- /** Delegate to current version. */
215
- public static encryptBackupCodes(
216
- backupUser: BackendMember,
217
- systemUser: BackendMember,
218
- codes: Array<BackupCode>,
219
- ): Promise<Array<IBackupCode>> {
220
- return BackupCode.encryptBackupCodesV1(backupUser, systemUser, codes);
221
- }
222
-
223
- /**
224
- * v1: Validate whether a backup code exists (unused) in the provided collection.
225
- * Uses constant-time comparison of binary checksums (codeUtf8 + salt).
226
- */
227
- public static validateBackupCodeV1(
228
- encryptedBackupCodes: Array<IBackupCode>,
229
- backupCode: string,
230
- constants: IConstants = Constants,
231
- ): boolean {
232
- const normalizedCode = BackupCodeString.normalizeCode(backupCode);
233
- if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
234
- return false;
235
- }
236
- const codeBytes = Buffer.from(normalizedCode, 'utf8');
237
- try {
238
- for (const code of encryptedBackupCodes) {
239
- if (code.version !== BackupCode.BackupCodeVersion) continue;
240
- const checksumSalt = Buffer.from(code.checksumSalt, 'hex');
241
- const expected = BackupCode.hkdfSha256(
242
- codeBytes,
243
- checksumSalt,
244
- Buffer.from('backup-checksum'),
245
- 32,
246
- );
247
- if (
248
- code.checksum.length === expected.length * 2 &&
249
- timingSafeEqual(Buffer.from(code.checksum, 'hex'), expected)
250
- ) {
251
- return true;
252
- }
253
- }
254
- return false;
255
- } finally {
256
- codeBytes.fill(0);
257
- }
258
- }
259
-
260
- /**
261
- * Validate a backup code against any supported version present in the collection.
262
- */
263
- public static validateBackupCode(
264
- encryptedBackupCodes: Array<IBackupCode>,
265
- backupCode: string,
266
- constants: IConstants = Constants,
267
- ): boolean {
268
- const normalizedCode = BackupCodeString.normalizeCode(backupCode);
269
- if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
270
- return false;
271
- }
272
- if (
273
- encryptedBackupCodes.some(
274
- (c) => c.version === BackupCode.BackupCodeVersion,
275
- )
276
- ) {
277
- return this.validateBackupCodeV1(
278
- encryptedBackupCodes.filter(
279
- (c) => c.version === BackupCode.BackupCodeVersion,
280
- ),
281
- normalizedCode,
282
- );
283
- }
284
- return false;
285
- }
286
-
287
- /**
288
- * Detect the version by matching checksum against stored codes; returns the matched version.
289
- */
290
- public static detectBackupCodeVersion(
291
- encryptedBackupCodes: Array<IBackupCode>,
292
- backupCode: string,
293
- constants: IConstants = Constants,
294
- ): string {
295
- const normalizedCode = BackupCodeString.normalizeCode(backupCode);
296
- if (!constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
297
- throw new InvalidBackupCodeError();
298
- }
299
-
300
- const v1Set = encryptedBackupCodes.filter(
301
- (c) => c.version === BackupCode.BackupCodeVersion,
302
- );
303
- if (v1Set.length) {
304
- const codeBytes = Buffer.from(normalizedCode, 'utf8');
305
- try {
306
- for (const c of v1Set) {
307
- const checksumSalt = Buffer.from(c.checksumSalt, 'hex');
308
- const expected = BackupCode.hkdfSha256(
309
- codeBytes,
310
- checksumSalt,
311
- Buffer.from('backup-checksum'),
312
- 32,
313
- );
314
- if (
315
- c.checksum.length === expected.length * 2 &&
316
- timingSafeEqual(Buffer.from(c.checksum, 'hex'), expected)
317
- ) {
318
- return c.version;
319
- }
320
- }
321
- } finally {
322
- // zeroize
323
- codeBytes.fill(0);
324
- }
325
- }
326
-
327
- const versionsInSet = new Set(encryptedBackupCodes.map((c) => c.version));
328
- if (
329
- versionsInSet.size > 0 &&
330
- !versionsInSet.has(BackupCode.BackupCodeVersion)
331
- ) {
332
- throw new InvalidBackupCodeVersionError([...versionsInSet][0]);
333
- }
334
- throw new InvalidBackupCodeError();
335
- }
336
- }
package/src/constants.ts DELETED
@@ -1,69 +0,0 @@
1
- import { ECIES as ECIESDefaults } from '@digitaldefiance/ecies-lib';
2
- import { createConstants } from '@digitaldefiance/suite-core-lib';
3
- import { IFECConsts } from './interfaces';
4
- import { IChecksumConsts } from './interfaces/checksum-consts';
5
- import { IConstants } from './interfaces/constants';
6
- import { IJwtConsts } from './interfaces/jwt-consts';
7
-
8
- /**
9
- * Constants for checksum operations
10
- * These values are critical for data integrity and MUST NOT be changed
11
- * in an already established system as it will break all existing checksums.
12
- */
13
- export const CHECKSUM: IChecksumConsts = Object.freeze({
14
- /** Default hash bits for SHA3 */
15
- SHA3_DEFAULT_HASH_BITS: 512 as const,
16
-
17
- /** Length of a SHA3 checksum buffer in bytes */
18
- SHA3_BUFFER_LENGTH: 64 as const,
19
-
20
- /** algorithm to use for checksum */
21
- ALGORITHM: 'sha3-512' as const,
22
-
23
- /** encoding to use for checksum */
24
- ENCODING: 'hex' as const,
25
- } as const);
26
-
27
- export const JWT: IJwtConsts = {
28
- /**
29
- * Algorithm to use for JWT
30
- */
31
- ALGORITHM: 'HS256' as const,
32
-
33
- /**
34
- * The expiration time for a JWT token in seconds
35
- */
36
- EXPIRATION_SEC: 86400 as const,
37
- } as const;
38
-
39
- export const FEC: IFECConsts = {
40
- /**
41
- * Maximum size of a single shard
42
- */
43
- MAX_SHARD_SIZE: 1048576 as const,
44
- } as const;
45
-
46
- // use defaults from ecies-lib
47
- export const ECIES = Object.freeze(ECIESDefaults);
48
-
49
- export const createExpressConstants = (
50
- siteDomain: string,
51
- overrides?: Partial<IConstants>,
52
- ): IConstants => {
53
- return Object.freeze({
54
- ...createConstants(siteDomain, overrides),
55
- CHECKSUM: CHECKSUM,
56
- JWT: JWT,
57
- FEC: FEC,
58
- ECIES: ECIES,
59
- } as const);
60
- };
61
-
62
- export const Constants: IConstants = createExpressConstants('localhost');
63
-
64
- if (
65
- CHECKSUM.SHA3_BUFFER_LENGTH !== CHECKSUM.SHA3_DEFAULT_HASH_BITS / 8 ||
66
- CHECKSUM.SHA3_BUFFER_LENGTH !== CHECKSUM.SHA3_DEFAULT_HASH_BITS / 8
67
- ) {
68
- throw new Error('Invalid checksum constants');
69
- }