@webda/core 4.0.0-beta.2 → 4.0.0-beta.3
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/README.md +252 -0
- package/lib/application/application.d.ts +437 -0
- package/lib/application/application.d.ts.map +1 -0
- package/lib/application/application.js +792 -0
- package/lib/application/application.js.map +1 -0
- package/lib/application/hooks.d.ts +34 -0
- package/lib/application/hooks.d.ts.map +1 -0
- package/lib/application/hooks.js +57 -0
- package/lib/application/hooks.js.map +1 -0
- package/lib/application/iapplication.d.ts +43 -0
- package/lib/application/iapplication.d.ts.map +1 -0
- package/lib/application/iapplication.js +2 -0
- package/lib/application/iapplication.js.map +1 -0
- package/lib/application/iconfiguration.d.ts +176 -0
- package/lib/application/iconfiguration.d.ts.map +1 -0
- package/lib/application/iconfiguration.js +8 -0
- package/lib/application/iconfiguration.js.map +1 -0
- package/lib/application/runner.d.ts +8 -0
- package/lib/application/runner.d.ts.map +1 -0
- package/lib/application/runner.js +26 -0
- package/lib/application/runner.js.map +1 -0
- package/lib/{unpackedapplication.d.ts → application/unpackedapplication.d.ts} +43 -23
- package/lib/application/unpackedapplication.d.ts.map +1 -0
- package/lib/application/unpackedapplication.js +492 -0
- package/lib/application/unpackedapplication.js.map +1 -0
- package/lib/bin/cli-phase.d.ts +28 -0
- package/lib/bin/cli-phase.d.ts.map +1 -0
- package/lib/bin/cli-phase.js +44 -0
- package/lib/bin/cli-phase.js.map +1 -0
- package/lib/bin/cli.d.ts +161 -0
- package/lib/bin/cli.d.ts.map +1 -0
- package/lib/bin/cli.js +828 -0
- package/lib/bin/cli.js.map +1 -0
- package/lib/bin/launcher.d.ts +3 -0
- package/lib/bin/launcher.d.ts.map +1 -0
- package/lib/bin/launcher.js +50 -0
- package/lib/bin/launcher.js.map +1 -0
- package/lib/cache/cache.d.ts +33 -0
- package/lib/cache/cache.d.ts.map +1 -0
- package/lib/cache/cache.js +8 -0
- package/lib/cache/cache.js.map +1 -0
- package/lib/{services/configuration.d.ts → configurations/configuration.service.d.ts} +58 -58
- package/lib/configurations/configuration.service.d.ts.map +1 -0
- package/lib/configurations/configuration.service.js +248 -0
- package/lib/configurations/configuration.service.js.map +1 -0
- package/lib/configurations/fileconfiguration.service.d.ts +30 -0
- package/lib/configurations/fileconfiguration.service.d.ts.map +1 -0
- package/lib/configurations/fileconfiguration.service.js +65 -0
- package/lib/configurations/fileconfiguration.service.js.map +1 -0
- package/lib/configurations/kubernetesconfiguration.service.d.ts +43 -0
- package/lib/configurations/kubernetesconfiguration.service.d.ts.map +1 -0
- package/lib/configurations/kubernetesconfiguration.service.js +83 -0
- package/lib/configurations/kubernetesconfiguration.service.js.map +1 -0
- package/lib/contexts/execution.d.ts +33 -0
- package/lib/contexts/execution.d.ts.map +1 -0
- package/lib/contexts/execution.js +73 -0
- package/lib/contexts/execution.js.map +1 -0
- package/lib/contexts/globalcontext.d.ts +29 -0
- package/lib/contexts/globalcontext.d.ts.map +1 -0
- package/lib/contexts/globalcontext.js +38 -0
- package/lib/contexts/globalcontext.js.map +1 -0
- package/lib/{utils → contexts}/httpcontext.d.ts +44 -19
- package/lib/contexts/httpcontext.d.ts.map +1 -0
- package/lib/{utils → contexts}/httpcontext.js +95 -27
- package/lib/contexts/httpcontext.js.map +1 -0
- package/lib/contexts/icontext.d.ts +236 -0
- package/lib/contexts/icontext.d.ts.map +1 -0
- package/lib/contexts/icontext.js +230 -0
- package/lib/contexts/icontext.js.map +1 -0
- package/lib/contexts/operationcontext.d.ts +179 -0
- package/lib/contexts/operationcontext.d.ts.map +1 -0
- package/lib/contexts/operationcontext.js +358 -0
- package/lib/contexts/operationcontext.js.map +1 -0
- package/lib/contexts/simplecontext.d.ts +31 -0
- package/lib/contexts/simplecontext.d.ts.map +1 -0
- package/lib/contexts/simplecontext.js +45 -0
- package/lib/contexts/simplecontext.js.map +1 -0
- package/lib/contexts/webcontext.d.ts +218 -0
- package/lib/contexts/webcontext.d.ts.map +1 -0
- package/lib/contexts/webcontext.js +389 -0
- package/lib/contexts/webcontext.js.map +1 -0
- package/lib/core/authorizer.d.ts +23 -0
- package/lib/core/authorizer.d.ts.map +1 -0
- package/lib/core/authorizer.js +17 -0
- package/lib/core/authorizer.js.map +1 -0
- package/lib/core/core.d.ts +225 -0
- package/lib/core/core.d.ts.map +1 -0
- package/lib/core/core.js +576 -0
- package/lib/core/core.js.map +1 -0
- package/lib/core/hooks.d.ts +72 -0
- package/lib/core/hooks.d.ts.map +1 -0
- package/lib/core/hooks.js +73 -0
- package/lib/core/hooks.js.map +1 -0
- package/lib/core/icore.d.ts +249 -0
- package/lib/core/icore.d.ts.map +1 -0
- package/lib/core/icore.js +15 -0
- package/lib/core/icore.js.map +1 -0
- package/lib/core/instancestorage.d.ts +61 -0
- package/lib/core/instancestorage.d.ts.map +1 -0
- package/lib/core/instancestorage.js +75 -0
- package/lib/core/instancestorage.js.map +1 -0
- package/lib/core/operations.d.ts +181 -0
- package/lib/core/operations.d.ts.map +1 -0
- package/lib/core/operations.js +559 -0
- package/lib/core/operations.js.map +1 -0
- package/lib/errors/errors.d.ts +126 -0
- package/lib/errors/errors.d.ts.map +1 -0
- package/lib/errors/errors.js +165 -0
- package/lib/errors/errors.js.map +1 -0
- package/lib/events/asynceventemitter.d.ts +159 -0
- package/lib/events/asynceventemitter.d.ts.map +1 -0
- package/lib/events/asynceventemitter.js +152 -0
- package/lib/events/asynceventemitter.js.map +1 -0
- package/lib/events/events.d.ts +112 -0
- package/lib/events/events.d.ts.map +1 -0
- package/lib/events/events.js +45 -0
- package/lib/events/events.js.map +1 -0
- package/lib/index.d.ts +82 -53
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +81 -62
- package/lib/index.js.map +1 -1
- package/lib/loggers/console.service.d.ts +24 -0
- package/lib/loggers/console.service.d.ts.map +1 -0
- package/lib/loggers/console.service.js +30 -0
- package/lib/loggers/console.service.js.map +1 -0
- package/lib/loggers/file.service.d.ts +25 -0
- package/lib/loggers/file.service.d.ts.map +1 -0
- package/lib/loggers/file.service.js +33 -0
- package/lib/loggers/file.service.js.map +1 -0
- package/lib/loggers/hooks.d.ts +20 -0
- package/lib/loggers/hooks.d.ts.map +1 -0
- package/lib/loggers/hooks.js +40 -0
- package/lib/loggers/hooks.js.map +1 -0
- package/lib/loggers/ilogger.d.ts +76 -0
- package/lib/loggers/ilogger.d.ts.map +1 -0
- package/lib/loggers/ilogger.js +108 -0
- package/lib/loggers/ilogger.js.map +1 -0
- package/lib/loggers/logger.d.ts +13 -0
- package/lib/loggers/logger.d.ts.map +1 -0
- package/lib/loggers/logger.js +18 -0
- package/lib/loggers/logger.js.map +1 -0
- package/lib/loggers/memory.service.d.ts +18 -0
- package/lib/loggers/memory.service.d.ts.map +1 -0
- package/lib/loggers/memory.service.js +21 -0
- package/lib/loggers/memory.service.js.map +1 -0
- package/lib/loggers/params.d.ts +47 -0
- package/lib/loggers/params.d.ts.map +1 -0
- package/lib/loggers/params.js +56 -0
- package/lib/loggers/params.js.map +1 -0
- package/lib/metrics/metrics.d.ts +25 -0
- package/lib/metrics/metrics.d.ts.map +1 -0
- package/lib/metrics/metrics.js +51 -0
- package/lib/metrics/metrics.js.map +1 -0
- package/lib/models/aclmodel.d.ts +20 -76
- package/lib/models/aclmodel.d.ts.map +1 -1
- package/lib/models/aclmodel.js +27 -203
- package/lib/models/aclmodel.js.map +1 -1
- package/lib/models/coremodel.model.d.ts +5 -0
- package/lib/models/coremodel.model.d.ts.map +1 -0
- package/lib/models/coremodel.model.js +5 -0
- package/lib/models/coremodel.model.js.map +1 -0
- package/lib/models/decorator.d.ts +63 -0
- package/lib/models/decorator.d.ts.map +1 -0
- package/lib/models/decorator.js +63 -0
- package/lib/models/decorator.js.map +1 -0
- package/lib/models/deployment.d.ts +1 -1
- package/lib/models/deployment.d.ts.map +1 -1
- package/lib/models/ident.model.d.ts +89 -0
- package/lib/models/ident.model.d.ts.map +1 -0
- package/lib/models/ident.model.js +115 -0
- package/lib/models/ident.model.js.map +1 -0
- package/lib/models/ownermodel.model.d.ts +68 -0
- package/lib/models/ownermodel.model.d.ts.map +1 -0
- package/lib/models/ownermodel.model.js +112 -0
- package/lib/models/ownermodel.model.js.map +1 -0
- package/lib/models/registry.model.d.ts +76 -0
- package/lib/models/registry.model.d.ts.map +1 -0
- package/lib/models/registry.model.js +104 -0
- package/lib/models/registry.model.js.map +1 -0
- package/lib/models/rolemodel.model.d.ts +28 -0
- package/lib/models/rolemodel.model.d.ts.map +1 -0
- package/lib/models/{rolemodel.js → rolemodel.model.js} +23 -5
- package/lib/models/rolemodel.model.js.map +1 -0
- package/lib/models/simpleuser.model.d.ts +78 -0
- package/lib/models/simpleuser.model.d.ts.map +1 -0
- package/lib/models/simpleuser.model.js +123 -0
- package/lib/models/simpleuser.model.js.map +1 -0
- package/lib/models/types.d.ts +113 -0
- package/lib/models/types.d.ts.map +1 -0
- package/lib/models/types.js +2 -0
- package/lib/models/types.js.map +1 -0
- package/lib/models/user.model.d.ts +103 -0
- package/lib/models/user.model.d.ts.map +1 -0
- package/lib/models/user.model.js +125 -0
- package/lib/models/user.model.js.map +1 -0
- package/lib/queues/{memoryqueue.d.ts → memoryqueue.service.d.ts} +26 -13
- package/lib/queues/memoryqueue.service.d.ts.map +1 -0
- package/lib/queues/{memoryqueue.js → memoryqueue.service.js} +55 -31
- package/lib/queues/memoryqueue.service.js.map +1 -0
- package/lib/queues/pubsubservice.d.ts +8 -6
- package/lib/queues/pubsubservice.d.ts.map +1 -1
- package/lib/queues/pubsubservice.js +5 -4
- package/lib/queues/pubsubservice.js.map +1 -1
- package/lib/queues/queueservice.d.ts +9 -11
- package/lib/queues/queueservice.d.ts.map +1 -1
- package/lib/queues/queueservice.js +41 -13
- package/lib/queues/queueservice.js.map +1 -1
- package/lib/rest/hooks.d.ts +8 -0
- package/lib/rest/hooks.d.ts.map +1 -0
- package/lib/rest/hooks.js +10 -0
- package/lib/rest/hooks.js.map +1 -0
- package/lib/rest/irest.d.ts +212 -0
- package/lib/rest/irest.d.ts.map +1 -0
- package/lib/rest/irest.js +39 -0
- package/lib/rest/irest.js.map +1 -0
- package/lib/rest/originfilter.d.ts +38 -0
- package/lib/rest/originfilter.d.ts.map +1 -0
- package/lib/rest/originfilter.js +61 -0
- package/lib/rest/originfilter.js.map +1 -0
- package/lib/rest/restoperationstransport.service.d.ts +193 -0
- package/lib/rest/restoperationstransport.service.d.ts.map +1 -0
- package/lib/rest/restoperationstransport.service.js +780 -0
- package/lib/rest/restoperationstransport.service.js.map +1 -0
- package/lib/rest/router.service.d.ts +244 -0
- package/lib/rest/router.service.d.ts.map +1 -0
- package/lib/rest/router.service.js +843 -0
- package/lib/rest/router.service.js.map +1 -0
- package/lib/schemas/hooks.d.ts +48 -0
- package/lib/schemas/hooks.d.ts.map +1 -0
- package/lib/schemas/hooks.js +152 -0
- package/lib/schemas/hooks.js.map +1 -0
- package/lib/services/audit.model.d.ts +208 -0
- package/lib/services/audit.model.d.ts.map +1 -0
- package/lib/services/audit.model.js +431 -0
- package/lib/services/audit.model.js.map +1 -0
- package/lib/services/{authentication.d.ts → authentication.service.d.ts} +140 -59
- package/lib/services/authentication.service.d.ts.map +1 -0
- package/lib/services/authentication.service.js +932 -0
- package/lib/services/authentication.service.js.map +1 -0
- package/lib/services/binary.service.d.ts +808 -0
- package/lib/services/binary.service.d.ts.map +1 -0
- package/lib/services/binary.service.js +1365 -0
- package/lib/services/binary.service.js.map +1 -0
- package/lib/services/cloudbinary.d.ts +17 -12
- package/lib/services/cloudbinary.d.ts.map +1 -1
- package/lib/services/cloudbinary.js +23 -17
- package/lib/services/cloudbinary.js.map +1 -1
- package/lib/services/command.d.ts +118 -0
- package/lib/services/command.d.ts.map +1 -0
- package/lib/services/command.js +97 -0
- package/lib/services/command.js.map +1 -0
- package/lib/services/cron.service.d.ts +142 -0
- package/lib/services/cron.service.d.ts.map +1 -0
- package/lib/services/cron.service.js +291 -0
- package/lib/services/cron.service.js.map +1 -0
- package/lib/services/{cryptoservice.d.ts → cryptoservice.service.d.ts} +75 -141
- package/lib/services/cryptoservice.service.d.ts.map +1 -0
- package/lib/services/cryptoservice.service.js +527 -0
- package/lib/services/cryptoservice.service.js.map +1 -0
- package/lib/services/debugmailer.service.d.ts +49 -0
- package/lib/services/debugmailer.service.d.ts.map +1 -0
- package/lib/services/{debugmailer.js → debugmailer.service.js} +25 -10
- package/lib/services/debugmailer.service.js.map +1 -0
- package/lib/services/domainservice.service.d.ts +203 -0
- package/lib/services/domainservice.service.d.ts.map +1 -0
- package/lib/services/domainservice.service.js +600 -0
- package/lib/services/domainservice.service.js.map +1 -0
- package/lib/services/httpserver.service.d.ts +248 -0
- package/lib/services/httpserver.service.d.ts.map +1 -0
- package/lib/services/httpserver.service.js +673 -0
- package/lib/services/httpserver.service.js.map +1 -0
- package/lib/services/iauthentication.d.ts +9 -0
- package/lib/services/iauthentication.d.ts.map +1 -0
- package/lib/services/iauthentication.js +2 -0
- package/lib/services/iauthentication.js.map +1 -0
- package/lib/services/icryptoservice.d.ts +127 -0
- package/lib/services/icryptoservice.d.ts.map +1 -0
- package/lib/services/icryptoservice.js +68 -0
- package/lib/services/icryptoservice.js.map +1 -0
- package/lib/services/imailer.d.ts +17 -0
- package/lib/services/imailer.d.ts.map +1 -0
- package/lib/services/imailer.js +2 -0
- package/lib/services/imailer.js.map +1 -0
- package/lib/services/iservice.d.ts +104 -0
- package/lib/services/iservice.d.ts.map +1 -0
- package/lib/services/iservice.js +63 -0
- package/lib/services/iservice.js.map +1 -0
- package/lib/services/mailer.service.d.ts +220 -0
- package/lib/services/mailer.service.d.ts.map +1 -0
- package/lib/services/mailer.service.js +251 -0
- package/lib/services/mailer.service.js.map +1 -0
- package/lib/services/{notificationservice.d.ts → notificationservice.service.d.ts} +10 -11
- package/lib/services/notificationservice.service.d.ts.map +1 -0
- package/lib/services/{notificationservice.js → notificationservice.service.js} +24 -12
- package/lib/services/notificationservice.service.js.map +1 -0
- package/lib/services/oauth.d.ts +52 -28
- package/lib/services/oauth.d.ts.map +1 -1
- package/lib/services/oauth.js +365 -254
- package/lib/services/oauth.js.map +1 -1
- package/lib/services/operationstransport.d.ts +65 -0
- package/lib/services/operationstransport.d.ts.map +1 -0
- package/lib/services/operationstransport.js +103 -0
- package/lib/services/operationstransport.js.map +1 -0
- package/lib/services/{prometheus.d.ts → prometheus.service.d.ts} +13 -12
- package/lib/services/prometheus.service.d.ts.map +1 -0
- package/lib/services/prometheus.service.js +203 -0
- package/lib/services/prometheus.service.js.map +1 -0
- package/lib/services/{resource.d.ts → resource.service.d.ts} +34 -15
- package/lib/services/resource.service.d.ts.map +1 -0
- package/lib/services/resource.service.js +301 -0
- package/lib/services/resource.service.js.map +1 -0
- package/lib/services/service.d.ts +87 -188
- package/lib/services/service.d.ts.map +1 -1
- package/lib/services/service.js +407 -422
- package/lib/services/service.js.map +1 -1
- package/lib/services/servicecommands.d.ts +99 -0
- package/lib/services/servicecommands.d.ts.map +1 -0
- package/lib/services/servicecommands.js +165 -0
- package/lib/services/servicecommands.js.map +1 -0
- package/lib/services/serviceparameters.d.ts +33 -0
- package/lib/services/serviceparameters.d.ts.map +1 -0
- package/lib/services/serviceparameters.js +79 -0
- package/lib/services/serviceparameters.js.map +1 -0
- package/lib/{utils → session}/cookie.d.ts +32 -19
- package/lib/session/cookie.d.ts.map +1 -0
- package/lib/{utils → session}/cookie.js +76 -23
- package/lib/session/cookie.js.map +1 -0
- package/lib/session/manager.model.d.ts +71 -0
- package/lib/session/manager.model.d.ts.map +1 -0
- package/lib/session/manager.model.js +155 -0
- package/lib/session/manager.model.js.map +1 -0
- package/lib/session/session.d.ts +57 -0
- package/lib/session/session.d.ts.map +1 -0
- package/lib/session/session.js +126 -0
- package/lib/session/session.js.map +1 -0
- package/lib/stores/istore.d.ts +99 -0
- package/lib/stores/istore.d.ts.map +1 -0
- package/lib/stores/istore.js +26 -0
- package/lib/stores/istore.js.map +1 -0
- package/lib/stores/memory.service.d.ts +114 -0
- package/lib/stores/memory.service.d.ts.map +1 -0
- package/lib/stores/memory.service.js +343 -0
- package/lib/stores/memory.service.js.map +1 -0
- package/lib/stores/store.d.ts +126 -626
- package/lib/stores/store.d.ts.map +1 -1
- package/lib/stores/store.js +257 -1117
- package/lib/stores/store.js.map +1 -1
- package/lib/templates/templates.d.ts +39 -0
- package/lib/templates/templates.d.ts.map +1 -0
- package/lib/templates/templates.js +92 -0
- package/lib/templates/templates.js.map +1 -0
- package/lib/test/application.d.ts +174 -0
- package/lib/test/application.d.ts.map +1 -0
- package/lib/test/application.js +288 -0
- package/lib/test/application.js.map +1 -0
- package/lib/test/asyncstorage.d.ts +16 -0
- package/lib/test/asyncstorage.d.ts.map +1 -0
- package/lib/test/asyncstorage.js +32 -0
- package/lib/test/asyncstorage.js.map +1 -0
- package/lib/test/core.d.ts +63 -0
- package/lib/test/core.d.ts.map +1 -0
- package/lib/test/core.js +190 -0
- package/lib/test/core.js.map +1 -0
- package/lib/test/index.d.ts +7 -0
- package/lib/test/index.d.ts.map +1 -0
- package/lib/test/index.js +8 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/internal.d.ts +34 -0
- package/lib/test/internal.d.ts.map +1 -0
- package/lib/test/internal.js +156 -0
- package/lib/test/internal.js.map +1 -0
- package/lib/test/objects.d.ts +318 -0
- package/lib/test/objects.d.ts.map +1 -0
- package/lib/test/objects.js +443 -0
- package/lib/test/objects.js.map +1 -0
- package/lib/utils/abstractdeployer.d.ts +4 -2
- package/lib/utils/abstractdeployer.d.ts.map +1 -1
- package/lib/utils/abstractdeployer.js +3 -0
- package/lib/utils/abstractdeployer.js.map +1 -1
- package/package.json +85 -60
- package/test/cachedapp/webda.config.json +1 -5
- package/test/config-cached.json +1 -5
- package/test/config.json +0 -9
- package/test/my-cnf.json +9 -0
- package/webda.module.json +3463 -2482
- package/lib/application.d.ts +0 -888
- package/lib/application.d.ts.map +0 -1
- package/lib/application.js +0 -768
- package/lib/application.js.map +0 -1
- package/lib/application.spec.d.ts +0 -2
- package/lib/application.spec.d.ts.map +0 -1
- package/lib/application.spec.js +0 -248
- package/lib/application.spec.js.map +0 -1
- package/lib/core.d.ts +0 -743
- package/lib/core.d.ts.map +0 -1
- package/lib/core.js +0 -1334
- package/lib/core.js.map +0 -1
- package/lib/core.spec.d.ts +0 -2
- package/lib/core.spec.d.ts.map +0 -1
- package/lib/core.spec.js +0 -790
- package/lib/core.spec.js.map +0 -1
- package/lib/errors.d.ts +0 -64
- package/lib/errors.d.ts.map +0 -1
- package/lib/errors.js +0 -97
- package/lib/errors.js.map +0 -1
- package/lib/errors.spec.d.ts +0 -2
- package/lib/errors.spec.d.ts.map +0 -1
- package/lib/errors.spec.js +0 -33
- package/lib/errors.spec.js.map +0 -1
- package/lib/models/aclmodel.spec.d.ts +0 -2
- package/lib/models/aclmodel.spec.d.ts.map +0 -1
- package/lib/models/aclmodel.spec.js +0 -187
- package/lib/models/aclmodel.spec.js.map +0 -1
- package/lib/models/coremodel.d.ts +0 -896
- package/lib/models/coremodel.d.ts.map +0 -1
- package/lib/models/coremodel.js +0 -1214
- package/lib/models/coremodel.js.map +0 -1
- package/lib/models/coremodel.spec.d.ts +0 -2
- package/lib/models/coremodel.spec.d.ts.map +0 -1
- package/lib/models/coremodel.spec.js +0 -464
- package/lib/models/coremodel.spec.js.map +0 -1
- package/lib/models/ident.d.ts +0 -68
- package/lib/models/ident.d.ts.map +0 -1
- package/lib/models/ident.js +0 -26
- package/lib/models/ident.js.map +0 -1
- package/lib/models/ident.spec.d.ts +0 -2
- package/lib/models/ident.spec.d.ts.map +0 -1
- package/lib/models/ident.spec.js +0 -24
- package/lib/models/ident.spec.js.map +0 -1
- package/lib/models/ownermodel.d.ts +0 -51
- package/lib/models/ownermodel.d.ts.map +0 -1
- package/lib/models/ownermodel.js +0 -65
- package/lib/models/ownermodel.js.map +0 -1
- package/lib/models/ownermodel.spec.d.ts +0 -2
- package/lib/models/ownermodel.spec.d.ts.map +0 -1
- package/lib/models/ownermodel.spec.js +0 -215
- package/lib/models/ownermodel.spec.js.map +0 -1
- package/lib/models/relations.d.ts +0 -182
- package/lib/models/relations.d.ts.map +0 -1
- package/lib/models/relations.js +0 -157
- package/lib/models/relations.js.map +0 -1
- package/lib/models/relations.spec.d.ts +0 -14
- package/lib/models/relations.spec.d.ts.map +0 -1
- package/lib/models/relations.spec.js +0 -217
- package/lib/models/relations.spec.js.map +0 -1
- package/lib/models/rolemodel.d.ts +0 -11
- package/lib/models/rolemodel.d.ts.map +0 -1
- package/lib/models/rolemodel.js.map +0 -1
- package/lib/models/rolemodel.spec.d.ts +0 -2
- package/lib/models/rolemodel.spec.d.ts.map +0 -1
- package/lib/models/rolemodel.spec.js +0 -90
- package/lib/models/rolemodel.spec.js.map +0 -1
- package/lib/models/simpleuser.d.ts +0 -47
- package/lib/models/simpleuser.d.ts.map +0 -1
- package/lib/models/simpleuser.js +0 -84
- package/lib/models/simpleuser.js.map +0 -1
- package/lib/models/test.d.ts +0 -11
- package/lib/models/test.d.ts.map +0 -1
- package/lib/models/test.js +0 -7
- package/lib/models/test.js.map +0 -1
- package/lib/models/user.d.ts +0 -67
- package/lib/models/user.d.ts.map +0 -1
- package/lib/models/user.js +0 -86
- package/lib/models/user.js.map +0 -1
- package/lib/models/user.spec.d.ts +0 -2
- package/lib/models/user.spec.d.ts.map +0 -1
- package/lib/models/user.spec.js +0 -89
- package/lib/models/user.spec.js.map +0 -1
- package/lib/queues/filequeue.d.ts +0 -59
- package/lib/queues/filequeue.d.ts.map +0 -1
- package/lib/queues/filequeue.js +0 -131
- package/lib/queues/filequeue.js.map +0 -1
- package/lib/queues/filequeue.spec.d.ts +0 -2
- package/lib/queues/filequeue.spec.d.ts.map +0 -1
- package/lib/queues/filequeue.spec.js +0 -84
- package/lib/queues/filequeue.spec.js.map +0 -1
- package/lib/queues/memoryqueue.d.ts.map +0 -1
- package/lib/queues/memoryqueue.js.map +0 -1
- package/lib/queues/memoryqueue.spec.d.ts +0 -2
- package/lib/queues/memoryqueue.spec.d.ts.map +0 -1
- package/lib/queues/memoryqueue.spec.js +0 -203
- package/lib/queues/memoryqueue.spec.js.map +0 -1
- package/lib/queues/queue.spec.d.ts +0 -6
- package/lib/queues/queue.spec.d.ts.map +0 -1
- package/lib/queues/queue.spec.js +0 -55
- package/lib/queues/queue.spec.js.map +0 -1
- package/lib/rest/restdomainservice.d.ts +0 -63
- package/lib/rest/restdomainservice.d.ts.map +0 -1
- package/lib/rest/restdomainservice.js +0 -687
- package/lib/rest/restdomainservice.js.map +0 -1
- package/lib/rest/restdomainservice.spec.d.ts +0 -2
- package/lib/rest/restdomainservice.spec.d.ts.map +0 -1
- package/lib/rest/restdomainservice.spec.js +0 -124
- package/lib/rest/restdomainservice.spec.js.map +0 -1
- package/lib/rest/router.d.ts +0 -174
- package/lib/rest/router.d.ts.map +0 -1
- package/lib/rest/router.js +0 -429
- package/lib/rest/router.js.map +0 -1
- package/lib/rest/router.spec.d.ts +0 -2
- package/lib/rest/router.spec.d.ts.map +0 -1
- package/lib/rest/router.spec.js +0 -255
- package/lib/rest/router.spec.js.map +0 -1
- package/lib/services/asyncevents.d.ts +0 -152
- package/lib/services/asyncevents.d.ts.map +0 -1
- package/lib/services/asyncevents.js +0 -217
- package/lib/services/asyncevents.js.map +0 -1
- package/lib/services/asyncevents.spec.d.ts +0 -2
- package/lib/services/asyncevents.spec.d.ts.map +0 -1
- package/lib/services/asyncevents.spec.js +0 -118
- package/lib/services/asyncevents.spec.js.map +0 -1
- package/lib/services/authentication.d.ts.map +0 -1
- package/lib/services/authentication.js +0 -773
- package/lib/services/authentication.js.map +0 -1
- package/lib/services/authentication.spec.d.ts +0 -2
- package/lib/services/authentication.spec.d.ts.map +0 -1
- package/lib/services/authentication.spec.js +0 -458
- package/lib/services/authentication.spec.js.map +0 -1
- package/lib/services/binary.d.ts +0 -477
- package/lib/services/binary.d.ts.map +0 -1
- package/lib/services/binary.js +0 -617
- package/lib/services/binary.js.map +0 -1
- package/lib/services/binary.spec.d.ts +0 -41
- package/lib/services/binary.spec.d.ts.map +0 -1
- package/lib/services/binary.spec.js +0 -151
- package/lib/services/binary.spec.js.map +0 -1
- package/lib/services/cloudbinary.spec.d.ts +0 -6
- package/lib/services/cloudbinary.spec.d.ts.map +0 -1
- package/lib/services/cloudbinary.spec.js +0 -66
- package/lib/services/cloudbinary.spec.js.map +0 -1
- package/lib/services/configuration.d.ts.map +0 -1
- package/lib/services/configuration.js +0 -193
- package/lib/services/configuration.js.map +0 -1
- package/lib/services/configuration.spec.d.ts +0 -2
- package/lib/services/configuration.spec.d.ts.map +0 -1
- package/lib/services/configuration.spec.js +0 -130
- package/lib/services/configuration.spec.js.map +0 -1
- package/lib/services/cron.d.ts +0 -74
- package/lib/services/cron.d.ts.map +0 -1
- package/lib/services/cron.js +0 -141
- package/lib/services/cron.js.map +0 -1
- package/lib/services/cron.spec.d.ts +0 -2
- package/lib/services/cron.spec.d.ts.map +0 -1
- package/lib/services/cron.spec.js +0 -76
- package/lib/services/cron.spec.js.map +0 -1
- package/lib/services/cryptoservice.d.ts.map +0 -1
- package/lib/services/cryptoservice.js +0 -433
- package/lib/services/cryptoservice.js.map +0 -1
- package/lib/services/cryptoservice.spec.d.ts +0 -2
- package/lib/services/cryptoservice.spec.d.ts.map +0 -1
- package/lib/services/cryptoservice.spec.js +0 -177
- package/lib/services/cryptoservice.spec.js.map +0 -1
- package/lib/services/debugmailer.d.ts +0 -36
- package/lib/services/debugmailer.d.ts.map +0 -1
- package/lib/services/debugmailer.js.map +0 -1
- package/lib/services/debugmailer.spec.d.ts +0 -2
- package/lib/services/debugmailer.spec.d.ts.map +0 -1
- package/lib/services/debugmailer.spec.js +0 -32
- package/lib/services/debugmailer.spec.js.map +0 -1
- package/lib/services/domainservice.d.ts +0 -272
- package/lib/services/domainservice.d.ts.map +0 -1
- package/lib/services/domainservice.js +0 -651
- package/lib/services/domainservice.js.map +0 -1
- package/lib/services/domainservice.spec.d.ts +0 -2
- package/lib/services/domainservice.spec.d.ts.map +0 -1
- package/lib/services/domainservice.spec.js +0 -592
- package/lib/services/domainservice.spec.js.map +0 -1
- package/lib/services/filebinary.d.ts +0 -136
- package/lib/services/filebinary.d.ts.map +0 -1
- package/lib/services/filebinary.js +0 -373
- package/lib/services/filebinary.js.map +0 -1
- package/lib/services/filebinary.spec.d.ts +0 -25
- package/lib/services/filebinary.spec.d.ts.map +0 -1
- package/lib/services/filebinary.spec.js +0 -428
- package/lib/services/filebinary.spec.js.map +0 -1
- package/lib/services/fileconfiguration.d.ts +0 -23
- package/lib/services/fileconfiguration.d.ts.map +0 -1
- package/lib/services/fileconfiguration.js +0 -48
- package/lib/services/fileconfiguration.js.map +0 -1
- package/lib/services/fileconfiguration.spec.d.ts +0 -2
- package/lib/services/fileconfiguration.spec.d.ts.map +0 -1
- package/lib/services/fileconfiguration.spec.js +0 -215
- package/lib/services/fileconfiguration.spec.js.map +0 -1
- package/lib/services/invitationservice.d.ts +0 -223
- package/lib/services/invitationservice.d.ts.map +0 -1
- package/lib/services/invitationservice.js +0 -529
- package/lib/services/invitationservice.js.map +0 -1
- package/lib/services/invitationservice.spec.d.ts +0 -2
- package/lib/services/invitationservice.spec.d.ts.map +0 -1
- package/lib/services/invitationservice.spec.js +0 -567
- package/lib/services/invitationservice.spec.js.map +0 -1
- package/lib/services/kubernetesconfiguration.d.ts +0 -27
- package/lib/services/kubernetesconfiguration.d.ts.map +0 -1
- package/lib/services/kubernetesconfiguration.js +0 -52
- package/lib/services/kubernetesconfiguration.js.map +0 -1
- package/lib/services/kubernetesconfiguration.spec.d.ts +0 -2
- package/lib/services/kubernetesconfiguration.spec.d.ts.map +0 -1
- package/lib/services/kubernetesconfiguration.spec.js +0 -206
- package/lib/services/kubernetesconfiguration.spec.js.map +0 -1
- package/lib/services/mailer.d.ts +0 -166
- package/lib/services/mailer.d.ts.map +0 -1
- package/lib/services/mailer.js +0 -176
- package/lib/services/mailer.js.map +0 -1
- package/lib/services/mailer.spec.d.ts +0 -2
- package/lib/services/mailer.spec.d.ts.map +0 -1
- package/lib/services/mailer.spec.js +0 -158
- package/lib/services/mailer.spec.js.map +0 -1
- package/lib/services/notificationservice.d.ts.map +0 -1
- package/lib/services/notificationservice.js.map +0 -1
- package/lib/services/notificationservice.spec.d.ts +0 -2
- package/lib/services/notificationservice.spec.d.ts.map +0 -1
- package/lib/services/notificationservice.spec.js +0 -83
- package/lib/services/notificationservice.spec.js.map +0 -1
- package/lib/services/oauth.spec.d.ts +0 -2
- package/lib/services/oauth.spec.d.ts.map +0 -1
- package/lib/services/oauth.spec.js +0 -208
- package/lib/services/oauth.spec.js.map +0 -1
- package/lib/services/prometheus.d.ts.map +0 -1
- package/lib/services/prometheus.js +0 -160
- package/lib/services/prometheus.js.map +0 -1
- package/lib/services/prometheus.spec.d.ts +0 -2
- package/lib/services/prometheus.spec.d.ts.map +0 -1
- package/lib/services/prometheus.spec.js +0 -76
- package/lib/services/prometheus.spec.js.map +0 -1
- package/lib/services/resource.d.ts.map +0 -1
- package/lib/services/resource.js +0 -170
- package/lib/services/resource.js.map +0 -1
- package/lib/services/resource.spec.d.ts +0 -2
- package/lib/services/resource.spec.d.ts.map +0 -1
- package/lib/services/resource.spec.js +0 -140
- package/lib/services/resource.spec.js.map +0 -1
- package/lib/services/service.spec.d.ts +0 -2
- package/lib/services/service.spec.d.ts.map +0 -1
- package/lib/services/service.spec.js +0 -286
- package/lib/services/service.spec.js.map +0 -1
- package/lib/stores/aggregator.d.ts +0 -48
- package/lib/stores/aggregator.d.ts.map +0 -1
- package/lib/stores/aggregator.js +0 -80
- package/lib/stores/aggregator.js.map +0 -1
- package/lib/stores/file.d.ts +0 -108
- package/lib/stores/file.d.ts.map +0 -1
- package/lib/stores/file.js +0 -188
- package/lib/stores/file.js.map +0 -1
- package/lib/stores/file.spec.d.ts +0 -13
- package/lib/stores/file.spec.d.ts.map +0 -1
- package/lib/stores/file.spec.js +0 -138
- package/lib/stores/file.spec.js.map +0 -1
- package/lib/stores/mapper.d.ts +0 -150
- package/lib/stores/mapper.d.ts.map +0 -1
- package/lib/stores/mapper.js +0 -293
- package/lib/stores/mapper.js.map +0 -1
- package/lib/stores/mapper.spec.d.ts +0 -2
- package/lib/stores/mapper.spec.d.ts.map +0 -1
- package/lib/stores/mapper.spec.js +0 -167
- package/lib/stores/mapper.spec.js.map +0 -1
- package/lib/stores/memory.d.ts +0 -152
- package/lib/stores/memory.d.ts.map +0 -1
- package/lib/stores/memory.js +0 -371
- package/lib/stores/memory.js.map +0 -1
- package/lib/stores/memory.spec.d.ts +0 -14
- package/lib/stores/memory.spec.d.ts.map +0 -1
- package/lib/stores/memory.spec.js +0 -263
- package/lib/stores/memory.spec.js.map +0 -1
- package/lib/stores/modelmapper.d.ts +0 -62
- package/lib/stores/modelmapper.d.ts.map +0 -1
- package/lib/stores/modelmapper.js +0 -197
- package/lib/stores/modelmapper.js.map +0 -1
- package/lib/stores/store.spec.d.ts +0 -57
- package/lib/stores/store.spec.d.ts.map +0 -1
- package/lib/stores/store.spec.js +0 -737
- package/lib/stores/store.spec.js.map +0 -1
- package/lib/test.d.ts +0 -265
- package/lib/test.d.ts.map +0 -1
- package/lib/test.js +0 -622
- package/lib/test.js.map +0 -1
- package/lib/unpackedapplication.d.ts.map +0 -1
- package/lib/unpackedapplication.js +0 -350
- package/lib/unpackedapplication.js.map +0 -1
- package/lib/utils/abstractdeployer.spec.d.ts +0 -2
- package/lib/utils/abstractdeployer.spec.d.ts.map +0 -1
- package/lib/utils/abstractdeployer.spec.js +0 -21
- package/lib/utils/abstractdeployer.spec.js.map +0 -1
- package/lib/utils/case.d.ts +0 -8
- package/lib/utils/case.d.ts.map +0 -1
- package/lib/utils/case.js +0 -43
- package/lib/utils/case.js.map +0 -1
- package/lib/utils/case.spec.d.ts +0 -2
- package/lib/utils/case.spec.d.ts.map +0 -1
- package/lib/utils/case.spec.js +0 -50
- package/lib/utils/case.spec.js.map +0 -1
- package/lib/utils/context.d.ts +0 -482
- package/lib/utils/context.d.ts.map +0 -1
- package/lib/utils/context.js +0 -739
- package/lib/utils/context.js.map +0 -1
- package/lib/utils/context.spec.d.ts +0 -10
- package/lib/utils/context.spec.d.ts.map +0 -1
- package/lib/utils/context.spec.js +0 -383
- package/lib/utils/context.spec.js.map +0 -1
- package/lib/utils/cookie.d.ts.map +0 -1
- package/lib/utils/cookie.js.map +0 -1
- package/lib/utils/cookie.spec.d.ts +0 -2
- package/lib/utils/cookie.spec.d.ts.map +0 -1
- package/lib/utils/cookie.spec.js +0 -88
- package/lib/utils/cookie.spec.js.map +0 -1
- package/lib/utils/esm.d.ts +0 -14
- package/lib/utils/esm.d.ts.map +0 -1
- package/lib/utils/esm.js +0 -19
- package/lib/utils/esm.js.map +0 -1
- package/lib/utils/httpcontext.d.ts.map +0 -1
- package/lib/utils/httpcontext.js.map +0 -1
- package/lib/utils/httpcontext.spec.d.ts +0 -5
- package/lib/utils/httpcontext.spec.d.ts.map +0 -1
- package/lib/utils/httpcontext.spec.js +0 -77
- package/lib/utils/httpcontext.spec.js.map +0 -1
- package/lib/utils/logger.d.ts +0 -92
- package/lib/utils/logger.d.ts.map +0 -1
- package/lib/utils/logger.js +0 -121
- package/lib/utils/logger.js.map +0 -1
- package/lib/utils/logger.spec.d.ts +0 -2
- package/lib/utils/logger.spec.d.ts.map +0 -1
- package/lib/utils/logger.spec.js +0 -48
- package/lib/utils/logger.spec.js.map +0 -1
- package/lib/utils/serializers.d.ts +0 -162
- package/lib/utils/serializers.d.ts.map +0 -1
- package/lib/utils/serializers.js +0 -420
- package/lib/utils/serializers.js.map +0 -1
- package/lib/utils/serializers.spec.d.ts +0 -2
- package/lib/utils/serializers.spec.d.ts.map +0 -1
- package/lib/utils/serializers.spec.js +0 -311
- package/lib/utils/serializers.spec.js.map +0 -1
- package/lib/utils/session.d.ts +0 -123
- package/lib/utils/session.d.ts.map +0 -1
- package/lib/utils/session.js +0 -156
- package/lib/utils/session.js.map +0 -1
- package/lib/utils/session.spec.d.ts +0 -2
- package/lib/utils/session.spec.d.ts.map +0 -1
- package/lib/utils/session.spec.js +0 -81
- package/lib/utils/session.spec.js.map +0 -1
- package/lib/utils/throttler.d.ts +0 -99
- package/lib/utils/throttler.d.ts.map +0 -1
- package/lib/utils/throttler.js +0 -160
- package/lib/utils/throttler.js.map +0 -1
- package/lib/utils/throttler.spec.d.ts +0 -2
- package/lib/utils/throttler.spec.d.ts.map +0 -1
- package/lib/utils/throttler.spec.js +0 -53
- package/lib/utils/throttler.spec.js.map +0 -1
- package/lib/utils/waiter.d.ts +0 -94
- package/lib/utils/waiter.d.ts.map +0 -1
- package/lib/utils/waiter.js +0 -148
- package/lib/utils/waiter.js.map +0 -1
- package/lib/utils/waiter.spec.d.ts +0 -2
- package/lib/utils/waiter.spec.d.ts.map +0 -1
- package/lib/utils/waiter.spec.js +0 -98
- package/lib/utils/waiter.spec.js.map +0 -1
- package/test/jsonutils/mdocs.yaml +0 -56
- package/test/jsonutils/test.json +0 -3
- package/test/jsonutils/test.yml +0 -5
|
@@ -0,0 +1,932 @@
|
|
|
1
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
2
|
+
var useValue = arguments.length > 2;
|
|
3
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
4
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
5
|
+
}
|
|
6
|
+
return useValue ? value : void 0;
|
|
7
|
+
};
|
|
8
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
9
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
10
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
11
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
12
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
13
|
+
var _, done = false;
|
|
14
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
15
|
+
var context = {};
|
|
16
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
17
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
18
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
19
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
20
|
+
if (kind === "accessor") {
|
|
21
|
+
if (result === void 0) continue;
|
|
22
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
23
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
24
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
25
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
26
|
+
}
|
|
27
|
+
else if (_ = accept(result)) {
|
|
28
|
+
if (kind === "field") initializers.unshift(_);
|
|
29
|
+
else descriptor[key] = _;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
33
|
+
done = true;
|
|
34
|
+
};
|
|
35
|
+
import bcrypt from "bcryptjs";
|
|
36
|
+
import { Counter } from "../metrics/metrics.js";
|
|
37
|
+
import * as WebdaError from "../errors/errors.js";
|
|
38
|
+
import { Inject, Service } from "../services/service.js";
|
|
39
|
+
import { Route } from "../rest/irest.js";
|
|
40
|
+
import { runAsSystem } from "../contexts/execution.js";
|
|
41
|
+
import { ServiceParameters } from "./serviceparameters.js";
|
|
42
|
+
import { useModelRepository, useDynamicService } from "../core/hooks.js";
|
|
43
|
+
/** Parameters for the Authentication service including identity, email, and password settings */
|
|
44
|
+
export class AuthenticationParameters extends ServiceParameters {
|
|
45
|
+
/**
|
|
46
|
+
* Idents store for authentication identifiers
|
|
47
|
+
*
|
|
48
|
+
* @default "Webda/Ident"
|
|
49
|
+
*/
|
|
50
|
+
identModel;
|
|
51
|
+
/**
|
|
52
|
+
* User store for authentication users
|
|
53
|
+
*
|
|
54
|
+
* @default "Webda/User"
|
|
55
|
+
*/
|
|
56
|
+
userModel;
|
|
57
|
+
/**
|
|
58
|
+
* Enable the email authentication
|
|
59
|
+
*/
|
|
60
|
+
email;
|
|
61
|
+
password;
|
|
62
|
+
/**
|
|
63
|
+
* Number of salt iteration for bcrypt.hashSync
|
|
64
|
+
*/
|
|
65
|
+
salt;
|
|
66
|
+
/**
|
|
67
|
+
* Redirect to this page when email validation failed
|
|
68
|
+
*/
|
|
69
|
+
failureRedirect;
|
|
70
|
+
/**
|
|
71
|
+
* Redirect to this page when email validation succeed
|
|
72
|
+
*/
|
|
73
|
+
successRedirect;
|
|
74
|
+
/**
|
|
75
|
+
* Redirect to this page once email is validate to finish the registration process
|
|
76
|
+
*/
|
|
77
|
+
registerRedirect;
|
|
78
|
+
/**
|
|
79
|
+
* Load parameters with defaults for authentication URLs, models, and password policy
|
|
80
|
+
* @param params - the service parameters
|
|
81
|
+
* @returns this for chaining
|
|
82
|
+
*/
|
|
83
|
+
load(params = {}) {
|
|
84
|
+
super.load(params);
|
|
85
|
+
this.identModel ??= "Webda/Ident";
|
|
86
|
+
this.userModel ??= "Webda/User";
|
|
87
|
+
this.url ??= "/auth";
|
|
88
|
+
this.password ??= {
|
|
89
|
+
regexp: ".{8,}"
|
|
90
|
+
};
|
|
91
|
+
if (this.email) {
|
|
92
|
+
this.email.delay ??= 3600000 * 4;
|
|
93
|
+
this.email.failedLoginBeforeDelay ??= 3;
|
|
94
|
+
}
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* This class is known as the Authentication module
|
|
100
|
+
* It handles OAuth for several providers for now (Facebook, Google, Amazon, GitHub and Twitter)
|
|
101
|
+
* It also handles email authentication with prevalidation or postvalidation of the email
|
|
102
|
+
*
|
|
103
|
+
* It requires two Store to work one `idents` and one `users`
|
|
104
|
+
*
|
|
105
|
+
* The parameters are
|
|
106
|
+
* ```
|
|
107
|
+
* providerName: {
|
|
108
|
+
* clientID: '...',
|
|
109
|
+
* clientSecret: '...',
|
|
110
|
+
* scope: ''
|
|
111
|
+
* },
|
|
112
|
+
* email: {
|
|
113
|
+
* postValidation: true|false // If postValidation=true, account created without email verification
|
|
114
|
+
* }
|
|
115
|
+
* url: 'url' // By default /auth
|
|
116
|
+
* ```
|
|
117
|
+
*
|
|
118
|
+
* Core authentication service handling login, registration, password recovery, and email validation
|
|
119
|
+
*
|
|
120
|
+
* @category CoreServices
|
|
121
|
+
* @WebdaModda
|
|
122
|
+
*/
|
|
123
|
+
let Authentication = (() => {
|
|
124
|
+
let _classSuper = Service;
|
|
125
|
+
let _instanceExtraInitializers = [];
|
|
126
|
+
let _cryptoService_decorators;
|
|
127
|
+
let _cryptoService_initializers = [];
|
|
128
|
+
let _cryptoService_extraInitializers = [];
|
|
129
|
+
let __sendEmailValidation_decorators;
|
|
130
|
+
let __getMe_decorators;
|
|
131
|
+
let __listAuthentications_decorators;
|
|
132
|
+
let __handleEmailCallback_decorators;
|
|
133
|
+
return class Authentication extends _classSuper {
|
|
134
|
+
static {
|
|
135
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
136
|
+
_cryptoService_decorators = [Inject("CryptoService")];
|
|
137
|
+
__sendEmailValidation_decorators = [Route("./email/{email}/validate", ["GET"], {
|
|
138
|
+
get: {
|
|
139
|
+
description: "The email validation process will be start",
|
|
140
|
+
summary: "Restart email validation",
|
|
141
|
+
operationId: "startEmailRecovery",
|
|
142
|
+
responses: {
|
|
143
|
+
"204": {
|
|
144
|
+
description: ""
|
|
145
|
+
},
|
|
146
|
+
"409": {
|
|
147
|
+
description: "Email already verified for another user"
|
|
148
|
+
},
|
|
149
|
+
"412": {
|
|
150
|
+
description: "Email already verified for current user"
|
|
151
|
+
},
|
|
152
|
+
"429": {
|
|
153
|
+
description: "Validation has been initiated in the last 4 hours"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
})];
|
|
158
|
+
__getMe_decorators = [Route("./me", ["GET"], {
|
|
159
|
+
get: {
|
|
160
|
+
description: "Retrieve the current user from the session",
|
|
161
|
+
summary: "Get current user",
|
|
162
|
+
operationId: "getCurrentUser"
|
|
163
|
+
}
|
|
164
|
+
})];
|
|
165
|
+
__listAuthentications_decorators = [Route(".", ["GET", "DELETE"], {
|
|
166
|
+
get: {
|
|
167
|
+
description: "Retrieve the list of available authentication",
|
|
168
|
+
summary: "Get available auths",
|
|
169
|
+
operationId: `getAuthenticationMethods`,
|
|
170
|
+
responses: {
|
|
171
|
+
"200": {
|
|
172
|
+
description: "List of authentication"
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
delete: {
|
|
177
|
+
description: "Logout current user",
|
|
178
|
+
summary: "Logout",
|
|
179
|
+
operationId: `logout`,
|
|
180
|
+
responses: {
|
|
181
|
+
"200": {}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
})];
|
|
185
|
+
__handleEmailCallback_decorators = [Route("./email/callback{?email,token,user?}", ["GET"], {
|
|
186
|
+
hidden: true
|
|
187
|
+
})];
|
|
188
|
+
__esDecorate(this, null, __sendEmailValidation_decorators, { kind: "method", name: "_sendEmailValidation", static: false, private: false, access: { has: obj => "_sendEmailValidation" in obj, get: obj => obj._sendEmailValidation }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
189
|
+
__esDecorate(this, null, __getMe_decorators, { kind: "method", name: "_getMe", static: false, private: false, access: { has: obj => "_getMe" in obj, get: obj => obj._getMe }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
190
|
+
__esDecorate(this, null, __listAuthentications_decorators, { kind: "method", name: "_listAuthentications", static: false, private: false, access: { has: obj => "_listAuthentications" in obj, get: obj => obj._listAuthentications }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
191
|
+
__esDecorate(this, null, __handleEmailCallback_decorators, { kind: "method", name: "_handleEmailCallback", static: false, private: false, access: { has: obj => "_handleEmailCallback" in obj, get: obj => obj._handleEmailCallback }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
192
|
+
__esDecorate(null, null, _cryptoService_decorators, { kind: "field", name: "cryptoService", static: false, private: false, access: { has: obj => "cryptoService" in obj, get: obj => obj.cryptoService, set: (obj, value) => { obj.cryptoService = value; } }, metadata: _metadata }, _cryptoService_initializers, _cryptoService_extraInitializers);
|
|
193
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Ident model to use
|
|
197
|
+
*/
|
|
198
|
+
identModel = __runInitializers(this, _instanceExtraInitializers);
|
|
199
|
+
/**
|
|
200
|
+
* User model to use
|
|
201
|
+
*/
|
|
202
|
+
userModel;
|
|
203
|
+
/**
|
|
204
|
+
* Used for hmac
|
|
205
|
+
*/
|
|
206
|
+
cryptoService = __runInitializers(this, _cryptoService_initializers, void 0);
|
|
207
|
+
/**
|
|
208
|
+
* Password verification system
|
|
209
|
+
*/
|
|
210
|
+
_passwordVerifier = __runInitializers(this, _cryptoService_extraInitializers);
|
|
211
|
+
/**
|
|
212
|
+
*
|
|
213
|
+
*/
|
|
214
|
+
providers = new Set();
|
|
215
|
+
/**
|
|
216
|
+
* Get user model
|
|
217
|
+
* @returns the result
|
|
218
|
+
*/
|
|
219
|
+
getUserModel() {
|
|
220
|
+
return this.userModel;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get ident model
|
|
224
|
+
* @returns the result
|
|
225
|
+
*/
|
|
226
|
+
getIdentModel() {
|
|
227
|
+
return this.identModel;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* @ignore
|
|
231
|
+
* Setup the default routes
|
|
232
|
+
*/
|
|
233
|
+
computeParameters() {
|
|
234
|
+
super.computeParameters();
|
|
235
|
+
this.identModel = useModelRepository(this.parameters.identModel);
|
|
236
|
+
this.userModel = useModelRepository(this.parameters.userModel);
|
|
237
|
+
if (this.parameters.password.verifier) {
|
|
238
|
+
this._passwordVerifier = useDynamicService(this.parameters.password.verifier);
|
|
239
|
+
}
|
|
240
|
+
if (this.parameters.email && this.getMailMan() === undefined) {
|
|
241
|
+
throw Error("email authentication requires a Mailer service");
|
|
242
|
+
}
|
|
243
|
+
// Add email provider
|
|
244
|
+
if (this.parameters.email) {
|
|
245
|
+
this.addProvider("email");
|
|
246
|
+
this.addRoute("./email/{email}/recover", ["GET"], this._passwordRecoveryEmail, {
|
|
247
|
+
get: {
|
|
248
|
+
description: "The password reset process will be start",
|
|
249
|
+
summary: "Start password recovery",
|
|
250
|
+
operationId: "startEmailRecovery",
|
|
251
|
+
responses: {
|
|
252
|
+
"204": {
|
|
253
|
+
description: ""
|
|
254
|
+
},
|
|
255
|
+
"404": {
|
|
256
|
+
description: "Email does not exist"
|
|
257
|
+
},
|
|
258
|
+
"429": {
|
|
259
|
+
description: "Recovery has been initiated in the last 4 hours"
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
this.addRoute("./email/passwordRecovery", ["POST"], this._passwordRecovery, {
|
|
265
|
+
post: {
|
|
266
|
+
schemas: {
|
|
267
|
+
input: {
|
|
268
|
+
type: "object",
|
|
269
|
+
properties: {
|
|
270
|
+
token: {
|
|
271
|
+
type: "string"
|
|
272
|
+
},
|
|
273
|
+
expire: {
|
|
274
|
+
type: "number"
|
|
275
|
+
},
|
|
276
|
+
password: {
|
|
277
|
+
type: "string"
|
|
278
|
+
},
|
|
279
|
+
login: {
|
|
280
|
+
type: "string"
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
description: "Reinit the password if we have the right token, expire",
|
|
286
|
+
summary: "Reinit password",
|
|
287
|
+
operationId: "reinitPassword",
|
|
288
|
+
responses: {
|
|
289
|
+
"204": {
|
|
290
|
+
description: ""
|
|
291
|
+
},
|
|
292
|
+
"403": {
|
|
293
|
+
description: "Wrong Token"
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
this.addRoute("./email", ["POST"], this._handleEmail, {
|
|
299
|
+
post: {
|
|
300
|
+
description: "Authenticate with an email and password",
|
|
301
|
+
summary: "Authenticate with email",
|
|
302
|
+
operationId: `authWithEmail`
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* @override
|
|
309
|
+
*/
|
|
310
|
+
initMetrics() {
|
|
311
|
+
super.initMetrics();
|
|
312
|
+
this.metrics.login = this.getMetric(Counter, {
|
|
313
|
+
name: "auth_login",
|
|
314
|
+
help: "Counter number of login per provider",
|
|
315
|
+
labelNames: ["provider"]
|
|
316
|
+
});
|
|
317
|
+
this.metrics.logout = this.getMetric(Counter, {
|
|
318
|
+
name: "auth_logout",
|
|
319
|
+
help: "Counter number of logout"
|
|
320
|
+
});
|
|
321
|
+
this.metrics.registration = this.getMetric(Counter, {
|
|
322
|
+
name: "auth_registration",
|
|
323
|
+
help: "Counter number of registration per provider",
|
|
324
|
+
labelNames: ["provider"]
|
|
325
|
+
});
|
|
326
|
+
if (this.parameters.email) {
|
|
327
|
+
this.metrics.loginFailed = this.getMetric(Counter, {
|
|
328
|
+
name: "auth_login_failed",
|
|
329
|
+
help: "Counter number of login failed with password"
|
|
330
|
+
});
|
|
331
|
+
this.metrics.recovery = this.getMetric(Counter, {
|
|
332
|
+
name: "auth_login_recovery",
|
|
333
|
+
help: "Counter number of password lost process initiated"
|
|
334
|
+
});
|
|
335
|
+
this.metrics.recovered = this.getMetric(Counter, {
|
|
336
|
+
name: "auth_login_recovered",
|
|
337
|
+
help: "Counter number of password lost process successful"
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Add a provider to the oauth scheme
|
|
343
|
+
* @param name - the name to use
|
|
344
|
+
*/
|
|
345
|
+
addProvider(name) {
|
|
346
|
+
this.providers.add(name);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Ensure email is enabled for all emails routes
|
|
350
|
+
* @override
|
|
351
|
+
*/
|
|
352
|
+
getUrl(url, methods) {
|
|
353
|
+
if (url.startsWith("./emails") && !this.parameters.email) {
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
return super.getUrl(url, methods);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Send or resend an email to validate the email address
|
|
360
|
+
*
|
|
361
|
+
* @param ctx - the operation context
|
|
362
|
+
* @throws 409 if ident is linked to someone else
|
|
363
|
+
* @throws 412 if the email is already validated
|
|
364
|
+
* @throws 429 if a validation email has been sent recently
|
|
365
|
+
*/
|
|
366
|
+
async _sendEmailValidation(ctx) {
|
|
367
|
+
const identKey = ctx.parameters.email + "_email";
|
|
368
|
+
const ident = await this.identModel.ref(identKey).get();
|
|
369
|
+
ident._lastUsed?.getDate();
|
|
370
|
+
if (!ident) {
|
|
371
|
+
await this.identModel.ref(`${ctx.parameters.email}_email`).create({
|
|
372
|
+
_lastValidationEmail: Date.now(),
|
|
373
|
+
_type: "email"
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
// If the ident is linked to someone else - might want to remove it
|
|
378
|
+
if (ident.getUser().getPrimaryKey().toString() !== ctx.getCurrentUserId()) {
|
|
379
|
+
throw new WebdaError.Conflict("Ident is linked to someone else");
|
|
380
|
+
}
|
|
381
|
+
// If the email is already validated
|
|
382
|
+
if (ident._validation) {
|
|
383
|
+
throw new WebdaError.PreconditionFailed("Email already validated");
|
|
384
|
+
}
|
|
385
|
+
//
|
|
386
|
+
if (ident._lastValidationEmail >= Date.now() - this.parameters.email.delay) {
|
|
387
|
+
throw new WebdaError.TooManyRequests("Email sent recently");
|
|
388
|
+
}
|
|
389
|
+
await this.identModel.ref(ident.getUUID()).setAttribute("_lastValidationEmail", Date.now());
|
|
390
|
+
//ident.ref(ident.getUUID()).setAttribute("_lastValidationEmail", Date.now());
|
|
391
|
+
//await this.identModel.ref(ident.getUUID()).setAttribute("lastValidationEmail", Date.now());
|
|
392
|
+
}
|
|
393
|
+
await this.sendValidationEmail(ctx, ctx.parameters.email);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Return current user
|
|
397
|
+
* @param ctx - the operation context
|
|
398
|
+
*/
|
|
399
|
+
async _getMe(ctx) {
|
|
400
|
+
const user = await ctx.getCurrentUser();
|
|
401
|
+
if (user === undefined) {
|
|
402
|
+
throw new WebdaError.NotFound("No user found");
|
|
403
|
+
}
|
|
404
|
+
await this.emit("Authentication.GetMe", {
|
|
405
|
+
context: ctx,
|
|
406
|
+
user
|
|
407
|
+
});
|
|
408
|
+
ctx.write(user);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Handle both list of available authentication
|
|
412
|
+
* and logout with method 'DELETE'
|
|
413
|
+
*
|
|
414
|
+
* @param ctx - the operation context
|
|
415
|
+
* @returns the result
|
|
416
|
+
*/
|
|
417
|
+
async _listAuthentications(ctx) {
|
|
418
|
+
if (ctx.getHttpContext().getMethod() === "DELETE") {
|
|
419
|
+
await this.logout(ctx);
|
|
420
|
+
this.metrics.logout.inc();
|
|
421
|
+
ctx.write("GoodBye");
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
ctx.write(Array.from(this.providers));
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Handle login via an identity provider, creating or linking the ident to a user
|
|
428
|
+
* @param ctx - the operation context
|
|
429
|
+
* @param provider - the provider name
|
|
430
|
+
* @param identId - the identity identifier
|
|
431
|
+
* @param profile - the user profile
|
|
432
|
+
* @param tokens - the authentication tokens
|
|
433
|
+
*/
|
|
434
|
+
async onIdentLogin(ctx, provider, identId, profile, tokens = undefined) {
|
|
435
|
+
// Auto postifx with provider name
|
|
436
|
+
const postfix = `_${provider}`;
|
|
437
|
+
if (!identId.endsWith(postfix)) {
|
|
438
|
+
identId += postfix;
|
|
439
|
+
}
|
|
440
|
+
let ident = await this.identModel.ref(identId).get();
|
|
441
|
+
// Ident is known
|
|
442
|
+
if (ident) {
|
|
443
|
+
await this.login(ctx, ident.getUser().toString(), ident, provider);
|
|
444
|
+
await runAsSystem(() => ident.patch({
|
|
445
|
+
_lastUsed: new Date().toString(),
|
|
446
|
+
__tokens: tokens
|
|
447
|
+
}));
|
|
448
|
+
// Redirect to?
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
let user;
|
|
452
|
+
if (profile.email) {
|
|
453
|
+
ident = await this.identModel.ref(`${profile.email}_email`).get();
|
|
454
|
+
}
|
|
455
|
+
await runAsSystem(async () => {
|
|
456
|
+
// If already login
|
|
457
|
+
if (ctx.getCurrentUserId()) {
|
|
458
|
+
user = await ctx.getCurrentUser();
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
// If an email in profile try to find the ident
|
|
462
|
+
if (ident) {
|
|
463
|
+
user = await this.userModel.ref(ident.getUser().toString()).get();
|
|
464
|
+
}
|
|
465
|
+
if (!user) {
|
|
466
|
+
// If no user, register a new user automatically
|
|
467
|
+
user = await this.registerUser(ctx, profile, identId);
|
|
468
|
+
await user.save();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (profile.email && !ident) {
|
|
472
|
+
// Save additional email
|
|
473
|
+
await this.identModel.create({
|
|
474
|
+
uuid: `${profile.email}_email`,
|
|
475
|
+
provider: "email",
|
|
476
|
+
_user: user.getUuid()
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
// Work directly on ident argument
|
|
480
|
+
ident = await this.identModel.create({
|
|
481
|
+
uuid: identId,
|
|
482
|
+
__profile: profile,
|
|
483
|
+
__tokens: tokens,
|
|
484
|
+
provider,
|
|
485
|
+
_lastUsed: new Date(),
|
|
486
|
+
_user: user.uuid,
|
|
487
|
+
_type: provider
|
|
488
|
+
});
|
|
489
|
+
await this.login(ctx, user, ident, provider);
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Create a new User with the link ident
|
|
494
|
+
* @param ident
|
|
495
|
+
*
|
|
496
|
+
async createUserWithIdent(provider: string, identId: string, profile: any = {}) {
|
|
497
|
+
if (await this.identModel.ref(`${identId}_${provider}`).exists()) {
|
|
498
|
+
throw new Error("Ident is already known");
|
|
499
|
+
}
|
|
500
|
+
const ctx = await this._webda.newWebContext(new HttpContext("fake", "GET", "/"));
|
|
501
|
+
// Pretend we logged in with the ident
|
|
502
|
+
await this.onIdentLogin(ctx, provider, identId, profile);
|
|
503
|
+
}
|
|
504
|
+
*/
|
|
505
|
+
/**
|
|
506
|
+
* Create and register a new user, emitting a registration event
|
|
507
|
+
* @param ctx - the operation context
|
|
508
|
+
* @param data - the data to process
|
|
509
|
+
* @param identId - the identity identifier
|
|
510
|
+
* @param user - the user object
|
|
511
|
+
* @returns the result
|
|
512
|
+
*/
|
|
513
|
+
async registerUser(ctx, data, identId, user) {
|
|
514
|
+
user ??= await this.userModel.create({
|
|
515
|
+
email: data.email,
|
|
516
|
+
locale: ctx.getLocale()
|
|
517
|
+
}, false);
|
|
518
|
+
user.email = data.email;
|
|
519
|
+
user.locale = ctx.getLocale();
|
|
520
|
+
this.metrics.registration.inc();
|
|
521
|
+
await this.emit("Authentication.Register", {
|
|
522
|
+
user: user,
|
|
523
|
+
data: data,
|
|
524
|
+
context: ctx,
|
|
525
|
+
identId
|
|
526
|
+
});
|
|
527
|
+
return user;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Generate password recovery info (token and expiry) for a user
|
|
531
|
+
* @param uuid - the unique identifier
|
|
532
|
+
* @param interval - the interval
|
|
533
|
+
* @returns the result
|
|
534
|
+
*/
|
|
535
|
+
async getPasswordRecoveryInfos(uuid, interval = this.parameters.email.delay) {
|
|
536
|
+
const expire = Date.now() + interval;
|
|
537
|
+
let user;
|
|
538
|
+
if (typeof uuid === "string") {
|
|
539
|
+
user = await this.userModel.fromUID(uuid).get();
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
user = uuid;
|
|
543
|
+
}
|
|
544
|
+
if (!user) {
|
|
545
|
+
return undefined;
|
|
546
|
+
}
|
|
547
|
+
return {
|
|
548
|
+
expire: expire,
|
|
549
|
+
// Might want to add more alea not coming from the db to avoid exploitation of stolen db
|
|
550
|
+
token: await this.cryptoService.hmac(user.uuid + expire + user.getPassword()),
|
|
551
|
+
login: user.uuid
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Manage password recovery
|
|
556
|
+
* @param ctx - the operation context
|
|
557
|
+
*/
|
|
558
|
+
async _passwordRecoveryEmail(ctx) {
|
|
559
|
+
const email = ctx.parameter("email");
|
|
560
|
+
const ident = await this.identModel.ref(email + "_email").get();
|
|
561
|
+
if (!ident) {
|
|
562
|
+
throw new WebdaError.NotFound("Email not found");
|
|
563
|
+
}
|
|
564
|
+
const user = await this.userModel.ref(ident.getUser().toString()).get();
|
|
565
|
+
// Dont allow to do too many request
|
|
566
|
+
if (!user.lastPasswordRecoveryBefore(Date.now() - this.parameters.email.delay)) {
|
|
567
|
+
throw new WebdaError.TooManyRequests("Password recovery already requested recently");
|
|
568
|
+
}
|
|
569
|
+
await user.patch({
|
|
570
|
+
_lastPasswordRecovery: Date.now()
|
|
571
|
+
});
|
|
572
|
+
this.metrics.recovery.inc();
|
|
573
|
+
await this.sendRecoveryEmail(ctx, user, email);
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Verify that a password meets the configured policy or custom verifier
|
|
577
|
+
* @param password - the password
|
|
578
|
+
* @param user - the user object
|
|
579
|
+
*/
|
|
580
|
+
async _verifyPassword(password, user) {
|
|
581
|
+
if (this._passwordVerifier) {
|
|
582
|
+
if (!(await this._passwordVerifier.validate(password, user))) {
|
|
583
|
+
throw new WebdaError.BadRequest("Password does not match the policy");
|
|
584
|
+
}
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
const regexp = new RegExp(this.parameters.password.regexp);
|
|
588
|
+
if (regexp.exec(password) === null) {
|
|
589
|
+
throw new WebdaError.BadRequest("Password does not match the policy");
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Handle password recovery: verify token and update the user's password
|
|
594
|
+
* @param ctx - the operation context
|
|
595
|
+
*/
|
|
596
|
+
async _passwordRecovery(ctx) {
|
|
597
|
+
const body = await ctx.getRequestBody();
|
|
598
|
+
const user = await this.userModel.ref(body.login.toLowerCase()).get();
|
|
599
|
+
if (!user) {
|
|
600
|
+
throw new WebdaError.Forbidden("User not found");
|
|
601
|
+
}
|
|
602
|
+
if (!(await this.cryptoService.hmacVerify(body.login.toLowerCase() + body.expire + user.getPassword(), body.token))) {
|
|
603
|
+
throw new WebdaError.Forbidden("Invalid token");
|
|
604
|
+
}
|
|
605
|
+
if (body.expire < Date.now()) {
|
|
606
|
+
throw new WebdaError.Gone("Expired token");
|
|
607
|
+
}
|
|
608
|
+
await this._verifyPassword(body.password, user);
|
|
609
|
+
const password = this.hashPassword(body.password);
|
|
610
|
+
await user.patch({
|
|
611
|
+
__password: password
|
|
612
|
+
});
|
|
613
|
+
this.metrics.recovered.inc();
|
|
614
|
+
await this.emit("Authentication.PasswordUpdate", {
|
|
615
|
+
user,
|
|
616
|
+
password,
|
|
617
|
+
context: ctx
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Callback to validate an email address
|
|
622
|
+
* @param ctx - the operation context
|
|
623
|
+
* @returns the result
|
|
624
|
+
*/
|
|
625
|
+
async _handleEmailCallback(ctx) {
|
|
626
|
+
if (!(await this.cryptoService.hmacVerify(`${ctx.parameter("email")}_${ctx.parameter("user")}`, ctx.parameter("token")))) {
|
|
627
|
+
ctx.writeHead(302, {
|
|
628
|
+
Location: this.parameters.failureRedirect + "?reason=badToken"
|
|
629
|
+
});
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
if (ctx.parameter("user") !== ctx.getCurrentUserId() &&
|
|
633
|
+
ctx.getCurrentUserId() !== "" &&
|
|
634
|
+
ctx.getCurrentUserId() !== undefined) {
|
|
635
|
+
ctx.writeHead(302, {
|
|
636
|
+
Location: this.parameters.failureRedirect + "?reason=badUser"
|
|
637
|
+
});
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
640
|
+
if (!ctx.parameter("user")) {
|
|
641
|
+
ctx.writeHead(302, {
|
|
642
|
+
Location: `${this.parameters.registerRedirect}?token=${ctx.parameter("token")}&email=${ctx.parameter("email")}`
|
|
643
|
+
});
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
await runAsSystem(async () => {
|
|
647
|
+
const uuid = ctx.parameter("email") + "_email";
|
|
648
|
+
let ident = await this.identModel.ref(uuid).get();
|
|
649
|
+
// Would mean the ident got delete in the mean time... hyper low likely hood
|
|
650
|
+
if (ident === undefined) {
|
|
651
|
+
ident = await this.identModel.create({
|
|
652
|
+
uuid
|
|
653
|
+
}, false);
|
|
654
|
+
}
|
|
655
|
+
ident._type = "email";
|
|
656
|
+
ident._validation = new Date();
|
|
657
|
+
ident.setUser(ctx.parameter("user"));
|
|
658
|
+
await ident.save();
|
|
659
|
+
ctx.writeHead(302, {
|
|
660
|
+
Location: this.parameters.successRedirect + "?validation=email",
|
|
661
|
+
"X-Webda-Authentication": "success"
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Send an email to recover the user password
|
|
667
|
+
*
|
|
668
|
+
* @param ctx - the operation context
|
|
669
|
+
* @param user - the user object
|
|
670
|
+
* @param email - the email address
|
|
671
|
+
* @returns the result
|
|
672
|
+
*/
|
|
673
|
+
async sendRecoveryEmail(ctx, user, email) {
|
|
674
|
+
const infos = await this.getPasswordRecoveryInfos(user);
|
|
675
|
+
const mailer = this.getMailMan();
|
|
676
|
+
const locale = user.locale || ctx.getLocale();
|
|
677
|
+
const mailOptions = {
|
|
678
|
+
to: email,
|
|
679
|
+
locale: locale,
|
|
680
|
+
template: "EMAIL_RECOVERY",
|
|
681
|
+
replacements: {
|
|
682
|
+
...this.parameters.email,
|
|
683
|
+
infos,
|
|
684
|
+
to: email,
|
|
685
|
+
context: ctx
|
|
686
|
+
}
|
|
687
|
+
};
|
|
688
|
+
return mailer.send(mailOptions);
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Send an email to validate the user email by sending a unique link to
|
|
692
|
+
* his email
|
|
693
|
+
*
|
|
694
|
+
* @param ctx - the operation context
|
|
695
|
+
* @param email - the email address
|
|
696
|
+
* @returns the result
|
|
697
|
+
*/
|
|
698
|
+
async sendValidationEmail(ctx, email) {
|
|
699
|
+
const mailer = this.getMailMan();
|
|
700
|
+
const replacements = {
|
|
701
|
+
...this.parameters.email,
|
|
702
|
+
context: ctx,
|
|
703
|
+
url: ctx
|
|
704
|
+
.getHttpContext()
|
|
705
|
+
.getAbsoluteUrl(`${this.parameters.url}/email/callback?email=${email}&token=${await this.generateEmailValidationToken(ctx.getCurrentUserId(), email)}`)
|
|
706
|
+
};
|
|
707
|
+
const userId = ctx.getCurrentUserId();
|
|
708
|
+
if (userId && userId.length > 0) {
|
|
709
|
+
replacements.url += "&user=" + userId;
|
|
710
|
+
}
|
|
711
|
+
const mailOptions = {
|
|
712
|
+
to: email,
|
|
713
|
+
locale: ctx.getLocale(),
|
|
714
|
+
template: "EMAIL_REGISTER",
|
|
715
|
+
replacements: replacements
|
|
716
|
+
};
|
|
717
|
+
return mailer.send(mailOptions);
|
|
718
|
+
}
|
|
719
|
+
/**
|
|
720
|
+
* Check the password match the stored hash
|
|
721
|
+
* @param hash generate prior by hashPassword
|
|
722
|
+
* @param password as entered by the user
|
|
723
|
+
* @param pass - the password
|
|
724
|
+
* @returns true if the condition is met
|
|
725
|
+
*/
|
|
726
|
+
checkPassword(hash = "", pass = "") {
|
|
727
|
+
return bcrypt.compareSync(pass, hash);
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Hash the password according to good practices
|
|
731
|
+
*
|
|
732
|
+
* @param pass to hash
|
|
733
|
+
* @returns the result string
|
|
734
|
+
*/
|
|
735
|
+
hashPassword(pass) {
|
|
736
|
+
return bcrypt.hashSync(pass, this.parameters.salt || 10);
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Logout user
|
|
740
|
+
* @param ctx - the operation context
|
|
741
|
+
*/
|
|
742
|
+
async logout(ctx) {
|
|
743
|
+
await this.emit("Authentication.Logout", {
|
|
744
|
+
context: ctx
|
|
745
|
+
});
|
|
746
|
+
await ctx.newSession();
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Login a user
|
|
750
|
+
*
|
|
751
|
+
* @param ctx - the operation context
|
|
752
|
+
* @param user - the user object
|
|
753
|
+
* @param ident - the identity object
|
|
754
|
+
* @param provider - the provider name
|
|
755
|
+
* @returns the result
|
|
756
|
+
*/
|
|
757
|
+
async login(ctx, user, ident, provider) {
|
|
758
|
+
const event = {
|
|
759
|
+
context: ctx,
|
|
760
|
+
userId: "",
|
|
761
|
+
identId: ident.uuid,
|
|
762
|
+
ident
|
|
763
|
+
};
|
|
764
|
+
if (typeof user == "object") {
|
|
765
|
+
event.userId = user.getPrimaryKey().toString();
|
|
766
|
+
event.user = user;
|
|
767
|
+
}
|
|
768
|
+
else {
|
|
769
|
+
event.userId = user;
|
|
770
|
+
}
|
|
771
|
+
event.context = ctx;
|
|
772
|
+
ctx.getSession().login(event.userId, event.identId);
|
|
773
|
+
this.metrics.login.inc({ provider });
|
|
774
|
+
return this.emit("Authentication.Login", event);
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
777
|
+
* Get the mailer service
|
|
778
|
+
* @returns the result
|
|
779
|
+
*/
|
|
780
|
+
getMailMan() {
|
|
781
|
+
return useDynamicService(this.parameters.email.mailer ? this.parameters.email.mailer : "Mailer");
|
|
782
|
+
}
|
|
783
|
+
/**
|
|
784
|
+
* Handle a user login request
|
|
785
|
+
*
|
|
786
|
+
* @param ctx - the operation context
|
|
787
|
+
* @param ident - the identity object
|
|
788
|
+
*/
|
|
789
|
+
async handleLogin(ctx, ident) {
|
|
790
|
+
const updates = {};
|
|
791
|
+
const user = await this.userModel.ref(ident.getUser().toString()).get();
|
|
792
|
+
// Check password
|
|
793
|
+
if (this.checkPassword(user.getPassword(), (await ctx.getRequestBody()).password)) {
|
|
794
|
+
if (ident._failedLogin > 0) {
|
|
795
|
+
ident._failedLogin = 0;
|
|
796
|
+
}
|
|
797
|
+
updates._lastUsed = new Date();
|
|
798
|
+
updates._failedLogin = 0;
|
|
799
|
+
await this.identModel.ref(ident.uuid).patch(updates);
|
|
800
|
+
await this.login(ctx, ident.getUser().toString(), ident, "email");
|
|
801
|
+
ctx.write(user);
|
|
802
|
+
}
|
|
803
|
+
else {
|
|
804
|
+
this.metrics.loginFailed.inc();
|
|
805
|
+
await this.emit("Authentication.LoginFailed", {
|
|
806
|
+
user,
|
|
807
|
+
context: ctx
|
|
808
|
+
});
|
|
809
|
+
ident._failedLogin ??= 0;
|
|
810
|
+
updates._failedLogin = ident._failedLogin + 1;
|
|
811
|
+
updates._lastFailedLogin = new Date();
|
|
812
|
+
// Swalow exeception issue to double check !
|
|
813
|
+
await this.identModel.ref(ident.uuid).patch(updates);
|
|
814
|
+
// Allows to auto redirect user to a oauth if needed
|
|
815
|
+
// It can intercept the error and redirect to the oauth if
|
|
816
|
+
// email match
|
|
817
|
+
if (!ctx.isEnded()) {
|
|
818
|
+
throw new WebdaError.Forbidden("Invalid password");
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
/**
|
|
823
|
+
* Handle the POST /auth/email
|
|
824
|
+
*
|
|
825
|
+
* @param ctx - the operation context
|
|
826
|
+
* @returns the result
|
|
827
|
+
*/
|
|
828
|
+
async _handleEmail(ctx) {
|
|
829
|
+
// If called while logged in reject
|
|
830
|
+
if (ctx.getCurrentUserId() !== undefined) {
|
|
831
|
+
throw new WebdaError.Gone("Already logged in");
|
|
832
|
+
}
|
|
833
|
+
const body = await ctx.getRequestBody();
|
|
834
|
+
const mailConfig = this.parameters.email;
|
|
835
|
+
const uuid = body.login.toLowerCase() + "_email";
|
|
836
|
+
let ident = await this.identModel.ref(uuid).get();
|
|
837
|
+
if (ident !== undefined && ident.getUser() !== undefined) {
|
|
838
|
+
// Register on an known user
|
|
839
|
+
if (!body.register) {
|
|
840
|
+
await this.handleLogin(ctx, ident);
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
843
|
+
// If register on a validate email
|
|
844
|
+
if (ident._validation !== undefined) {
|
|
845
|
+
throw new WebdaError.Conflict("Email already registered");
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
// TODO Handle add of email on authenticated user
|
|
849
|
+
const email = body.login.toLowerCase();
|
|
850
|
+
// Read the form
|
|
851
|
+
if (body.register) {
|
|
852
|
+
let validation = undefined;
|
|
853
|
+
// Need to check email before creation
|
|
854
|
+
if (!mailConfig.postValidation) {
|
|
855
|
+
if (body.token && (await this.cryptoService.hmacVerify(`${email}_${ctx.getCurrentUserId()}`, body.token))) {
|
|
856
|
+
validation = new Date();
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
ctx.write({});
|
|
860
|
+
// token is undefined send an email
|
|
861
|
+
return this.sendValidationEmail(ctx, email);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
if (!body.password) {
|
|
865
|
+
throw new WebdaError.BadRequest("Password is required");
|
|
866
|
+
}
|
|
867
|
+
// Store with a _
|
|
868
|
+
const __password = this.hashPassword(body.password);
|
|
869
|
+
await this._verifyPassword(body.password);
|
|
870
|
+
// Remove useless attributes
|
|
871
|
+
delete body.password;
|
|
872
|
+
delete body.register;
|
|
873
|
+
delete body.token;
|
|
874
|
+
const user = await runAsSystem(async () => this.registerUser(ctx, {}, uuid, await this.userModel.create({
|
|
875
|
+
...body,
|
|
876
|
+
__password
|
|
877
|
+
}, false)));
|
|
878
|
+
await this.emit("Authentication.PasswordCreate", {
|
|
879
|
+
user,
|
|
880
|
+
password: __password,
|
|
881
|
+
context: ctx
|
|
882
|
+
});
|
|
883
|
+
await user.save();
|
|
884
|
+
const newIdent = await runAsSystem(async () => await this.identModel.create({
|
|
885
|
+
uuid: uuid,
|
|
886
|
+
_type: "email",
|
|
887
|
+
email: email
|
|
888
|
+
}));
|
|
889
|
+
newIdent.setUser(user.getPrimaryKey().toString());
|
|
890
|
+
if (validation) {
|
|
891
|
+
newIdent._validation = validation;
|
|
892
|
+
}
|
|
893
|
+
else if (!mailConfig.skipEmailValidation) {
|
|
894
|
+
newIdent._lastValidationEmail = Date.now();
|
|
895
|
+
}
|
|
896
|
+
ident = await newIdent.save();
|
|
897
|
+
await this.login(ctx, user, ident, "email");
|
|
898
|
+
ctx.write(user);
|
|
899
|
+
if (!validation && !mailConfig.skipEmailValidation) {
|
|
900
|
+
await this.sendValidationEmail(ctx, email);
|
|
901
|
+
}
|
|
902
|
+
return;
|
|
903
|
+
}
|
|
904
|
+
throw new WebdaError.NotFound("");
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Generate an HMAC-based token for email address validation
|
|
908
|
+
* @param user - the user object
|
|
909
|
+
* @param email - the email address
|
|
910
|
+
* @returns the result string
|
|
911
|
+
*/
|
|
912
|
+
async generateEmailValidationToken(user, email) {
|
|
913
|
+
return this.cryptoService.hmac(email + "_" + user);
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* Create a new User with the link ident
|
|
917
|
+
* @param ident - the identity object
|
|
918
|
+
* @param provider - the provider name
|
|
919
|
+
* @param identId - the identity identifier
|
|
920
|
+
* @param profile - the user profile
|
|
921
|
+
*/
|
|
922
|
+
async createUserWithIdent(provider, identId, profile = {}) {
|
|
923
|
+
if (await this.identModel.ref(`${identId}_${provider}`).exists()) {
|
|
924
|
+
throw new Error("Ident is already known");
|
|
925
|
+
}
|
|
926
|
+
// Pretend we logged in with the ident
|
|
927
|
+
await this.onIdentLogin(undefined, provider, identId, profile);
|
|
928
|
+
}
|
|
929
|
+
};
|
|
930
|
+
})();
|
|
931
|
+
export { Authentication };
|
|
932
|
+
//# sourceMappingURL=authentication.service.js.map
|