kuzzle 2.49.1 → 2.50.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/dist/bin/check-node-version.js +11 -0
- package/dist/bin/copy-protobuf.js +17 -0
- package/dist/lib/api/controllers/adminController.d.ts +51 -0
- package/dist/lib/api/controllers/adminController.js +191 -0
- package/{lib → dist/lib}/api/controllers/authController.d.ts +20 -40
- package/{lib → dist/lib}/api/controllers/authController.js +23 -24
- package/dist/lib/api/controllers/bulkController.d.ts +46 -0
- package/dist/lib/api/controllers/bulkController.js +132 -0
- package/dist/lib/api/controllers/clusterController.d.ts +6 -0
- package/{lib → dist/lib}/api/controllers/clusterController.js +7 -11
- package/dist/lib/api/controllers/collectionController.d.ts +136 -0
- package/dist/lib/api/controllers/collectionController.js +356 -0
- package/dist/lib/api/controllers/documentController.d.ts +181 -0
- package/dist/lib/api/controllers/documentController.js +768 -0
- package/dist/lib/api/controllers/index.d.ts +12 -0
- package/{lib → dist/lib}/api/controllers/index.js +13 -14
- package/dist/lib/api/controllers/indexController.d.ts +65 -0
- package/dist/lib/api/controllers/indexController.js +139 -0
- package/dist/lib/api/controllers/memoryStorageController.d.ts +8 -0
- package/dist/lib/api/controllers/memoryStorageController.js +867 -0
- package/dist/lib/api/controllers/realtimeController.d.ts +47 -0
- package/dist/lib/api/controllers/realtimeController.js +128 -0
- package/dist/lib/api/controllers/securityController.d.ts +423 -0
- package/dist/lib/api/controllers/securityController.js +1139 -0
- package/dist/lib/api/controllers/serverController.d.ts +82 -0
- package/dist/lib/api/controllers/serverController.js +321 -0
- package/dist/lib/api/documentExtractor.d.ts +9 -0
- package/dist/lib/api/documentExtractor.js +274 -0
- package/dist/lib/api/funnel.d.ts +183 -0
- package/dist/lib/api/funnel.js +821 -0
- package/dist/lib/api/httpRoutes.d.ts +17 -0
- package/dist/lib/api/httpRoutes.js +1496 -0
- package/dist/lib/api/rateLimiter.d.ts +18 -0
- package/dist/lib/api/rateLimiter.js +74 -0
- package/{lib → dist/lib}/api/request/kuzzleRequest.d.ts +2 -2
- package/{lib → dist/lib}/api/request/requestContext.d.ts +2 -1
- package/dist/lib/cluster/command.d.ts +73 -0
- package/dist/lib/cluster/command.js +236 -0
- package/dist/lib/cluster/index.d.ts +2 -0
- package/{lib → dist/lib}/cluster/index.js +1 -2
- package/dist/lib/cluster/node.d.ts +278 -0
- package/dist/lib/cluster/node.js +876 -0
- package/dist/lib/cluster/publisher.d.ts +188 -0
- package/dist/lib/cluster/publisher.js +347 -0
- package/dist/lib/cluster/subscriber.d.ts +269 -0
- package/dist/lib/cluster/subscriber.js +555 -0
- package/dist/lib/cluster/workers/IDCardRenewer.d.ts +13 -0
- package/dist/lib/cluster/workers/IDCardRenewer.js +120 -0
- package/{lib → dist/lib}/config/documentEventAliases.d.ts +1 -2
- package/dist/lib/config/index.d.ts +5 -0
- package/dist/lib/config/index.js +244 -0
- package/dist/lib/config/sdkCompatibility.json +9 -0
- package/dist/lib/core/auth/formatProcessing.d.ts +30 -0
- package/dist/lib/core/auth/formatProcessing.js +55 -0
- package/dist/lib/core/auth/passportResponse.d.ts +15 -0
- package/{lib → dist/lib}/core/auth/passportResponse.js +24 -30
- package/dist/lib/core/auth/passportWrapper.d.ts +28 -0
- package/dist/lib/core/auth/passportWrapper.js +126 -0
- package/{lib → dist/lib}/core/backend/backendConfig.js +2 -2
- package/{lib → dist/lib}/core/backend/backendErrors.js +9 -12
- package/dist/lib/core/cache/cacheEngine.d.ts +15 -0
- package/dist/lib/core/cache/cacheEngine.js +205 -0
- package/dist/lib/core/network/accessLogger.d.ts +29 -0
- package/dist/lib/core/network/accessLogger.js +250 -0
- package/dist/lib/core/network/clientConnection.d.ts +15 -0
- package/{lib → dist/lib}/core/network/clientConnection.js +17 -24
- package/dist/lib/core/network/context.d.ts +42 -0
- package/dist/lib/core/network/context.js +57 -0
- package/dist/lib/core/network/entryPoint.d.ts +62 -0
- package/dist/lib/core/network/entryPoint.js +261 -0
- package/dist/lib/core/network/httpRouter/index.d.ts +85 -0
- package/dist/lib/core/network/httpRouter/index.js +258 -0
- package/dist/lib/core/network/httpRouter/routeHandler.d.ts +46 -0
- package/dist/lib/core/network/httpRouter/routeHandler.js +101 -0
- package/dist/lib/core/network/httpRouter/routePart.d.ts +35 -0
- package/dist/lib/core/network/httpRouter/routePart.js +117 -0
- package/dist/lib/core/network/protocolManifest.d.ts +6 -0
- package/{lib → dist/lib}/core/network/protocolManifest.js +5 -9
- package/dist/lib/core/network/protocols/httpMessage.d.ts +22 -0
- package/dist/lib/core/network/protocols/httpMessage.js +62 -0
- package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +171 -0
- package/dist/lib/core/network/protocols/httpwsProtocol.js +921 -0
- package/dist/lib/core/network/protocols/internalProtocol.d.ts +27 -0
- package/dist/lib/core/network/protocols/internalProtocol.js +82 -0
- package/dist/lib/core/network/protocols/mqttProtocol.d.ts +39 -0
- package/dist/lib/core/network/protocols/mqttProtocol.js +219 -0
- package/dist/lib/core/network/protocols/protocol.d.ts +26 -0
- package/dist/lib/core/network/protocols/protocol.js +74 -0
- package/dist/lib/core/network/router.d.ts +49 -0
- package/dist/lib/core/network/router.js +193 -0
- package/dist/lib/core/plugin/plugin.d.ts +56 -0
- package/dist/lib/core/plugin/plugin.js +282 -0
- package/{lib → dist/lib}/core/plugin/pluginContext.js +2 -2
- package/dist/lib/core/plugin/pluginManifest.d.ts +5 -0
- package/{lib → dist/lib}/core/plugin/pluginManifest.js +16 -27
- package/dist/lib/core/plugin/pluginRepository.d.ts +53 -0
- package/dist/lib/core/plugin/pluginRepository.js +112 -0
- package/dist/lib/core/plugin/pluginsManager.d.ts +190 -0
- package/dist/lib/core/plugin/pluginsManager.js +817 -0
- package/dist/lib/core/plugin/privilegedContext.d.ts +14 -0
- package/{lib → dist/lib}/core/plugin/privilegedContext.js +10 -14
- package/dist/lib/core/realtime/actionEnum.d.ts +25 -0
- package/{lib → dist/lib}/core/realtime/actionEnum.js +7 -10
- package/dist/lib/core/realtime/index.d.ts +8 -0
- package/{lib → dist/lib}/core/realtime/index.js +9 -13
- package/dist/lib/core/realtime/notification/document.d.ts +34 -0
- package/dist/lib/core/realtime/notification/document.js +98 -0
- package/dist/lib/core/realtime/notification/index.d.ts +3 -0
- package/{lib → dist/lib}/core/realtime/notification/index.js +4 -5
- package/dist/lib/core/realtime/notification/server.d.ts +17 -0
- package/{lib → dist/lib}/core/realtime/notification/server.js +8 -10
- package/dist/lib/core/realtime/notification/user.d.ts +29 -0
- package/dist/lib/core/realtime/notification/user.js +66 -0
- package/dist/lib/core/realtime/notifier.d.ts +171 -0
- package/dist/lib/core/realtime/notifier.js +405 -0
- package/dist/lib/core/security/index.d.ts +14 -0
- package/{lib → dist/lib}/core/security/index.js +15 -19
- package/dist/lib/core/security/roleRepository.d.ts +143 -0
- package/dist/lib/core/security/roleRepository.js +445 -0
- package/dist/lib/core/security/securityLoader.d.ts +24 -0
- package/dist/lib/core/security/securityLoader.js +125 -0
- package/{lib → dist/lib}/core/security/tokenRepository.js +1 -1
- package/dist/lib/core/security/userRepository.d.ts +81 -0
- package/dist/lib/core/security/userRepository.js +346 -0
- package/dist/lib/core/shared/abstractManifest.d.ts +27 -0
- package/dist/lib/core/shared/abstractManifest.js +85 -0
- package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +7 -0
- package/dist/lib/core/shared/sdk/impersonatedSdk.js +80 -0
- package/{lib → dist/lib}/core/shared/store.d.ts +2 -2
- package/dist/lib/core/statistics/statistics.d.ts +94 -0
- package/dist/lib/core/statistics/statistics.js +287 -0
- package/dist/lib/core/storage/clientAdapter.d.ts +62 -0
- package/dist/lib/core/storage/clientAdapter.js +756 -0
- package/dist/lib/core/storage/storageEngine.d.ts +13 -0
- package/dist/lib/core/storage/storageEngine.js +52 -0
- package/dist/lib/core/validation/baseType.d.ts +35 -0
- package/dist/lib/core/validation/baseType.js +70 -0
- package/dist/lib/core/validation/types/anything.d.ts +10 -0
- package/{lib → dist/lib}/core/validation/types/anything.js +7 -10
- package/dist/lib/core/validation/types/boolean.d.ts +16 -0
- package/{lib → dist/lib}/core/validation/types/boolean.js +18 -23
- package/dist/lib/core/validation/types/date.d.ts +17 -0
- package/dist/lib/core/validation/types/date.js +215 -0
- package/dist/lib/core/validation/types/email.d.ts +17 -0
- package/dist/lib/core/validation/types/email.js +80 -0
- package/dist/lib/core/validation/types/enum.d.ts +17 -0
- package/dist/lib/core/validation/types/enum.js +70 -0
- package/dist/lib/core/validation/types/geoPoint.d.ts +17 -0
- package/{lib → dist/lib}/core/validation/types/geoPoint.js +19 -24
- package/dist/lib/core/validation/types/geoShape.d.ts +31 -0
- package/dist/lib/core/validation/types/geoShape.js +280 -0
- package/dist/lib/core/validation/types/integer.d.ts +7 -0
- package/{lib → dist/lib}/core/validation/types/integer.js +21 -27
- package/dist/lib/core/validation/types/ipAddress.d.ts +17 -0
- package/dist/lib/core/validation/types/ipAddress.js +73 -0
- package/dist/lib/core/validation/types/numeric.d.ts +17 -0
- package/dist/lib/core/validation/types/numeric.js +84 -0
- package/dist/lib/core/validation/types/object.d.ts +24 -0
- package/dist/lib/core/validation/types/object.js +74 -0
- package/dist/lib/core/validation/types/string.d.ts +17 -0
- package/dist/lib/core/validation/types/string.js +85 -0
- package/dist/lib/core/validation/types/url.d.ts +17 -0
- package/dist/lib/core/validation/types/url.js +73 -0
- package/dist/lib/core/validation/validation.d.ts +113 -0
- package/dist/lib/core/validation/validation.js +692 -0
- package/dist/lib/kerror/codes/0-core.json +194 -0
- package/dist/lib/kerror/codes/1-services.json +351 -0
- package/dist/lib/kerror/codes/2-api.json +195 -0
- package/dist/lib/kerror/codes/3-network.json +151 -0
- package/dist/lib/kerror/codes/4-plugin.json +498 -0
- package/dist/lib/kerror/codes/5-validation.json +158 -0
- package/dist/lib/kerror/codes/6-protocol.json +28 -0
- package/dist/lib/kerror/codes/7-security.json +283 -0
- package/dist/lib/kerror/codes/8-cluster.json +16 -0
- package/dist/lib/kerror/codes/index.d.ts +24 -0
- package/dist/lib/kerror/codes/index.js +140 -0
- package/{lib → dist/lib}/kerror/index.d.ts +5 -5
- package/{lib → dist/lib}/kuzzle/Logger.d.ts +6 -0
- package/{lib → dist/lib}/kuzzle/Logger.js +26 -5
- package/dist/lib/kuzzle/dumpGenerator.d.ts +14 -0
- package/dist/lib/kuzzle/dumpGenerator.js +180 -0
- package/dist/lib/kuzzle/event/pipeRunner.d.ts +30 -0
- package/dist/lib/kuzzle/event/pipeRunner.js +119 -0
- package/dist/lib/kuzzle/event/waterfall.d.ts +2 -0
- package/dist/lib/kuzzle/event/waterfall.js +90 -0
- package/dist/lib/kuzzle/internalIndexHandler.d.ts +186 -0
- package/dist/lib/kuzzle/internalIndexHandler.js +174 -0
- package/{lib → dist/lib}/kuzzle/kuzzle.d.ts +6 -7
- package/{lib → dist/lib}/kuzzle/kuzzle.js +5 -2
- package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +20 -0
- package/{lib → dist/lib}/kuzzle/kuzzleStateEnum.js +5 -8
- package/dist/lib/kuzzle/vault.d.ts +2 -0
- package/dist/lib/kuzzle/vault.js +63 -0
- package/dist/lib/model/security/rights.d.ts +8 -0
- package/{lib → dist/lib}/model/security/rights.js +4 -8
- package/{lib → dist/lib}/model/security/role.d.ts +1 -1
- package/{lib → dist/lib}/model/security/user.d.ts +1 -0
- package/dist/lib/model/storage/apiKey.d.ts +49 -0
- package/dist/lib/model/storage/apiKey.js +126 -0
- package/dist/lib/model/storage/baseModel.d.ts +100 -0
- package/dist/lib/model/storage/baseModel.js +211 -0
- package/dist/lib/service/cache/redis.d.ts +74 -0
- package/dist/lib/service/cache/redis.js +237 -0
- package/dist/lib/service/service.d.ts +30 -0
- package/dist/lib/service/service.js +74 -0
- package/{lib → dist/lib}/service/storage/7/elasticsearch.d.ts +2 -2
- package/{lib → dist/lib}/service/storage/7/elasticsearch.js +23 -25
- package/dist/lib/service/storage/7/esWrapper.d.ts +19 -0
- package/dist/lib/service/storage/7/esWrapper.js +245 -0
- package/{lib → dist/lib}/service/storage/8/elasticsearch.js +23 -25
- package/dist/lib/service/storage/8/esWrapper.d.ts +19 -0
- package/dist/lib/service/storage/8/esWrapper.js +245 -0
- package/{lib → dist/lib}/types/Plugin.d.ts +1 -1
- package/{lib/types → dist/lib/types/controllers}/Controller.d.ts +2 -2
- package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.d.ts +1 -1
- package/dist/lib/types/controllers/adminControlller.type.d.ts +5 -0
- package/dist/lib/types/controllers/adminControlller.type.js +3 -0
- package/dist/lib/types/controllers/authController.type.d.ts +5 -0
- package/dist/lib/types/controllers/authController.type.js +3 -0
- package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -0
- package/dist/lib/types/core/auth/formatProcessing.type.js +3 -0
- package/{lib → dist/lib}/types/index.d.ts +3 -3
- package/{lib → dist/lib}/types/index.js +3 -3
- package/dist/lib/util/assertType.d.ts +41 -0
- package/{lib → dist/lib}/util/assertType.js +38 -56
- package/dist/lib/util/asyncStore.d.ts +38 -0
- package/dist/lib/util/asyncStore.js +70 -0
- package/dist/lib/util/bytes.d.ts +2 -0
- package/dist/lib/util/bytes.js +33 -0
- package/dist/lib/util/debug.d.ts +2 -0
- package/{lib → dist/lib}/util/debug.js +15 -23
- package/dist/lib/util/deprecate.d.ts +1 -0
- package/dist/lib/util/deprecate.js +64 -0
- package/dist/lib/util/didYouMean.d.ts +2 -0
- package/{lib → dist/lib}/util/didYouMean.js +9 -15
- package/dist/lib/util/extractFields.d.ts +17 -0
- package/{lib → dist/lib}/util/extractFields.js +18 -32
- package/dist/lib/util/memoize.d.ts +7 -0
- package/{lib → dist/lib}/util/memoize.js +14 -21
- package/dist/lib/util/promback.d.ts +13 -0
- package/dist/lib/util/promback.js +60 -0
- package/dist/lib/util/requestAssertions.d.ts +10 -0
- package/dist/lib/util/requestAssertions.js +143 -0
- package/dist/lib/util/safeObject.d.ts +3 -0
- package/{lib → dist/lib}/util/safeObject.js +7 -13
- package/dist/lib/util/stackTrace.d.ts +19 -0
- package/{lib → dist/lib}/util/stackTrace.js +35 -41
- package/dist/lib/util/wildcard.d.ts +1 -0
- package/{lib → dist/lib}/util/wildcard.js +21 -30
- package/dist/package.json +120 -0
- package/package.json +45 -58
- package/bin/start-kuzzle-server +0 -126
- package/check-node-version.js +0 -17
- package/lib/api/controllers/adminController.js +0 -229
- package/lib/api/controllers/bulkController.js +0 -210
- package/lib/api/controllers/collectionController.js +0 -502
- package/lib/api/controllers/documentController.js +0 -1156
- package/lib/api/controllers/indexController.js +0 -179
- package/lib/api/controllers/memoryStorageController.js +0 -1023
- package/lib/api/controllers/realtimeController.js +0 -155
- package/lib/api/controllers/securityController.js +0 -1571
- package/lib/api/controllers/serverController.js +0 -381
- package/lib/api/documentExtractor.js +0 -309
- package/lib/api/funnel.js +0 -1143
- package/lib/api/httpRoutes.js +0 -1547
- package/lib/api/rateLimiter.js +0 -87
- package/lib/cluster/command.js +0 -284
- package/lib/cluster/node.js +0 -1203
- package/lib/cluster/publisher.js +0 -386
- package/lib/cluster/subscriber.js +0 -776
- package/lib/cluster/workers/IDCardRenewer.js +0 -144
- package/lib/config/index.js +0 -351
- package/lib/config/sdkCompatibility.json +0 -9
- package/lib/core/auth/formatProcessing.js +0 -66
- package/lib/core/auth/passportWrapper.js +0 -126
- package/lib/core/cache/cacheEngine.js +0 -278
- package/lib/core/network/accessLogger.js +0 -322
- package/lib/core/network/context.js +0 -80
- package/lib/core/network/entryPoint.js +0 -358
- package/lib/core/network/httpRouter/index.js +0 -316
- package/lib/core/network/httpRouter/routeHandler.js +0 -111
- package/lib/core/network/httpRouter/routePart.js +0 -147
- package/lib/core/network/protocols/httpMessage.js +0 -69
- package/lib/core/network/protocols/httpwsProtocol.js +0 -1254
- package/lib/core/network/protocols/internalProtocol.js +0 -109
- package/lib/core/network/protocols/mqttProtocol.js +0 -291
- package/lib/core/network/protocols/protocol.js +0 -102
- package/lib/core/network/router.js +0 -255
- package/lib/core/plugin/plugin.js +0 -436
- package/lib/core/plugin/pluginRepository.js +0 -132
- package/lib/core/plugin/pluginsManager.js +0 -1244
- package/lib/core/realtime/notification/document.js +0 -108
- package/lib/core/realtime/notification/user.js +0 -70
- package/lib/core/realtime/notifier.js +0 -541
- package/lib/core/security/README.md +0 -223
- package/lib/core/security/roleRepository.js +0 -569
- package/lib/core/security/securityLoader.js +0 -174
- package/lib/core/security/userRepository.js +0 -446
- package/lib/core/shared/README.md +0 -3
- package/lib/core/shared/abstractManifest.js +0 -102
- package/lib/core/shared/sdk/impersonatedSdk.js +0 -94
- package/lib/core/statistics/index.js +0 -24
- package/lib/core/statistics/statistics.js +0 -373
- package/lib/core/storage/clientAdapter.js +0 -1045
- package/lib/core/storage/storageEngine.js +0 -63
- package/lib/core/validation/baseType.js +0 -80
- package/lib/core/validation/index.js +0 -24
- package/lib/core/validation/types/date.js +0 -284
- package/lib/core/validation/types/email.js +0 -92
- package/lib/core/validation/types/enum.js +0 -100
- package/lib/core/validation/types/geoShape.js +0 -370
- package/lib/core/validation/types/ipAddress.js +0 -83
- package/lib/core/validation/types/numeric.js +0 -108
- package/lib/core/validation/types/object.js +0 -88
- package/lib/core/validation/types/string.js +0 -110
- package/lib/core/validation/types/url.js +0 -83
- package/lib/core/validation/validation.js +0 -1180
- package/lib/kerror/codes/0-core.json +0 -194
- package/lib/kerror/codes/1-services.json +0 -351
- package/lib/kerror/codes/2-api.json +0 -195
- package/lib/kerror/codes/3-network.json +0 -151
- package/lib/kerror/codes/4-plugin.json +0 -498
- package/lib/kerror/codes/5-validation.json +0 -158
- package/lib/kerror/codes/6-protocol.json +0 -28
- package/lib/kerror/codes/7-security.json +0 -283
- package/lib/kerror/codes/8-cluster.json +0 -16
- package/lib/kerror/codes/index.js +0 -208
- package/lib/kuzzle/dumpGenerator.js +0 -259
- package/lib/kuzzle/event/pipeRunner.js +0 -144
- package/lib/kuzzle/event/waterfall.js +0 -101
- package/lib/kuzzle/internalIndexHandler.js +0 -234
- package/lib/kuzzle/vault.js +0 -89
- package/lib/model/storage/apiKey.js +0 -158
- package/lib/model/storage/baseModel.js +0 -275
- package/lib/service/cache/redis.js +0 -282
- package/lib/service/service.js +0 -84
- package/lib/service/storage/7/esWrapper.js +0 -303
- package/lib/service/storage/8/esWrapper.js +0 -303
- package/lib/util/asyncStore.js +0 -112
- package/lib/util/bytes.js +0 -36
- package/lib/util/deprecate.js +0 -82
- package/lib/util/promback.js +0 -66
- package/lib/util/readYamlFile.d.ts +0 -2
- package/lib/util/readYamlFile.js +0 -10
- package/lib/util/requestAssertions.js +0 -157
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{index.js → dist/index.js} +0 -0
- /package/{lib → dist/lib}/api/controllers/baseController.d.ts +0 -0
- /package/{lib → dist/lib}/api/controllers/baseController.js +0 -0
- /package/{lib → dist/lib}/api/controllers/debugController.d.ts +0 -0
- /package/{lib → dist/lib}/api/controllers/debugController.js +0 -0
- /package/{lib → dist/lib}/api/openapi/OpenApiManager.d.ts +0 -0
- /package/{lib → dist/lib}/api/openapi/OpenApiManager.js +0 -0
- /package/{lib → dist/lib}/api/openapi/index.d.ts +0 -0
- /package/{lib → dist/lib}/api/openapi/index.js +0 -0
- /package/{lib → dist/lib}/api/openapi/openApiGenerator.d.ts +0 -0
- /package/{lib → dist/lib}/api/openapi/openApiGenerator.js +0 -0
- /package/{lib → dist/lib}/api/request/index.d.ts +0 -0
- /package/{lib → dist/lib}/api/request/index.js +0 -0
- /package/{lib → dist/lib}/api/request/kuzzleRequest.js +0 -0
- /package/{lib → dist/lib}/api/request/requestContext.js +0 -0
- /package/{lib → dist/lib}/api/request/requestInput.d.ts +0 -0
- /package/{lib → dist/lib}/api/request/requestInput.js +0 -0
- /package/{lib → dist/lib}/api/request/requestResponse.d.ts +0 -0
- /package/{lib → dist/lib}/api/request/requestResponse.js +0 -0
- /package/{lib → dist/lib}/cluster/idCardHandler.d.ts +0 -0
- /package/{lib → dist/lib}/cluster/idCardHandler.js +0 -0
- /package/{lib → dist/lib}/cluster/protobuf/command.proto +0 -0
- /package/{lib → dist/lib}/cluster/protobuf/sync.proto +0 -0
- /package/{lib → dist/lib}/cluster/state.d.ts +0 -0
- /package/{lib → dist/lib}/cluster/state.js +0 -0
- /package/{lib → dist/lib}/config/default.config.d.ts +0 -0
- /package/{lib → dist/lib}/config/default.config.js +0 -0
- /package/{lib → dist/lib}/config/documentEventAliases.js +0 -0
- /package/{lib → dist/lib}/core/auth/tokenManager.d.ts +0 -0
- /package/{lib → dist/lib}/core/auth/tokenManager.js +0 -0
- /package/{lib → dist/lib}/core/backend/applicationManager.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/applicationManager.js +0 -0
- /package/{lib → dist/lib}/core/backend/backend.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backend.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendCluster.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendCluster.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendConfig.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendController.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendController.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendErrors.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendHook.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendHook.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendImport.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendImport.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendOpenApi.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendOpenApi.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendPipe.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendPipe.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendPlugin.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendPlugin.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendStorage.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendStorage.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendSubscription.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendSubscription.js +0 -0
- /package/{lib → dist/lib}/core/backend/backendVault.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/backendVault.js +0 -0
- /package/{lib → dist/lib}/core/backend/index.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/index.js +0 -0
- /package/{lib → dist/lib}/core/backend/internalLogger.d.ts +0 -0
- /package/{lib → dist/lib}/core/backend/internalLogger.js +0 -0
- /package/{lib → dist/lib}/core/cache/cacheDbEnum.d.ts +0 -0
- /package/{lib → dist/lib}/core/cache/cacheDbEnum.js +0 -0
- /package/{lib → dist/lib}/core/debug/kuzzleDebugger.d.ts +0 -0
- /package/{lib → dist/lib}/core/debug/kuzzleDebugger.js +0 -0
- /package/{lib → dist/lib}/core/plugin/pluginContext.d.ts +0 -0
- /package/{lib → dist/lib}/core/realtime/channel.d.ts +0 -0
- /package/{lib → dist/lib}/core/realtime/channel.js +0 -0
- /package/{lib → dist/lib}/core/realtime/connectionRooms.d.ts +0 -0
- /package/{lib → dist/lib}/core/realtime/connectionRooms.js +0 -0
- /package/{lib → dist/lib}/core/realtime/hotelClerk.d.ts +0 -0
- /package/{lib → dist/lib}/core/realtime/hotelClerk.js +0 -0
- /package/{lib → dist/lib}/core/realtime/room.d.ts +0 -0
- /package/{lib → dist/lib}/core/realtime/room.js +0 -0
- /package/{lib → dist/lib}/core/realtime/subscription.d.ts +0 -0
- /package/{lib → dist/lib}/core/realtime/subscription.js +0 -0
- /package/{lib → dist/lib}/core/security/profileRepository.d.ts +0 -0
- /package/{lib → dist/lib}/core/security/profileRepository.js +0 -0
- /package/{lib → dist/lib}/core/security/tokenRepository.d.ts +0 -0
- /package/{lib → dist/lib}/core/shared/KoncordeWrapper.d.ts +0 -0
- /package/{lib → dist/lib}/core/shared/KoncordeWrapper.js +0 -0
- /package/{lib → dist/lib}/core/shared/ObjectRepository.d.ts +0 -0
- /package/{lib → dist/lib}/core/shared/ObjectRepository.js +0 -0
- /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.d.ts +0 -0
- /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.js +0 -0
- /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.d.ts +0 -0
- /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.js +0 -0
- /package/{lib → dist/lib}/core/shared/store.js +0 -0
- /package/{lib → dist/lib}/core/storage/indexCache.d.ts +0 -0
- /package/{lib → dist/lib}/core/storage/indexCache.js +0 -0
- /package/{lib → dist/lib}/core/storage/storeScopeEnum.d.ts +0 -0
- /package/{lib → dist/lib}/core/storage/storeScopeEnum.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/badRequestError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/badRequestError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/externalServiceError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/externalServiceError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/forbiddenError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/forbiddenError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/index.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/index.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/internalError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/internalError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/kuzzleError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/kuzzleError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/notFoundError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/notFoundError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/partialError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/partialError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/preconditionError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/preconditionError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/sizeLimitError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/sizeLimitError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.js +0 -0
- /package/{lib → dist/lib}/kerror/errors/unauthorizedError.d.ts +0 -0
- /package/{lib → dist/lib}/kerror/errors/unauthorizedError.js +0 -0
- /package/{lib → dist/lib}/kerror/index.js +0 -0
- /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.d.ts +0 -0
- /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.js +0 -0
- /package/{lib → dist/lib}/kuzzle/index.d.ts +0 -0
- /package/{lib → dist/lib}/kuzzle/index.js +0 -0
- /package/{lib → dist/lib}/model/security/profile.d.ts +0 -0
- /package/{lib → dist/lib}/model/security/profile.js +0 -0
- /package/{lib → dist/lib}/model/security/role.js +0 -0
- /package/{lib → dist/lib}/model/security/token.d.ts +0 -0
- /package/{lib → dist/lib}/model/security/token.js +0 -0
- /package/{lib → dist/lib}/model/security/user.js +0 -0
- /package/{lib → dist/lib}/service/storage/8/elasticsearch.d.ts +0 -0
- /package/{lib → dist/lib}/service/storage/Elasticsearch.d.ts +0 -0
- /package/{lib → dist/lib}/service/storage/Elasticsearch.js +0 -0
- /package/{lib → dist/lib}/service/storage/commons/queryTranslator.d.ts +0 -0
- /package/{lib → dist/lib}/service/storage/commons/queryTranslator.js +0 -0
- /package/{lib → dist/lib}/types/ClientConnection.d.ts +0 -0
- /package/{lib → dist/lib}/types/ClientConnection.js +0 -0
- /package/{lib → dist/lib}/types/Deprecation.d.ts +0 -0
- /package/{lib → dist/lib}/types/Deprecation.js +0 -0
- /package/{lib → dist/lib}/types/EventHandler.d.ts +0 -0
- /package/{lib → dist/lib}/types/EventHandler.js +0 -0
- /package/{lib → dist/lib}/types/Global.d.ts +0 -0
- /package/{lib → dist/lib}/types/Global.js +0 -0
- /package/{lib → dist/lib}/types/HttpMessage.d.ts +0 -0
- /package/{lib → dist/lib}/types/HttpMessage.js +0 -0
- /package/{lib → dist/lib}/types/HttpStream.d.ts +0 -0
- /package/{lib → dist/lib}/types/HttpStream.js +0 -0
- /package/{lib → dist/lib}/types/Kuzzle.d.ts +0 -0
- /package/{lib → dist/lib}/types/Kuzzle.js +0 -0
- /package/{lib → dist/lib}/types/KuzzleDocument.d.ts +0 -0
- /package/{lib → dist/lib}/types/KuzzleDocument.js +0 -0
- /package/{lib → dist/lib}/types/OpenApiDefinition.d.ts +0 -0
- /package/{lib → dist/lib}/types/OpenApiDefinition.js +0 -0
- /package/{lib → dist/lib}/types/PasswordPolicy.d.ts +0 -0
- /package/{lib → dist/lib}/types/PasswordPolicy.js +0 -0
- /package/{lib → dist/lib}/types/Plugin.js +0 -0
- /package/{lib → dist/lib}/types/PluginManifest.d.ts +0 -0
- /package/{lib → dist/lib}/types/PluginManifest.js +0 -0
- /package/{lib → dist/lib}/types/Policy.d.ts +0 -0
- /package/{lib → dist/lib}/types/Policy.js +0 -0
- /package/{lib → dist/lib}/types/PolicyRestrictions.d.ts +0 -0
- /package/{lib → dist/lib}/types/PolicyRestrictions.js +0 -0
- /package/{lib → dist/lib}/types/ProfileDefinition.d.ts +0 -0
- /package/{lib → dist/lib}/types/ProfileDefinition.js +0 -0
- /package/{lib → dist/lib}/types/RoleDefinition.d.ts +0 -0
- /package/{lib → dist/lib}/types/RoleDefinition.js +0 -0
- /package/{lib → dist/lib}/types/StrategyDefinition.d.ts +0 -0
- /package/{lib → dist/lib}/types/StrategyDefinition.js +0 -0
- /package/{lib → dist/lib}/types/Target.d.ts +0 -0
- /package/{lib → dist/lib}/types/Target.js +0 -0
- /package/{lib → dist/lib}/types/Token.d.ts +0 -0
- /package/{lib → dist/lib}/types/Token.js +0 -0
- /package/{lib → dist/lib}/types/User.d.ts +0 -0
- /package/{lib → dist/lib}/types/User.js +0 -0
- /package/{lib → dist/lib}/types/config/DumpConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/DumpConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/HttpConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/HttpConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/KuzzleConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/KuzzleConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/LimitsConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/LimitsConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/PluginsConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/PluginsConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/SecurityConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/SecurityConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/ServerConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/ServerConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/ServicesConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/ServicesConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.js +0 -0
- /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +0 -0
- /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.js +0 -0
- /package/{lib/types → dist/lib/types/controllers}/Controller.js +0 -0
- /package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.js +0 -0
- /package/{lib/types → dist/lib/types/controllers}/ControllerRights.d.ts +0 -0
- /package/{lib/types → dist/lib/types/controllers}/ControllerRights.js +0 -0
- /package/{lib → dist/lib}/types/errors/ErrorDefinition.d.ts +0 -0
- /package/{lib → dist/lib}/types/errors/ErrorDefinition.js +0 -0
- /package/{lib → dist/lib}/types/errors/ErrorDomains.d.ts +0 -0
- /package/{lib → dist/lib}/types/errors/ErrorDomains.js +0 -0
- /package/{lib → dist/lib}/types/events/EventGenericDocument.d.ts +0 -0
- /package/{lib → dist/lib}/types/events/EventGenericDocument.js +0 -0
- /package/{lib → dist/lib}/types/events/EventProtocol.d.ts +0 -0
- /package/{lib → dist/lib}/types/events/EventProtocol.js +0 -0
- /package/{lib → dist/lib}/types/realtime/RealtimeScope.d.ts +0 -0
- /package/{lib → dist/lib}/types/realtime/RealtimeScope.js +0 -0
- /package/{lib → dist/lib}/types/realtime/RealtimeUsers.d.ts +0 -0
- /package/{lib → dist/lib}/types/realtime/RealtimeUsers.js +0 -0
- /package/{lib → dist/lib}/types/realtime/RoomList.d.ts +0 -0
- /package/{lib → dist/lib}/types/realtime/RoomList.js +0 -0
- /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.d.ts +0 -0
- /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.js +0 -0
- /package/{lib → dist/lib}/types/storage/7/Elasticsearch.d.ts +0 -0
- /package/{lib → dist/lib}/types/storage/7/Elasticsearch.js +0 -0
- /package/{lib → dist/lib}/types/storage/8/Elasticsearch.d.ts +0 -0
- /package/{lib → dist/lib}/types/storage/8/Elasticsearch.js +0 -0
- /package/{lib → dist/lib}/util/Inflector.d.ts +0 -0
- /package/{lib → dist/lib}/util/Inflector.js +0 -0
- /package/{lib → dist/lib}/util/array.d.ts +0 -0
- /package/{lib → dist/lib}/util/array.js +0 -0
- /package/{lib → dist/lib}/util/async.d.ts +0 -0
- /package/{lib → dist/lib}/util/async.js +0 -0
- /package/{lib → dist/lib}/util/bufferedPassThrough.d.ts +0 -0
- /package/{lib → dist/lib}/util/bufferedPassThrough.js +0 -0
- /package/{lib → dist/lib}/util/crypto.d.ts +0 -0
- /package/{lib → dist/lib}/util/crypto.js +0 -0
- /package/{lib → dist/lib}/util/dump-collection.d.ts +0 -0
- /package/{lib → dist/lib}/util/dump-collection.js +0 -0
- /package/{lib → dist/lib}/util/esRequest.d.ts +0 -0
- /package/{lib → dist/lib}/util/esRequest.js +0 -0
- /package/{lib → dist/lib}/util/koncordeCompat.d.ts +0 -0
- /package/{lib → dist/lib}/util/koncordeCompat.js +0 -0
- /package/{lib → dist/lib}/util/mutex.d.ts +0 -0
- /package/{lib → dist/lib}/util/mutex.js +0 -0
- /package/{lib → dist/lib}/util/name-generator.d.ts +0 -0
- /package/{lib → dist/lib}/util/name-generator.js +0 -0
- /package/{lib → dist/lib}/util/time.d.ts +0 -0
- /package/{lib → dist/lib}/util/time.js +0 -0
|
@@ -0,0 +1,1139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
/*
|
|
30
|
+
* Kuzzle, a backend software, self-hostable and ready to use
|
|
31
|
+
* to power modern apps
|
|
32
|
+
*
|
|
33
|
+
* Copyright 2015-2022 Kuzzle
|
|
34
|
+
* mailto: support AT kuzzle.io
|
|
35
|
+
* website: http://kuzzle.io
|
|
36
|
+
*
|
|
37
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
38
|
+
* you may not use this file except in compliance with the License.
|
|
39
|
+
* You may obtain a copy of the License at
|
|
40
|
+
*
|
|
41
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
42
|
+
*
|
|
43
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
44
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
45
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
46
|
+
* See the License for the specific language governing permissions and
|
|
47
|
+
* limitations under the License.
|
|
48
|
+
*/
|
|
49
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
50
|
+
const lodash_1 = require("lodash");
|
|
51
|
+
const uuid_1 = require("uuid");
|
|
52
|
+
const errors_1 = require("../../kerror/errors");
|
|
53
|
+
const request_1 = require("../request");
|
|
54
|
+
const baseController_1 = require("./baseController");
|
|
55
|
+
const formatProcessing_1 = __importDefault(require("../../core/auth/formatProcessing"));
|
|
56
|
+
const apiKey_1 = __importDefault(require("../../model/storage/apiKey"));
|
|
57
|
+
const kerror = __importStar(require("../../kerror"));
|
|
58
|
+
const safeObject_1 = require("../../util/safeObject");
|
|
59
|
+
const name_generator_1 = require("../../util/name-generator");
|
|
60
|
+
/**
|
|
61
|
+
* @class SecurityController
|
|
62
|
+
*/
|
|
63
|
+
class SecurityController extends baseController_1.NativeController {
|
|
64
|
+
static userOrSdk(userId) {
|
|
65
|
+
return userId === null ? "EmbeddedSDK" : `User "${userId}"`;
|
|
66
|
+
}
|
|
67
|
+
constructor() {
|
|
68
|
+
super([
|
|
69
|
+
"checkRights",
|
|
70
|
+
"createApiKey",
|
|
71
|
+
"createCredentials",
|
|
72
|
+
"createFirstAdmin",
|
|
73
|
+
"createOrReplaceProfile",
|
|
74
|
+
"createOrReplaceRole",
|
|
75
|
+
"createProfile",
|
|
76
|
+
"createRestrictedUser",
|
|
77
|
+
"createRole",
|
|
78
|
+
"createUser",
|
|
79
|
+
"deleteApiKey",
|
|
80
|
+
"deleteCredentials",
|
|
81
|
+
"deleteProfile",
|
|
82
|
+
"deleteRole",
|
|
83
|
+
"deleteUser",
|
|
84
|
+
"getAllCredentialFields",
|
|
85
|
+
"getCredentialFields",
|
|
86
|
+
"getCredentials",
|
|
87
|
+
"getCredentialsById",
|
|
88
|
+
"getProfile",
|
|
89
|
+
"getProfileMapping",
|
|
90
|
+
"getProfileRights",
|
|
91
|
+
"getRole",
|
|
92
|
+
"getRoleMapping",
|
|
93
|
+
"getUser",
|
|
94
|
+
"getUserMapping",
|
|
95
|
+
"getUserRights",
|
|
96
|
+
"getUserStrategies",
|
|
97
|
+
"hasCredentials",
|
|
98
|
+
"mDeleteProfiles",
|
|
99
|
+
"mDeleteRoles",
|
|
100
|
+
"mDeleteUsers",
|
|
101
|
+
"mGetProfiles",
|
|
102
|
+
"mGetRoles",
|
|
103
|
+
"mGetUsers",
|
|
104
|
+
"refresh",
|
|
105
|
+
"replaceUser",
|
|
106
|
+
"revokeTokens",
|
|
107
|
+
"scrollProfiles",
|
|
108
|
+
"scrollUsers",
|
|
109
|
+
"searchApiKeys",
|
|
110
|
+
"searchProfiles",
|
|
111
|
+
"searchRoles",
|
|
112
|
+
"searchUsers",
|
|
113
|
+
"searchUsersByCredentials",
|
|
114
|
+
"updateCredentials",
|
|
115
|
+
"updateProfile",
|
|
116
|
+
"updateProfileMapping",
|
|
117
|
+
"updateRole",
|
|
118
|
+
"updateRoleMapping",
|
|
119
|
+
"updateUser",
|
|
120
|
+
"updateUserMapping",
|
|
121
|
+
"upsertUser",
|
|
122
|
+
"validateCredentials",
|
|
123
|
+
]);
|
|
124
|
+
this.anonymousId = null;
|
|
125
|
+
this.subdomain = "security";
|
|
126
|
+
this.securityCollections = ["users", "profiles", "roles"];
|
|
127
|
+
// @deprecated - helper, will be loosely coupled in the near future
|
|
128
|
+
this.getStrategyMethod =
|
|
129
|
+
global.kuzzle.pluginsManager.getStrategyMethod.bind(global.kuzzle.pluginsManager);
|
|
130
|
+
this.logger = global.kuzzle.log.child("api:controllers:security");
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Checks if an API action can be executed by a user
|
|
134
|
+
*/
|
|
135
|
+
async checkRights(request) {
|
|
136
|
+
const userId = request.getString("userId");
|
|
137
|
+
const requestPayload = request.getBody();
|
|
138
|
+
if (typeof requestPayload.controller !== "string") {
|
|
139
|
+
throw kerror.get("api", "assert", "missing_argument", "body.controller");
|
|
140
|
+
}
|
|
141
|
+
if (typeof requestPayload.action !== "string") {
|
|
142
|
+
throw kerror.get("api", "assert", "missing_argument", "body.action");
|
|
143
|
+
}
|
|
144
|
+
const user = await global.kuzzle.ask("core:security:user:get", userId);
|
|
145
|
+
const allowed = await user.isActionAllowed(new request_1.Request(requestPayload));
|
|
146
|
+
return {
|
|
147
|
+
allowed,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Creates a new API key for a user
|
|
152
|
+
*/
|
|
153
|
+
async createApiKey(request) {
|
|
154
|
+
const expiresIn = request.input.args.expiresIn || -1;
|
|
155
|
+
const refresh = request.getRefresh("wait_for");
|
|
156
|
+
const userId = request.getString("userId");
|
|
157
|
+
const apiKeyId = request.getId({ ifMissing: "generate" });
|
|
158
|
+
const description = request.getBodyString("description");
|
|
159
|
+
const user = await this.ask("core:security:user:get", userId);
|
|
160
|
+
const creatorId = request.getKuid();
|
|
161
|
+
const apiKey = await apiKey_1.default.create(user, expiresIn, description, {
|
|
162
|
+
apiKeyId,
|
|
163
|
+
bypassMaxTTL: true,
|
|
164
|
+
creatorId,
|
|
165
|
+
refresh,
|
|
166
|
+
});
|
|
167
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(creatorId)} applied action "${request.input.action}" on user "${userId}."`);
|
|
168
|
+
return apiKey.serialize({ includeToken: true });
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Search in an user API keys
|
|
172
|
+
*/
|
|
173
|
+
async searchApiKeys(request) {
|
|
174
|
+
const userId = request.getString("userId");
|
|
175
|
+
let query = request.getBody({});
|
|
176
|
+
const { from, size, scrollTTL } = request.getSearchParams();
|
|
177
|
+
const lang = request.getLangParam();
|
|
178
|
+
if (lang === "koncorde") {
|
|
179
|
+
query = await this.translateKoncorde(query);
|
|
180
|
+
}
|
|
181
|
+
const searchBody = {
|
|
182
|
+
query: {
|
|
183
|
+
bool: {
|
|
184
|
+
filter: { bool: { must: { term: { userId } } } },
|
|
185
|
+
must: (0, lodash_1.isEmpty)(query) ? { match_all: {} } : query,
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
const apiKeys = await apiKey_1.default.search(searchBody, {
|
|
190
|
+
from,
|
|
191
|
+
scroll: scrollTTL,
|
|
192
|
+
size,
|
|
193
|
+
});
|
|
194
|
+
return {
|
|
195
|
+
hits: apiKeys.map((apiKey) => apiKey.serialize()),
|
|
196
|
+
total: apiKeys.length,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Deletes an user API key
|
|
201
|
+
*/
|
|
202
|
+
async deleteApiKey(request) {
|
|
203
|
+
const userId = request.getString("userId");
|
|
204
|
+
const apiKeyId = request.getId();
|
|
205
|
+
const refresh = request.getRefresh("wait_for");
|
|
206
|
+
const apiKey = await apiKey_1.default.load(userId, apiKeyId);
|
|
207
|
+
await apiKey.delete({ refresh });
|
|
208
|
+
return {
|
|
209
|
+
_id: apiKeyId,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get the role mapping
|
|
214
|
+
*
|
|
215
|
+
* @returns {Promise}
|
|
216
|
+
*/
|
|
217
|
+
async getRoleMapping() {
|
|
218
|
+
const { properties } = await global.kuzzle.internalIndex.getMapping("roles");
|
|
219
|
+
return { mapping: properties };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Update the roles collection mapping
|
|
223
|
+
* @param {Request} request
|
|
224
|
+
* @returns {Promise}
|
|
225
|
+
*/
|
|
226
|
+
async updateRoleMapping(request) {
|
|
227
|
+
const mappings = request.getBody();
|
|
228
|
+
return global.kuzzle.internalIndex.updateMapping("roles", mappings);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get the profile mapping
|
|
232
|
+
*
|
|
233
|
+
* @returns {Promise}
|
|
234
|
+
*/
|
|
235
|
+
async getProfileMapping() {
|
|
236
|
+
const { properties } = await global.kuzzle.internalIndex.getMapping("profiles");
|
|
237
|
+
return { mapping: properties };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Update the profiles collection mapping
|
|
241
|
+
|
|
242
|
+
* @param {Request} request
|
|
243
|
+
* @returns {Promise}
|
|
244
|
+
*/
|
|
245
|
+
updateProfileMapping(request) {
|
|
246
|
+
const mappings = request.getBody();
|
|
247
|
+
return global.kuzzle.internalIndex.updateMapping("profiles", mappings);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get the user mapping
|
|
251
|
+
*
|
|
252
|
+
* @returns {Promise}
|
|
253
|
+
*/
|
|
254
|
+
async getUserMapping() {
|
|
255
|
+
const { properties } = await global.kuzzle.internalIndex.getMapping("users");
|
|
256
|
+
return { mapping: properties };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Update the users collection mapping
|
|
260
|
+
|
|
261
|
+
* @param {Request} request
|
|
262
|
+
* @returns {Promise}
|
|
263
|
+
*/
|
|
264
|
+
async updateUserMapping(request) {
|
|
265
|
+
const mappings = request.getBody();
|
|
266
|
+
return global.kuzzle.internalIndex.updateMapping("users", mappings);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get a specific role according to the given id
|
|
270
|
+
*
|
|
271
|
+
* @param {Request} request
|
|
272
|
+
* @returns {Promise<Object>}
|
|
273
|
+
*/
|
|
274
|
+
async getRole(request) {
|
|
275
|
+
const id = request.getId();
|
|
276
|
+
const role = await this.ask("core:security:role:get", id);
|
|
277
|
+
return formatProcessing_1.default.serializeRole(role);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get specific roles according to given ids
|
|
281
|
+
*
|
|
282
|
+
* @param {Request} request
|
|
283
|
+
* @returns {Promise<Object>}
|
|
284
|
+
*/
|
|
285
|
+
async mGetRoles(request) {
|
|
286
|
+
const ids = request.getBodyArray("ids");
|
|
287
|
+
const roles = await this.ask("core:security:role:mGet", ids);
|
|
288
|
+
return { hits: roles.map(formatProcessing_1.default.serializeRole) };
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Refresh a security collection (users, roles, profiles)
|
|
292
|
+
*
|
|
293
|
+
* @param {Request} request
|
|
294
|
+
* @returns {Promise}
|
|
295
|
+
*/
|
|
296
|
+
async refresh(request) {
|
|
297
|
+
const collection = request.getCollection();
|
|
298
|
+
if (!this.securityCollections.includes(collection)) {
|
|
299
|
+
throw kerror.get("api", "assert", "unexpected_argument", collection, this.securityCollections);
|
|
300
|
+
}
|
|
301
|
+
await global.kuzzle.internalIndex.refreshCollection(collection);
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Search for roles
|
|
306
|
+
*
|
|
307
|
+
* @param {Request} request
|
|
308
|
+
* @returns {Promise<Object>}
|
|
309
|
+
*/
|
|
310
|
+
async searchRoles(request) {
|
|
311
|
+
const from = request.getInteger("from", 0);
|
|
312
|
+
const size = this._getSearchPageSize(request);
|
|
313
|
+
const lang = request.getLangParam();
|
|
314
|
+
const body = request.getBody({});
|
|
315
|
+
if (body.controllers && body.query) {
|
|
316
|
+
throw new errors_1.BadRequestError('You cannot specifify both "controllers" and "query". Prefer the usage of "query" property with a search query.');
|
|
317
|
+
}
|
|
318
|
+
if (body.controllers) {
|
|
319
|
+
// Type checking
|
|
320
|
+
request.getBodyArray("controllers");
|
|
321
|
+
}
|
|
322
|
+
if (lang === "koncorde") {
|
|
323
|
+
body.query = await this.translateKoncorde(body.query || {});
|
|
324
|
+
}
|
|
325
|
+
const response = await this.ask("core:security:role:search", body, {
|
|
326
|
+
from,
|
|
327
|
+
size,
|
|
328
|
+
});
|
|
329
|
+
response.hits = response.hits.map(formatProcessing_1.default.serializeRole);
|
|
330
|
+
return response;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Create or replace a Role
|
|
334
|
+
*
|
|
335
|
+
* @param {Request} request
|
|
336
|
+
* @returns {Promise<Object>}
|
|
337
|
+
*/
|
|
338
|
+
async createOrReplaceRole(request) {
|
|
339
|
+
const id = request.getId();
|
|
340
|
+
const body = request.getBody();
|
|
341
|
+
const userId = request.getKuid();
|
|
342
|
+
const role = await this.ask("core:security:role:createOrReplace", id, body, {
|
|
343
|
+
force: request.getBoolean("force"),
|
|
344
|
+
refresh: request.getRefresh("wait_for"),
|
|
345
|
+
userId,
|
|
346
|
+
});
|
|
347
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on role "${role._id}."`);
|
|
348
|
+
return formatProcessing_1.default.serializeRole(role);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Create a Role
|
|
352
|
+
*
|
|
353
|
+
* @param {Request} request
|
|
354
|
+
* @returns {Promise<Object>}
|
|
355
|
+
*/
|
|
356
|
+
async createRole(request) {
|
|
357
|
+
const id = request.getId();
|
|
358
|
+
const body = request.getBody();
|
|
359
|
+
const userId = request.getKuid();
|
|
360
|
+
const role = await this.ask("core:security:role:create", id, body, {
|
|
361
|
+
force: request.getBoolean("force"),
|
|
362
|
+
refresh: request.getRefresh("wait_for"),
|
|
363
|
+
userId,
|
|
364
|
+
});
|
|
365
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on role "${role._id}."`);
|
|
366
|
+
return formatProcessing_1.default.serializeRole(role);
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Remove a role according to the given id
|
|
370
|
+
*
|
|
371
|
+
* @param {Request} request
|
|
372
|
+
* @returns {Promise<Object>}
|
|
373
|
+
*/
|
|
374
|
+
async deleteRole(request) {
|
|
375
|
+
const id = request.getId();
|
|
376
|
+
await this.ask("core:security:role:delete", id, {
|
|
377
|
+
refresh: request.getRefresh("wait_for"),
|
|
378
|
+
});
|
|
379
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} applied action "${request.input.action} on role "${id}."`);
|
|
380
|
+
// @todo This avoids a breaking change... but we should really return
|
|
381
|
+
// an acknowledgment.
|
|
382
|
+
return { _id: id };
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Get a specific profile according to the given id
|
|
386
|
+
*
|
|
387
|
+
* @param {Request} request
|
|
388
|
+
* @returns {Promise<Object>}
|
|
389
|
+
*/
|
|
390
|
+
async getProfile(request) {
|
|
391
|
+
const id = request.getId();
|
|
392
|
+
const profile = await this.ask("core:security:profile:get", id);
|
|
393
|
+
return formatProcessing_1.default.serializeProfile(profile);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Get specific profiles according to given ids
|
|
397
|
+
*
|
|
398
|
+
* @param {Request} request
|
|
399
|
+
* @returns {Promise<Object>}
|
|
400
|
+
*/
|
|
401
|
+
async mGetProfiles(request) {
|
|
402
|
+
const ids = request.getBodyArray("ids");
|
|
403
|
+
const profiles = await this.ask("core:security:profile:mGet", ids);
|
|
404
|
+
// @todo - should return an array of profiles directly, this is not a
|
|
405
|
+
// search route...
|
|
406
|
+
return {
|
|
407
|
+
hits: profiles.map((profile) => formatProcessing_1.default.serializeProfile(profile)),
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Create or replace a Profile
|
|
412
|
+
*
|
|
413
|
+
* @param {Request} request
|
|
414
|
+
* @returns {Promise<Object>}
|
|
415
|
+
*/
|
|
416
|
+
async createOrReplaceProfile(request) {
|
|
417
|
+
const id = request.getId();
|
|
418
|
+
const content = request.getBody();
|
|
419
|
+
const userId = request.getKuid();
|
|
420
|
+
// Assert: must have a "policies" array
|
|
421
|
+
request.getBodyArray("policies");
|
|
422
|
+
const profile = await this.ask("core:security:profile:createOrReplace", id, content, {
|
|
423
|
+
refresh: request.getRefresh("wait_for"),
|
|
424
|
+
strict: request.getBoolean("strict"),
|
|
425
|
+
userId,
|
|
426
|
+
});
|
|
427
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on profile "${profile._id}."`);
|
|
428
|
+
return formatProcessing_1.default.serializeProfile(profile);
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Create a Profile
|
|
432
|
+
*
|
|
433
|
+
* @param {Request} request
|
|
434
|
+
* @returns {Promise<Object>}
|
|
435
|
+
*/
|
|
436
|
+
async createProfile(request) {
|
|
437
|
+
const id = request.getId();
|
|
438
|
+
const content = request.getBody();
|
|
439
|
+
const userId = request.getKuid();
|
|
440
|
+
// Assert: must have a "policies" array
|
|
441
|
+
request.getBodyArray("policies");
|
|
442
|
+
const profile = await this.ask("core:security:profile:create", id, content, {
|
|
443
|
+
refresh: request.getRefresh("wait_for"),
|
|
444
|
+
strict: request.getBoolean("strict"),
|
|
445
|
+
userId,
|
|
446
|
+
});
|
|
447
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on profile "${profile._id}."`);
|
|
448
|
+
return formatProcessing_1.default.serializeProfile(profile);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Deletes a profile
|
|
452
|
+
*
|
|
453
|
+
* @param {Request} request
|
|
454
|
+
* @returns {Promise<Object>}
|
|
455
|
+
*/
|
|
456
|
+
async deleteProfile(request) {
|
|
457
|
+
const id = request.getId();
|
|
458
|
+
const userId = request.getKuid();
|
|
459
|
+
const options = {
|
|
460
|
+
onAssignedUsers: request.getString("onAssignedUsers", "fail"),
|
|
461
|
+
refresh: request.getRefresh("wait_for"),
|
|
462
|
+
userId,
|
|
463
|
+
};
|
|
464
|
+
await this.ask("core:security:profile:delete", id, options);
|
|
465
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on profile "${id}."`);
|
|
466
|
+
// @todo - replace by an acknowledgement
|
|
467
|
+
return { _id: id };
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Search for profiles
|
|
471
|
+
*
|
|
472
|
+
* @param {Request} request
|
|
473
|
+
* @returns {Promise<Object>}
|
|
474
|
+
*/
|
|
475
|
+
async searchProfiles(request) {
|
|
476
|
+
const size = this._getSearchPageSize(request);
|
|
477
|
+
const { from, scrollTTL, searchBody } = request.getSearchParams();
|
|
478
|
+
const lang = request.getLangParam();
|
|
479
|
+
const body = request.getBody({});
|
|
480
|
+
if (body.roles && body.query) {
|
|
481
|
+
throw new errors_1.BadRequestError('You cannot specifify both "roles" and "query". Prefer the usage of "query" property with a search query.');
|
|
482
|
+
}
|
|
483
|
+
if (body.roles) {
|
|
484
|
+
const roles = request.getBodyArray("roles");
|
|
485
|
+
request.addDeprecation("auto-version", 'Usage of the "roles" property is deprecated. Prefer the usage of "query" property with a search query.');
|
|
486
|
+
if (roles.length > 0) {
|
|
487
|
+
searchBody.query = { terms: { "policies.roleId": roles } };
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
searchBody.query = { match_all: {} };
|
|
491
|
+
}
|
|
492
|
+
delete body.roles;
|
|
493
|
+
}
|
|
494
|
+
if (lang === "koncorde") {
|
|
495
|
+
searchBody.query = await this.translateKoncorde(searchBody.query || {});
|
|
496
|
+
}
|
|
497
|
+
const response = await this.ask("core:security:profile:search", searchBody, {
|
|
498
|
+
from,
|
|
499
|
+
scroll: scrollTTL,
|
|
500
|
+
size,
|
|
501
|
+
});
|
|
502
|
+
response.hits = response.hits.map(formatProcessing_1.default.serializeProfile);
|
|
503
|
+
return response;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Given a user id, returns the matching User object
|
|
507
|
+
*
|
|
508
|
+
* @param {Request} request
|
|
509
|
+
* @returns {Promise<Object>}
|
|
510
|
+
*/
|
|
511
|
+
async getUser(request) {
|
|
512
|
+
const id = request.getId();
|
|
513
|
+
const user = await this.ask("core:security:user:get", id);
|
|
514
|
+
return formatProcessing_1.default.serializeUser(user);
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Get specific users according to given ids
|
|
518
|
+
*
|
|
519
|
+
* @param {Request} request
|
|
520
|
+
* @returns {Promise.<Object>}
|
|
521
|
+
*/
|
|
522
|
+
async mGetUsers(request) {
|
|
523
|
+
let ids;
|
|
524
|
+
if (request.input.body &&
|
|
525
|
+
request.input.body.ids &&
|
|
526
|
+
Object.keys(request.input.body.ids).length) {
|
|
527
|
+
ids = request.getBodyArray("ids");
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
// @deprecated Should be replaced with request.getArray('ids')
|
|
531
|
+
ids = request.getArrayLegacy("ids");
|
|
532
|
+
}
|
|
533
|
+
const users = await this.ask("core:security:user:mGet", ids);
|
|
534
|
+
return { hits: users.map((user) => formatProcessing_1.default.serializeUser(user)) };
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Given a profile id, returns the matching profile's rights as an array.
|
|
538
|
+
*
|
|
539
|
+
* @param {Request} request
|
|
540
|
+
* @returns {Promise<Object>}
|
|
541
|
+
*/
|
|
542
|
+
async getProfileRights(request) {
|
|
543
|
+
const id = request.getId();
|
|
544
|
+
const profile = await this.ask("core:security:profile:get", id);
|
|
545
|
+
const rights = await profile.getRights();
|
|
546
|
+
const hits = Object.keys(rights).reduce((array, item) => array.concat(rights[item]), []);
|
|
547
|
+
return {
|
|
548
|
+
hits,
|
|
549
|
+
total: hits.length,
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Given a user id, returns the matching user's rights as an array.
|
|
554
|
+
*
|
|
555
|
+
* @param {Request} request
|
|
556
|
+
* @returns {Promise<Object>}
|
|
557
|
+
*/
|
|
558
|
+
async getUserRights(request) {
|
|
559
|
+
const id = request.getId();
|
|
560
|
+
const user = await this.ask("core:security:user:get", id);
|
|
561
|
+
const rights = await user.getRights();
|
|
562
|
+
const hits = Object.keys(rights).reduce((array, item) => array.concat(rights[item]), []);
|
|
563
|
+
return {
|
|
564
|
+
hits,
|
|
565
|
+
total: hits.length,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Given a user id, returns the matching user's strategies as an array.
|
|
570
|
+
*
|
|
571
|
+
* @param {Request} request
|
|
572
|
+
* @returns {Promise<Object>}
|
|
573
|
+
*/
|
|
574
|
+
async getUserStrategies(request) {
|
|
575
|
+
const userId = request.getId();
|
|
576
|
+
const checkPromises = [];
|
|
577
|
+
// Throws if the user doesn't exist
|
|
578
|
+
await this.ask("core:security:user:get", userId);
|
|
579
|
+
if (this.anonymousId === userId) {
|
|
580
|
+
checkPromises.push(bluebird_1.default.resolve(null));
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
const availableStrategies = global.kuzzle.pluginsManager.listStrategies();
|
|
584
|
+
for (const strategy of availableStrategies) {
|
|
585
|
+
const existMethod = this.getStrategyMethod(strategy, "exists");
|
|
586
|
+
checkPromises.push(existMethod(request, userId, strategy).then((exists) => exists ? strategy : null));
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
const strategies = await bluebird_1.default.all(checkPromises).filter((item) => item !== null);
|
|
590
|
+
return {
|
|
591
|
+
strategies,
|
|
592
|
+
total: strategies.length,
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Returns the User objects matching the given query
|
|
597
|
+
*
|
|
598
|
+
* @param {Request} request
|
|
599
|
+
* @returns {Promise<Object>}
|
|
600
|
+
*/
|
|
601
|
+
async searchUsers(request) {
|
|
602
|
+
const size = this._getSearchPageSize(request);
|
|
603
|
+
const { from, scrollTTL, searchBody } = request.getSearchParams();
|
|
604
|
+
const lang = request.getLangParam();
|
|
605
|
+
if (lang === "koncorde") {
|
|
606
|
+
searchBody.query = await this.translateKoncorde(searchBody.query);
|
|
607
|
+
}
|
|
608
|
+
const response = await this.ask("core:security:user:search", searchBody, {
|
|
609
|
+
from,
|
|
610
|
+
scroll: scrollTTL,
|
|
611
|
+
size,
|
|
612
|
+
});
|
|
613
|
+
return {
|
|
614
|
+
hits: response.hits.map(formatProcessing_1.default.serializeUser),
|
|
615
|
+
scrollId: response.scrollId,
|
|
616
|
+
total: response.total,
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Given a credentials related search query, returns matched users' kuid.
|
|
621
|
+
*
|
|
622
|
+
* @param {Request} request
|
|
623
|
+
* @returns {Promise<Object>}
|
|
624
|
+
*/
|
|
625
|
+
async searchUsersByCredentials(request) {
|
|
626
|
+
const strategy = request.getString("strategy");
|
|
627
|
+
const lang = request.getLangParam();
|
|
628
|
+
const { from, size, searchBody } = request.getSearchParams();
|
|
629
|
+
this.assertIsStrategyRegistered(strategy);
|
|
630
|
+
const searchMethod = this.getStrategyMethod(strategy, "search");
|
|
631
|
+
if (!searchMethod) {
|
|
632
|
+
throw kerror.get("plugin", "strategy", "missing_optional_method", "search", strategy);
|
|
633
|
+
}
|
|
634
|
+
if (lang === "koncorde") {
|
|
635
|
+
searchBody.query = await this.translateKoncorde(searchBody.query || {});
|
|
636
|
+
}
|
|
637
|
+
this.assertNotExceedMaxFetch(size - from);
|
|
638
|
+
return searchMethod(searchBody, { from, size });
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Deletes a user from Kuzzle
|
|
642
|
+
*
|
|
643
|
+
* @param {Request} request
|
|
644
|
+
* @returns {Promise<Object>}
|
|
645
|
+
*/
|
|
646
|
+
async deleteUser(request) {
|
|
647
|
+
const id = request.getId();
|
|
648
|
+
const options = { refresh: request.getRefresh("wait_for") };
|
|
649
|
+
await this.ask("core:security:user:delete", id, options);
|
|
650
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} applied action "${request.input.action}" on user "${id}."`);
|
|
651
|
+
return { _id: id };
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* Creates a new User object in Kuzzle's database layer
|
|
655
|
+
*
|
|
656
|
+
* @param {Request} request
|
|
657
|
+
* @returns {Promise<Object>}
|
|
658
|
+
*/
|
|
659
|
+
async createUser(request) {
|
|
660
|
+
const content = request.getBodyObject("content");
|
|
661
|
+
const profileIds = request.getBodyArray("content.profileIds");
|
|
662
|
+
const humanReadableId = request.getString("kuid", "human") !== "uuid";
|
|
663
|
+
return this._persistUser(request, profileIds, content, { humanReadableId });
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Creates a new User object in Kuzzle's database layer and applies restricted profileIds
|
|
667
|
+
*
|
|
668
|
+
* @param {Request} request
|
|
669
|
+
* @returns {Promise<Object>}
|
|
670
|
+
*/
|
|
671
|
+
async createRestrictedUser(request) {
|
|
672
|
+
const content = request.getBodyObject("content", {});
|
|
673
|
+
const humanReadableId = request.getString("kuid", "human") !== "uuid";
|
|
674
|
+
if ((0, safeObject_1.has)(content, "profileIds")) {
|
|
675
|
+
throw kerror.get("api", "assert", "forbidden_argument", "body.content.profileIds");
|
|
676
|
+
}
|
|
677
|
+
return this._persistUser(request, global.kuzzle.config.security.restrictedProfileIds, content, { humanReadableId });
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Updates an existing User
|
|
681
|
+
*
|
|
682
|
+
* @param {Request} request
|
|
683
|
+
* @returns {Promise<Object>}
|
|
684
|
+
*/
|
|
685
|
+
async updateUser(request) {
|
|
686
|
+
const id = request.getId();
|
|
687
|
+
const content = request.getBody();
|
|
688
|
+
const userId = request.getKuid();
|
|
689
|
+
const profileIds = (0, lodash_1.isNil)(content.profileIds)
|
|
690
|
+
? null
|
|
691
|
+
: request.getBodyArray("profileIds");
|
|
692
|
+
return this._changeUser(request, id, content, userId, profileIds);
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Applies a partial update to an existing user.
|
|
696
|
+
* If the user doesn't already exist, a new user is created.
|
|
697
|
+
*
|
|
698
|
+
* @param {Request} request
|
|
699
|
+
* @returns {Promise}
|
|
700
|
+
*/
|
|
701
|
+
async upsertUser(request) {
|
|
702
|
+
const id = request.getId();
|
|
703
|
+
const content = request.getBodyObject("content");
|
|
704
|
+
const userId = request.getKuid();
|
|
705
|
+
const profileIds = request.getBodyArray("content.profileIds");
|
|
706
|
+
const defaultValues = request.getBodyObject("default", {});
|
|
707
|
+
try {
|
|
708
|
+
return await this._changeUser(request, id, content, userId, profileIds);
|
|
709
|
+
}
|
|
710
|
+
catch (error) {
|
|
711
|
+
if (error.id && error.id === "security.user.not_found") {
|
|
712
|
+
const creatingContent = {
|
|
713
|
+
...defaultValues,
|
|
714
|
+
...content, // Order important, content erase default duplicates
|
|
715
|
+
};
|
|
716
|
+
return this._persistUser(request, profileIds, creatingContent);
|
|
717
|
+
}
|
|
718
|
+
throw error;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Replaces an existing User
|
|
723
|
+
*
|
|
724
|
+
* @param {Request} request
|
|
725
|
+
* @returns {Promise<Object>}
|
|
726
|
+
*/
|
|
727
|
+
async replaceUser(request) {
|
|
728
|
+
const id = request.getId();
|
|
729
|
+
const content = request.getBody();
|
|
730
|
+
const profileIds = request.getBodyArray("profileIds");
|
|
731
|
+
const userId = request.getKuid();
|
|
732
|
+
const user = await this.ask("core:security:user:replace", id, profileIds, content, { refresh: request.getRefresh("wait_for"), userId });
|
|
733
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on user "${id}."`);
|
|
734
|
+
return formatProcessing_1.default.serializeUser(user);
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Updates an existing profile
|
|
738
|
+
*
|
|
739
|
+
* @param {Request} request
|
|
740
|
+
* @returns {Promise<Object>}
|
|
741
|
+
*/
|
|
742
|
+
async updateProfile(request) {
|
|
743
|
+
const id = request.getId();
|
|
744
|
+
const body = request.getBody();
|
|
745
|
+
const userId = request.getKuid();
|
|
746
|
+
const updated = await this.ask("core:security:profile:update", id, body, {
|
|
747
|
+
refresh: request.getRefresh("wait_for"),
|
|
748
|
+
retryOnConflict: request.getInteger("retryOnConflict", 10),
|
|
749
|
+
strict: request.getBoolean("strict"),
|
|
750
|
+
userId,
|
|
751
|
+
});
|
|
752
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on profile "${id}."`);
|
|
753
|
+
return formatProcessing_1.default.serializeProfile(updated);
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* Updates an existing role
|
|
757
|
+
*
|
|
758
|
+
* @param {Request} request
|
|
759
|
+
* @returns {Promise<Object>}
|
|
760
|
+
*/
|
|
761
|
+
async updateRole(request) {
|
|
762
|
+
const id = request.getId();
|
|
763
|
+
const body = request.getBody();
|
|
764
|
+
const userId = request.getKuid();
|
|
765
|
+
const updated = await this.ask("core:security:role:update", id, body, {
|
|
766
|
+
force: request.getBoolean("force"),
|
|
767
|
+
refresh: request.getRefresh("wait_for"),
|
|
768
|
+
retryOnConflict: request.getInteger("retryOnConflict", 10),
|
|
769
|
+
userId,
|
|
770
|
+
});
|
|
771
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on role "${id}."`);
|
|
772
|
+
return formatProcessing_1.default.serializeRole(updated);
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Creates the first admin user if it does not already exist
|
|
776
|
+
*
|
|
777
|
+
* @param {Request} request
|
|
778
|
+
* @returns {Promise<Object>}
|
|
779
|
+
*/
|
|
780
|
+
async createFirstAdmin(request) {
|
|
781
|
+
const adminExists = await global.kuzzle.ask("core:security:user:admin:exist");
|
|
782
|
+
if (adminExists) {
|
|
783
|
+
throw kerror.get("api", "process", "admin_exists");
|
|
784
|
+
}
|
|
785
|
+
const userId = request.getKuid();
|
|
786
|
+
const content = request.getBodyObject("content", {});
|
|
787
|
+
const reset = request.getBoolean("reset");
|
|
788
|
+
const humanReadableId = request.getString("kuid", "human") !== "uuid";
|
|
789
|
+
if ((0, safeObject_1.has)(content, "profileIds")) {
|
|
790
|
+
throw kerror.get("api", "assert", "forbidden_argument", "body.content.profileIds");
|
|
791
|
+
}
|
|
792
|
+
const user = await this._persistUser(request, ["admin"], content, {
|
|
793
|
+
humanReadableId,
|
|
794
|
+
});
|
|
795
|
+
if (reset) {
|
|
796
|
+
for (const type of ["role", "profile"]) {
|
|
797
|
+
await bluebird_1.default.map(Object.entries(global.kuzzle.config.security.standard[`${type}s`]), ([name, value]) => this.ask(`core:security:${type}:createOrReplace`, name, value, {
|
|
798
|
+
refresh: "wait_for",
|
|
799
|
+
userId,
|
|
800
|
+
}));
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}".`);
|
|
804
|
+
return user;
|
|
805
|
+
}
|
|
806
|
+
/**
|
|
807
|
+
* Deletes multiple profiles
|
|
808
|
+
*
|
|
809
|
+
* @param {Request} request
|
|
810
|
+
* @returns {Promise<Object>}
|
|
811
|
+
*/
|
|
812
|
+
mDeleteProfiles(request) {
|
|
813
|
+
return this._mDelete("profile", request);
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* Deletes multiple roles
|
|
817
|
+
*
|
|
818
|
+
* @param {Request} request
|
|
819
|
+
* @returns {Promise<Object>}
|
|
820
|
+
*/
|
|
821
|
+
mDeleteRoles(request) {
|
|
822
|
+
return this._mDelete("role", request);
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Deletes multiple users
|
|
826
|
+
*
|
|
827
|
+
* @param {Request} request
|
|
828
|
+
* @returns {Promise<Object>}
|
|
829
|
+
*/
|
|
830
|
+
mDeleteUsers(request) {
|
|
831
|
+
return this._mDelete("user", request);
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* Scroll a paginated users search result
|
|
835
|
+
*
|
|
836
|
+
* @param {Request} request
|
|
837
|
+
* @returns {Promise<Object>}
|
|
838
|
+
*/
|
|
839
|
+
async scrollUsers(request) {
|
|
840
|
+
const id = request.getString("scrollId");
|
|
841
|
+
const ttl = request.getScrollTTLParam();
|
|
842
|
+
const response = await this.ask("core:security:user:scroll", id, ttl);
|
|
843
|
+
response.hits = response.hits.map(formatProcessing_1.default.serializeUser);
|
|
844
|
+
return response;
|
|
845
|
+
}
|
|
846
|
+
/**
|
|
847
|
+
* Scroll a paginated profiles search result
|
|
848
|
+
*
|
|
849
|
+
* @param {Request} request
|
|
850
|
+
* @returns {Promise<Object>}
|
|
851
|
+
*/
|
|
852
|
+
async scrollProfiles(request) {
|
|
853
|
+
const id = request.getString("scrollId");
|
|
854
|
+
const ttl = request.getScrollTTLParam();
|
|
855
|
+
const response = await this.ask("core:security:profile:scroll", id, ttl);
|
|
856
|
+
response.hits = response.hits.map(formatProcessing_1.default.serializeProfile);
|
|
857
|
+
return response;
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* @param {Request} request
|
|
861
|
+
* @returns {Promise<Object>}
|
|
862
|
+
*/
|
|
863
|
+
async createCredentials(request) {
|
|
864
|
+
const id = request.getId();
|
|
865
|
+
const body = request.getBody();
|
|
866
|
+
const strategy = request.getString("strategy");
|
|
867
|
+
this.assertIsStrategyRegistered(strategy);
|
|
868
|
+
// Throws if the user doesn't exist
|
|
869
|
+
await this.ask("core:security:user:get", id);
|
|
870
|
+
const validateMethod = this.getStrategyMethod(strategy, "validate");
|
|
871
|
+
await validateMethod(request, body, id, strategy, false);
|
|
872
|
+
const createMethod = this.getStrategyMethod(strategy, "create");
|
|
873
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} applied action "${request.input.action}" on user "${id}."`);
|
|
874
|
+
return createMethod(request, body, id, strategy);
|
|
875
|
+
}
|
|
876
|
+
/**
|
|
877
|
+
* @param {Request} request
|
|
878
|
+
* @returns {Promise<Object>}
|
|
879
|
+
*/
|
|
880
|
+
async updateCredentials(request) {
|
|
881
|
+
const id = request.getId();
|
|
882
|
+
const body = request.getBody();
|
|
883
|
+
const strategy = request.getString("strategy");
|
|
884
|
+
this.assertIsStrategyRegistered(strategy);
|
|
885
|
+
// Throws if the user doesn't exist
|
|
886
|
+
await this.ask("core:security:user:get", id);
|
|
887
|
+
const validateMethod = this.getStrategyMethod(strategy, "validate");
|
|
888
|
+
await validateMethod(request, body, id, strategy, true);
|
|
889
|
+
const updateMethod = this.getStrategyMethod(strategy, "update");
|
|
890
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} applied action "${request.input.action}" on user "${id}."`);
|
|
891
|
+
return updateMethod(request, body, id, strategy);
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* @param {Request} request
|
|
895
|
+
* @returns {Promise.<Object>}
|
|
896
|
+
*/
|
|
897
|
+
async hasCredentials(request) {
|
|
898
|
+
const id = request.getId();
|
|
899
|
+
const strategy = request.getString("strategy");
|
|
900
|
+
this.assertIsStrategyRegistered(strategy);
|
|
901
|
+
const existsMethod = this.getStrategyMethod(strategy, "exists");
|
|
902
|
+
return existsMethod(request, id, strategy);
|
|
903
|
+
}
|
|
904
|
+
/**
|
|
905
|
+
* @param {Request} request
|
|
906
|
+
* @returns {Promise.<Object>}
|
|
907
|
+
*/
|
|
908
|
+
async validateCredentials(request) {
|
|
909
|
+
const strategy = request.getString("strategy");
|
|
910
|
+
this.assertIsStrategyRegistered(strategy);
|
|
911
|
+
const validateMethod = this.getStrategyMethod(strategy, "validate");
|
|
912
|
+
return validateMethod(request, request.getBody(), request.getId({ ifMissing: "ignore" }), strategy, false);
|
|
913
|
+
}
|
|
914
|
+
/**
|
|
915
|
+
* @param {Request} request
|
|
916
|
+
* @returns {Promise<Object>}
|
|
917
|
+
*/
|
|
918
|
+
async deleteCredentials(request) {
|
|
919
|
+
const id = request.getId();
|
|
920
|
+
const strategy = request.getString("strategy");
|
|
921
|
+
this.assertIsStrategyRegistered(strategy);
|
|
922
|
+
const deleteMethod = this.getStrategyMethod(strategy, "delete");
|
|
923
|
+
await deleteMethod(request, id, strategy);
|
|
924
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} applied action "${request.input.action}" on user "${id}."`);
|
|
925
|
+
return { acknowledged: true };
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
928
|
+
* @param {Request} request
|
|
929
|
+
* @returns {Promise<Object>}
|
|
930
|
+
*/
|
|
931
|
+
async getCredentials(request) {
|
|
932
|
+
const id = request.getId();
|
|
933
|
+
const strategy = request.getString("strategy");
|
|
934
|
+
this.assertIsStrategyRegistered(strategy);
|
|
935
|
+
if (global.kuzzle.pluginsManager.hasStrategyMethod(strategy, "getInfo")) {
|
|
936
|
+
const getInfoMethod = this.getStrategyMethod(strategy, "getInfo");
|
|
937
|
+
return getInfoMethod(request, id, strategy);
|
|
938
|
+
}
|
|
939
|
+
return {};
|
|
940
|
+
}
|
|
941
|
+
/**
|
|
942
|
+
* @param {Request} request
|
|
943
|
+
* @returns {Promise<Object>}
|
|
944
|
+
*/
|
|
945
|
+
async getCredentialsById(request) {
|
|
946
|
+
const id = request.getId();
|
|
947
|
+
const strategy = request.getString("strategy");
|
|
948
|
+
this.assertIsStrategyRegistered(strategy);
|
|
949
|
+
if (global.kuzzle.pluginsManager.hasStrategyMethod(strategy, "getById")) {
|
|
950
|
+
const getByIdMethod = this.getStrategyMethod(strategy, "getById");
|
|
951
|
+
return getByIdMethod(request, id, strategy);
|
|
952
|
+
}
|
|
953
|
+
return {};
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* @param {Request} request
|
|
957
|
+
* @returns {Promise<Object>}
|
|
958
|
+
*/
|
|
959
|
+
async getCredentialFields(request) {
|
|
960
|
+
const strategy = request.getString("strategy");
|
|
961
|
+
this.assertIsStrategyRegistered(strategy);
|
|
962
|
+
return global.kuzzle.pluginsManager.getStrategyFields(strategy);
|
|
963
|
+
}
|
|
964
|
+
/**
|
|
965
|
+
* @returns {Promise<Object>}
|
|
966
|
+
*/
|
|
967
|
+
async getAllCredentialFields() {
|
|
968
|
+
const strategyFields = {};
|
|
969
|
+
global.kuzzle.pluginsManager.listStrategies().forEach((strategy) => {
|
|
970
|
+
strategyFields[strategy] =
|
|
971
|
+
global.kuzzle.pluginsManager.getStrategyFields(strategy);
|
|
972
|
+
});
|
|
973
|
+
return strategyFields;
|
|
974
|
+
}
|
|
975
|
+
/**
|
|
976
|
+
* @param {Request} request
|
|
977
|
+
* @returns {Promise.<null>}
|
|
978
|
+
*/
|
|
979
|
+
async revokeTokens(request) {
|
|
980
|
+
const id = request.getId();
|
|
981
|
+
await this.ask("core:security:token:deleteByKuid", id);
|
|
982
|
+
return null;
|
|
983
|
+
}
|
|
984
|
+
/**
|
|
985
|
+
* @param {string.<profile|role|user>} type
|
|
986
|
+
* @param {Request} request
|
|
987
|
+
* @returns {Promise.<Array.<string>>}
|
|
988
|
+
* @private
|
|
989
|
+
*/
|
|
990
|
+
async _mDelete(type, request) {
|
|
991
|
+
const ids = request.getBodyArray("ids");
|
|
992
|
+
const refresh = request.getRefresh("wait_for");
|
|
993
|
+
if (ids.length > global.kuzzle.config.limits.documentsWriteCount) {
|
|
994
|
+
throw kerror.get("services", "storage", "write_limit_exceeded");
|
|
995
|
+
}
|
|
996
|
+
const successes = [];
|
|
997
|
+
const errors = [];
|
|
998
|
+
await bluebird_1.default.map(ids, (id) => this.ask(`core:security:${type}:delete`, id, { refresh })
|
|
999
|
+
.then(() => successes.push(id))
|
|
1000
|
+
.catch((err) => errors.push(err)));
|
|
1001
|
+
if (errors.length) {
|
|
1002
|
+
request.setError(kerror.get("services", "storage", "incomplete_delete", errors));
|
|
1003
|
+
}
|
|
1004
|
+
if (successes.length > 1000) {
|
|
1005
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} deleted the following ${type}s: ${successes
|
|
1006
|
+
.slice(0, 1000)
|
|
1007
|
+
.join(", ")}... (${successes.length - 1000} more users deleted)."`);
|
|
1008
|
+
}
|
|
1009
|
+
else {
|
|
1010
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} deleted the following ${type}s: ${successes.join(", ")}."`);
|
|
1011
|
+
}
|
|
1012
|
+
return successes;
|
|
1013
|
+
}
|
|
1014
|
+
/**
|
|
1015
|
+
* @returns {Promise}
|
|
1016
|
+
* @private
|
|
1017
|
+
*/
|
|
1018
|
+
async _changeUser(request, id, content, userId, profileIds) {
|
|
1019
|
+
const updated = await this.ask("core:security:user:update", id, profileIds, content, {
|
|
1020
|
+
refresh: request.getRefresh("wait_for"),
|
|
1021
|
+
retryOnConflict: request.getInteger("retryOnConflict", 10),
|
|
1022
|
+
userId,
|
|
1023
|
+
});
|
|
1024
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${request.input.action}" on user "${id}."`);
|
|
1025
|
+
return formatProcessing_1.default.serializeUser(updated);
|
|
1026
|
+
}
|
|
1027
|
+
/**
|
|
1028
|
+
* @param {Request} request
|
|
1029
|
+
* @returns {Promise}
|
|
1030
|
+
* @private
|
|
1031
|
+
*/
|
|
1032
|
+
async _persistUser(request, profileIds, content, { humanReadableId = true } = {}) {
|
|
1033
|
+
const credentials = request.getBodyObject("credentials", {});
|
|
1034
|
+
const strategies = Object.keys(credentials);
|
|
1035
|
+
const generator = humanReadableId
|
|
1036
|
+
? () => name_generator_1.NameGenerator.generateRandomName({ prefix: "kuid" })
|
|
1037
|
+
: () => "kuid-" + (0, uuid_1.v4)();
|
|
1038
|
+
let id = "";
|
|
1039
|
+
let alreadyExists = false;
|
|
1040
|
+
// Early checks before the user is created
|
|
1041
|
+
do {
|
|
1042
|
+
let generated = false;
|
|
1043
|
+
id = request.getId({
|
|
1044
|
+
generator: () => {
|
|
1045
|
+
generated = true;
|
|
1046
|
+
return generator();
|
|
1047
|
+
},
|
|
1048
|
+
ifMissing: "generate",
|
|
1049
|
+
});
|
|
1050
|
+
for (const strategy of strategies) {
|
|
1051
|
+
if (!global.kuzzle.pluginsManager.listStrategies().includes(strategy)) {
|
|
1052
|
+
throw kerror.get("security", "credentials", "unknown_strategy", strategy);
|
|
1053
|
+
}
|
|
1054
|
+
const exists = this.getStrategyMethod(strategy, "exists");
|
|
1055
|
+
alreadyExists = await exists(request, id, strategy);
|
|
1056
|
+
if (alreadyExists) {
|
|
1057
|
+
if (generated) {
|
|
1058
|
+
break; // exit for loop, to regenerate an id
|
|
1059
|
+
}
|
|
1060
|
+
throw kerror.get("security", "credentials", "database_inconsistency", id);
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
} while (alreadyExists);
|
|
1064
|
+
const user = await this.ask("core:security:user:create", id, profileIds, content, { refresh: request.getRefresh("wait_for") });
|
|
1065
|
+
const createdUser = formatProcessing_1.default.serializeUser(user);
|
|
1066
|
+
// Creating credentials
|
|
1067
|
+
let creationFailure = null;
|
|
1068
|
+
const createdStrategies = [];
|
|
1069
|
+
for (const strategy of strategies) {
|
|
1070
|
+
try {
|
|
1071
|
+
const validate = this.getStrategyMethod(strategy, "validate");
|
|
1072
|
+
await validate(request, credentials[strategy], id, strategy, false);
|
|
1073
|
+
}
|
|
1074
|
+
catch (error) {
|
|
1075
|
+
creationFailure = { error, validation: true };
|
|
1076
|
+
break;
|
|
1077
|
+
}
|
|
1078
|
+
try {
|
|
1079
|
+
const create = this.getStrategyMethod(strategy, "create");
|
|
1080
|
+
await create(request, credentials[strategy], id, strategy);
|
|
1081
|
+
createdStrategies.push(strategy);
|
|
1082
|
+
}
|
|
1083
|
+
catch (error) {
|
|
1084
|
+
creationFailure = { error, validation: false };
|
|
1085
|
+
break;
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
if (creationFailure === null) {
|
|
1089
|
+
this.logger.info(`[SECURITY] ${SecurityController.userOrSdk(request.getKuid())} applied action "${request.input.action}" on user "${id}."`);
|
|
1090
|
+
return createdUser;
|
|
1091
|
+
}
|
|
1092
|
+
// Failed to create credentials: rollback created strategies
|
|
1093
|
+
const deletionErrors = [];
|
|
1094
|
+
for (const strategy of createdStrategies) {
|
|
1095
|
+
try {
|
|
1096
|
+
const del = this.getStrategyMethod(strategy, "delete");
|
|
1097
|
+
await del(request, id, strategy);
|
|
1098
|
+
}
|
|
1099
|
+
catch (e) {
|
|
1100
|
+
// We catch any error produced by delete as we want to make as much
|
|
1101
|
+
// cleanup as possible
|
|
1102
|
+
deletionErrors.push(e);
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
try {
|
|
1106
|
+
await this.ask("core:security:user:delete", id, { refresh: "false" });
|
|
1107
|
+
}
|
|
1108
|
+
catch (e) {
|
|
1109
|
+
this.logger.error(`User rollback error: ${e}`);
|
|
1110
|
+
}
|
|
1111
|
+
if (deletionErrors.length > 0) {
|
|
1112
|
+
// 2 errors > we
|
|
1113
|
+
throw kerror.get("plugin", "runtime", "unexpected_error", [
|
|
1114
|
+
creationFailure.error.message,
|
|
1115
|
+
...deletionErrors.map((e) => e.message),
|
|
1116
|
+
].join("\n"));
|
|
1117
|
+
}
|
|
1118
|
+
if (creationFailure.error instanceof errors_1.KuzzleError) {
|
|
1119
|
+
throw creationFailure.error;
|
|
1120
|
+
}
|
|
1121
|
+
if (creationFailure.validation) {
|
|
1122
|
+
throw kerror.getFrom(creationFailure.error, "security", "credentials", "rejected", creationFailure.error.message);
|
|
1123
|
+
}
|
|
1124
|
+
throw kerror.getFrom(creationFailure.error, "plugin", "runtime", "unexpected_error", creationFailure.error.message);
|
|
1125
|
+
}
|
|
1126
|
+
/**
|
|
1127
|
+
* Checks if a search result can exceeds the server configured limit
|
|
1128
|
+
* @param {Request} request
|
|
1129
|
+
* @param {number} limit
|
|
1130
|
+
* @throws
|
|
1131
|
+
*/
|
|
1132
|
+
_getSearchPageSize(request) {
|
|
1133
|
+
const size = request.getInteger("size", global.kuzzle.config.limits.documentsFetchCount);
|
|
1134
|
+
this.assertNotExceedMaxFetch(size);
|
|
1135
|
+
return size;
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
exports.default = SecurityController;
|
|
1139
|
+
//# sourceMappingURL=securityController.js.map
|