@digitaldefiance/node-express-suite 3.6.19 → 3.6.21
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.
- package/LICENSE +21 -0
- package/package.json +8 -9
- package/src/__tests__/fixtures/{index.d.ts → index.ts} +0 -1
- package/src/__tests__/fixtures/model-mocks.mock.ts +164 -0
- package/src/__tests__/helpers/application.mock.ts +89 -0
- package/src/__tests__/helpers/{index.d.ts → index.ts} +1 -2
- package/src/__tests__/helpers/setup-test-env.ts +190 -0
- package/src/__tests__/{index.d.ts → index.ts} +0 -1
- package/src/application-base.ts +536 -0
- package/src/application-concrete.ts +42 -0
- package/src/application.ts +321 -0
- package/src/backup-code.ts +348 -0
- package/src/builders/application-builder.ts +131 -0
- package/src/builders/{index.d.ts → index.ts} +0 -1
- package/src/constants.ts +83 -0
- package/src/container/{index.d.ts → index.ts} +0 -1
- package/src/container/service-container.ts +50 -0
- package/src/container/service-definitions.ts +11 -0
- package/src/controllers/base.ts +499 -0
- package/src/controllers/{index.d.ts → index.ts} +0 -1
- package/src/controllers/user.ts +1711 -0
- package/src/database/database-initializer.ts +7 -0
- package/src/database/{index.d.ts → index.ts} +0 -1
- package/src/decorators/base-controller.ts +77 -0
- package/src/decorators/controller.ts +146 -0
- package/src/decorators/{index.d.ts → index.ts} +0 -1
- package/src/decorators/zod-validation.ts +58 -0
- package/src/defaults.ts +249 -0
- package/src/documents/base.ts +10 -0
- package/src/documents/email-token.ts +13 -0
- package/src/documents/{index.d.ts → index.ts} +0 -1
- package/src/documents/{mnemonic.d.ts → mnemonic.ts} +5 -3
- package/src/documents/{role.d.ts → role.ts} +4 -3
- package/src/documents/used-direct-login-token.ts +7 -0
- package/src/documents/{user-role.d.ts → user-role.ts} +5 -3
- package/src/documents/{user.d.ts → user.ts} +6 -3
- package/src/enumerations/base-model-name.ts +41 -0
- package/src/enumerations/{index.d.ts → index.ts} +0 -1
- package/src/enumerations/length-encoding-type.ts +6 -0
- package/src/enumerations/schema-collection.ts +33 -0
- package/src/enumerations/symmetric-error-type.ts +4 -0
- package/src/environment.ts +836 -0
- package/src/errors/express-validation.ts +21 -0
- package/src/errors/{index.d.ts → index.ts} +0 -1
- package/src/errors/invalid-backup-code-version.ts +15 -0
- package/src/errors/invalid-jwt-token.ts +11 -0
- package/src/errors/invalid-model.ts +11 -0
- package/src/errors/invalid-new-password.ts +18 -0
- package/src/errors/invalid-password.ts +13 -0
- package/src/errors/missing-validated-data.ts +36 -0
- package/src/errors/mnemonic-or-password-required.ts +13 -0
- package/src/errors/model-not-registered.ts +11 -0
- package/src/errors/mongoose-validation.ts +38 -0
- package/src/errors/symmetric.ts +37 -0
- package/src/errors/token-expired.ts +11 -0
- package/src/get-language.ts +53 -0
- package/src/get-timezone.ts +61 -0
- package/src/{index.d.ts → index.ts} +3 -3
- package/src/interfaces/{api-error-response.d.ts → api-error-response.ts} +2 -2
- package/src/interfaces/api-express-validation-error-response.ts +8 -0
- package/src/interfaces/api-message-response.ts +3 -0
- package/src/interfaces/{api-mongo-validation-error-response.d.ts → api-mongo-validation-error-response.ts} +2 -2
- package/src/interfaces/api-responses/{backup-codes-response.d.ts → backup-codes-response.ts} +2 -2
- package/src/interfaces/api-responses/{challenge-response.d.ts → challenge-response.ts} +3 -3
- package/src/interfaces/api-responses/{code-count-response.d.ts → code-count-response.ts} +2 -2
- package/src/interfaces/api-responses/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/api-responses/{login-response.d.ts → login-response.ts} +4 -4
- package/src/interfaces/api-responses/{mnemonic-response.d.ts → mnemonic-response.ts} +2 -2
- package/src/interfaces/api-responses/{registration-response.d.ts → registration-response.ts} +3 -3
- package/src/interfaces/api-responses/{request-user-response.d.ts → request-user-response.ts} +2 -2
- package/src/interfaces/api-responses/user-settings-response.ts +12 -0
- package/src/interfaces/application.ts +16 -0
- package/src/interfaces/backend-objects/email-token.ts +9 -0
- package/src/interfaces/backend-objects/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/backend-objects/request-user.ts +8 -0
- package/src/interfaces/backend-objects/role.ts +6 -0
- package/src/interfaces/backend-objects/user.ts +7 -0
- package/src/interfaces/checksum-config.ts +4 -0
- package/src/interfaces/checksum-consts.ts +13 -0
- package/src/interfaces/constants.ts +103 -0
- package/src/interfaces/controller-config.ts +36 -0
- package/src/interfaces/create-user-basics.ts +17 -0
- package/src/interfaces/csp-config.ts +16 -0
- package/src/interfaces/csp-definition.ts +49 -0
- package/src/interfaces/{db-init-result.d.ts → db-init-result.ts} +2 -2
- package/src/interfaces/deep-partial.ts +3 -0
- package/src/interfaces/{discriminator-collections.d.ts → discriminator-collections.ts} +3 -3
- package/src/interfaces/email-service.ts +8 -0
- package/src/interfaces/environment-mongo.ts +76 -0
- package/src/interfaces/environment.ts +185 -0
- package/src/interfaces/failable-result.ts +6 -0
- package/src/interfaces/fec-consts.ts +4 -0
- package/src/interfaces/flexible-csp.ts +18 -0
- package/src/interfaces/handleable-error-options.ts +6 -0
- package/src/interfaces/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/jwt-consts.ts +23 -0
- package/src/interfaces/jwt-sign-response.ts +19 -0
- package/src/interfaces/models/{email-token.d.ts → email-token.ts} +1 -1
- package/src/interfaces/models/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/models/{mnemonic.d.ts → mnemonic.ts} +1 -1
- package/src/interfaces/models/{role.d.ts → role.ts} +1 -1
- package/src/interfaces/models/{token-role.d.ts → token-role.ts} +1 -1
- package/src/interfaces/models/{used-direct-login-token.d.ts → used-direct-login-token.ts} +3 -2
- package/src/interfaces/models/{user-role.d.ts → user-role.ts} +1 -1
- package/src/interfaces/models/{user.d.ts → user.ts} +11 -3
- package/src/interfaces/mongo-errors.ts +5 -0
- package/src/interfaces/request-user.ts +70 -0
- package/src/interfaces/required-string-keys.ts +26 -0
- package/src/interfaces/schema.ts +31 -0
- package/src/interfaces/server-init-result.ts +40 -0
- package/src/interfaces/status-code-response.ts +7 -0
- package/src/interfaces/symmetric-encryption-results.d.ts +3 -3
- package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -1
- package/src/interfaces/symmetric-encryption-results.js.map +1 -1
- package/src/interfaces/symmetric-encryption-results.ts +4 -0
- package/src/interfaces/{test-environment.d.ts → test-environment.ts} +7 -7
- package/src/interfaces/{token-response.d.ts → token-response.ts} +2 -2
- package/src/middlewares/authenticate-crypto.ts +216 -0
- package/src/middlewares/authenticate-token.ts +150 -0
- package/src/middlewares/cleanup-crypto.ts +37 -0
- package/src/middlewares/{index.d.ts → index.ts} +0 -1
- package/src/middlewares/set-global-context-language.ts +24 -0
- package/src/middlewares.ts +112 -0
- package/src/model-registry.ts +79 -0
- package/src/models/email-token.d.ts +11 -35
- package/src/models/email-token.ts +15 -0
- package/src/models/{index.d.ts → index.ts} +0 -1
- package/src/models/mnemonic.d.ts +11 -35
- package/src/models/mnemonic.ts +15 -0
- package/src/models/role.d.ts +11 -35
- package/src/models/role.ts +15 -0
- package/src/models/used-direct-login-token.d.ts +11 -35
- package/src/models/used-direct-login-token.ts +15 -0
- package/src/models/user-role.d.ts +10 -3
- package/src/models/user-role.ts +13 -0
- package/src/models/user.d.ts +16 -3
- package/src/models/user.ts +15 -0
- package/src/pipeline/{index.d.ts → index.ts} +0 -1
- package/src/pipeline/pipeline-builder.ts +18 -0
- package/src/plugins/{index.d.ts → index.ts} +0 -1
- package/src/plugins/plugin-interface.ts +8 -0
- package/src/plugins/plugin-manager.ts +42 -0
- package/src/registry/email-service-registry.ts +53 -0
- package/src/registry/{index.d.ts → index.ts} +0 -1
- package/src/responses/{index.d.ts → index.ts} +0 -1
- package/src/responses/response-builder.ts +86 -0
- package/src/routers/api.ts +196 -0
- package/src/routers/app.ts +333 -0
- package/src/routers/base.ts +13 -0
- package/src/routers/{index.d.ts → index.ts} +0 -1
- package/src/routers/router-config.ts +16 -0
- package/src/routing/index.ts +1 -0
- package/src/routing/route-builder.ts +128 -0
- package/src/schemas/email-token.d.ts +13 -47
- package/src/schemas/email-token.ts +95 -0
- package/src/schemas/{index.d.ts → index.ts} +0 -1
- package/src/schemas/mnemonic.d.ts +10 -26
- package/src/schemas/mnemonic.ts +37 -0
- package/src/schemas/role.d.ts +13 -40
- package/src/schemas/role.ts +137 -0
- package/src/schemas/schema.ts +164 -0
- package/src/schemas/used-direct-login-token.d.ts +12 -35
- package/src/schemas/used-direct-login-token.ts +45 -0
- package/src/schemas/user-role.d.ts +12 -37
- package/src/schemas/user-role.ts +79 -0
- package/src/schemas/user.d.ts +18 -23
- package/src/schemas/user.ts +224 -0
- package/src/services/backup-code.ts +321 -0
- package/src/services/base.ts +30 -0
- package/src/services/checksum.ts +167 -0
- package/src/services/crc.ts +213 -0
- package/src/services/database-initialization.ts +1648 -0
- package/src/services/db-init-cache.ts +17 -0
- package/src/services/direct-login-token.ts +61 -0
- package/src/services/dummy-email-service.ts +20 -0
- package/src/services/fec-usage-example.ts +102 -0
- package/src/services/fec.ts +355 -0
- package/src/services/{index.d.ts → index.ts} +0 -1
- package/src/services/jwt.ts +130 -0
- package/src/services/key-wrapping.ts +447 -0
- package/src/services/mnemonic.ts +168 -0
- package/src/services/request-user.ts +101 -0
- package/src/services/role.ts +414 -0
- package/src/services/symmetric.ts +139 -0
- package/src/services/system-user.ts +79 -0
- package/src/services/user.ts +2281 -0
- package/src/services/xor.ts +34 -0
- package/src/testing.ts +3 -0
- package/src/transactions/{index.d.ts → index.ts} +0 -1
- package/src/transactions/transaction-manager.ts +37 -0
- package/src/types/app-config.ts +17 -0
- package/src/types/{controller-config.d.ts → controller-config.ts} +9 -8
- package/src/types/{environment-variables.d.ts → environment-variables.ts} +26 -5
- package/src/types/id-converters.ts +53 -0
- package/src/types/{index.d.ts → index.ts} +0 -1
- package/src/types/{mongoose-helpers.d.ts → mongoose-helpers.ts} +2 -2
- package/src/types/mongoose-override.d.ts +1 -0
- package/src/types/mongoose.d.ts +1 -0
- package/src/types.d.ts +34 -67
- package/src/types.ts +130 -0
- package/src/utils.ts +1087 -0
- package/src/validation/{index.d.ts → index.ts} +0 -1
- package/src/validation/validation-builder.ts +115 -0
- package/src/__tests__/fixtures/index.d.ts.map +0 -1
- package/src/__tests__/fixtures/index.js +0 -5
- package/src/__tests__/fixtures/index.js.map +0 -1
- package/src/__tests__/fixtures/model-mocks.mock.d.ts +0 -6
- package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +0 -1
- package/src/__tests__/fixtures/model-mocks.mock.js +0 -94
- package/src/__tests__/fixtures/model-mocks.mock.js.map +0 -1
- package/src/__tests__/helpers/application.mock.d.ts +0 -8
- package/src/__tests__/helpers/application.mock.d.ts.map +0 -1
- package/src/__tests__/helpers/application.mock.js +0 -77
- package/src/__tests__/helpers/application.mock.js.map +0 -1
- package/src/__tests__/helpers/index.d.ts.map +0 -1
- package/src/__tests__/helpers/index.js +0 -7
- package/src/__tests__/helpers/index.js.map +0 -1
- package/src/__tests__/helpers/setup-test-env.d.ts +0 -12
- package/src/__tests__/helpers/setup-test-env.d.ts.map +0 -1
- package/src/__tests__/helpers/setup-test-env.js +0 -119
- package/src/__tests__/helpers/setup-test-env.js.map +0 -1
- package/src/__tests__/index.d.ts.map +0 -1
- package/src/__tests__/index.js +0 -6
- package/src/__tests__/index.js.map +0 -1
- package/src/application-base.d.ts +0 -122
- package/src/application-base.d.ts.map +0 -1
- package/src/application-base.js +0 -355
- package/src/application-base.js.map +0 -1
- package/src/application-concrete.d.ts +0 -12
- package/src/application-concrete.d.ts.map +0 -1
- package/src/application-concrete.js +0 -21
- package/src/application-concrete.js.map +0 -1
- package/src/application.d.ts +0 -28
- package/src/application.d.ts.map +0 -1
- package/src/application.js +0 -167
- package/src/application.js.map +0 -1
- package/src/backup-code.d.ts +0 -68
- package/src/backup-code.d.ts.map +0 -1
- package/src/backup-code.js +0 -238
- package/src/backup-code.js.map +0 -1
- package/src/builders/application-builder.d.ts +0 -34
- package/src/builders/application-builder.d.ts.map +0 -1
- package/src/builders/application-builder.js +0 -64
- package/src/builders/application-builder.js.map +0 -1
- package/src/builders/index.d.ts.map +0 -1
- package/src/builders/index.js +0 -5
- package/src/builders/index.js.map +0 -1
- package/src/constants.d.ts +0 -16
- package/src/constants.d.ts.map +0 -1
- package/src/constants.js +0 -58
- package/src/constants.js.map +0 -1
- package/src/container/index.d.ts.map +0 -1
- package/src/container/index.js +0 -6
- package/src/container/index.js.map +0 -1
- package/src/container/service-container.d.ts +0 -11
- package/src/container/service-container.d.ts.map +0 -1
- package/src/container/service-container.js +0 -38
- package/src/container/service-container.js.map +0 -1
- package/src/container/service-definitions.d.ts +0 -11
- package/src/container/service-definitions.d.ts.map +0 -1
- package/src/container/service-definitions.js +0 -13
- package/src/container/service-definitions.js.map +0 -1
- package/src/controllers/base.d.ts +0 -66
- package/src/controllers/base.d.ts.map +0 -1
- package/src/controllers/base.js +0 -305
- package/src/controllers/base.js.map +0 -1
- package/src/controllers/index.d.ts.map +0 -1
- package/src/controllers/index.js +0 -6
- package/src/controllers/index.js.map +0 -1
- package/src/controllers/user.d.ts +0 -46
- package/src/controllers/user.d.ts.map +0 -1
- package/src/controllers/user.js +0 -918
- package/src/controllers/user.js.map +0 -1
- package/src/database/database-initializer.d.ts +0 -7
- package/src/database/database-initializer.d.ts.map +0 -1
- package/src/database/database-initializer.js +0 -3
- package/src/database/database-initializer.js.map +0 -1
- package/src/database/index.d.ts.map +0 -1
- package/src/database/index.js +0 -5
- package/src/database/index.js.map +0 -1
- package/src/decorators/base-controller.d.ts +0 -10
- package/src/decorators/base-controller.d.ts.map +0 -1
- package/src/decorators/base-controller.js +0 -60
- package/src/decorators/base-controller.js.map +0 -1
- package/src/decorators/controller.d.ts +0 -38
- package/src/decorators/controller.d.ts.map +0 -1
- package/src/decorators/controller.js +0 -67
- package/src/decorators/controller.js.map +0 -1
- package/src/decorators/index.d.ts.map +0 -1
- package/src/decorators/index.js +0 -7
- package/src/decorators/index.js.map +0 -1
- package/src/decorators/zod-validation.d.ts +0 -5
- package/src/decorators/zod-validation.d.ts.map +0 -1
- package/src/decorators/zod-validation.js +0 -47
- package/src/decorators/zod-validation.js.map +0 -1
- package/src/defaults.d.ts +0 -7
- package/src/defaults.d.ts.map +0 -1
- package/src/defaults.js +0 -204
- package/src/defaults.js.map +0 -1
- package/src/documents/base.d.ts +0 -4
- package/src/documents/base.d.ts.map +0 -1
- package/src/documents/base.js +0 -3
- package/src/documents/base.js.map +0 -1
- package/src/documents/email-token.d.ts +0 -8
- package/src/documents/email-token.d.ts.map +0 -1
- package/src/documents/email-token.js +0 -3
- package/src/documents/email-token.js.map +0 -1
- package/src/documents/index.d.ts.map +0 -1
- package/src/documents/index.js +0 -3
- package/src/documents/index.js.map +0 -1
- package/src/documents/mnemonic.d.ts.map +0 -1
- package/src/documents/mnemonic.js +0 -3
- package/src/documents/mnemonic.js.map +0 -1
- package/src/documents/role.d.ts.map +0 -1
- package/src/documents/role.js +0 -3
- package/src/documents/role.js.map +0 -1
- package/src/documents/used-direct-login-token.d.ts +0 -5
- package/src/documents/used-direct-login-token.d.ts.map +0 -1
- package/src/documents/used-direct-login-token.js +0 -3
- package/src/documents/used-direct-login-token.js.map +0 -1
- package/src/documents/user-role.d.ts.map +0 -1
- package/src/documents/user-role.js +0 -3
- package/src/documents/user-role.js.map +0 -1
- package/src/documents/user.d.ts.map +0 -1
- package/src/documents/user.js +0 -3
- package/src/documents/user.js.map +0 -1
- package/src/enumerations/base-model-name.d.ts +0 -38
- package/src/enumerations/base-model-name.d.ts.map +0 -1
- package/src/enumerations/base-model-name.js +0 -34
- package/src/enumerations/base-model-name.js.map +0 -1
- package/src/enumerations/index.d.ts.map +0 -1
- package/src/enumerations/index.js +0 -8
- package/src/enumerations/index.js.map +0 -1
- package/src/enumerations/length-encoding-type.d.ts +0 -7
- package/src/enumerations/length-encoding-type.d.ts.map +0 -1
- package/src/enumerations/length-encoding-type.js +0 -11
- package/src/enumerations/length-encoding-type.js.map +0 -1
- package/src/enumerations/schema-collection.d.ts +0 -34
- package/src/enumerations/schema-collection.d.ts.map +0 -1
- package/src/enumerations/schema-collection.js +0 -38
- package/src/enumerations/schema-collection.js.map +0 -1
- package/src/enumerations/symmetric-error-type.d.ts +0 -5
- package/src/enumerations/symmetric-error-type.d.ts.map +0 -1
- package/src/enumerations/symmetric-error-type.js +0 -9
- package/src/enumerations/symmetric-error-type.js.map +0 -1
- package/src/environment.d.ts +0 -190
- package/src/environment.d.ts.map +0 -1
- package/src/environment.js +0 -646
- package/src/environment.js.map +0 -1
- package/src/errors/express-validation.d.ts +0 -9
- package/src/errors/express-validation.d.ts.map +0 -1
- package/src/errors/express-validation.js +0 -18
- package/src/errors/express-validation.js.map +0 -1
- package/src/errors/index.d.ts.map +0 -1
- package/src/errors/index.js +0 -16
- package/src/errors/index.js.map +0 -1
- package/src/errors/invalid-backup-code-version.d.ts +0 -6
- package/src/errors/invalid-backup-code-version.d.ts.map +0 -1
- package/src/errors/invalid-backup-code-version.js +0 -16
- package/src/errors/invalid-backup-code-version.js.map +0 -1
- package/src/errors/invalid-jwt-token.d.ts +0 -5
- package/src/errors/invalid-jwt-token.d.ts.map +0 -1
- package/src/errors/invalid-jwt-token.js +0 -12
- package/src/errors/invalid-jwt-token.js.map +0 -1
- package/src/errors/invalid-model.d.ts +0 -6
- package/src/errors/invalid-model.d.ts.map +0 -1
- package/src/errors/invalid-model.js +0 -14
- package/src/errors/invalid-model.js.map +0 -1
- package/src/errors/invalid-new-password.d.ts +0 -5
- package/src/errors/invalid-new-password.d.ts.map +0 -1
- package/src/errors/invalid-new-password.js +0 -14
- package/src/errors/invalid-new-password.js.map +0 -1
- package/src/errors/invalid-password.d.ts +0 -5
- package/src/errors/invalid-password.d.ts.map +0 -1
- package/src/errors/invalid-password.js +0 -14
- package/src/errors/invalid-password.js.map +0 -1
- package/src/errors/missing-validated-data.d.ts +0 -7
- package/src/errors/missing-validated-data.d.ts.map +0 -1
- package/src/errors/missing-validated-data.js +0 -36
- package/src/errors/missing-validated-data.js.map +0 -1
- package/src/errors/mnemonic-or-password-required.d.ts +0 -5
- package/src/errors/mnemonic-or-password-required.d.ts.map +0 -1
- package/src/errors/mnemonic-or-password-required.js +0 -14
- package/src/errors/mnemonic-or-password-required.js.map +0 -1
- package/src/errors/model-not-registered.d.ts +0 -6
- package/src/errors/model-not-registered.d.ts.map +0 -1
- package/src/errors/model-not-registered.js +0 -14
- package/src/errors/model-not-registered.js.map +0 -1
- package/src/errors/mongoose-validation.d.ts +0 -12
- package/src/errors/mongoose-validation.d.ts.map +0 -1
- package/src/errors/mongoose-validation.js +0 -17
- package/src/errors/mongoose-validation.js.map +0 -1
- package/src/errors/symmetric.d.ts +0 -8
- package/src/errors/symmetric.d.ts.map +0 -1
- package/src/errors/symmetric.js +0 -22
- package/src/errors/symmetric.js.map +0 -1
- package/src/errors/token-expired.d.ts +0 -5
- package/src/errors/token-expired.d.ts.map +0 -1
- package/src/errors/token-expired.js +0 -12
- package/src/errors/token-expired.js.map +0 -1
- package/src/get-language.d.ts +0 -2
- package/src/get-language.d.ts.map +0 -1
- package/src/get-language.js +0 -30
- package/src/get-language.js.map +0 -1
- package/src/get-timezone.d.ts +0 -2
- package/src/get-timezone.d.ts.map +0 -1
- package/src/get-timezone.js +0 -39
- package/src/get-timezone.js.map +0 -1
- package/src/index.d.ts.map +0 -1
- package/src/index.js +0 -43
- package/src/index.js.map +0 -1
- package/src/interfaces/api-error-response.d.ts.map +0 -1
- package/src/interfaces/api-error-response.js +0 -3
- package/src/interfaces/api-error-response.js.map +0 -1
- package/src/interfaces/api-express-validation-error-response.d.ts +0 -7
- package/src/interfaces/api-express-validation-error-response.d.ts.map +0 -1
- package/src/interfaces/api-express-validation-error-response.js +0 -3
- package/src/interfaces/api-express-validation-error-response.js.map +0 -1
- package/src/interfaces/api-message-response.d.ts +0 -4
- package/src/interfaces/api-message-response.d.ts.map +0 -1
- package/src/interfaces/api-message-response.js +0 -3
- package/src/interfaces/api-message-response.js.map +0 -1
- package/src/interfaces/api-mongo-validation-error-response.d.ts.map +0 -1
- package/src/interfaces/api-mongo-validation-error-response.js +0 -3
- package/src/interfaces/api-mongo-validation-error-response.js.map +0 -1
- package/src/interfaces/api-responses/backup-codes-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/backup-codes-response.js +0 -3
- package/src/interfaces/api-responses/backup-codes-response.js.map +0 -1
- package/src/interfaces/api-responses/challenge-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/challenge-response.js +0 -3
- package/src/interfaces/api-responses/challenge-response.js.map +0 -1
- package/src/interfaces/api-responses/code-count-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/code-count-response.js +0 -3
- package/src/interfaces/api-responses/code-count-response.js.map +0 -1
- package/src/interfaces/api-responses/index.d.ts.map +0 -1
- package/src/interfaces/api-responses/index.js +0 -12
- package/src/interfaces/api-responses/index.js.map +0 -1
- package/src/interfaces/api-responses/login-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/login-response.js +0 -3
- package/src/interfaces/api-responses/login-response.js.map +0 -1
- package/src/interfaces/api-responses/mnemonic-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/mnemonic-response.js +0 -3
- package/src/interfaces/api-responses/mnemonic-response.js.map +0 -1
- package/src/interfaces/api-responses/registration-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/registration-response.js +0 -3
- package/src/interfaces/api-responses/registration-response.js.map +0 -1
- package/src/interfaces/api-responses/request-user-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/request-user-response.js +0 -3
- package/src/interfaces/api-responses/request-user-response.js.map +0 -1
- package/src/interfaces/api-responses/user-settings-response.d.ts +0 -12
- package/src/interfaces/api-responses/user-settings-response.d.ts.map +0 -1
- package/src/interfaces/api-responses/user-settings-response.js +0 -3
- package/src/interfaces/api-responses/user-settings-response.js.map +0 -1
- package/src/interfaces/application.d.ts +0 -16
- package/src/interfaces/application.d.ts.map +0 -1
- package/src/interfaces/application.js +0 -3
- package/src/interfaces/application.js.map +0 -1
- package/src/interfaces/backend-objects/email-token.d.ts +0 -4
- package/src/interfaces/backend-objects/email-token.d.ts.map +0 -1
- package/src/interfaces/backend-objects/email-token.js +0 -3
- package/src/interfaces/backend-objects/email-token.js.map +0 -1
- package/src/interfaces/backend-objects/index.d.ts.map +0 -1
- package/src/interfaces/backend-objects/index.js +0 -8
- package/src/interfaces/backend-objects/index.js.map +0 -1
- package/src/interfaces/backend-objects/request-user.d.ts +0 -5
- package/src/interfaces/backend-objects/request-user.d.ts.map +0 -1
- package/src/interfaces/backend-objects/request-user.js +0 -3
- package/src/interfaces/backend-objects/request-user.js.map +0 -1
- package/src/interfaces/backend-objects/role.d.ts +0 -4
- package/src/interfaces/backend-objects/role.d.ts.map +0 -1
- package/src/interfaces/backend-objects/role.js +0 -3
- package/src/interfaces/backend-objects/role.js.map +0 -1
- package/src/interfaces/backend-objects/user.d.ts +0 -4
- package/src/interfaces/backend-objects/user.d.ts.map +0 -1
- package/src/interfaces/backend-objects/user.js +0 -3
- package/src/interfaces/backend-objects/user.js.map +0 -1
- package/src/interfaces/checksum-config.d.ts +0 -5
- package/src/interfaces/checksum-config.d.ts.map +0 -1
- package/src/interfaces/checksum-config.js +0 -3
- package/src/interfaces/checksum-config.js.map +0 -1
- package/src/interfaces/checksum-consts.d.ts +0 -11
- package/src/interfaces/checksum-consts.d.ts.map +0 -1
- package/src/interfaces/checksum-consts.js +0 -3
- package/src/interfaces/checksum-consts.js.map +0 -1
- package/src/interfaces/constants.d.ts +0 -98
- package/src/interfaces/constants.d.ts.map +0 -1
- package/src/interfaces/constants.js +0 -3
- package/src/interfaces/constants.js.map +0 -1
- package/src/interfaces/controller-config.d.ts +0 -21
- package/src/interfaces/controller-config.d.ts.map +0 -1
- package/src/interfaces/controller-config.js +0 -3
- package/src/interfaces/controller-config.js.map +0 -1
- package/src/interfaces/create-user-basics.d.ts +0 -18
- package/src/interfaces/create-user-basics.d.ts.map +0 -1
- package/src/interfaces/create-user-basics.js +0 -3
- package/src/interfaces/create-user-basics.js.map +0 -1
- package/src/interfaces/csp-config.d.ts +0 -7
- package/src/interfaces/csp-config.d.ts.map +0 -1
- package/src/interfaces/csp-config.js +0 -13
- package/src/interfaces/csp-config.js.map +0 -1
- package/src/interfaces/csp-definition.d.ts +0 -13
- package/src/interfaces/csp-definition.d.ts.map +0 -1
- package/src/interfaces/csp-definition.js +0 -23
- package/src/interfaces/csp-definition.js.map +0 -1
- package/src/interfaces/db-init-result.d.ts.map +0 -1
- package/src/interfaces/db-init-result.js +0 -3
- package/src/interfaces/db-init-result.js.map +0 -1
- package/src/interfaces/deep-partial.d.ts +0 -4
- package/src/interfaces/deep-partial.d.ts.map +0 -1
- package/src/interfaces/deep-partial.js +0 -3
- package/src/interfaces/deep-partial.js.map +0 -1
- package/src/interfaces/discriminator-collections.d.ts.map +0 -1
- package/src/interfaces/discriminator-collections.js +0 -3
- package/src/interfaces/discriminator-collections.js.map +0 -1
- package/src/interfaces/email-service.d.ts +0 -4
- package/src/interfaces/email-service.d.ts.map +0 -1
- package/src/interfaces/email-service.js +0 -3
- package/src/interfaces/email-service.js.map +0 -1
- package/src/interfaces/environment-mongo.d.ts +0 -76
- package/src/interfaces/environment-mongo.d.ts.map +0 -1
- package/src/interfaces/environment-mongo.js +0 -3
- package/src/interfaces/environment-mongo.js.map +0 -1
- package/src/interfaces/environment.d.ts +0 -184
- package/src/interfaces/environment.d.ts.map +0 -1
- package/src/interfaces/environment.js +0 -3
- package/src/interfaces/environment.js.map +0 -1
- package/src/interfaces/failable-result.d.ts +0 -7
- package/src/interfaces/failable-result.d.ts.map +0 -1
- package/src/interfaces/failable-result.js +0 -3
- package/src/interfaces/failable-result.js.map +0 -1
- package/src/interfaces/fec-consts.d.ts +0 -5
- package/src/interfaces/fec-consts.d.ts.map +0 -1
- package/src/interfaces/fec-consts.js +0 -3
- package/src/interfaces/fec-consts.js.map +0 -1
- package/src/interfaces/flexible-csp.d.ts +0 -8
- package/src/interfaces/flexible-csp.d.ts.map +0 -1
- package/src/interfaces/flexible-csp.js +0 -14
- package/src/interfaces/flexible-csp.js.map +0 -1
- package/src/interfaces/handleable-error-options.d.ts +0 -7
- package/src/interfaces/handleable-error-options.d.ts.map +0 -1
- package/src/interfaces/handleable-error-options.js +0 -3
- package/src/interfaces/handleable-error-options.js.map +0 -1
- package/src/interfaces/index.d.ts.map +0 -1
- package/src/interfaces/index.js +0 -38
- package/src/interfaces/index.js.map +0 -1
- package/src/interfaces/jwt-consts.d.ts +0 -11
- package/src/interfaces/jwt-consts.d.ts.map +0 -1
- package/src/interfaces/jwt-consts.js +0 -3
- package/src/interfaces/jwt-consts.js.map +0 -1
- package/src/interfaces/jwt-sign-response.d.ts +0 -11
- package/src/interfaces/jwt-sign-response.d.ts.map +0 -1
- package/src/interfaces/jwt-sign-response.js +0 -3
- package/src/interfaces/jwt-sign-response.js.map +0 -1
- package/src/interfaces/models/email-token.d.ts.map +0 -1
- package/src/interfaces/models/email-token.js +0 -3
- package/src/interfaces/models/email-token.js.map +0 -1
- package/src/interfaces/models/index.d.ts.map +0 -1
- package/src/interfaces/models/index.js +0 -11
- package/src/interfaces/models/index.js.map +0 -1
- package/src/interfaces/models/mnemonic.d.ts.map +0 -1
- package/src/interfaces/models/mnemonic.js +0 -3
- package/src/interfaces/models/mnemonic.js.map +0 -1
- package/src/interfaces/models/role.d.ts.map +0 -1
- package/src/interfaces/models/role.js +0 -3
- package/src/interfaces/models/role.js.map +0 -1
- package/src/interfaces/models/token-role.d.ts.map +0 -1
- package/src/interfaces/models/token-role.js +0 -3
- package/src/interfaces/models/token-role.js.map +0 -1
- package/src/interfaces/models/used-direct-login-token.d.ts.map +0 -1
- package/src/interfaces/models/used-direct-login-token.js +0 -3
- package/src/interfaces/models/used-direct-login-token.js.map +0 -1
- package/src/interfaces/models/user-role.d.ts.map +0 -1
- package/src/interfaces/models/user-role.js +0 -3
- package/src/interfaces/models/user-role.js.map +0 -1
- package/src/interfaces/models/user.d.ts.map +0 -1
- package/src/interfaces/models/user.js +0 -3
- package/src/interfaces/models/user.js.map +0 -1
- package/src/interfaces/mongo-errors.d.ts +0 -5
- package/src/interfaces/mongo-errors.d.ts.map +0 -1
- package/src/interfaces/mongo-errors.js +0 -3
- package/src/interfaces/mongo-errors.js.map +0 -1
- package/src/interfaces/request-user.d.ts +0 -58
- package/src/interfaces/request-user.d.ts.map +0 -1
- package/src/interfaces/request-user.js +0 -3
- package/src/interfaces/request-user.js.map +0 -1
- package/src/interfaces/required-string-keys.d.ts +0 -22
- package/src/interfaces/required-string-keys.d.ts.map +0 -1
- package/src/interfaces/required-string-keys.js +0 -3
- package/src/interfaces/required-string-keys.js.map +0 -1
- package/src/interfaces/schema.d.ts +0 -29
- package/src/interfaces/schema.d.ts.map +0 -1
- package/src/interfaces/schema.js +0 -3
- package/src/interfaces/schema.js.map +0 -1
- package/src/interfaces/server-init-result.d.ts +0 -36
- package/src/interfaces/server-init-result.d.ts.map +0 -1
- package/src/interfaces/server-init-result.js +0 -3
- package/src/interfaces/server-init-result.js.map +0 -1
- package/src/interfaces/status-code-response.d.ts +0 -7
- package/src/interfaces/status-code-response.d.ts.map +0 -1
- package/src/interfaces/status-code-response.js +0 -3
- package/src/interfaces/status-code-response.js.map +0 -1
- package/src/interfaces/test-environment.d.ts.map +0 -1
- package/src/interfaces/test-environment.js +0 -3
- package/src/interfaces/test-environment.js.map +0 -1
- package/src/interfaces/token-response.d.ts.map +0 -1
- package/src/interfaces/token-response.js +0 -3
- package/src/interfaces/token-response.js.map +0 -1
- package/src/middlewares/authenticate-crypto.d.ts +0 -10
- package/src/middlewares/authenticate-crypto.d.ts.map +0 -1
- package/src/middlewares/authenticate-crypto.js +0 -126
- package/src/middlewares/authenticate-crypto.js.map +0 -1
- package/src/middlewares/authenticate-token.d.ts +0 -21
- package/src/middlewares/authenticate-token.d.ts.map +0 -1
- package/src/middlewares/authenticate-token.js +0 -104
- package/src/middlewares/authenticate-token.js.map +0 -1
- package/src/middlewares/cleanup-crypto.d.ts +0 -7
- package/src/middlewares/cleanup-crypto.d.ts.map +0 -1
- package/src/middlewares/cleanup-crypto.js +0 -32
- package/src/middlewares/cleanup-crypto.js.map +0 -1
- package/src/middlewares/index.d.ts.map +0 -1
- package/src/middlewares/index.js +0 -8
- package/src/middlewares/index.js.map +0 -1
- package/src/middlewares/set-global-context-language.d.ts +0 -3
- package/src/middlewares/set-global-context-language.d.ts.map +0 -1
- package/src/middlewares/set-global-context-language.js +0 -14
- package/src/middlewares/set-global-context-language.js.map +0 -1
- package/src/middlewares.d.ts +0 -8
- package/src/middlewares.d.ts.map +0 -1
- package/src/middlewares.js +0 -89
- package/src/middlewares.js.map +0 -1
- package/src/model-registry.d.ts +0 -23
- package/src/model-registry.d.ts.map +0 -1
- package/src/model-registry.js +0 -47
- package/src/model-registry.js.map +0 -1
- package/src/models/email-token.d.ts.map +0 -1
- package/src/models/email-token.js +0 -11
- package/src/models/email-token.js.map +0 -1
- package/src/models/index.d.ts.map +0 -1
- package/src/models/index.js +0 -10
- package/src/models/index.js.map +0 -1
- package/src/models/mnemonic.d.ts.map +0 -1
- package/src/models/mnemonic.js +0 -11
- package/src/models/mnemonic.js.map +0 -1
- package/src/models/role.d.ts.map +0 -1
- package/src/models/role.js +0 -11
- package/src/models/role.js.map +0 -1
- package/src/models/used-direct-login-token.d.ts.map +0 -1
- package/src/models/used-direct-login-token.js +0 -11
- package/src/models/used-direct-login-token.js.map +0 -1
- package/src/models/user-role.d.ts.map +0 -1
- package/src/models/user-role.js +0 -10
- package/src/models/user-role.js.map +0 -1
- package/src/models/user.d.ts.map +0 -1
- package/src/models/user.js +0 -11
- package/src/models/user.js.map +0 -1
- package/src/pipeline/index.d.ts.map +0 -1
- package/src/pipeline/index.js +0 -5
- package/src/pipeline/index.js.map +0 -1
- package/src/pipeline/pipeline-builder.d.ts +0 -8
- package/src/pipeline/pipeline-builder.d.ts.map +0 -1
- package/src/pipeline/pipeline-builder.js +0 -18
- package/src/pipeline/pipeline-builder.js.map +0 -1
- package/src/plugins/index.d.ts.map +0 -1
- package/src/plugins/index.js +0 -6
- package/src/plugins/index.js.map +0 -1
- package/src/plugins/plugin-interface.d.ts +0 -8
- package/src/plugins/plugin-interface.d.ts.map +0 -1
- package/src/plugins/plugin-interface.js +0 -3
- package/src/plugins/plugin-interface.js.map +0 -1
- package/src/plugins/plugin-manager.d.ts +0 -12
- package/src/plugins/plugin-manager.d.ts.map +0 -1
- package/src/plugins/plugin-manager.js +0 -37
- package/src/plugins/plugin-manager.js.map +0 -1
- package/src/registry/email-service-registry.d.ts +0 -27
- package/src/registry/email-service-registry.d.ts.map +0 -1
- package/src/registry/email-service-registry.js +0 -42
- package/src/registry/email-service-registry.js.map +0 -1
- package/src/registry/index.d.ts.map +0 -1
- package/src/registry/index.js +0 -6
- package/src/registry/index.js.map +0 -1
- package/src/responses/index.d.ts.map +0 -1
- package/src/responses/index.js +0 -5
- package/src/responses/index.js.map +0 -1
- package/src/responses/response-builder.d.ts +0 -24
- package/src/responses/response-builder.d.ts.map +0 -1
- package/src/responses/response-builder.js +0 -63
- package/src/responses/response-builder.js.map +0 -1
- package/src/routers/api.d.ts +0 -28
- package/src/routers/api.d.ts.map +0 -1
- package/src/routers/api.js +0 -80
- package/src/routers/api.js.map +0 -1
- package/src/routers/app.d.ts +0 -32
- package/src/routers/app.d.ts.map +0 -1
- package/src/routers/app.js +0 -228
- package/src/routers/app.js.map +0 -1
- package/src/routers/base.d.ts +0 -8
- package/src/routers/base.d.ts.map +0 -1
- package/src/routers/base.js +0 -14
- package/src/routers/base.js.map +0 -1
- package/src/routers/index.d.ts.map +0 -1
- package/src/routers/index.js +0 -7
- package/src/routers/index.js.map +0 -1
- package/src/routers/router-config.d.ts +0 -18
- package/src/routers/router-config.d.ts.map +0 -1
- package/src/routers/router-config.js +0 -8
- package/src/routers/router-config.js.map +0 -1
- package/src/routing/index.d.ts +0 -2
- package/src/routing/index.d.ts.map +0 -1
- package/src/routing/index.js +0 -5
- package/src/routing/index.js.map +0 -1
- package/src/routing/route-builder.d.ts +0 -36
- package/src/routing/route-builder.d.ts.map +0 -1
- package/src/routing/route-builder.js +0 -86
- package/src/routing/route-builder.js.map +0 -1
- package/src/schemas/email-token.d.ts.map +0 -1
- package/src/schemas/email-token.js +0 -55
- package/src/schemas/email-token.js.map +0 -1
- package/src/schemas/index.d.ts.map +0 -1
- package/src/schemas/index.js +0 -11
- package/src/schemas/index.js.map +0 -1
- package/src/schemas/mnemonic.d.ts.map +0 -1
- package/src/schemas/mnemonic.js +0 -31
- package/src/schemas/mnemonic.js.map +0 -1
- package/src/schemas/role.d.ts.map +0 -1
- package/src/schemas/role.js +0 -88
- package/src/schemas/role.js.map +0 -1
- package/src/schemas/schema.d.ts +0 -42
- package/src/schemas/schema.d.ts.map +0 -1
- package/src/schemas/schema.js +0 -70
- package/src/schemas/schema.js.map +0 -1
- package/src/schemas/used-direct-login-token.d.ts.map +0 -1
- package/src/schemas/used-direct-login-token.js +0 -24
- package/src/schemas/used-direct-login-token.js.map +0 -1
- package/src/schemas/user-role.d.ts.map +0 -1
- package/src/schemas/user-role.js +0 -55
- package/src/schemas/user-role.js.map +0 -1
- package/src/schemas/user.d.ts.map +0 -1
- package/src/schemas/user.js +0 -194
- package/src/schemas/user.js.map +0 -1
- package/src/services/backup-code.d.ts +0 -76
- package/src/services/backup-code.d.ts.map +0 -1
- package/src/services/backup-code.js +0 -185
- package/src/services/backup-code.js.map +0 -1
- package/src/services/base.d.ts +0 -10
- package/src/services/base.d.ts.map +0 -1
- package/src/services/base.js +0 -15
- package/src/services/base.js.map +0 -1
- package/src/services/checksum.d.ts +0 -69
- package/src/services/checksum.d.ts.map +0 -1
- package/src/services/checksum.js +0 -145
- package/src/services/checksum.js.map +0 -1
- package/src/services/crc.d.ts +0 -87
- package/src/services/crc.d.ts.map +0 -1
- package/src/services/crc.js +0 -198
- package/src/services/crc.js.map +0 -1
- package/src/services/database-initialization.d.ts +0 -111
- package/src/services/database-initialization.d.ts.map +0 -1
- package/src/services/database-initialization.js +0 -873
- package/src/services/database-initialization.js.map +0 -1
- package/src/services/db-init-cache.d.ts +0 -10
- package/src/services/db-init-cache.d.ts.map +0 -1
- package/src/services/db-init-cache.js +0 -3
- package/src/services/db-init-cache.js.map +0 -1
- package/src/services/direct-login-token.d.ts +0 -6
- package/src/services/direct-login-token.d.ts.map +0 -1
- package/src/services/direct-login-token.js +0 -41
- package/src/services/direct-login-token.js.map +0 -1
- package/src/services/dummy-email-service.d.ts +0 -10
- package/src/services/dummy-email-service.d.ts.map +0 -1
- package/src/services/dummy-email-service.js +0 -16
- package/src/services/dummy-email-service.js.map +0 -1
- package/src/services/fec-usage-example.d.ts +0 -38
- package/src/services/fec-usage-example.d.ts.map +0 -1
- package/src/services/fec-usage-example.js +0 -75
- package/src/services/fec-usage-example.js.map +0 -1
- package/src/services/fec.d.ts +0 -46
- package/src/services/fec.d.ts.map +0 -1
- package/src/services/fec.js +0 -214
- package/src/services/fec.js.map +0 -1
- package/src/services/index.d.ts.map +0 -1
- package/src/services/index.js +0 -23
- package/src/services/index.js.map +0 -1
- package/src/services/jwt.d.ts +0 -30
- package/src/services/jwt.d.ts.map +0 -1
- package/src/services/jwt.js +0 -90
- package/src/services/jwt.js.map +0 -1
- package/src/services/key-wrapping.d.ts +0 -61
- package/src/services/key-wrapping.d.ts.map +0 -1
- package/src/services/key-wrapping.js +0 -310
- package/src/services/key-wrapping.js.map +0 -1
- package/src/services/mnemonic.d.ts +0 -61
- package/src/services/mnemonic.d.ts.map +0 -1
- package/src/services/mnemonic.js +0 -114
- package/src/services/mnemonic.js.map +0 -1
- package/src/services/request-user.d.ts +0 -23
- package/src/services/request-user.d.ts.map +0 -1
- package/src/services/request-user.js +0 -66
- package/src/services/request-user.js.map +0 -1
- package/src/services/role.d.ts +0 -86
- package/src/services/role.d.ts.map +0 -1
- package/src/services/role.js +0 -285
- package/src/services/role.js.map +0 -1
- package/src/services/symmetric.d.ts +0 -42
- package/src/services/symmetric.d.ts.map +0 -1
- package/src/services/symmetric.js +0 -101
- package/src/services/symmetric.js.map +0 -1
- package/src/services/system-user.d.ts +0 -17
- package/src/services/system-user.d.ts.map +0 -1
- package/src/services/system-user.js +0 -46
- package/src/services/system-user.js.map +0 -1
- package/src/services/user.d.ts +0 -349
- package/src/services/user.d.ts.map +0 -1
- package/src/services/user.js +0 -1442
- package/src/services/user.js.map +0 -1
- package/src/services/xor.d.ts +0 -24
- package/src/services/xor.d.ts.map +0 -1
- package/src/services/xor.js +0 -37
- package/src/services/xor.js.map +0 -1
- package/src/testing.d.ts +0 -3
- package/src/testing.d.ts.map +0 -1
- package/src/testing.js +0 -7
- package/src/testing.js.map +0 -1
- package/src/transactions/index.d.ts.map +0 -1
- package/src/transactions/index.js +0 -5
- package/src/transactions/index.js.map +0 -1
- package/src/transactions/transaction-manager.d.ts +0 -12
- package/src/transactions/transaction-manager.d.ts.map +0 -1
- package/src/transactions/transaction-manager.js +0 -30
- package/src/transactions/transaction-manager.js.map +0 -1
- package/src/types/app-config.d.ts +0 -16
- package/src/types/app-config.d.ts.map +0 -1
- package/src/types/app-config.js +0 -3
- package/src/types/app-config.js.map +0 -1
- package/src/types/controller-config.d.ts.map +0 -1
- package/src/types/controller-config.js +0 -3
- package/src/types/controller-config.js.map +0 -1
- package/src/types/environment-variables.d.ts.map +0 -1
- package/src/types/environment-variables.js +0 -39
- package/src/types/environment-variables.js.map +0 -1
- package/src/types/id-converters.d.ts +0 -28
- package/src/types/id-converters.d.ts.map +0 -1
- package/src/types/id-converters.js +0 -45
- package/src/types/id-converters.js.map +0 -1
- package/src/types/index.d.ts.map +0 -1
- package/src/types/index.js +0 -6
- package/src/types/index.js.map +0 -1
- package/src/types/mongoose-helpers.d.ts.map +0 -1
- package/src/types/mongoose-helpers.js +0 -6
- package/src/types/mongoose-helpers.js.map +0 -1
- package/src/types.d.ts.map +0 -1
- package/src/types.js +0 -14
- package/src/types.js.map +0 -1
- package/src/utils.d.ts +0 -210
- package/src/utils.d.ts.map +0 -1
- package/src/utils.js +0 -819
- package/src/utils.js.map +0 -1
- package/src/validation/index.d.ts.map +0 -1
- package/src/validation/index.js +0 -5
- package/src/validation/index.js.map +0 -1
- package/src/validation/validation-builder.d.ts +0 -32
- package/src/validation/validation-builder.d.ts.map +0 -1
- package/src/validation/validation-builder.js +0 -81
- package/src/validation/validation-builder.js.map +0 -1
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { SecureBuffer, SecureString } from '@digitaldefiance/ecies-lib';
|
|
2
|
+
import {
|
|
3
|
+
Constants,
|
|
4
|
+
IConstants,
|
|
5
|
+
Pbkdf2Service,
|
|
6
|
+
} from '@digitaldefiance/node-ecies-lib';
|
|
7
|
+
import {
|
|
8
|
+
createCipheriv,
|
|
9
|
+
createDecipheriv,
|
|
10
|
+
createHash,
|
|
11
|
+
randomBytes,
|
|
12
|
+
} from 'crypto';
|
|
13
|
+
import { InvalidNewPasswordError, InvalidPasswordError } from '../errors';
|
|
14
|
+
|
|
15
|
+
function createPbkdf2Service(constants: IConstants): Pbkdf2Service {
|
|
16
|
+
return Pbkdf2Service.fromConstants(constants);
|
|
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(
|
|
45
|
+
password: SecureString,
|
|
46
|
+
constants: IConstants = Constants,
|
|
47
|
+
): {
|
|
48
|
+
masterKey: SecureBuffer;
|
|
49
|
+
wrappedKey: WrappedKey;
|
|
50
|
+
} {
|
|
51
|
+
const masterKey = new SecureBuffer(
|
|
52
|
+
randomBytes(constants.WRAPPED_KEY.MASTER_KEY_SIZE),
|
|
53
|
+
);
|
|
54
|
+
const wrappedKey = this.wrapMasterKey(masterKey, password, constants);
|
|
55
|
+
return { masterKey, wrappedKey };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Wraps an existing master key with a password-derived key
|
|
60
|
+
*/
|
|
61
|
+
public wrapMasterKey(
|
|
62
|
+
masterKey: SecureBuffer,
|
|
63
|
+
password: SecureString,
|
|
64
|
+
constants: IConstants = Constants,
|
|
65
|
+
): WrappedKey {
|
|
66
|
+
if (constants.PasswordRegex.test(password.value ?? '') === false) {
|
|
67
|
+
throw new InvalidNewPasswordError();
|
|
68
|
+
}
|
|
69
|
+
const salt = randomBytes(constants.WRAPPED_KEY.SALT_SIZE);
|
|
70
|
+
const iterations = constants.WRAPPED_KEY.MIN_ITERATIONS;
|
|
71
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
72
|
+
|
|
73
|
+
// Derive key from password using centralized PBKDF2 service
|
|
74
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
75
|
+
Buffer.from(password.valueAsUint8Array),
|
|
76
|
+
salt,
|
|
77
|
+
iterations,
|
|
78
|
+
constants.WRAPPED_KEY.SALT_SIZE,
|
|
79
|
+
32, // AES-256 key size
|
|
80
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
81
|
+
);
|
|
82
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
83
|
+
|
|
84
|
+
// Encrypt master key
|
|
85
|
+
const iv = randomBytes(constants.WRAPPED_KEY.IV_SIZE);
|
|
86
|
+
const cipher = createCipheriv('aes-256-gcm', passwordKeySecure.value, iv);
|
|
87
|
+
|
|
88
|
+
const encrypted = Buffer.concat([
|
|
89
|
+
cipher.update(masterKey.value),
|
|
90
|
+
cipher.final(),
|
|
91
|
+
]);
|
|
92
|
+
|
|
93
|
+
const authTag = cipher.getAuthTag();
|
|
94
|
+
|
|
95
|
+
passwordKeySecure.dispose();
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
salt: salt.toString('hex'),
|
|
99
|
+
iv: iv.toString('hex'),
|
|
100
|
+
authTag: authTag.toString('hex'),
|
|
101
|
+
encryptedMasterKey: encrypted.toString('hex'),
|
|
102
|
+
iterations,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Unwraps a master key using the user's password
|
|
108
|
+
*/
|
|
109
|
+
public unwrapMasterKey(
|
|
110
|
+
wrappedKey: WrappedKey,
|
|
111
|
+
password: SecureString,
|
|
112
|
+
constants: IConstants = Constants,
|
|
113
|
+
): SecureBuffer {
|
|
114
|
+
const salt = Buffer.from(wrappedKey.salt, 'hex');
|
|
115
|
+
const iv = Buffer.from(wrappedKey.iv, 'hex');
|
|
116
|
+
const authTag = Buffer.from(wrappedKey.authTag, 'hex');
|
|
117
|
+
const encrypted = Buffer.from(wrappedKey.encryptedMasterKey, 'hex');
|
|
118
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
119
|
+
|
|
120
|
+
// Derive the same key from password using centralized PBKDF2 service
|
|
121
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
122
|
+
Buffer.from(password.valueAsUint8Array),
|
|
123
|
+
salt,
|
|
124
|
+
wrappedKey.iterations,
|
|
125
|
+
salt.length, // Use actual salt size
|
|
126
|
+
32, // AES-256 key size
|
|
127
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
128
|
+
);
|
|
129
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
const decipher = createDecipheriv(
|
|
133
|
+
'aes-256-gcm',
|
|
134
|
+
passwordKeySecure.value,
|
|
135
|
+
iv,
|
|
136
|
+
);
|
|
137
|
+
decipher.setAuthTag(authTag);
|
|
138
|
+
|
|
139
|
+
const decrypted = Buffer.concat([
|
|
140
|
+
decipher.update(encrypted),
|
|
141
|
+
decipher.final(),
|
|
142
|
+
]);
|
|
143
|
+
|
|
144
|
+
return new SecureBuffer(decrypted);
|
|
145
|
+
} catch {
|
|
146
|
+
throw new InvalidPasswordError();
|
|
147
|
+
} finally {
|
|
148
|
+
passwordKeySecure.dispose();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Async version of unwrapMasterKey that uses libuv threadpool via crypto.pbkdf2
|
|
154
|
+
* to avoid blocking the event loop during password verification.
|
|
155
|
+
*/
|
|
156
|
+
public async unwrapMasterKeyAsync(
|
|
157
|
+
wrappedKey: WrappedKey,
|
|
158
|
+
password: SecureString | string,
|
|
159
|
+
constants: IConstants = Constants,
|
|
160
|
+
): Promise<SecureBuffer> {
|
|
161
|
+
const __perfEnabled = process.env['PERF_LOGS'] === '1';
|
|
162
|
+
const _t0 = __perfEnabled ? Date.now() : 0;
|
|
163
|
+
const salt = Buffer.from(wrappedKey.salt, 'hex');
|
|
164
|
+
const iv = Buffer.from(wrappedKey.iv, 'hex');
|
|
165
|
+
const authTag = Buffer.from(wrappedKey.authTag, 'hex');
|
|
166
|
+
const encrypted = Buffer.from(wrappedKey.encryptedMasterKey, 'hex');
|
|
167
|
+
|
|
168
|
+
// Accept either a SecureString (preferred) or a raw password string to avoid
|
|
169
|
+
// expensive SecureString construction in the hot login path.
|
|
170
|
+
const pwdBuffer =
|
|
171
|
+
// amazonq-ignore-next-line false positive
|
|
172
|
+
typeof password === 'string'
|
|
173
|
+
? Buffer.from(password, 'utf8')
|
|
174
|
+
: Buffer.from(password.valueAsUint8Array);
|
|
175
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
176
|
+
|
|
177
|
+
// Use centralized PBKDF2 service for async key derivation
|
|
178
|
+
const derivedKey = await pbkdf2Service.deriveKeyFromPasswordAsync(
|
|
179
|
+
pwdBuffer,
|
|
180
|
+
salt,
|
|
181
|
+
wrappedKey.iterations,
|
|
182
|
+
salt.length, // Use actual salt size
|
|
183
|
+
32, // AES-256 key size
|
|
184
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
185
|
+
);
|
|
186
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
const decipher = createDecipheriv(
|
|
190
|
+
'aes-256-gcm',
|
|
191
|
+
passwordKeySecure.value,
|
|
192
|
+
iv,
|
|
193
|
+
);
|
|
194
|
+
decipher.setAuthTag(authTag);
|
|
195
|
+
|
|
196
|
+
const decrypted = Buffer.concat([
|
|
197
|
+
decipher.update(encrypted),
|
|
198
|
+
decipher.final(),
|
|
199
|
+
]);
|
|
200
|
+
if (__perfEnabled)
|
|
201
|
+
console.warn(
|
|
202
|
+
'[perf] unwrapMasterKeyAsync pbkdf2',
|
|
203
|
+
'iters=' + String(wrappedKey.iterations).replace(/[\r\n]/g, ''),
|
|
204
|
+
'dt=' + (Date.now() - _t0) + 'ms',
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
return new SecureBuffer(decrypted);
|
|
208
|
+
} catch {
|
|
209
|
+
throw new InvalidPasswordError();
|
|
210
|
+
} finally {
|
|
211
|
+
// Best-effort zero the temporary password buffer
|
|
212
|
+
try {
|
|
213
|
+
pwdBuffer.fill(0);
|
|
214
|
+
} catch {
|
|
215
|
+
// ignore
|
|
216
|
+
}
|
|
217
|
+
passwordKeySecure.dispose();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Deduplicated async unwrap that coalesces concurrent identical PBKDF2 operations.
|
|
223
|
+
* Keyed by salt + iterations + a short hash of the password. Entry is removed after resolve/reject.
|
|
224
|
+
*/
|
|
225
|
+
public async unwrapMasterKeyAsyncDedup(
|
|
226
|
+
wrappedKey: WrappedKey,
|
|
227
|
+
password: string,
|
|
228
|
+
constants: IConstants = Constants,
|
|
229
|
+
): Promise<SecureBuffer> {
|
|
230
|
+
// Derive a short cache key; avoid storing raw password by hashing
|
|
231
|
+
const pwdKey = createHash('sha256')
|
|
232
|
+
.update(password, 'utf8')
|
|
233
|
+
.digest('hex')
|
|
234
|
+
.slice(0, 24);
|
|
235
|
+
const cacheKey = `${wrappedKey.salt}:${wrappedKey.iterations}:${pwdKey}`;
|
|
236
|
+
let p = KeyWrappingService.inFlightUnwraps.get(cacheKey);
|
|
237
|
+
if (!p) {
|
|
238
|
+
// Compute once, extract raw bytes, dispose the shared SecureBuffer, and cache the bytes
|
|
239
|
+
p = (async () => {
|
|
240
|
+
const mk = await this.unwrapMasterKeyAsync(
|
|
241
|
+
wrappedKey,
|
|
242
|
+
password,
|
|
243
|
+
constants,
|
|
244
|
+
);
|
|
245
|
+
try {
|
|
246
|
+
const copy = Buffer.from(mk.value);
|
|
247
|
+
const b64 = copy.toString('base64');
|
|
248
|
+
// zeroize copy
|
|
249
|
+
copy.fill(0);
|
|
250
|
+
return b64;
|
|
251
|
+
} finally {
|
|
252
|
+
mk.dispose();
|
|
253
|
+
}
|
|
254
|
+
})().finally(() => {
|
|
255
|
+
// Best-effort cleanup
|
|
256
|
+
KeyWrappingService.inFlightUnwraps.delete(cacheKey);
|
|
257
|
+
}) as Promise<string>;
|
|
258
|
+
KeyWrappingService.inFlightUnwraps.set(cacheKey, p);
|
|
259
|
+
}
|
|
260
|
+
const b64 = await p;
|
|
261
|
+
// Return a fresh SecureBuffer per caller to avoid cross-disposal races
|
|
262
|
+
const buf = Buffer.from(b64, 'base64');
|
|
263
|
+
const secure = new SecureBuffer(Buffer.from(buf));
|
|
264
|
+
buf.fill(0);
|
|
265
|
+
return secure;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Changes password by re-wrapping the master key
|
|
270
|
+
*/
|
|
271
|
+
public changePassword(
|
|
272
|
+
wrappedKey: WrappedKey,
|
|
273
|
+
oldPassword: SecureString,
|
|
274
|
+
newPassword: SecureString,
|
|
275
|
+
constants: IConstants = Constants,
|
|
276
|
+
): WrappedKey {
|
|
277
|
+
// Unwrap with old password
|
|
278
|
+
const masterKey = this.unwrapMasterKey(wrappedKey, oldPassword, constants);
|
|
279
|
+
|
|
280
|
+
try {
|
|
281
|
+
// Re-wrap with new password
|
|
282
|
+
return this.wrapMasterKey(masterKey, newPassword, constants);
|
|
283
|
+
} finally {
|
|
284
|
+
masterKey.dispose();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Wraps arbitrary secret bytes with a password-derived key (AES-256-GCM)
|
|
290
|
+
*/
|
|
291
|
+
public wrapSecret(
|
|
292
|
+
secret: SecureBuffer,
|
|
293
|
+
password: SecureString,
|
|
294
|
+
constants: IConstants = Constants,
|
|
295
|
+
): PasswordWrappedSecret {
|
|
296
|
+
if (constants.PasswordRegex.test(password.value ?? '') === false) {
|
|
297
|
+
throw new InvalidNewPasswordError();
|
|
298
|
+
}
|
|
299
|
+
const salt = randomBytes(constants.WRAPPED_KEY.SALT_SIZE);
|
|
300
|
+
const iterations = constants.WRAPPED_KEY.MIN_ITERATIONS;
|
|
301
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
302
|
+
|
|
303
|
+
// Derive key from password using centralized PBKDF2 service
|
|
304
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
305
|
+
Buffer.from(password.valueAsUint8Array),
|
|
306
|
+
salt,
|
|
307
|
+
iterations,
|
|
308
|
+
constants.WRAPPED_KEY.SALT_SIZE,
|
|
309
|
+
32, // AES-256 key size
|
|
310
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
311
|
+
);
|
|
312
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
313
|
+
|
|
314
|
+
try {
|
|
315
|
+
const iv = randomBytes(constants.WRAPPED_KEY.IV_SIZE);
|
|
316
|
+
const cipher = createCipheriv('aes-256-gcm', passwordKeySecure.value, iv);
|
|
317
|
+
const encrypted = Buffer.concat([
|
|
318
|
+
cipher.update(secret.value),
|
|
319
|
+
cipher.final(),
|
|
320
|
+
]);
|
|
321
|
+
const authTag = cipher.getAuthTag();
|
|
322
|
+
return {
|
|
323
|
+
salt: salt.toString('hex'),
|
|
324
|
+
iv: iv.toString('hex'),
|
|
325
|
+
authTag: authTag.toString('hex'),
|
|
326
|
+
ciphertext: encrypted.toString('hex'),
|
|
327
|
+
iterations,
|
|
328
|
+
};
|
|
329
|
+
} finally {
|
|
330
|
+
passwordKeySecure.dispose();
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Unwraps a password-wrapped secret (sync)
|
|
336
|
+
*/
|
|
337
|
+
public unwrapSecret(
|
|
338
|
+
wrapped: PasswordWrappedSecret,
|
|
339
|
+
password: SecureString,
|
|
340
|
+
constants: IConstants = Constants,
|
|
341
|
+
): SecureBuffer {
|
|
342
|
+
const salt = Buffer.from(wrapped.salt, 'hex');
|
|
343
|
+
const iv = Buffer.from(wrapped.iv, 'hex');
|
|
344
|
+
const authTag = Buffer.from(wrapped.authTag, 'hex');
|
|
345
|
+
const encrypted = Buffer.from(wrapped.ciphertext, 'hex');
|
|
346
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
347
|
+
|
|
348
|
+
// Derive key from password using centralized PBKDF2 service
|
|
349
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
350
|
+
Buffer.from(password.valueAsUint8Array),
|
|
351
|
+
salt,
|
|
352
|
+
wrapped.iterations,
|
|
353
|
+
salt.length, // Use actual salt size
|
|
354
|
+
32, // AES-256 key size
|
|
355
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
356
|
+
);
|
|
357
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
358
|
+
try {
|
|
359
|
+
const decipher = createDecipheriv(
|
|
360
|
+
'aes-256-gcm',
|
|
361
|
+
passwordKeySecure.value,
|
|
362
|
+
iv,
|
|
363
|
+
);
|
|
364
|
+
decipher.setAuthTag(authTag);
|
|
365
|
+
const decrypted = Buffer.concat([
|
|
366
|
+
decipher.update(encrypted),
|
|
367
|
+
decipher.final(),
|
|
368
|
+
]);
|
|
369
|
+
return new SecureBuffer(decrypted);
|
|
370
|
+
} catch {
|
|
371
|
+
throw new InvalidPasswordError();
|
|
372
|
+
} finally {
|
|
373
|
+
passwordKeySecure.dispose();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Unwraps a password-wrapped secret (async PBKDF2)
|
|
379
|
+
*/
|
|
380
|
+
public async unwrapSecretAsync(
|
|
381
|
+
wrapped: PasswordWrappedSecret,
|
|
382
|
+
password: SecureString | string,
|
|
383
|
+
constants: IConstants = Constants,
|
|
384
|
+
): Promise<SecureBuffer> {
|
|
385
|
+
const salt = Buffer.from(wrapped.salt, 'hex');
|
|
386
|
+
const iv = Buffer.from(wrapped.iv, 'hex');
|
|
387
|
+
const authTag = Buffer.from(wrapped.authTag, 'hex');
|
|
388
|
+
const encrypted = Buffer.from(wrapped.ciphertext, 'hex');
|
|
389
|
+
|
|
390
|
+
// Validate password parameter before using it
|
|
391
|
+
// amazonq-ignore-next-line false positive
|
|
392
|
+
if (typeof password === 'string') {
|
|
393
|
+
if (password === undefined || password === null) {
|
|
394
|
+
throw new Error('Password cannot be undefined or null');
|
|
395
|
+
}
|
|
396
|
+
} else if (!(password instanceof SecureString)) {
|
|
397
|
+
throw new Error('Password must be provided as string or SecureString');
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const pwdBuffer =
|
|
401
|
+
// amazonq-ignore-next-line false positive
|
|
402
|
+
typeof password === 'string'
|
|
403
|
+
? Buffer.from(password, 'utf8')
|
|
404
|
+
: await (async () => password.valueAsUint8Array)();
|
|
405
|
+
|
|
406
|
+
// Additional safety check
|
|
407
|
+
if (!pwdBuffer) {
|
|
408
|
+
throw new Error(
|
|
409
|
+
'Failed to create password buffer - password may be invalid',
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
413
|
+
|
|
414
|
+
// Use centralized PBKDF2 service for async key derivation
|
|
415
|
+
const derivedKey = await pbkdf2Service.deriveKeyFromPasswordAsync(
|
|
416
|
+
Buffer.from(pwdBuffer),
|
|
417
|
+
salt,
|
|
418
|
+
wrapped.iterations,
|
|
419
|
+
salt.length, // Use actual salt size
|
|
420
|
+
32, // AES-256 key size
|
|
421
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
422
|
+
);
|
|
423
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
424
|
+
try {
|
|
425
|
+
const decipher = createDecipheriv(
|
|
426
|
+
'aes-256-gcm',
|
|
427
|
+
passwordKeySecure.value,
|
|
428
|
+
iv,
|
|
429
|
+
);
|
|
430
|
+
decipher.setAuthTag(authTag);
|
|
431
|
+
const decrypted = Buffer.concat([
|
|
432
|
+
decipher.update(encrypted),
|
|
433
|
+
decipher.final(),
|
|
434
|
+
]);
|
|
435
|
+
return new SecureBuffer(decrypted);
|
|
436
|
+
} catch {
|
|
437
|
+
throw new InvalidPasswordError();
|
|
438
|
+
} finally {
|
|
439
|
+
try {
|
|
440
|
+
pwdBuffer.fill(0);
|
|
441
|
+
} catch {
|
|
442
|
+
// ignore
|
|
443
|
+
}
|
|
444
|
+
passwordKeySecure.dispose();
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { SecureBuffer, SecureString } from '@digitaldefiance/ecies-lib';
|
|
2
|
+
import { ClientSession, Model, Types } from '@digitaldefiance/mongoose-types';
|
|
3
|
+
import {
|
|
4
|
+
SuiteCoreStringKey,
|
|
5
|
+
TranslatableSuiteError,
|
|
6
|
+
} from '@digitaldefiance/suite-core-lib';
|
|
7
|
+
import { createHmac } from 'crypto';
|
|
8
|
+
import { IMnemonicDocument } from '../documents/mnemonic';
|
|
9
|
+
import { IConstants } from '../interfaces';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Encrypts and stores mnemonics securely, using an HMAC to check for
|
|
13
|
+
* uniqueness without exposing the mnemonic itself.
|
|
14
|
+
*/
|
|
15
|
+
export class MnemonicService<
|
|
16
|
+
I extends string | Types.ObjectId = Types.ObjectId,
|
|
17
|
+
> {
|
|
18
|
+
private readonly hmacSecret: SecureBuffer;
|
|
19
|
+
private readonly MnemonicModel: Model<IMnemonicDocument<I>>;
|
|
20
|
+
private readonly constants: IConstants;
|
|
21
|
+
|
|
22
|
+
constructor(
|
|
23
|
+
mnemonicModel: Model<IMnemonicDocument<I>>,
|
|
24
|
+
hmacSecret: SecureBuffer,
|
|
25
|
+
constants: IConstants,
|
|
26
|
+
) {
|
|
27
|
+
this.MnemonicModel = mnemonicModel;
|
|
28
|
+
// Immediately wrap secrets in secure containers
|
|
29
|
+
this.hmacSecret = hmacSecret;
|
|
30
|
+
this.constants = constants;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Disposes of the secure secrets held by this service.
|
|
35
|
+
*/
|
|
36
|
+
public dispose(): void {
|
|
37
|
+
this.hmacSecret.dispose();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Creates a non-reversible HMAC of the mnemonic for fast, indexed lookups.
|
|
42
|
+
* @param mnemonic The mnemonic to hash, wrapped in a SecureString.
|
|
43
|
+
*/
|
|
44
|
+
public getMnemonicHmac(mnemonic: SecureString): string {
|
|
45
|
+
// Use the raw secret buffer for the HMAC
|
|
46
|
+
return createHmac('sha256', this.hmacSecret.value)
|
|
47
|
+
.update(mnemonic.valueAsUint8Array) // Use the raw buffer for consistency
|
|
48
|
+
.digest('hex');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Checks if a mnemonic already exists in the database using its HMAC.
|
|
53
|
+
* @param mnemonic The mnemonic to check, wrapped in a SecureString.
|
|
54
|
+
* @param session Optional Mongoose session for transaction support.
|
|
55
|
+
*/
|
|
56
|
+
public async mnemonicExists(
|
|
57
|
+
mnemonic: SecureString,
|
|
58
|
+
session?: ClientSession,
|
|
59
|
+
): Promise<boolean> {
|
|
60
|
+
const hmac = this.getMnemonicHmac(mnemonic);
|
|
61
|
+
const count = await this.MnemonicModel.countDocuments({ hmac }).session(
|
|
62
|
+
session ?? null,
|
|
63
|
+
);
|
|
64
|
+
return count > 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Adds a new, unique mnemonic to the database with password-based key wrapping.
|
|
69
|
+
* @param mnemonic The mnemonic to add, wrapped in a SecureString.
|
|
70
|
+
* @param password User's password for key wrapping.
|
|
71
|
+
* @param session Optional Mongoose session for transaction support.
|
|
72
|
+
*/
|
|
73
|
+
public async addMnemonicWithPassword(
|
|
74
|
+
mnemonic: SecureString,
|
|
75
|
+
_password: SecureString,
|
|
76
|
+
session?: ClientSession,
|
|
77
|
+
): Promise<{
|
|
78
|
+
document: IMnemonicDocument<I> | null;
|
|
79
|
+
}> {
|
|
80
|
+
if (!mnemonic.value || !this.constants.MnemonicRegex.test(mnemonic.value)) {
|
|
81
|
+
throw new TranslatableSuiteError(
|
|
82
|
+
SuiteCoreStringKey.Validation_MnemonicRegex,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (await this.mnemonicExists(mnemonic, session)) {
|
|
87
|
+
return { document: null };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const hmac = this.getMnemonicHmac(mnemonic);
|
|
92
|
+
const [newDoc] = await this.MnemonicModel.create(
|
|
93
|
+
[
|
|
94
|
+
{
|
|
95
|
+
hmac: hmac,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
{ session },
|
|
99
|
+
);
|
|
100
|
+
return { document: newDoc };
|
|
101
|
+
} finally {
|
|
102
|
+
// nothing to dispose
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Adds a new, unique mnemonic to the database.
|
|
108
|
+
* @param mnemonic The mnemonic to add, wrapped in a SecureString.
|
|
109
|
+
* @param session Optional Mongoose session for transaction support.
|
|
110
|
+
*/
|
|
111
|
+
public async addMnemonic(
|
|
112
|
+
mnemonic: SecureString,
|
|
113
|
+
session?: ClientSession,
|
|
114
|
+
): Promise<IMnemonicDocument<I> | null> {
|
|
115
|
+
if (!mnemonic.value || !this.constants.MnemonicRegex.test(mnemonic.value)) {
|
|
116
|
+
throw new TranslatableSuiteError(
|
|
117
|
+
SuiteCoreStringKey.Validation_MnemonicRegex,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (await this.mnemonicExists(mnemonic, session)) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const hmac = this.getMnemonicHmac(mnemonic);
|
|
125
|
+
const [newDoc] = await this.MnemonicModel.create(
|
|
126
|
+
[
|
|
127
|
+
{
|
|
128
|
+
hmac: hmac,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
{ session },
|
|
132
|
+
);
|
|
133
|
+
return newDoc;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Retrieves a mnemonic document by ID.
|
|
138
|
+
* @param mnemonicId The ID of the mnemonic document.
|
|
139
|
+
* @param session Optional Mongoose session for transaction support.
|
|
140
|
+
*/
|
|
141
|
+
public async getMnemonicDocument(
|
|
142
|
+
mnemonicId: I,
|
|
143
|
+
session?: ClientSession,
|
|
144
|
+
): Promise<IMnemonicDocument<I> | null> {
|
|
145
|
+
return await this.MnemonicModel.findById(mnemonicId).session(
|
|
146
|
+
session ?? null,
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Decrypts a mnemonic from a document using the service's master encryption key.
|
|
152
|
+
* @param doc The mnemonic document.
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Deletes a mnemonic document by ID.
|
|
157
|
+
* @param mnemonicId The ID of the mnemonic document.
|
|
158
|
+
* @param session Optional Mongoose session for transaction support.
|
|
159
|
+
*/
|
|
160
|
+
public async deleteMnemonicDocument(
|
|
161
|
+
mnemonicId: I,
|
|
162
|
+
session?: ClientSession,
|
|
163
|
+
): Promise<void> {
|
|
164
|
+
await this.MnemonicModel.findByIdAndDelete(mnemonicId).session(
|
|
165
|
+
session ?? null,
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Types } from '@digitaldefiance/mongoose-types';
|
|
2
|
+
import {
|
|
3
|
+
IRequestUserDTO,
|
|
4
|
+
IRoleDTO,
|
|
5
|
+
ITokenRole,
|
|
6
|
+
} from '@digitaldefiance/suite-core-lib';
|
|
7
|
+
import { IUserDocument } from '../documents';
|
|
8
|
+
import { IRequestUserBackendObject } from '../interfaces/backend-objects/request-user';
|
|
9
|
+
import { convertStringToGenericId } from '../types/id-converters';
|
|
10
|
+
import { RoleService } from './role';
|
|
11
|
+
|
|
12
|
+
export class RequestUserService<
|
|
13
|
+
I extends string | Types.ObjectId,
|
|
14
|
+
_TTokenRole extends ITokenRole<I>,
|
|
15
|
+
> {
|
|
16
|
+
/**
|
|
17
|
+
* Given a user document and an array of role documents, create the IRequestUser
|
|
18
|
+
* @param userDoc
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
public static makeRequestUserDTO<
|
|
22
|
+
I extends string | Types.ObjectId,
|
|
23
|
+
S extends string,
|
|
24
|
+
TTokenRole extends ITokenRole<I>,
|
|
25
|
+
TRequestUserDTO extends IRequestUserDTO,
|
|
26
|
+
>(
|
|
27
|
+
userDoc:
|
|
28
|
+
| IUserDocument<S, I>
|
|
29
|
+
| (Pick<IUserDocument<S, I>, keyof IUserDocument<S, I>> & {
|
|
30
|
+
_id: Types.ObjectId | string;
|
|
31
|
+
}),
|
|
32
|
+
roles: TTokenRole[],
|
|
33
|
+
): TRequestUserDTO {
|
|
34
|
+
if (!userDoc._id) {
|
|
35
|
+
throw new Error('User document is missing _id');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Calculate combined role privileges across all roles
|
|
39
|
+
const rolePrivileges = {
|
|
40
|
+
admin: roles.some((r) => r.admin),
|
|
41
|
+
member: roles.some((r) => r.member),
|
|
42
|
+
child: roles.some((r) => r.child),
|
|
43
|
+
system: roles.some((r) => r.system),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
id: userDoc._id.toString(),
|
|
48
|
+
email: userDoc.email,
|
|
49
|
+
roles: roles.map((r) => RoleService.roleToRoleDTO(r)),
|
|
50
|
+
rolePrivileges,
|
|
51
|
+
username: userDoc.username,
|
|
52
|
+
timezone: userDoc.timezone,
|
|
53
|
+
currency: userDoc.currency,
|
|
54
|
+
directChallenge: userDoc.directChallenge,
|
|
55
|
+
emailVerified: userDoc.emailVerified,
|
|
56
|
+
darkMode: userDoc.darkMode,
|
|
57
|
+
siteLanguage: userDoc.siteLanguage as string,
|
|
58
|
+
...(userDoc.lastLogin && { lastLogin: userDoc.lastLogin.toString() }),
|
|
59
|
+
} as TRequestUserDTO;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Given a request user, reconstitute dates, objectids, and enums
|
|
64
|
+
* @param requestUser a RequestUser DTO
|
|
65
|
+
* @returns An IRequestUserBackendObject
|
|
66
|
+
*/
|
|
67
|
+
public static hydrateRequestUser<
|
|
68
|
+
I extends string | Types.ObjectId,
|
|
69
|
+
S extends string,
|
|
70
|
+
TRequestUserDTO extends IRequestUserDTO & { siteLanguage: S },
|
|
71
|
+
>(
|
|
72
|
+
requestUser: TRequestUserDTO,
|
|
73
|
+
idConverter?: (id: string) => I,
|
|
74
|
+
): IRequestUserBackendObject<S, I> {
|
|
75
|
+
const convert =
|
|
76
|
+
idConverter ?? ((id: string) => convertStringToGenericId<I>(id));
|
|
77
|
+
const hydratedRoles = requestUser.roles.map((role: IRoleDTO) =>
|
|
78
|
+
RoleService.hydrateRoleDTOToBackend<I>(role, convert),
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const hydratedUser: IRequestUserBackendObject<S, I> = {
|
|
82
|
+
id: convert(requestUser.id),
|
|
83
|
+
email: requestUser.email,
|
|
84
|
+
roles: hydratedRoles,
|
|
85
|
+
rolePrivileges: requestUser.rolePrivileges,
|
|
86
|
+
username: requestUser.username,
|
|
87
|
+
timezone: requestUser.timezone,
|
|
88
|
+
currency: requestUser.currency,
|
|
89
|
+
directChallenge: requestUser.directChallenge,
|
|
90
|
+
emailVerified: requestUser.emailVerified,
|
|
91
|
+
darkMode: requestUser.darkMode,
|
|
92
|
+
siteLanguage: requestUser.siteLanguage,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (requestUser.lastLogin) {
|
|
96
|
+
hydratedUser.lastLogin = new Date(requestUser.lastLogin);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return hydratedUser;
|
|
100
|
+
}
|
|
101
|
+
}
|