kuzzle 2.19.2 → 2.19.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/lib/api/controllers/adminController.js +94 -80
- package/lib/api/controllers/authController.js +239 -212
- package/lib/api/controllers/baseController.js +89 -51
- package/lib/api/controllers/bulkController.js +62 -49
- package/lib/api/controllers/clusterController.js +6 -8
- package/lib/api/controllers/collectionController.js +140 -129
- package/lib/api/controllers/debugController.d.ts +2 -2
- package/lib/api/controllers/debugController.js +33 -31
- package/lib/api/controllers/documentController.js +365 -274
- package/lib/api/controllers/index.js +13 -13
- package/lib/api/controllers/indexController.js +46 -50
- package/lib/api/controllers/memoryStorageController.js +410 -360
- package/lib/api/controllers/realtimeController.js +37 -36
- package/lib/api/controllers/securityController.js +553 -412
- package/lib/api/controllers/serverController.js +111 -104
- package/lib/api/documentExtractor.js +75 -68
- package/lib/api/funnel.js +411 -312
- package/lib/api/httpRoutes.js +1493 -324
- package/lib/api/openapi/OpenApiManager.d.ts +1 -1
- package/lib/api/openapi/OpenApiManager.js +22 -22
- package/lib/api/openapi/components/document/count.yaml +1 -1
- package/lib/api/openapi/components/document/create.yaml +2 -2
- package/lib/api/openapi/components/document/delete.yaml +1 -1
- package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
- package/lib/api/openapi/components/document/exists.yaml +1 -1
- package/lib/api/openapi/components/document/get.yaml +2 -2
- package/lib/api/openapi/components/document/index.js +12 -12
- package/lib/api/openapi/components/document/replace.yaml +1 -1
- package/lib/api/openapi/components/document/scroll.yaml +1 -1
- package/lib/api/openapi/components/document/validate.yaml +1 -1
- package/lib/api/openapi/components/index.d.ts +2 -2
- package/lib/api/openapi/components/index.js +1 -1
- package/lib/api/openapi/components/security/index.js +1 -1
- package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
- package/lib/api/openapi/index.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.js +7 -7
- package/lib/api/rateLimiter.js +12 -13
- package/lib/api/request/index.d.ts +4 -4
- package/lib/api/request/kuzzleRequest.d.ts +9 -9
- package/lib/api/request/kuzzleRequest.js +89 -87
- package/lib/api/request/requestContext.d.ts +2 -2
- package/lib/api/request/requestContext.js +17 -17
- package/lib/api/request/requestInput.d.ts +1 -1
- package/lib/api/request/requestInput.js +19 -19
- package/lib/api/request/requestResponse.d.ts +4 -4
- package/lib/api/request/requestResponse.js +31 -33
- package/lib/cluster/command.js +48 -44
- package/lib/cluster/idCardHandler.d.ts +1 -1
- package/lib/cluster/idCardHandler.js +15 -15
- package/lib/cluster/index.js +2 -2
- package/lib/cluster/node.js +301 -269
- package/lib/cluster/publisher.js +45 -46
- package/lib/cluster/state.d.ts +5 -5
- package/lib/cluster/state.js +8 -8
- package/lib/cluster/subscriber.js +163 -113
- package/lib/cluster/workers/IDCardRenewer.js +33 -32
- package/lib/config/default.config.d.ts +1 -1
- package/lib/config/default.config.js +212 -171
- package/lib/config/documentEventAliases.js +6 -6
- package/lib/config/index.js +161 -98
- package/lib/config/sdkCompatibility.json +8 -8
- package/lib/core/auth/formatProcessing.js +7 -7
- package/lib/core/auth/passportResponse.js +7 -7
- package/lib/core/auth/passportWrapper.js +34 -30
- package/lib/core/auth/tokenManager.d.ts +2 -2
- package/lib/core/auth/tokenManager.js +11 -10
- package/lib/core/backend/applicationManager.d.ts +1 -1
- package/lib/core/backend/applicationManager.js +2 -2
- package/lib/core/backend/backend.d.ts +3 -3
- package/lib/core/backend/backend.js +34 -31
- package/lib/core/backend/backendCluster.d.ts +2 -2
- package/lib/core/backend/backendCluster.js +5 -5
- package/lib/core/backend/backendConfig.d.ts +2 -2
- package/lib/core/backend/backendConfig.js +3 -3
- package/lib/core/backend/backendController.d.ts +2 -2
- package/lib/core/backend/backendController.js +9 -10
- package/lib/core/backend/backendErrors.d.ts +3 -3
- package/lib/core/backend/backendErrors.js +2 -1
- package/lib/core/backend/backendHook.d.ts +2 -2
- package/lib/core/backend/backendHook.js +5 -5
- package/lib/core/backend/backendImport.d.ts +3 -3
- package/lib/core/backend/backendImport.js +23 -23
- package/lib/core/backend/backendOpenApi.d.ts +2 -2
- package/lib/core/backend/backendOpenApi.js +16 -16
- package/lib/core/backend/backendPipe.d.ts +2 -2
- package/lib/core/backend/backendPipe.js +6 -6
- package/lib/core/backend/backendPlugin.d.ts +4 -4
- package/lib/core/backend/backendPlugin.js +14 -14
- package/lib/core/backend/backendStorage.d.ts +2 -2
- package/lib/core/backend/backendStorage.js +1 -2
- package/lib/core/backend/backendVault.d.ts +2 -2
- package/lib/core/backend/backendVault.js +3 -3
- package/lib/core/backend/index.d.ts +14 -14
- package/lib/core/backend/internalLogger.d.ts +1 -1
- package/lib/core/backend/internalLogger.js +5 -5
- package/lib/core/cache/cacheDbEnum.js +4 -4
- package/lib/core/cache/cacheEngine.js +79 -85
- package/lib/core/network/accessLogger.js +126 -120
- package/lib/core/network/clientConnection.js +5 -5
- package/lib/core/network/context.js +8 -8
- package/lib/core/network/entryPoint.js +100 -85
- package/lib/core/network/httpRouter/index.js +63 -60
- package/lib/core/network/httpRouter/routeHandler.js +18 -19
- package/lib/core/network/httpRouter/routePart.js +23 -19
- package/lib/core/network/protocolManifest.js +3 -3
- package/lib/core/network/protocols/httpMessage.js +8 -10
- package/lib/core/network/protocols/httpwsProtocol.js +305 -250
- package/lib/core/network/protocols/internalProtocol.js +27 -24
- package/lib/core/network/protocols/mqttProtocol.js +106 -96
- package/lib/core/network/protocols/protocol.js +20 -17
- package/lib/core/network/router.js +56 -46
- package/lib/core/plugin/plugin.js +151 -120
- package/lib/core/plugin/pluginContext.d.ts +7 -7
- package/lib/core/plugin/pluginContext.js +48 -44
- package/lib/core/plugin/pluginManifest.js +13 -12
- package/lib/core/plugin/pluginRepository.js +26 -27
- package/lib/core/plugin/pluginsManager.js +425 -304
- package/lib/core/plugin/privilegedContext.js +3 -3
- package/lib/core/realtime/actionEnum.js +1 -1
- package/lib/core/realtime/channel.d.ts +1 -1
- package/lib/core/realtime/channel.js +22 -22
- package/lib/core/realtime/connectionRooms.d.ts +1 -1
- package/lib/core/realtime/hotelClerk.d.ts +2 -2
- package/lib/core/realtime/hotelClerk.js +53 -50
- package/lib/core/realtime/index.js +5 -5
- package/lib/core/realtime/notification/document.js +25 -25
- package/lib/core/realtime/notification/index.js +4 -4
- package/lib/core/realtime/notification/server.js +3 -3
- package/lib/core/realtime/notification/user.js +4 -4
- package/lib/core/realtime/notifier.js +113 -75
- package/lib/core/realtime/room.d.ts +1 -1
- package/lib/core/realtime/subscription.d.ts +1 -1
- package/lib/core/realtime/subscription.js +1 -1
- package/lib/core/security/index.js +8 -8
- package/lib/core/security/profileRepository.d.ts +6 -6
- package/lib/core/security/profileRepository.js +48 -45
- package/lib/core/security/roleRepository.js +127 -115
- package/lib/core/security/securityLoader.js +70 -63
- package/lib/core/security/tokenRepository.js +132 -118
- package/lib/core/security/userRepository.js +104 -88
- package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
- package/lib/core/shared/KoncordeWrapper.js +3 -1
- package/lib/core/shared/abstractManifest.js +22 -23
- package/lib/core/shared/repository.js +69 -67
- package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
- package/lib/core/shared/sdk/embeddedSdk.js +36 -32
- package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
- package/lib/core/shared/sdk/funnelProtocol.js +11 -11
- package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
- package/lib/core/shared/store.js +127 -32
- package/lib/core/statistics/index.js +2 -2
- package/lib/core/statistics/statistics.js +99 -85
- package/lib/core/storage/clientAdapter.js +219 -136
- package/lib/core/storage/indexCache.js +3 -3
- package/lib/core/storage/storageEngine.js +10 -13
- package/lib/core/storage/storeScopeEnum.js +3 -3
- package/lib/core/validation/baseType.js +12 -10
- package/lib/core/validation/index.js +2 -2
- package/lib/core/validation/types/anything.js +4 -4
- package/lib/core/validation/types/boolean.js +7 -7
- package/lib/core/validation/types/date.js +165 -131
- package/lib/core/validation/types/email.js +18 -21
- package/lib/core/validation/types/enum.js +34 -21
- package/lib/core/validation/types/geoPoint.js +7 -7
- package/lib/core/validation/types/geoShape.js +148 -125
- package/lib/core/validation/types/integer.js +9 -9
- package/lib/core/validation/types/ipAddress.js +17 -19
- package/lib/core/validation/types/numeric.js +36 -29
- package/lib/core/validation/types/object.js +19 -19
- package/lib/core/validation/types/string.js +36 -29
- package/lib/core/validation/types/url.js +17 -19
- package/lib/core/validation/validation.js +422 -378
- package/lib/kerror/codes/1-services.json +7 -1
- package/lib/kerror/codes/4-plugin.json +2 -2
- package/lib/kerror/codes/index.js +85 -63
- package/lib/kerror/errors/badRequestError.d.ts +1 -1
- package/lib/kerror/errors/externalServiceError.d.ts +1 -1
- package/lib/kerror/errors/forbiddenError.d.ts +1 -1
- package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
- package/lib/kerror/errors/index.d.ts +15 -15
- package/lib/kerror/errors/internalError.d.ts +1 -1
- package/lib/kerror/errors/kuzzleError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.js +1 -1
- package/lib/kerror/errors/notFoundError.d.ts +1 -1
- package/lib/kerror/errors/partialError.d.ts +1 -1
- package/lib/kerror/errors/partialError.js +1 -1
- package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
- package/lib/kerror/errors/pluginImplementationError.js +2 -1
- package/lib/kerror/errors/preconditionError.d.ts +1 -1
- package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
- package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
- package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
- package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
- package/lib/kerror/index.d.ts +3 -3
- package/lib/kerror/index.js +17 -16
- package/lib/kuzzle/dumpGenerator.js +130 -114
- package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
- package/lib/kuzzle/event/pipeRunner.js +25 -24
- package/lib/kuzzle/event/waterfall.js +13 -15
- package/lib/kuzzle/index.js +2 -2
- package/lib/kuzzle/internalIndexHandler.js +80 -59
- package/lib/kuzzle/kuzzle.js +99 -99
- package/lib/kuzzle/kuzzleStateEnum.js +1 -1
- package/lib/kuzzle/log.js +23 -18
- package/lib/kuzzle/vault.js +34 -19
- package/lib/model/security/profile.d.ts +3 -3
- package/lib/model/security/profile.js +38 -37
- package/lib/model/security/rights.js +5 -5
- package/lib/model/security/role.d.ts +3 -3
- package/lib/model/security/role.js +25 -26
- package/lib/model/security/token.d.ts +1 -1
- package/lib/model/security/token.js +4 -4
- package/lib/model/security/user.d.ts +2 -2
- package/lib/model/security/user.js +9 -9
- package/lib/model/storage/apiKey.js +43 -33
- package/lib/model/storage/baseModel.js +49 -45
- package/lib/service/cache/redis.js +60 -55
- package/lib/service/service.js +17 -17
- package/lib/service/storage/elasticsearch.js +839 -755
- package/lib/service/storage/esWrapper.js +103 -86
- package/lib/service/storage/queryTranslator.js +52 -59
- package/lib/types/Controller.d.ts +3 -3
- package/lib/types/ControllerDefinition.d.ts +3 -3
- package/lib/types/DebugModule.d.ts +2 -2
- package/lib/types/DebugModule.js +1 -1
- package/lib/types/Global.d.ts +1 -1
- package/lib/types/HttpStream.d.ts +2 -1
- package/lib/types/HttpStream.js +7 -5
- package/lib/types/Kuzzle.d.ts +1 -1
- package/lib/types/KuzzleDocument.d.ts +1 -1
- package/lib/types/OpenApiDefinition.d.ts +1 -1
- package/lib/types/PasswordPolicy.d.ts +1 -1
- package/lib/types/Plugin.d.ts +6 -6
- package/lib/types/Plugin.js +2 -2
- package/lib/types/Policy.d.ts +1 -1
- package/lib/types/RequestPayload.d.ts +1 -1
- package/lib/types/ResponsePayload.d.ts +1 -1
- package/lib/types/Token.d.ts +1 -1
- package/lib/types/User.d.ts +1 -1
- package/lib/types/config/DumpConfiguration.d.ts +8 -8
- package/lib/types/config/HttpConfiguration.d.ts +1 -1
- package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
- package/lib/types/config/LimitsConfiguration.d.ts +8 -8
- package/lib/types/config/PluginsConfiguration.d.ts +4 -4
- package/lib/types/config/SecurityConfiguration.d.ts +62 -62
- package/lib/types/config/ServerConfiguration.d.ts +55 -55
- package/lib/types/config/ServicesConfiguration.d.ts +2 -2
- package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
- package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
- package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
- package/lib/types/errors/ErrorDefinition.d.ts +1 -1
- package/lib/types/errors/ErrorDomains.d.ts +1 -1
- package/lib/types/index.d.ts +38 -38
- package/lib/types/realtime/RealtimeScope.d.ts +1 -1
- package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
- package/lib/util/assertType.js +13 -11
- package/lib/util/async.d.ts +1 -0
- package/lib/util/async.js +61 -0
- package/lib/util/asyncStore.js +19 -21
- package/lib/util/bufferedPassThrough.d.ts +2 -2
- package/lib/util/bufferedPassThrough.js +4 -4
- package/lib/util/bytes.js +9 -13
- package/lib/util/crypto.js +1 -1
- package/lib/util/debug.js +5 -5
- package/lib/util/deprecate.js +24 -21
- package/lib/util/didYouMean.js +7 -7
- package/lib/util/dump-collection.d.ts +2 -2
- package/lib/util/dump-collection.js +26 -26
- package/lib/util/esRequest.d.ts +1 -0
- package/lib/util/esRequest.js +62 -0
- package/lib/util/extractFields.js +24 -25
- package/lib/util/inflector.js +5 -5
- package/lib/util/koncordeCompat.d.ts +2 -2
- package/lib/util/koncordeCompat.js +5 -5
- package/lib/util/memoize.js +3 -5
- package/lib/util/mutex.d.ts +19 -1
- package/lib/util/mutex.js +39 -12
- package/lib/util/name-generator.js +1331 -1331
- package/lib/util/promback.js +8 -10
- package/lib/util/readYamlFile.d.ts +1 -1
- package/lib/util/readYamlFile.js +1 -1
- package/lib/util/requestAssertions.js +34 -34
- package/lib/util/safeObject.js +5 -5
- package/lib/util/stackTrace.js +20 -22
- package/lib/util/wildcard.js +15 -15
- package/package.json +6 -6
- package/npm-shrinkwrap.json +0 -19422
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const Bluebird = require(
|
|
24
|
+
const Bluebird = require("bluebird");
|
|
25
25
|
|
|
26
|
-
const kuzzleStateEnum = require(
|
|
27
|
-
const { Role } = require(
|
|
28
|
-
const Repository = require(
|
|
29
|
-
const kerror = require(
|
|
30
|
-
const didYouMean = require(
|
|
31
|
-
const cacheDbEnum = require(
|
|
26
|
+
const kuzzleStateEnum = require("../../kuzzle/kuzzleStateEnum");
|
|
27
|
+
const { Role } = require("../../model/security/role");
|
|
28
|
+
const Repository = require("../shared/repository");
|
|
29
|
+
const kerror = require("../../kerror");
|
|
30
|
+
const didYouMean = require("../../util/didYouMean");
|
|
31
|
+
const cacheDbEnum = require("../cache/cacheDbEnum");
|
|
32
32
|
|
|
33
|
-
const roleRightsError = kerror.wrap(
|
|
33
|
+
const roleRightsError = kerror.wrap("security", "role");
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* @class RoleRepository
|
|
@@ -41,7 +41,7 @@ class RoleRepository extends Repository {
|
|
|
41
41
|
* @constructor
|
|
42
42
|
* @param {SecurityModule} securityModule
|
|
43
43
|
*/
|
|
44
|
-
constructor
|
|
44
|
+
constructor(securityModule) {
|
|
45
45
|
super({
|
|
46
46
|
cache: cacheDbEnum.NONE,
|
|
47
47
|
store: global.kuzzle.internalIndex,
|
|
@@ -49,12 +49,12 @@ class RoleRepository extends Repository {
|
|
|
49
49
|
|
|
50
50
|
this.module = securityModule;
|
|
51
51
|
|
|
52
|
-
this.collection =
|
|
52
|
+
this.collection = "roles";
|
|
53
53
|
this.ObjectConstructor = Role;
|
|
54
54
|
this.roles = new Map();
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
init
|
|
57
|
+
init() {
|
|
58
58
|
/**
|
|
59
59
|
* Creates a new role
|
|
60
60
|
* @param {String} id - role identifier / name
|
|
@@ -63,9 +63,9 @@ class RoleRepository extends Repository {
|
|
|
63
63
|
* @returns {Role}
|
|
64
64
|
* @throws If already exists or if the content is invalid
|
|
65
65
|
*/
|
|
66
|
-
global.kuzzle.onAsk(
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
global.kuzzle.onAsk("core:security:role:create", (id, content, opts) =>
|
|
67
|
+
this.create(id, content, opts)
|
|
68
|
+
);
|
|
69
69
|
|
|
70
70
|
/**
|
|
71
71
|
* Creates a new role, or replaces it if it already exists
|
|
@@ -76,8 +76,9 @@ class RoleRepository extends Repository {
|
|
|
76
76
|
* @throws If the content is invalid
|
|
77
77
|
*/
|
|
78
78
|
global.kuzzle.onAsk(
|
|
79
|
-
|
|
80
|
-
(id, content, opts) => this.createOrReplace(id, content, opts)
|
|
79
|
+
"core:security:role:createOrReplace",
|
|
80
|
+
(id, content, opts) => this.createOrReplace(id, content, opts)
|
|
81
|
+
);
|
|
81
82
|
|
|
82
83
|
/**
|
|
83
84
|
* Deletes an existing role
|
|
@@ -86,9 +87,9 @@ class RoleRepository extends Repository {
|
|
|
86
87
|
* @throws If the role doesn't exist, if it is protected, or if it's
|
|
87
88
|
* still in use
|
|
88
89
|
*/
|
|
89
|
-
global.kuzzle.onAsk(
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
global.kuzzle.onAsk("core:security:role:delete", (id, opts) =>
|
|
91
|
+
this.deleteById(id, opts)
|
|
92
|
+
);
|
|
92
93
|
|
|
93
94
|
/**
|
|
94
95
|
* Loads and returns an existing role
|
|
@@ -96,7 +97,7 @@ class RoleRepository extends Repository {
|
|
|
96
97
|
* @returns {Role}
|
|
97
98
|
* @throws {NotFoundError} If the role doesn't exist
|
|
98
99
|
*/
|
|
99
|
-
global.kuzzle.onAsk(
|
|
100
|
+
global.kuzzle.onAsk("core:security:role:get", (id) => this.load(id));
|
|
100
101
|
|
|
101
102
|
/**
|
|
102
103
|
* Invalidates the RAM cache from the given role ID. If none is provided,
|
|
@@ -104,9 +105,9 @@ class RoleRepository extends Repository {
|
|
|
104
105
|
*
|
|
105
106
|
* @param {String} [id] - role identifier
|
|
106
107
|
*/
|
|
107
|
-
global.kuzzle.onAsk(
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
global.kuzzle.onAsk("core:security:role:invalidate", (id) =>
|
|
109
|
+
this.invalidate(id)
|
|
110
|
+
);
|
|
110
111
|
|
|
111
112
|
/**
|
|
112
113
|
* Gets multiple roles
|
|
@@ -114,7 +115,9 @@ class RoleRepository extends Repository {
|
|
|
114
115
|
* @returns {Array.<Role>}
|
|
115
116
|
* @throws If one or more roles don't exist
|
|
116
117
|
*/
|
|
117
|
-
global.kuzzle.onAsk(
|
|
118
|
+
global.kuzzle.onAsk("core:security:role:mGet", (ids) =>
|
|
119
|
+
this.loadRoles(ids)
|
|
120
|
+
);
|
|
118
121
|
|
|
119
122
|
/**
|
|
120
123
|
* Searches roles associated to a provided list of API controllers
|
|
@@ -123,17 +126,17 @@ class RoleRepository extends Repository {
|
|
|
123
126
|
* @param {Number} size
|
|
124
127
|
* @returns {Object} Search results
|
|
125
128
|
*/
|
|
126
|
-
global.kuzzle.onAsk(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
global.kuzzle.onAsk("core:security:role:search", (controllers, opts) =>
|
|
130
|
+
this.searchRole(controllers, opts)
|
|
131
|
+
);
|
|
129
132
|
|
|
130
133
|
/**
|
|
131
134
|
* Removes all existing roles and invalidates the RAM cache
|
|
132
135
|
* @param {Object} opts (refresh)
|
|
133
136
|
*/
|
|
134
|
-
global.kuzzle.onAsk(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
+
global.kuzzle.onAsk("core:security:role:truncate", (opts) =>
|
|
138
|
+
this.truncate(opts)
|
|
139
|
+
);
|
|
137
140
|
|
|
138
141
|
/**
|
|
139
142
|
* Updates an existing profile using a partial content
|
|
@@ -143,14 +146,14 @@ class RoleRepository extends Repository {
|
|
|
143
146
|
* userId (used for metadata)
|
|
144
147
|
* @returns {Role} Updated role
|
|
145
148
|
*/
|
|
146
|
-
global.kuzzle.onAsk(
|
|
147
|
-
|
|
148
|
-
|
|
149
|
+
global.kuzzle.onAsk("core:security:role:update", (id, content, opts) =>
|
|
150
|
+
this.update(id, content, opts)
|
|
151
|
+
);
|
|
149
152
|
|
|
150
153
|
/**
|
|
151
154
|
* Verifies that existing roles are sane
|
|
152
155
|
*/
|
|
153
|
-
global.kuzzle.onAsk(
|
|
156
|
+
global.kuzzle.onAsk("core:security:verify", () => this.sanityCheck());
|
|
154
157
|
}
|
|
155
158
|
|
|
156
159
|
/**
|
|
@@ -160,18 +163,17 @@ class RoleRepository extends Repository {
|
|
|
160
163
|
* @param {Object} options - resetCache (false)
|
|
161
164
|
* @returns {Promise.<Array.<Role>>}
|
|
162
165
|
*/
|
|
163
|
-
loadRoles
|
|
166
|
+
loadRoles(ids) {
|
|
164
167
|
const roles = [];
|
|
165
168
|
|
|
166
169
|
for (const id of ids) {
|
|
167
170
|
let role = this.roles.get(id);
|
|
168
171
|
|
|
169
|
-
if (!
|
|
170
|
-
role = this.loadOneFromDatabase(id)
|
|
171
|
-
.
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
});
|
|
172
|
+
if (!role) {
|
|
173
|
+
role = this.loadOneFromDatabase(id).then((r) => {
|
|
174
|
+
this.roles.set(id, r);
|
|
175
|
+
return r;
|
|
176
|
+
});
|
|
175
177
|
|
|
176
178
|
this.roles.set(id, role);
|
|
177
179
|
}
|
|
@@ -190,10 +192,10 @@ class RoleRepository extends Repository {
|
|
|
190
192
|
* @param {Object} [opts]
|
|
191
193
|
* @returns {Role}
|
|
192
194
|
*/
|
|
193
|
-
async _createOrReplace
|
|
195
|
+
async _createOrReplace(
|
|
194
196
|
id,
|
|
195
197
|
content,
|
|
196
|
-
{ force = false, method, refresh =
|
|
198
|
+
{ force = false, method, refresh = "false", userId = null } = {}
|
|
197
199
|
) {
|
|
198
200
|
const dto = {
|
|
199
201
|
...content,
|
|
@@ -220,9 +222,9 @@ class RoleRepository extends Repository {
|
|
|
220
222
|
* @param {Object} [opts]
|
|
221
223
|
* @returns {Role}
|
|
222
224
|
*/
|
|
223
|
-
async create
|
|
225
|
+
async create(id, content, opts) {
|
|
224
226
|
return this._createOrReplace(id, content, {
|
|
225
|
-
method:
|
|
227
|
+
method: "create",
|
|
226
228
|
...opts,
|
|
227
229
|
});
|
|
228
230
|
}
|
|
@@ -235,9 +237,9 @@ class RoleRepository extends Repository {
|
|
|
235
237
|
* @param {Object} [opts]
|
|
236
238
|
* @returns {Role}
|
|
237
239
|
*/
|
|
238
|
-
async createOrReplace
|
|
240
|
+
async createOrReplace(id, content, opts) {
|
|
239
241
|
return this._createOrReplace(id, content, {
|
|
240
|
-
method:
|
|
242
|
+
method: "createOrReplace",
|
|
241
243
|
...opts,
|
|
242
244
|
});
|
|
243
245
|
}
|
|
@@ -253,7 +255,7 @@ class RoleRepository extends Repository {
|
|
|
253
255
|
* @param {Object} [opts]
|
|
254
256
|
* @returns {Promise}
|
|
255
257
|
*/
|
|
256
|
-
async update
|
|
258
|
+
async update(id, content, { force, refresh, retryOnConflict, userId } = {}) {
|
|
257
259
|
const updated = await this.fromDTO({
|
|
258
260
|
// /!\ order is important
|
|
259
261
|
...content,
|
|
@@ -267,7 +269,7 @@ class RoleRepository extends Repository {
|
|
|
267
269
|
|
|
268
270
|
return this.validateAndSaveRole(updated, {
|
|
269
271
|
force,
|
|
270
|
-
method:
|
|
272
|
+
method: "replace",
|
|
271
273
|
refresh,
|
|
272
274
|
retryOnConflict,
|
|
273
275
|
});
|
|
@@ -280,7 +282,7 @@ class RoleRepository extends Repository {
|
|
|
280
282
|
* @returns {Promise.<Role>} role
|
|
281
283
|
* @throws {NotFoundError} If the corresponding role doesn't exist
|
|
282
284
|
*/
|
|
283
|
-
async load
|
|
285
|
+
async load(id) {
|
|
284
286
|
if (this.roles.has(id)) {
|
|
285
287
|
return this.roles.get(id);
|
|
286
288
|
}
|
|
@@ -295,13 +297,12 @@ class RoleRepository extends Repository {
|
|
|
295
297
|
/**
|
|
296
298
|
* @override
|
|
297
299
|
*/
|
|
298
|
-
async loadOneFromDatabase
|
|
300
|
+
async loadOneFromDatabase(id) {
|
|
299
301
|
try {
|
|
300
302
|
return await super.loadOneFromDatabase(id);
|
|
301
|
-
}
|
|
302
|
-
catch (err) {
|
|
303
|
+
} catch (err) {
|
|
303
304
|
if (err.status === 404) {
|
|
304
|
-
throw kerror.get(
|
|
305
|
+
throw kerror.get("security", "role", "not_found", id);
|
|
305
306
|
}
|
|
306
307
|
throw err;
|
|
307
308
|
}
|
|
@@ -311,25 +312,27 @@ class RoleRepository extends Repository {
|
|
|
311
312
|
* @param {Object} body Search body containing either "query" or "controllers"
|
|
312
313
|
* @param {Object} options
|
|
313
314
|
*/
|
|
314
|
-
async searchRole
|
|
315
|
-
if (!
|
|
315
|
+
async searchRole(body, { from = 0, size = 9999 } = {}) {
|
|
316
|
+
if (!body.controllers) {
|
|
316
317
|
return this.search(body, { from, size });
|
|
317
318
|
}
|
|
318
319
|
|
|
319
320
|
const searchResults = await this.search(
|
|
320
|
-
{ query: {}, sort: [{ _id: { order:
|
|
321
|
-
{ from: 0, size: 9999 }
|
|
321
|
+
{ query: {}, sort: [{ _id: { order: "asc" } }] },
|
|
322
|
+
{ from: 0, size: 9999 }
|
|
323
|
+
); // /!\ NOT the options values
|
|
322
324
|
|
|
323
325
|
const result = {
|
|
324
326
|
hits: searchResults.hits,
|
|
325
|
-
total: searchResults.total
|
|
327
|
+
total: searchResults.total,
|
|
326
328
|
};
|
|
327
329
|
|
|
328
330
|
if (body.controllers.length > 0) {
|
|
329
|
-
result.hits = searchResults.hits
|
|
330
|
-
.
|
|
331
|
-
|
|
332
|
-
|
|
331
|
+
result.hits = searchResults.hits.filter((role) =>
|
|
332
|
+
Object.keys(role.controllers).some(
|
|
333
|
+
(key) => key === "*" || body.controllers.includes(key)
|
|
334
|
+
)
|
|
335
|
+
);
|
|
333
336
|
|
|
334
337
|
result.total = result.hits.length;
|
|
335
338
|
}
|
|
@@ -346,11 +349,11 @@ class RoleRepository extends Repository {
|
|
|
346
349
|
* @param {object} [options] The persistence options
|
|
347
350
|
* @returns Promise
|
|
348
351
|
*/
|
|
349
|
-
async validateAndSaveRole
|
|
352
|
+
async validateAndSaveRole(role, options = {}) {
|
|
350
353
|
await role.validateDefinition();
|
|
351
354
|
|
|
352
|
-
if (role._id ===
|
|
353
|
-
throw kerror.get(
|
|
355
|
+
if (role._id === "anonymous" && !role.canLogIn()) {
|
|
356
|
+
throw kerror.get("security", "role", "login_required");
|
|
354
357
|
}
|
|
355
358
|
|
|
356
359
|
this.checkRoleNativeRights(role);
|
|
@@ -368,33 +371,34 @@ class RoleRepository extends Repository {
|
|
|
368
371
|
*
|
|
369
372
|
* @param {Role} role
|
|
370
373
|
*/
|
|
371
|
-
checkRoleNativeRights
|
|
372
|
-
Object.keys(role.controllers).forEach(roleController => {
|
|
373
|
-
if (
|
|
374
|
-
|
|
374
|
+
checkRoleNativeRights(role) {
|
|
375
|
+
Object.keys(role.controllers).forEach((roleController) => {
|
|
376
|
+
if (
|
|
377
|
+
roleController !== "*" &&
|
|
378
|
+
!global.kuzzle.funnel.isNativeController(roleController)
|
|
375
379
|
) {
|
|
376
380
|
return;
|
|
377
381
|
}
|
|
378
382
|
|
|
379
|
-
if (roleController ===
|
|
380
|
-
Object.keys(role.controllers[
|
|
381
|
-
if (action !==
|
|
382
|
-
throw roleRightsError.get(
|
|
383
|
+
if (roleController === "*") {
|
|
384
|
+
Object.keys(role.controllers["*"].actions).forEach((action) => {
|
|
385
|
+
if (action !== "*") {
|
|
386
|
+
throw roleRightsError.get("unknown_action", role._id, action, "*");
|
|
383
387
|
}
|
|
384
388
|
});
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
389
|
+
} else {
|
|
387
390
|
const controller = global.kuzzle.funnel.controllers.get(roleController);
|
|
388
391
|
const actions = Object.keys(role.controllers[roleController].actions);
|
|
389
392
|
|
|
390
|
-
actions.forEach(action => {
|
|
391
|
-
if (action !==
|
|
393
|
+
actions.forEach((action) => {
|
|
394
|
+
if (action !== "*" && !controller._isAction(action)) {
|
|
392
395
|
throw roleRightsError.get(
|
|
393
|
-
|
|
396
|
+
"unknown_action",
|
|
394
397
|
role._id,
|
|
395
398
|
action,
|
|
396
399
|
roleController,
|
|
397
|
-
didYouMean(action, controller.__actions)
|
|
400
|
+
didYouMean(action, controller.__actions)
|
|
401
|
+
);
|
|
398
402
|
}
|
|
399
403
|
});
|
|
400
404
|
}
|
|
@@ -407,23 +411,25 @@ class RoleRepository extends Repository {
|
|
|
407
411
|
* @param {Role} role
|
|
408
412
|
* @param {Force} force
|
|
409
413
|
*/
|
|
410
|
-
checkRolePluginsRights
|
|
414
|
+
checkRolePluginsRights(role, { force = false, forceWarn = false } = {}) {
|
|
411
415
|
const plugins = global.kuzzle.pluginsManager;
|
|
412
416
|
|
|
413
417
|
for (const roleController of Object.keys(role.controllers)) {
|
|
414
|
-
if (
|
|
415
|
-
||
|
|
418
|
+
if (
|
|
419
|
+
roleController === "*" ||
|
|
420
|
+
global.kuzzle.funnel.isNativeController(roleController)
|
|
416
421
|
) {
|
|
417
422
|
return;
|
|
418
423
|
}
|
|
419
424
|
|
|
420
|
-
if (!
|
|
421
|
-
if (!
|
|
425
|
+
if (!plugins.isController(roleController)) {
|
|
426
|
+
if (!force) {
|
|
422
427
|
throw roleRightsError.get(
|
|
423
|
-
|
|
428
|
+
"unknown_controller",
|
|
424
429
|
role._id,
|
|
425
430
|
roleController,
|
|
426
|
-
didYouMean(roleController, plugins.getControllerNames())
|
|
431
|
+
didYouMean(roleController, plugins.getControllerNames())
|
|
432
|
+
);
|
|
427
433
|
}
|
|
428
434
|
|
|
429
435
|
// Do not print any warning if Kuzzle is not started or if warn is not forced.
|
|
@@ -432,7 +438,9 @@ class RoleRepository extends Repository {
|
|
|
432
438
|
// then we need to display non-existing controllers with the sanity check
|
|
433
439
|
// made after plugins controllers loading.
|
|
434
440
|
if (global.kuzzle.state === kuzzleStateEnum.RUNNING || forceWarn) {
|
|
435
|
-
global.kuzzle.log.warn(
|
|
441
|
+
global.kuzzle.log.warn(
|
|
442
|
+
`The role "${role._id}" gives access to the non-existing controller "${roleController}".`
|
|
443
|
+
);
|
|
436
444
|
}
|
|
437
445
|
|
|
438
446
|
return;
|
|
@@ -440,19 +448,22 @@ class RoleRepository extends Repository {
|
|
|
440
448
|
|
|
441
449
|
const roleActions = Object.keys(role.controllers[roleController].actions);
|
|
442
450
|
for (const action of roleActions) {
|
|
443
|
-
if (action !==
|
|
444
|
-
if (!
|
|
451
|
+
if (action !== "*" && !plugins.isAction(roleController, action)) {
|
|
452
|
+
if (!force) {
|
|
445
453
|
throw roleRightsError.get(
|
|
446
|
-
|
|
454
|
+
"unknown_action",
|
|
447
455
|
role._id,
|
|
448
456
|
action,
|
|
449
457
|
roleController,
|
|
450
|
-
didYouMean(action, plugins.getActions(roleController))
|
|
458
|
+
didYouMean(action, plugins.getActions(roleController))
|
|
459
|
+
);
|
|
451
460
|
}
|
|
452
461
|
|
|
453
462
|
// see the other comment
|
|
454
463
|
if (global.kuzzle.state === kuzzleStateEnum.RUNNING || forceWarn) {
|
|
455
|
-
global.kuzzle.log.warn(
|
|
464
|
+
global.kuzzle.log.warn(
|
|
465
|
+
`The role "${role._id}" gives access to the non-existing action "${action}" for the controller "${roleController}".`
|
|
466
|
+
);
|
|
456
467
|
}
|
|
457
468
|
}
|
|
458
469
|
}
|
|
@@ -464,7 +475,7 @@ class RoleRepository extends Repository {
|
|
|
464
475
|
* If there are some, Kuzzle will log a warning.
|
|
465
476
|
*/
|
|
466
477
|
|
|
467
|
-
async sanityCheck
|
|
478
|
+
async sanityCheck() {
|
|
468
479
|
const roles = await this.search({}, {});
|
|
469
480
|
|
|
470
481
|
for (const role of roles.hits) {
|
|
@@ -479,7 +490,7 @@ class RoleRepository extends Repository {
|
|
|
479
490
|
* @param {object} [options]
|
|
480
491
|
* @returns Promise
|
|
481
492
|
*/
|
|
482
|
-
async deleteById
|
|
493
|
+
async deleteById(id, options) {
|
|
483
494
|
const role = await this.load(id);
|
|
484
495
|
return this.delete(role, options);
|
|
485
496
|
}
|
|
@@ -487,20 +498,23 @@ class RoleRepository extends Repository {
|
|
|
487
498
|
/**
|
|
488
499
|
* @override
|
|
489
500
|
*/
|
|
490
|
-
async delete
|
|
491
|
-
if ([
|
|
492
|
-
throw kerror.get(
|
|
501
|
+
async delete(role, { refresh = "false" } = {}) {
|
|
502
|
+
if (["admin", "default", "anonymous"].indexOf(role._id) > -1) {
|
|
503
|
+
throw kerror.get("security", "role", "cannot_delete");
|
|
493
504
|
}
|
|
494
505
|
|
|
495
|
-
const query = { term: {
|
|
506
|
+
const query = { term: { "policies.roleId": role._id } };
|
|
496
507
|
|
|
497
|
-
const response = await this.module.profile.search(
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
508
|
+
const response = await this.module.profile.search(
|
|
509
|
+
{ query },
|
|
510
|
+
{
|
|
511
|
+
from: 0,
|
|
512
|
+
size: 1,
|
|
513
|
+
}
|
|
514
|
+
);
|
|
501
515
|
|
|
502
516
|
if (response.total > 0) {
|
|
503
|
-
throw kerror.get(
|
|
517
|
+
throw kerror.get("security", "role", "in_use", role._id);
|
|
504
518
|
}
|
|
505
519
|
|
|
506
520
|
await this.deleteFromDatabase(role._id, { refresh });
|
|
@@ -514,11 +528,11 @@ class RoleRepository extends Repository {
|
|
|
514
528
|
* @param {Role} role
|
|
515
529
|
* @returns {object}
|
|
516
530
|
*/
|
|
517
|
-
serializeToDatabase
|
|
531
|
+
serializeToDatabase(role) {
|
|
518
532
|
const serializedRole = {};
|
|
519
533
|
|
|
520
|
-
Object.keys(role).forEach(key => {
|
|
521
|
-
if (key !==
|
|
534
|
+
Object.keys(role).forEach((key) => {
|
|
535
|
+
if (key !== "_id" && key !== "restrictedTo") {
|
|
522
536
|
serializedRole[key] = role[key];
|
|
523
537
|
}
|
|
524
538
|
});
|
|
@@ -529,11 +543,10 @@ class RoleRepository extends Repository {
|
|
|
529
543
|
/**
|
|
530
544
|
* @override
|
|
531
545
|
*/
|
|
532
|
-
async truncate
|
|
546
|
+
async truncate(opts) {
|
|
533
547
|
try {
|
|
534
548
|
await super.truncate(opts);
|
|
535
|
-
}
|
|
536
|
-
finally {
|
|
549
|
+
} finally {
|
|
537
550
|
this.invalidate();
|
|
538
551
|
}
|
|
539
552
|
}
|
|
@@ -543,11 +556,10 @@ class RoleRepository extends Repository {
|
|
|
543
556
|
* the entire cache is emptied.
|
|
544
557
|
* @param {string} [roleId]
|
|
545
558
|
*/
|
|
546
|
-
invalidate
|
|
547
|
-
if (!
|
|
559
|
+
invalidate(roleId) {
|
|
560
|
+
if (!roleId) {
|
|
548
561
|
this.roles.clear();
|
|
549
|
-
}
|
|
550
|
-
else {
|
|
562
|
+
} else {
|
|
551
563
|
this.roles.delete(roleId);
|
|
552
564
|
}
|
|
553
565
|
}
|