@digitaldefiance/node-express-suite 3.7.3 → 3.7.5
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 +4 -5
- 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} +0 -1
- package/src/__tests__/helpers/setup-test-env.ts +202 -0
- package/src/__tests__/{index.d.ts → index.ts} +0 -1
- package/src/application-base.ts +548 -0
- package/src/application-concrete.ts +62 -0
- package/src/application.ts +330 -0
- package/src/backup-code.ts +348 -0
- package/src/builders/application-builder.ts +147 -0
- package/src/builders/{index.d.ts → index.ts} +0 -1
- package/src/constants.ts +89 -0
- package/src/container/{index.d.ts → index.ts} +0 -1
- package/src/container/service-container.ts +85 -0
- package/src/container/service-definitions.ts +23 -0
- package/src/controllers/base.ts +512 -0
- package/src/controllers/{index.d.ts → index.ts} +0 -1
- package/src/controllers/user.ts +1734 -0
- package/src/database/database-initializer.ts +13 -0
- package/src/database/{index.d.ts → index.ts} +0 -1
- package/src/decorators/base-controller.ts +91 -0
- package/src/decorators/controller.ts +152 -0
- package/src/decorators/{index.d.ts → index.ts} +0 -1
- package/src/decorators/zod-validation.ts +64 -0
- package/src/defaults.ts +259 -0
- package/src/documents/base.ts +17 -0
- package/src/documents/email-token.ts +20 -0
- package/src/documents/{index.d.ts → index.ts} +0 -1
- package/src/documents/mnemonic.ts +20 -0
- package/src/documents/role.ts +19 -0
- package/src/documents/used-direct-login-token.ts +18 -0
- package/src/documents/user-role.ts +20 -0
- package/src/documents/user.ts +20 -0
- package/src/enumerations/base-model-name.ts +47 -0
- package/src/enumerations/{index.d.ts → index.ts} +0 -1
- package/src/enumerations/length-encoding-type.ts +16 -0
- package/src/enumerations/schema-collection.ts +39 -0
- package/src/enumerations/symmetric-error-type.ts +13 -0
- package/src/environment.ts +859 -0
- package/src/errors/express-validation.ts +38 -0
- package/src/errors/{index.d.ts → index.ts} +0 -1
- package/src/errors/invalid-backup-code-version.ts +30 -0
- package/src/errors/invalid-jwt-token.ts +24 -0
- package/src/errors/invalid-model.ts +24 -0
- package/src/errors/invalid-new-password.ts +33 -0
- package/src/errors/invalid-password.ts +28 -0
- package/src/errors/missing-validated-data.ts +55 -0
- package/src/errors/mnemonic-or-password-required.ts +26 -0
- package/src/errors/model-not-registered.ts +24 -0
- package/src/errors/mongoose-validation.ts +56 -0
- package/src/errors/symmetric.ts +53 -0
- package/src/errors/token-expired.ts +24 -0
- package/src/get-language.ts +64 -0
- package/src/get-timezone.ts +76 -0
- package/src/{index.d.ts → index.ts} +44 -2
- package/src/interfaces/api-error-response.ts +15 -0
- package/src/interfaces/api-express-validation-error-response.ts +17 -0
- package/src/interfaces/api-message-response.ts +12 -0
- package/src/interfaces/api-mongo-validation-error-response.ts +17 -0
- package/src/interfaces/api-responses/backup-codes-response.ts +15 -0
- package/src/interfaces/api-responses/challenge-response.ts +17 -0
- package/src/interfaces/api-responses/code-count-response.ts +12 -0
- package/src/interfaces/api-responses/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/api-responses/login-response.ts +18 -0
- package/src/interfaces/api-responses/mnemonic-response.ts +15 -0
- package/src/interfaces/api-responses/registration-response.ts +17 -0
- package/src/interfaces/api-responses/request-user-response.ts +16 -0
- package/src/interfaces/api-responses/user-settings-response.ts +19 -0
- package/src/interfaces/application.ts +40 -0
- package/src/interfaces/backend-objects/email-token.ts +18 -0
- package/src/interfaces/backend-objects/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/backend-objects/request-user.ts +19 -0
- package/src/interfaces/backend-objects/role.ts +18 -0
- package/src/interfaces/backend-objects/user.ts +18 -0
- package/src/interfaces/checksum-config.ts +15 -0
- package/src/interfaces/checksum-consts.ts +23 -0
- package/src/interfaces/constants.ts +114 -0
- package/src/interfaces/controller-config.ts +54 -0
- package/src/interfaces/create-user-basics.ts +24 -0
- package/src/interfaces/csp-config.ts +32 -0
- package/src/interfaces/csp-definition.ts +71 -0
- package/src/interfaces/db-init-result.ts +17 -0
- package/src/interfaces/deep-partial.ts +14 -0
- package/src/interfaces/discriminator-collections.ts +21 -0
- package/src/interfaces/email-service.ts +26 -0
- package/src/interfaces/environment-mongo.ts +86 -0
- package/src/interfaces/environment.ts +191 -0
- package/src/interfaces/failable-result.ts +20 -0
- package/src/interfaces/fec-consts.ts +14 -0
- package/src/interfaces/flexible-csp.ts +35 -0
- package/src/interfaces/handleable-error-options.ts +19 -0
- package/src/interfaces/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/jwt-consts.ts +33 -0
- package/src/interfaces/jwt-sign-response.ts +31 -0
- package/src/interfaces/models/email-token.ts +13 -0
- package/src/interfaces/models/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/models/mnemonic.ts +14 -0
- package/src/interfaces/models/role.ts +13 -0
- package/src/interfaces/models/token-role.ts +23 -0
- package/src/interfaces/models/used-direct-login-token.ts +21 -0
- package/src/interfaces/models/user-role.ts +23 -0
- package/src/interfaces/models/user.ts +30 -0
- package/src/interfaces/mongo-errors.ts +14 -0
- package/src/interfaces/request-user.ts +80 -0
- package/src/interfaces/required-string-keys.ts +33 -0
- package/src/interfaces/schema.ts +43 -0
- package/src/interfaces/server-init-result.ts +48 -0
- package/src/interfaces/status-code-response.ts +20 -0
- 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 +15 -0
- package/src/interfaces/test-environment.ts +23 -0
- package/src/interfaces/token-response.ts +16 -0
- package/src/middleware-utils.ts +138 -0
- package/src/middlewares/authenticate-crypto.ts +237 -0
- package/src/middlewares/authenticate-token.ts +165 -0
- package/src/middlewares/cleanup-crypto.ts +47 -0
- package/src/middlewares/{index.d.ts → index.ts} +0 -1
- package/src/middlewares/set-global-context-language.ts +38 -0
- package/src/model-registry.ts +142 -0
- package/src/models/email-token.ts +49 -0
- package/src/models/{index.d.ts → index.ts} +0 -1
- package/src/models/mnemonic.ts +42 -0
- package/src/models/role.ts +38 -0
- package/src/models/used-direct-login-token.ts +49 -0
- package/src/models/user-role.ts +40 -0
- package/src/models/user.ts +42 -0
- package/src/pipeline/{index.d.ts → index.ts} +0 -1
- package/src/pipeline/pipeline-builder.ts +27 -0
- package/src/plugins/{index.d.ts → index.ts} +0 -1
- package/src/plugins/plugin-interface.ts +19 -0
- package/src/plugins/plugin-manager.ts +53 -0
- package/src/registry/email-service-registry.ts +76 -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 +166 -0
- package/src/routers/api.ts +233 -0
- package/src/routers/app.ts +395 -0
- package/src/routers/base.ts +34 -0
- package/src/routers/{index.d.ts → index.ts} +0 -1
- package/src/routers/router-config.ts +34 -0
- package/src/routing/index.ts +1 -0
- package/src/routing/route-builder.ts +214 -0
- package/src/schemas/email-token.ts +112 -0
- package/src/schemas/{index.d.ts → index.ts} +0 -1
- package/src/schemas/mnemonic.ts +48 -0
- package/src/schemas/role.ts +153 -0
- package/src/schemas/schema.ts +185 -0
- package/src/schemas/used-direct-login-token.ts +58 -0
- package/src/schemas/user-role.ts +93 -0
- package/src/schemas/user.ts +244 -0
- package/src/services/backup-code.ts +327 -0
- package/src/services/base.ts +46 -0
- package/src/services/checksum.ts +189 -0
- package/src/services/database-initialization.ts +1653 -0
- package/src/services/db-init-cache.ts +28 -0
- package/src/services/direct-login-token.ts +83 -0
- package/src/services/dummy-email-service.ts +43 -0
- package/src/services/fec-usage-example.ts +123 -0
- package/src/services/fec.ts +399 -0
- package/src/services/{index.d.ts → index.ts} +0 -2
- package/src/services/jwt.ts +146 -0
- package/src/services/key-wrapping.ts +528 -0
- package/src/services/mnemonic.ts +174 -0
- package/src/services/request-user.ts +127 -0
- package/src/services/role.ts +417 -0
- package/src/services/symmetric.ts +164 -0
- package/src/services/system-user.ts +87 -0
- package/src/services/user.ts +2324 -0
- package/src/services/xor.ts +39 -0
- package/src/testing.ts +9 -0
- package/src/transactions/{index.d.ts → index.ts} +0 -1
- package/src/transactions/transaction-manager.ts +63 -0
- package/src/types/app-config.ts +36 -0
- package/src/types/controller-config.ts +28 -0
- package/src/types/{environment-variables.d.ts → environment-variables.ts} +32 -5
- package/src/types/{index.d.ts → index.ts} +0 -1
- package/src/types/{mongoose-helpers.d.ts → mongoose-helpers.ts} +8 -2
- package/src/types/mongoose-override.d.ts +1 -0
- package/src/types/mongoose.d.ts +1 -0
- package/src/types.ts +189 -0
- package/src/utils.ts +1116 -0
- package/src/validation/{index.d.ts → index.ts} +0 -1
- package/src/validation/validation-builder.ts +155 -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 -12
- package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +0 -1
- package/src/__tests__/fixtures/model-mocks.mock.js +0 -102
- 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 -121
- 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 -123
- package/src/application-base.d.ts.map +0 -1
- package/src/application-base.js +0 -359
- package/src/application-base.js.map +0 -1
- package/src/application-concrete.d.ts +0 -13
- 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 -29
- 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 -67
- 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 -35
- 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 -67
- 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 -49
- package/src/controllers/user.d.ts.map +0 -1
- package/src/controllers/user.js +0 -919
- 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 -11
- 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 -68
- 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 -48
- 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 -205
- 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 +0 -8
- 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 +0 -8
- 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 +0 -8
- 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 +0 -8
- 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 -189
- package/src/environment.d.ts.map +0 -1
- package/src/environment.js +0 -641
- 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 -80
- package/src/index.js.map +0 -1
- package/src/interfaces/api-error-response.d.ts +0 -5
- 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 +0 -6
- 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 +0 -5
- 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 +0 -6
- 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 +0 -5
- 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 +0 -8
- 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 +0 -5
- 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 +0 -6
- 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 +0 -6
- 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 -17
- 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 -102
- 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 -22
- package/src/interfaces/csp-definition.js.map +0 -1
- package/src/interfaces/db-init-result.d.ts +0 -5
- 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 +0 -7
- 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 -180
- 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 +0 -6
- 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 +0 -6
- 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 +0 -6
- 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 +0 -11
- 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 +0 -11
- 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 +0 -11
- 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 +0 -11
- 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 -35
- 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/symmetric-encryption-results.d.ts +0 -5
- package/src/interfaces/test-environment.d.ts +0 -12
- 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 +0 -5
- 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/middleware-utils.d.ts +0 -8
- package/src/middleware-utils.d.ts.map +0 -1
- package/src/middleware-utils.js +0 -94
- package/src/middleware-utils.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/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 +0 -8
- 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 +0 -8
- 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 +0 -8
- 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 +0 -8
- 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 +0 -7
- 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 +0 -8
- 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 -9
- 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 -13
- 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 -33
- 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 -9
- 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 +0 -49
- 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 +0 -27
- 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 +0 -42
- package/src/schemas/role.d.ts.map +0 -1
- package/src/schemas/role.js +0 -89
- 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 +0 -37
- 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 +0 -39
- 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 +0 -24
- package/src/schemas/user.d.ts.map +0 -1
- package/src/schemas/user.js +0 -195
- 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 -11
- 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 -878
- 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 -7
- 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 -11
- 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 -307
- package/src/services/key-wrapping.js.map +0 -1
- package/src/services/mnemonic.d.ts +0 -62
- 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 -68
- package/src/services/request-user.js.map +0 -1
- package/src/services/role.d.ts +0 -87
- package/src/services/role.d.ts.map +0 -1
- package/src/services/role.js +0 -279
- 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 -16
- 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 -345
- package/src/services/user.d.ts.map +0 -1
- package/src/services/user.js +0 -1447
- 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 +0 -14
- 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/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 +0 -104
- 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 -211
- package/src/utils.d.ts.map +0 -1
- package/src/utils.js +0 -818
- 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,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview JWT token service for authentication and authorization.
|
|
3
|
+
* Handles JWT token generation, signing, and verification with role-based access control.
|
|
4
|
+
* @module services/jwt
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
ITokenRole,
|
|
9
|
+
ITokenRoleDTO,
|
|
10
|
+
ITokenUser,
|
|
11
|
+
} from '@digitaldefiance/suite-core-lib';
|
|
12
|
+
import {
|
|
13
|
+
JsonWebTokenError,
|
|
14
|
+
JwtPayload,
|
|
15
|
+
TokenExpiredError as JwtTokenExpiredError,
|
|
16
|
+
sign,
|
|
17
|
+
verify,
|
|
18
|
+
VerifyOptions,
|
|
19
|
+
} from 'jsonwebtoken';
|
|
20
|
+
import { promisify } from 'util';
|
|
21
|
+
import { IUserDocument } from '../documents/user';
|
|
22
|
+
import { InvalidJwtTokenError } from '../errors/invalid-jwt-token';
|
|
23
|
+
import { TokenExpiredError } from '../errors/token-expired';
|
|
24
|
+
import { IApplication } from '../interfaces/application';
|
|
25
|
+
import { IJwtSignResponse } from '../interfaces/jwt-sign-response';
|
|
26
|
+
import { BaseService } from './base';
|
|
27
|
+
import { RoleService } from './role';
|
|
28
|
+
import type { PlatformID } from '@digitaldefiance/node-ecies-lib';
|
|
29
|
+
|
|
30
|
+
const verifyAsync = promisify<
|
|
31
|
+
string,
|
|
32
|
+
string | Buffer,
|
|
33
|
+
VerifyOptions,
|
|
34
|
+
JwtPayload | string
|
|
35
|
+
>(verify);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Service for JWT token operations including generation, signing, and verification.
|
|
39
|
+
* Integrates with role service to embed user roles in JWT tokens.
|
|
40
|
+
* @template TID - Platform ID type (defaults to Buffer)
|
|
41
|
+
* @template TDate - Date type (defaults to Date)
|
|
42
|
+
* @template TTokenRole - Token role interface type
|
|
43
|
+
* @template TTokenUser - Token user interface type
|
|
44
|
+
* @template TApplication - Application interface type
|
|
45
|
+
* @extends {BaseService<TID, TApplication>}
|
|
46
|
+
*/
|
|
47
|
+
export class JwtService<
|
|
48
|
+
TID extends PlatformID = Buffer,
|
|
49
|
+
TDate extends Date = Date,
|
|
50
|
+
TTokenRole extends ITokenRole<TID, TDate> = ITokenRole<TID, TDate>,
|
|
51
|
+
TTokenUser extends ITokenUser = ITokenUser,
|
|
52
|
+
TApplication extends IApplication<TID> = IApplication<TID>,
|
|
53
|
+
> extends BaseService<TID, TApplication> {
|
|
54
|
+
private readonly roleService: RoleService<TID, TDate, TTokenRole>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Constructor for the JWT service
|
|
58
|
+
* @param application The application object
|
|
59
|
+
*/
|
|
60
|
+
constructor(application: TApplication) {
|
|
61
|
+
super(application);
|
|
62
|
+
this.roleService = new RoleService<TID, TDate, TTokenRole>(application);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Sign a JWT token for a user
|
|
67
|
+
* @param userDoc The user document to sign the token for
|
|
68
|
+
* @param jwtSecret The secret to sign the token with
|
|
69
|
+
* @param overrideLanguage Optional language to use for role translations
|
|
70
|
+
* @returns The signed token
|
|
71
|
+
*/
|
|
72
|
+
public async signToken(
|
|
73
|
+
userDoc: IUserDocument<string, TID>,
|
|
74
|
+
jwtSecret: string,
|
|
75
|
+
overrideLanguage?: string,
|
|
76
|
+
): Promise<IJwtSignResponse<TID, TDate, TTokenRole>> {
|
|
77
|
+
// look for roles the user is a member of (the role contains the user id in the user's roles array)
|
|
78
|
+
const roles = await this.roleService.getUserRoles(userDoc._id);
|
|
79
|
+
const tokenRoles: Array<TTokenRole> = this.roleService.rolesToTokenRoles(
|
|
80
|
+
roles,
|
|
81
|
+
overrideLanguage,
|
|
82
|
+
);
|
|
83
|
+
const tokenRoleDTOs = tokenRoles.map((role) =>
|
|
84
|
+
RoleService.roleToRoleDTO<TID, TDate>(role),
|
|
85
|
+
);
|
|
86
|
+
const roleTranslatedNames = tokenRoles.map((role) => role.translatedName);
|
|
87
|
+
const roleNames = tokenRoles.map((role) => role.name);
|
|
88
|
+
const tokenUser = {
|
|
89
|
+
userId: userDoc._id.toString(),
|
|
90
|
+
roles: tokenRoleDTOs,
|
|
91
|
+
} as TTokenUser;
|
|
92
|
+
// amazonq-ignore-next-line false positive
|
|
93
|
+
const token = sign(tokenUser, jwtSecret, {
|
|
94
|
+
algorithm: this.application.constants.JWT.ALGORITHM,
|
|
95
|
+
allowInsecureKeySizes: false,
|
|
96
|
+
expiresIn: this.application.constants.JWT.EXPIRATION_SEC,
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
token,
|
|
100
|
+
tokenUser,
|
|
101
|
+
roleNames,
|
|
102
|
+
roleTranslatedNames,
|
|
103
|
+
roles: tokenRoles,
|
|
104
|
+
roleDTOs: tokenRoleDTOs,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Verify a JWT token and return the user data
|
|
110
|
+
* @param token The token to verify
|
|
111
|
+
* @returns The user data
|
|
112
|
+
* @throws InvalidTokenError
|
|
113
|
+
*/
|
|
114
|
+
public async verifyToken(token: string): Promise<TTokenUser | null> {
|
|
115
|
+
try {
|
|
116
|
+
const decoded = (await verifyAsync(
|
|
117
|
+
token,
|
|
118
|
+
this.application.environment.jwtSecret,
|
|
119
|
+
{
|
|
120
|
+
algorithms: [this.application.constants.JWT.ALGORITHM],
|
|
121
|
+
},
|
|
122
|
+
)) as JwtPayload;
|
|
123
|
+
|
|
124
|
+
if (
|
|
125
|
+
typeof decoded === 'object' &&
|
|
126
|
+
decoded !== null &&
|
|
127
|
+
'userId' in decoded &&
|
|
128
|
+
'roles' in decoded
|
|
129
|
+
) {
|
|
130
|
+
return {
|
|
131
|
+
userId: decoded['userId'] as string,
|
|
132
|
+
roles: decoded['roles'] as ITokenRoleDTO[],
|
|
133
|
+
} as TTokenUser;
|
|
134
|
+
} else {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
} catch (err) {
|
|
138
|
+
if (err instanceof JwtTokenExpiredError) {
|
|
139
|
+
throw new TokenExpiredError();
|
|
140
|
+
} else if (err instanceof JsonWebTokenError) {
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
throw new InvalidJwtTokenError();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Service for password-based key wrapping and unwrapping using AES-256-GCM.
|
|
3
|
+
* Provides secure master key management, password changes, and generic secret wrapping.
|
|
4
|
+
* @module services/key-wrapping
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { SecureBuffer, SecureString } from '@digitaldefiance/ecies-lib';
|
|
8
|
+
import {
|
|
9
|
+
Constants,
|
|
10
|
+
IConstants,
|
|
11
|
+
Pbkdf2Service,
|
|
12
|
+
} from '@digitaldefiance/node-ecies-lib';
|
|
13
|
+
import {
|
|
14
|
+
createCipheriv,
|
|
15
|
+
createDecipheriv,
|
|
16
|
+
createHash,
|
|
17
|
+
randomBytes,
|
|
18
|
+
} from 'crypto';
|
|
19
|
+
import { InvalidNewPasswordError, InvalidPasswordError } from '../errors';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Creates a PBKDF2 service instance from constants.
|
|
23
|
+
* @param constants Configuration constants
|
|
24
|
+
* @returns Configured PBKDF2 service
|
|
25
|
+
*/
|
|
26
|
+
function createPbkdf2Service(constants: IConstants): Pbkdf2Service {
|
|
27
|
+
return Pbkdf2Service.fromConstants(constants);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Represents a password-wrapped master key with all encryption metadata.
|
|
32
|
+
*/
|
|
33
|
+
export interface WrappedKey {
|
|
34
|
+
/** Hex-encoded salt for PBKDF2 key derivation */
|
|
35
|
+
salt: string;
|
|
36
|
+
/** Hex-encoded initialization vector for AES-GCM */
|
|
37
|
+
iv: string;
|
|
38
|
+
/** Hex-encoded authentication tag for AES-GCM */
|
|
39
|
+
authTag: string;
|
|
40
|
+
/** Hex-encoded encrypted master key */
|
|
41
|
+
encryptedMasterKey: string;
|
|
42
|
+
/** Number of PBKDF2 iterations used */
|
|
43
|
+
iterations: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Generic password-wrapped secret payload with encryption metadata.
|
|
48
|
+
*/
|
|
49
|
+
export interface PasswordWrappedSecret {
|
|
50
|
+
/** Hex-encoded salt for PBKDF2 key derivation */
|
|
51
|
+
salt: string;
|
|
52
|
+
/** Hex-encoded initialization vector for AES-GCM */
|
|
53
|
+
iv: string;
|
|
54
|
+
/** Hex-encoded authentication tag for AES-GCM */
|
|
55
|
+
authTag: string;
|
|
56
|
+
/** Hex-encoded encrypted secret data */
|
|
57
|
+
ciphertext: string;
|
|
58
|
+
/** Number of PBKDF2 iterations used */
|
|
59
|
+
iterations: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Service for password-based key wrapping and unwrapping operations.
|
|
64
|
+
* Provides secure master key management with AES-256-GCM encryption and PBKDF2 key derivation.
|
|
65
|
+
* Supports both synchronous and asynchronous operations with deduplication for concurrent requests.
|
|
66
|
+
*/
|
|
67
|
+
export class KeyWrappingService {
|
|
68
|
+
/**
|
|
69
|
+
* In-flight de-duplication map to share PBKDF2 work across concurrent identical requests.
|
|
70
|
+
* Stores promises of base64-encoded master key bytes for sharing across callers.
|
|
71
|
+
* @private
|
|
72
|
+
*/
|
|
73
|
+
private static inFlightUnwraps: Map<string, Promise<string>> = new Map();
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Generates a new random master key and wraps it with the user's password.
|
|
77
|
+
* @param password User's password for wrapping
|
|
78
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
79
|
+
* @returns Object containing the master key and wrapped key metadata
|
|
80
|
+
* @throws {InvalidNewPasswordError} If password doesn't meet requirements
|
|
81
|
+
*/
|
|
82
|
+
public wrapNewMasterKey(
|
|
83
|
+
password: SecureString,
|
|
84
|
+
constants: IConstants = Constants,
|
|
85
|
+
): {
|
|
86
|
+
masterKey: SecureBuffer;
|
|
87
|
+
wrappedKey: WrappedKey;
|
|
88
|
+
} {
|
|
89
|
+
const masterKey = new SecureBuffer(
|
|
90
|
+
randomBytes(constants.WRAPPED_KEY.MASTER_KEY_SIZE),
|
|
91
|
+
);
|
|
92
|
+
const wrappedKey = this.wrapMasterKey(masterKey, password, constants);
|
|
93
|
+
return { masterKey, wrappedKey };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Wraps an existing master key with a password-derived key using AES-256-GCM.
|
|
98
|
+
* @param masterKey Master key to wrap
|
|
99
|
+
* @param password User's password for wrapping
|
|
100
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
101
|
+
* @returns Wrapped key metadata including salt, IV, auth tag, and encrypted key
|
|
102
|
+
* @throws {InvalidNewPasswordError} If password doesn't meet requirements
|
|
103
|
+
*/
|
|
104
|
+
public wrapMasterKey(
|
|
105
|
+
masterKey: SecureBuffer,
|
|
106
|
+
password: SecureString,
|
|
107
|
+
constants: IConstants = Constants,
|
|
108
|
+
): WrappedKey {
|
|
109
|
+
if (constants.PasswordRegex.test(password.value ?? '') === false) {
|
|
110
|
+
throw new InvalidNewPasswordError();
|
|
111
|
+
}
|
|
112
|
+
const salt = randomBytes(constants.WRAPPED_KEY.SALT_SIZE);
|
|
113
|
+
const iterations = constants.WRAPPED_KEY.MIN_ITERATIONS;
|
|
114
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
115
|
+
|
|
116
|
+
// Derive key from password using centralized PBKDF2 service
|
|
117
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
118
|
+
Buffer.from(password.valueAsUint8Array),
|
|
119
|
+
salt,
|
|
120
|
+
iterations,
|
|
121
|
+
constants.WRAPPED_KEY.SALT_SIZE,
|
|
122
|
+
32, // AES-256 key size
|
|
123
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
124
|
+
);
|
|
125
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
126
|
+
|
|
127
|
+
// Encrypt master key
|
|
128
|
+
const iv = randomBytes(constants.WRAPPED_KEY.IV_SIZE);
|
|
129
|
+
const cipher = createCipheriv('aes-256-gcm', passwordKeySecure.value, iv);
|
|
130
|
+
|
|
131
|
+
const encrypted = Buffer.concat([
|
|
132
|
+
cipher.update(masterKey.value),
|
|
133
|
+
cipher.final(),
|
|
134
|
+
]);
|
|
135
|
+
|
|
136
|
+
const authTag = cipher.getAuthTag();
|
|
137
|
+
|
|
138
|
+
passwordKeySecure.dispose();
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
salt: salt.toString('hex'),
|
|
142
|
+
iv: iv.toString('hex'),
|
|
143
|
+
authTag: authTag.toString('hex'),
|
|
144
|
+
encryptedMasterKey: encrypted.toString('hex'),
|
|
145
|
+
iterations,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Unwraps a master key using the user's password (synchronous).
|
|
151
|
+
* @param wrappedKey Wrapped key metadata
|
|
152
|
+
* @param password User's password for unwrapping
|
|
153
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
154
|
+
* @returns Unwrapped master key in a SecureBuffer
|
|
155
|
+
* @throws {InvalidPasswordError} If password is incorrect or decryption fails
|
|
156
|
+
*/
|
|
157
|
+
public unwrapMasterKey(
|
|
158
|
+
wrappedKey: WrappedKey,
|
|
159
|
+
password: SecureString,
|
|
160
|
+
constants: IConstants = Constants,
|
|
161
|
+
): SecureBuffer {
|
|
162
|
+
const salt = Buffer.from(wrappedKey.salt, 'hex');
|
|
163
|
+
const iv = Buffer.from(wrappedKey.iv, 'hex');
|
|
164
|
+
const authTag = Buffer.from(wrappedKey.authTag, 'hex');
|
|
165
|
+
const encrypted = Buffer.from(wrappedKey.encryptedMasterKey, 'hex');
|
|
166
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
167
|
+
|
|
168
|
+
// Derive the same key from password using centralized PBKDF2 service
|
|
169
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
170
|
+
Buffer.from(password.valueAsUint8Array),
|
|
171
|
+
salt,
|
|
172
|
+
wrappedKey.iterations,
|
|
173
|
+
salt.length, // Use actual salt size
|
|
174
|
+
32, // AES-256 key size
|
|
175
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
176
|
+
);
|
|
177
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
const decipher = createDecipheriv(
|
|
181
|
+
'aes-256-gcm',
|
|
182
|
+
passwordKeySecure.value,
|
|
183
|
+
iv,
|
|
184
|
+
);
|
|
185
|
+
decipher.setAuthTag(authTag);
|
|
186
|
+
|
|
187
|
+
const decrypted = Buffer.concat([
|
|
188
|
+
decipher.update(encrypted),
|
|
189
|
+
decipher.final(),
|
|
190
|
+
]);
|
|
191
|
+
|
|
192
|
+
return new SecureBuffer(decrypted);
|
|
193
|
+
} catch {
|
|
194
|
+
throw new InvalidPasswordError();
|
|
195
|
+
} finally {
|
|
196
|
+
passwordKeySecure.dispose();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Async version of unwrapMasterKey that uses libuv threadpool via crypto.pbkdf2
|
|
202
|
+
* to avoid blocking the event loop during password verification.
|
|
203
|
+
* @param wrappedKey Wrapped key metadata
|
|
204
|
+
* @param password User's password (SecureString or raw string)
|
|
205
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
206
|
+
* @returns Promise resolving to unwrapped master key in a SecureBuffer
|
|
207
|
+
* @throws {InvalidPasswordError} If password is incorrect or decryption fails
|
|
208
|
+
*/
|
|
209
|
+
public async unwrapMasterKeyAsync(
|
|
210
|
+
wrappedKey: WrappedKey,
|
|
211
|
+
password: SecureString | string,
|
|
212
|
+
constants: IConstants = Constants,
|
|
213
|
+
): Promise<SecureBuffer> {
|
|
214
|
+
const __perfEnabled = process.env['PERF_LOGS'] === '1';
|
|
215
|
+
const _t0 = __perfEnabled ? Date.now() : 0;
|
|
216
|
+
const salt = Buffer.from(wrappedKey.salt, 'hex');
|
|
217
|
+
const iv = Buffer.from(wrappedKey.iv, 'hex');
|
|
218
|
+
const authTag = Buffer.from(wrappedKey.authTag, 'hex');
|
|
219
|
+
const encrypted = Buffer.from(wrappedKey.encryptedMasterKey, 'hex');
|
|
220
|
+
|
|
221
|
+
// Accept either a SecureString (preferred) or a raw password string to avoid
|
|
222
|
+
// expensive SecureString construction in the hot login path.
|
|
223
|
+
const pwdBuffer =
|
|
224
|
+
// amazonq-ignore-next-line false positive
|
|
225
|
+
typeof password === 'string'
|
|
226
|
+
? Buffer.from(password, 'utf8')
|
|
227
|
+
: Buffer.from(password.valueAsUint8Array);
|
|
228
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
229
|
+
|
|
230
|
+
// Use centralized PBKDF2 service for async key derivation
|
|
231
|
+
const derivedKey = await pbkdf2Service.deriveKeyFromPasswordAsync(
|
|
232
|
+
pwdBuffer,
|
|
233
|
+
salt,
|
|
234
|
+
wrappedKey.iterations,
|
|
235
|
+
salt.length, // Use actual salt size
|
|
236
|
+
32, // AES-256 key size
|
|
237
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
238
|
+
);
|
|
239
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
240
|
+
|
|
241
|
+
try {
|
|
242
|
+
const decipher = createDecipheriv(
|
|
243
|
+
'aes-256-gcm',
|
|
244
|
+
passwordKeySecure.value,
|
|
245
|
+
iv,
|
|
246
|
+
);
|
|
247
|
+
decipher.setAuthTag(authTag);
|
|
248
|
+
|
|
249
|
+
const decrypted = Buffer.concat([
|
|
250
|
+
decipher.update(encrypted),
|
|
251
|
+
decipher.final(),
|
|
252
|
+
]);
|
|
253
|
+
if (__perfEnabled)
|
|
254
|
+
console.warn(
|
|
255
|
+
'[perf] unwrapMasterKeyAsync pbkdf2',
|
|
256
|
+
'iters=' + String(wrappedKey.iterations).replace(/[\r\n]/g, ''),
|
|
257
|
+
'dt=' + (Date.now() - _t0) + 'ms',
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
return new SecureBuffer(decrypted);
|
|
261
|
+
} catch {
|
|
262
|
+
throw new InvalidPasswordError();
|
|
263
|
+
} finally {
|
|
264
|
+
// Best-effort zero the temporary password buffer
|
|
265
|
+
try {
|
|
266
|
+
pwdBuffer.fill(0);
|
|
267
|
+
} catch {
|
|
268
|
+
// ignore
|
|
269
|
+
}
|
|
270
|
+
passwordKeySecure.dispose();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Deduplicated async unwrap that coalesces concurrent identical PBKDF2 operations.
|
|
276
|
+
* Keyed by salt + iterations + password hash to avoid redundant computation.
|
|
277
|
+
* @param wrappedKey Wrapped key metadata
|
|
278
|
+
* @param password User's password as string
|
|
279
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
280
|
+
* @returns Promise resolving to unwrapped master key in a SecureBuffer
|
|
281
|
+
* @throws {InvalidPasswordError} If password is incorrect or decryption fails
|
|
282
|
+
*/
|
|
283
|
+
public async unwrapMasterKeyAsyncDedup(
|
|
284
|
+
wrappedKey: WrappedKey,
|
|
285
|
+
password: string,
|
|
286
|
+
constants: IConstants = Constants,
|
|
287
|
+
): Promise<SecureBuffer> {
|
|
288
|
+
// Derive a short cache key; avoid storing raw password by hashing
|
|
289
|
+
const pwdKey = createHash('sha256')
|
|
290
|
+
.update(password, 'utf8')
|
|
291
|
+
.digest('hex')
|
|
292
|
+
.slice(0, 24);
|
|
293
|
+
const cacheKey = `${wrappedKey.salt}:${wrappedKey.iterations}:${pwdKey}`;
|
|
294
|
+
let p = KeyWrappingService.inFlightUnwraps.get(cacheKey);
|
|
295
|
+
if (!p) {
|
|
296
|
+
// Compute once, extract raw bytes, dispose the shared SecureBuffer, and cache the bytes
|
|
297
|
+
p = (async () => {
|
|
298
|
+
const mk = await this.unwrapMasterKeyAsync(
|
|
299
|
+
wrappedKey,
|
|
300
|
+
password,
|
|
301
|
+
constants,
|
|
302
|
+
);
|
|
303
|
+
try {
|
|
304
|
+
const copy = Buffer.from(mk.value);
|
|
305
|
+
const b64 = copy.toString('base64');
|
|
306
|
+
// zeroize copy
|
|
307
|
+
copy.fill(0);
|
|
308
|
+
return b64;
|
|
309
|
+
} finally {
|
|
310
|
+
mk.dispose();
|
|
311
|
+
}
|
|
312
|
+
})().finally(() => {
|
|
313
|
+
// Best-effort cleanup
|
|
314
|
+
KeyWrappingService.inFlightUnwraps.delete(cacheKey);
|
|
315
|
+
}) as Promise<string>;
|
|
316
|
+
KeyWrappingService.inFlightUnwraps.set(cacheKey, p);
|
|
317
|
+
}
|
|
318
|
+
const b64 = await p;
|
|
319
|
+
// Return a fresh SecureBuffer per caller to avoid cross-disposal races
|
|
320
|
+
const buf = Buffer.from(b64, 'base64');
|
|
321
|
+
const secure = new SecureBuffer(Buffer.from(buf));
|
|
322
|
+
buf.fill(0);
|
|
323
|
+
return secure;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Changes password by re-wrapping the master key with a new password.
|
|
328
|
+
* @param wrappedKey Current wrapped key metadata
|
|
329
|
+
* @param oldPassword Current password
|
|
330
|
+
* @param newPassword New password
|
|
331
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
332
|
+
* @returns New wrapped key metadata
|
|
333
|
+
* @throws {InvalidPasswordError} If old password is incorrect
|
|
334
|
+
* @throws {InvalidNewPasswordError} If new password doesn't meet requirements
|
|
335
|
+
*/
|
|
336
|
+
public changePassword(
|
|
337
|
+
wrappedKey: WrappedKey,
|
|
338
|
+
oldPassword: SecureString,
|
|
339
|
+
newPassword: SecureString,
|
|
340
|
+
constants: IConstants = Constants,
|
|
341
|
+
): WrappedKey {
|
|
342
|
+
// Unwrap with old password
|
|
343
|
+
const masterKey = this.unwrapMasterKey(wrappedKey, oldPassword, constants);
|
|
344
|
+
|
|
345
|
+
try {
|
|
346
|
+
// Re-wrap with new password
|
|
347
|
+
return this.wrapMasterKey(masterKey, newPassword, constants);
|
|
348
|
+
} finally {
|
|
349
|
+
masterKey.dispose();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Wraps arbitrary secret bytes with a password-derived key using AES-256-GCM.
|
|
355
|
+
* @param secret Secret data to wrap
|
|
356
|
+
* @param password User's password for wrapping
|
|
357
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
358
|
+
* @returns Password-wrapped secret metadata
|
|
359
|
+
* @throws {InvalidNewPasswordError} If password doesn't meet requirements
|
|
360
|
+
*/
|
|
361
|
+
public wrapSecret(
|
|
362
|
+
secret: SecureBuffer,
|
|
363
|
+
password: SecureString,
|
|
364
|
+
constants: IConstants = Constants,
|
|
365
|
+
): PasswordWrappedSecret {
|
|
366
|
+
if (constants.PasswordRegex.test(password.value ?? '') === false) {
|
|
367
|
+
throw new InvalidNewPasswordError();
|
|
368
|
+
}
|
|
369
|
+
const salt = randomBytes(constants.WRAPPED_KEY.SALT_SIZE);
|
|
370
|
+
const iterations = constants.WRAPPED_KEY.MIN_ITERATIONS;
|
|
371
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
372
|
+
|
|
373
|
+
// Derive key from password using centralized PBKDF2 service
|
|
374
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
375
|
+
Buffer.from(password.valueAsUint8Array),
|
|
376
|
+
salt,
|
|
377
|
+
iterations,
|
|
378
|
+
constants.WRAPPED_KEY.SALT_SIZE,
|
|
379
|
+
32, // AES-256 key size
|
|
380
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
381
|
+
);
|
|
382
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
383
|
+
|
|
384
|
+
try {
|
|
385
|
+
const iv = randomBytes(constants.WRAPPED_KEY.IV_SIZE);
|
|
386
|
+
const cipher = createCipheriv('aes-256-gcm', passwordKeySecure.value, iv);
|
|
387
|
+
const encrypted = Buffer.concat([
|
|
388
|
+
cipher.update(secret.value),
|
|
389
|
+
cipher.final(),
|
|
390
|
+
]);
|
|
391
|
+
const authTag = cipher.getAuthTag();
|
|
392
|
+
return {
|
|
393
|
+
salt: salt.toString('hex'),
|
|
394
|
+
iv: iv.toString('hex'),
|
|
395
|
+
authTag: authTag.toString('hex'),
|
|
396
|
+
ciphertext: encrypted.toString('hex'),
|
|
397
|
+
iterations,
|
|
398
|
+
};
|
|
399
|
+
} finally {
|
|
400
|
+
passwordKeySecure.dispose();
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Unwraps a password-wrapped secret (synchronous).
|
|
406
|
+
* @param wrapped Password-wrapped secret metadata
|
|
407
|
+
* @param password User's password for unwrapping
|
|
408
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
409
|
+
* @returns Unwrapped secret in a SecureBuffer
|
|
410
|
+
* @throws {InvalidPasswordError} If password is incorrect or decryption fails
|
|
411
|
+
*/
|
|
412
|
+
public unwrapSecret(
|
|
413
|
+
wrapped: PasswordWrappedSecret,
|
|
414
|
+
password: SecureString,
|
|
415
|
+
constants: IConstants = Constants,
|
|
416
|
+
): SecureBuffer {
|
|
417
|
+
const salt = Buffer.from(wrapped.salt, 'hex');
|
|
418
|
+
const iv = Buffer.from(wrapped.iv, 'hex');
|
|
419
|
+
const authTag = Buffer.from(wrapped.authTag, 'hex');
|
|
420
|
+
const encrypted = Buffer.from(wrapped.ciphertext, 'hex');
|
|
421
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
422
|
+
|
|
423
|
+
// Derive key from password using centralized PBKDF2 service
|
|
424
|
+
const derivedKey = pbkdf2Service.deriveKeyFromPassword(
|
|
425
|
+
Buffer.from(password.valueAsUint8Array),
|
|
426
|
+
salt,
|
|
427
|
+
wrapped.iterations,
|
|
428
|
+
salt.length, // Use actual salt size
|
|
429
|
+
32, // AES-256 key size
|
|
430
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
431
|
+
);
|
|
432
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
433
|
+
try {
|
|
434
|
+
const decipher = createDecipheriv(
|
|
435
|
+
'aes-256-gcm',
|
|
436
|
+
passwordKeySecure.value,
|
|
437
|
+
iv,
|
|
438
|
+
);
|
|
439
|
+
decipher.setAuthTag(authTag);
|
|
440
|
+
const decrypted = Buffer.concat([
|
|
441
|
+
decipher.update(encrypted),
|
|
442
|
+
decipher.final(),
|
|
443
|
+
]);
|
|
444
|
+
return new SecureBuffer(decrypted);
|
|
445
|
+
} catch {
|
|
446
|
+
throw new InvalidPasswordError();
|
|
447
|
+
} finally {
|
|
448
|
+
passwordKeySecure.dispose();
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Unwraps a password-wrapped secret using async PBKDF2 to avoid blocking.
|
|
454
|
+
* @param wrapped Password-wrapped secret metadata
|
|
455
|
+
* @param password User's password (SecureString or raw string)
|
|
456
|
+
* @param constants Configuration constants (defaults to Constants)
|
|
457
|
+
* @returns Promise resolving to unwrapped secret in a SecureBuffer
|
|
458
|
+
* @throws {InvalidPasswordError} If password is incorrect or decryption fails
|
|
459
|
+
* @throws {Error} If password is undefined, null, or invalid type
|
|
460
|
+
*/
|
|
461
|
+
public async unwrapSecretAsync(
|
|
462
|
+
wrapped: PasswordWrappedSecret,
|
|
463
|
+
password: SecureString | string,
|
|
464
|
+
constants: IConstants = Constants,
|
|
465
|
+
): Promise<SecureBuffer> {
|
|
466
|
+
const salt = Buffer.from(wrapped.salt, 'hex');
|
|
467
|
+
const iv = Buffer.from(wrapped.iv, 'hex');
|
|
468
|
+
const authTag = Buffer.from(wrapped.authTag, 'hex');
|
|
469
|
+
const encrypted = Buffer.from(wrapped.ciphertext, 'hex');
|
|
470
|
+
|
|
471
|
+
// Validate password parameter before using it
|
|
472
|
+
// amazonq-ignore-next-line false positive
|
|
473
|
+
if (typeof password === 'string') {
|
|
474
|
+
if (password === undefined || password === null) {
|
|
475
|
+
throw new Error('Password cannot be undefined or null');
|
|
476
|
+
}
|
|
477
|
+
} else if (!(password instanceof SecureString)) {
|
|
478
|
+
throw new Error('Password must be provided as string or SecureString');
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
const pwdBuffer =
|
|
482
|
+
// amazonq-ignore-next-line false positive
|
|
483
|
+
typeof password === 'string'
|
|
484
|
+
? Buffer.from(password, 'utf8')
|
|
485
|
+
: await (async () => password.valueAsUint8Array)();
|
|
486
|
+
|
|
487
|
+
// Additional safety check
|
|
488
|
+
if (!pwdBuffer) {
|
|
489
|
+
throw new Error(
|
|
490
|
+
'Failed to create password buffer - password may be invalid',
|
|
491
|
+
);
|
|
492
|
+
}
|
|
493
|
+
const pbkdf2Service = createPbkdf2Service(constants);
|
|
494
|
+
|
|
495
|
+
// Use centralized PBKDF2 service for async key derivation
|
|
496
|
+
const derivedKey = await pbkdf2Service.deriveKeyFromPasswordAsync(
|
|
497
|
+
Buffer.from(pwdBuffer),
|
|
498
|
+
salt,
|
|
499
|
+
wrapped.iterations,
|
|
500
|
+
salt.length, // Use actual salt size
|
|
501
|
+
32, // AES-256 key size
|
|
502
|
+
'sha256', // Keep existing algorithm for compatibility
|
|
503
|
+
);
|
|
504
|
+
const passwordKeySecure = new SecureBuffer(derivedKey.hash);
|
|
505
|
+
try {
|
|
506
|
+
const decipher = createDecipheriv(
|
|
507
|
+
'aes-256-gcm',
|
|
508
|
+
passwordKeySecure.value,
|
|
509
|
+
iv,
|
|
510
|
+
);
|
|
511
|
+
decipher.setAuthTag(authTag);
|
|
512
|
+
const decrypted = Buffer.concat([
|
|
513
|
+
decipher.update(encrypted),
|
|
514
|
+
decipher.final(),
|
|
515
|
+
]);
|
|
516
|
+
return new SecureBuffer(decrypted);
|
|
517
|
+
} catch {
|
|
518
|
+
throw new InvalidPasswordError();
|
|
519
|
+
} finally {
|
|
520
|
+
try {
|
|
521
|
+
pwdBuffer.fill(0);
|
|
522
|
+
} catch {
|
|
523
|
+
// ignore
|
|
524
|
+
}
|
|
525
|
+
passwordKeySecure.dispose();
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|