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,14 +19,14 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { Request } = require(
|
|
25
|
-
const debug = require(
|
|
26
|
-
const Repository = require(
|
|
27
|
-
const kerror = require(
|
|
28
|
-
const { User } = require(
|
|
29
|
-
const ApiKey = require(
|
|
24
|
+
const { Request } = require("../../api/request");
|
|
25
|
+
const debug = require("../../util/debug")("kuzzle:core:security:users");
|
|
26
|
+
const Repository = require("../shared/repository");
|
|
27
|
+
const kerror = require("../../kerror");
|
|
28
|
+
const { User } = require("../../model/security/user");
|
|
29
|
+
const ApiKey = require("../../model/storage/apiKey");
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* @class UserRepository
|
|
@@ -37,26 +37,29 @@ class UserRepository extends Repository {
|
|
|
37
37
|
* @param {SecurityModule} securityModule
|
|
38
38
|
* @constructor
|
|
39
39
|
*/
|
|
40
|
-
constructor
|
|
40
|
+
constructor(securityModule) {
|
|
41
41
|
super({ store: global.kuzzle.internalIndex });
|
|
42
42
|
this.module = securityModule;
|
|
43
|
-
this.collection =
|
|
43
|
+
this.collection = "users";
|
|
44
44
|
this.ObjectConstructor = User;
|
|
45
45
|
this.anonymousUser = null;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
async init
|
|
48
|
+
async init() {
|
|
49
49
|
this.anonymousUser = await this.fromDTO({
|
|
50
|
-
_id:
|
|
51
|
-
name:
|
|
52
|
-
profileIds: [
|
|
50
|
+
_id: "-1",
|
|
51
|
+
name: "Anonymous",
|
|
52
|
+
profileIds: ["anonymous"],
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Gets the standard anonymous User object
|
|
57
57
|
* @returns {User}
|
|
58
58
|
*/
|
|
59
|
-
global.kuzzle.onAsk(
|
|
59
|
+
global.kuzzle.onAsk(
|
|
60
|
+
"core:security:user:anonymous:get",
|
|
61
|
+
() => this.anonymousUser
|
|
62
|
+
);
|
|
60
63
|
|
|
61
64
|
/**
|
|
62
65
|
* Creates a new user
|
|
@@ -68,8 +71,10 @@ class UserRepository extends Repository {
|
|
|
68
71
|
* @throws If already exists or if at least one profile ID is unknown
|
|
69
72
|
*/
|
|
70
73
|
global.kuzzle.onAsk(
|
|
71
|
-
|
|
72
|
-
(id, profileIds, content, opts) =>
|
|
74
|
+
"core:security:user:create",
|
|
75
|
+
(id, profileIds, content, opts) =>
|
|
76
|
+
this.create(id, profileIds, content, opts)
|
|
77
|
+
);
|
|
73
78
|
|
|
74
79
|
/**
|
|
75
80
|
* Deletes an existing user
|
|
@@ -77,9 +82,9 @@ class UserRepository extends Repository {
|
|
|
77
82
|
* @param {Object} opts - refresh
|
|
78
83
|
* @throws If the user doesn't exist
|
|
79
84
|
*/
|
|
80
|
-
global.kuzzle.onAsk(
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
global.kuzzle.onAsk("core:security:user:delete", (id, opts) =>
|
|
86
|
+
this.deleteById(id, opts)
|
|
87
|
+
);
|
|
83
88
|
|
|
84
89
|
/**
|
|
85
90
|
* Loads and returns an existing user
|
|
@@ -87,7 +92,7 @@ class UserRepository extends Repository {
|
|
|
87
92
|
* @returns {User}
|
|
88
93
|
* @throws {NotFoundError} If the user doesn't exist
|
|
89
94
|
*/
|
|
90
|
-
global.kuzzle.onAsk(
|
|
95
|
+
global.kuzzle.onAsk("core:security:user:get", (id) => this.load(id));
|
|
91
96
|
|
|
92
97
|
/**
|
|
93
98
|
* Gets multiple users
|
|
@@ -95,9 +100,9 @@ class UserRepository extends Repository {
|
|
|
95
100
|
* @returns {Array.<User>}
|
|
96
101
|
* @throws If one or more users don't exist
|
|
97
102
|
*/
|
|
98
|
-
global.kuzzle.onAsk(
|
|
99
|
-
|
|
100
|
-
|
|
103
|
+
global.kuzzle.onAsk("core:security:user:mGet", (ids) =>
|
|
104
|
+
this.loadMultiFromDatabase(ids)
|
|
105
|
+
);
|
|
101
106
|
|
|
102
107
|
/**
|
|
103
108
|
* Replaces the user's content
|
|
@@ -107,8 +112,10 @@ class UserRepository extends Repository {
|
|
|
107
112
|
* @returns {User} Updated user
|
|
108
113
|
*/
|
|
109
114
|
global.kuzzle.onAsk(
|
|
110
|
-
|
|
111
|
-
(id, profileIds, content, opts) =>
|
|
115
|
+
"core:security:user:replace",
|
|
116
|
+
(id, profileIds, content, opts) =>
|
|
117
|
+
this.replace(id, profileIds, content, opts)
|
|
118
|
+
);
|
|
112
119
|
|
|
113
120
|
/**
|
|
114
121
|
* Fetches the next page of search results
|
|
@@ -116,9 +123,9 @@ class UserRepository extends Repository {
|
|
|
116
123
|
* @param {String} [ttl] - refresh the scroll results TTL
|
|
117
124
|
* @returns {Object} Search results
|
|
118
125
|
*/
|
|
119
|
-
global.kuzzle.onAsk(
|
|
120
|
-
|
|
121
|
-
|
|
126
|
+
global.kuzzle.onAsk("core:security:user:scroll", (id, ttl) =>
|
|
127
|
+
this.scroll(id, ttl)
|
|
128
|
+
);
|
|
122
129
|
|
|
123
130
|
/**
|
|
124
131
|
* Searches users
|
|
@@ -126,17 +133,17 @@ class UserRepository extends Repository {
|
|
|
126
133
|
* @param {Object} opts (from, size, scroll)
|
|
127
134
|
* @returns {Object} Search results
|
|
128
135
|
*/
|
|
129
|
-
global.kuzzle.onAsk(
|
|
130
|
-
|
|
131
|
-
|
|
136
|
+
global.kuzzle.onAsk("core:security:user:search", (searchBody, opts) =>
|
|
137
|
+
this.search(searchBody, opts)
|
|
138
|
+
);
|
|
132
139
|
|
|
133
140
|
/**
|
|
134
141
|
* Removes all existing users
|
|
135
142
|
* @param {Object} opts (refresh)
|
|
136
143
|
*/
|
|
137
|
-
global.kuzzle.onAsk(
|
|
138
|
-
|
|
139
|
-
|
|
144
|
+
global.kuzzle.onAsk("core:security:user:truncate", (opts) =>
|
|
145
|
+
this.truncate(opts)
|
|
146
|
+
);
|
|
140
147
|
|
|
141
148
|
/**
|
|
142
149
|
* Updates an existing user using a partial content
|
|
@@ -146,17 +153,19 @@ class UserRepository extends Repository {
|
|
|
146
153
|
* @returns {User} Updated user
|
|
147
154
|
*/
|
|
148
155
|
global.kuzzle.onAsk(
|
|
149
|
-
|
|
150
|
-
(id, profileIds, content, opts) =>
|
|
156
|
+
"core:security:user:update",
|
|
157
|
+
(id, profileIds, content, opts) =>
|
|
158
|
+
this.update(id, profileIds, content, opts)
|
|
159
|
+
);
|
|
151
160
|
|
|
152
161
|
/**
|
|
153
162
|
* Returns true if there is at least one user with the "admin" profile
|
|
154
163
|
*
|
|
155
164
|
* @returns {Boolean}
|
|
156
165
|
*/
|
|
157
|
-
global.kuzzle.onAsk(
|
|
158
|
-
|
|
159
|
-
|
|
166
|
+
global.kuzzle.onAsk("core:security:user:admin:exist", () =>
|
|
167
|
+
this.adminExists()
|
|
168
|
+
);
|
|
160
169
|
}
|
|
161
170
|
|
|
162
171
|
/**
|
|
@@ -166,7 +175,7 @@ class UserRepository extends Repository {
|
|
|
166
175
|
* @param {Object} content
|
|
167
176
|
* @param {Object} [opts]
|
|
168
177
|
*/
|
|
169
|
-
async create
|
|
178
|
+
async create(id, profileIds, content, { userId, refresh = "false" } = {}) {
|
|
170
179
|
const user = await this.fromDTO({
|
|
171
180
|
...content,
|
|
172
181
|
// Profile Ids and content are stored at the same level... for now.
|
|
@@ -184,12 +193,11 @@ class UserRepository extends Repository {
|
|
|
184
193
|
|
|
185
194
|
try {
|
|
186
195
|
return await this.persist(user, {
|
|
187
|
-
database: { method:
|
|
196
|
+
database: { method: "create", refresh },
|
|
188
197
|
});
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
throw kerror.get('security', 'user', 'already_exists', id);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
if (error.id === "services.storage.document_already_exists") {
|
|
200
|
+
throw kerror.get("security", "user", "already_exists", id);
|
|
193
201
|
}
|
|
194
202
|
|
|
195
203
|
throw error;
|
|
@@ -204,11 +212,12 @@ class UserRepository extends Repository {
|
|
|
204
212
|
* @param {Object} [opts]
|
|
205
213
|
* @returns {Promise}
|
|
206
214
|
*/
|
|
207
|
-
async update
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
215
|
+
async update(
|
|
216
|
+
id,
|
|
217
|
+
profileIds,
|
|
218
|
+
content,
|
|
219
|
+
{ refresh = "false", retryOnConflict = 10, userId } = {}
|
|
220
|
+
) {
|
|
212
221
|
const user = await this.load(id);
|
|
213
222
|
const pojo = this.toDTO(user);
|
|
214
223
|
|
|
@@ -228,10 +237,10 @@ class UserRepository extends Repository {
|
|
|
228
237
|
|
|
229
238
|
return this.persist(updated, {
|
|
230
239
|
database: {
|
|
231
|
-
method:
|
|
240
|
+
method: "update",
|
|
232
241
|
refresh,
|
|
233
242
|
retryOnConflict,
|
|
234
|
-
}
|
|
243
|
+
},
|
|
235
244
|
});
|
|
236
245
|
}
|
|
237
246
|
|
|
@@ -242,7 +251,7 @@ class UserRepository extends Repository {
|
|
|
242
251
|
* @param {Object} [opts]
|
|
243
252
|
* @returns {Promise}
|
|
244
253
|
*/
|
|
245
|
-
async replace
|
|
254
|
+
async replace(id, profileIds, content, { refresh = "false", userId } = {}) {
|
|
246
255
|
// Assertion: the user must exist
|
|
247
256
|
await this.load(id);
|
|
248
257
|
|
|
@@ -254,16 +263,16 @@ class UserRepository extends Repository {
|
|
|
254
263
|
author: userId,
|
|
255
264
|
createdAt: Date.now(),
|
|
256
265
|
updatedAt: null,
|
|
257
|
-
updater: null
|
|
266
|
+
updater: null,
|
|
258
267
|
},
|
|
259
268
|
profileIds,
|
|
260
269
|
});
|
|
261
270
|
|
|
262
271
|
return this.persist(user, {
|
|
263
272
|
database: {
|
|
264
|
-
method:
|
|
273
|
+
method: "replace",
|
|
265
274
|
refresh,
|
|
266
|
-
}
|
|
275
|
+
},
|
|
267
276
|
});
|
|
268
277
|
}
|
|
269
278
|
|
|
@@ -274,22 +283,23 @@ class UserRepository extends Repository {
|
|
|
274
283
|
* @returns {Promise.<User>}
|
|
275
284
|
* @throws {NotFoundError} If the user is not found
|
|
276
285
|
*/
|
|
277
|
-
async load
|
|
278
|
-
if (id ===
|
|
286
|
+
async load(id) {
|
|
287
|
+
if (id === "anonymous" || id === "-1") {
|
|
279
288
|
return this.anonymousUser;
|
|
280
289
|
}
|
|
281
290
|
|
|
282
291
|
return super.load(id);
|
|
283
292
|
}
|
|
284
293
|
|
|
285
|
-
async persist
|
|
294
|
+
async persist(user, options = {}) {
|
|
286
295
|
const databaseOptions = options.database || {};
|
|
287
296
|
const cacheOptions = options.cache || {};
|
|
288
297
|
|
|
289
|
-
if (
|
|
290
|
-
|
|
298
|
+
if (
|
|
299
|
+
user._id === this.anonymousUser._id &&
|
|
300
|
+
user.profileIds.indexOf("anonymous") === -1
|
|
291
301
|
) {
|
|
292
|
-
throw kerror.get(
|
|
302
|
+
throw kerror.get("security", "user", "anonymous_profile_required");
|
|
293
303
|
}
|
|
294
304
|
|
|
295
305
|
await this.persistToDatabase(user, databaseOptions);
|
|
@@ -303,8 +313,8 @@ class UserRepository extends Repository {
|
|
|
303
313
|
* @param dto
|
|
304
314
|
* @returns {Promise<User>}
|
|
305
315
|
*/
|
|
306
|
-
async fromDTO
|
|
307
|
-
if (dto.profileIds && !
|
|
316
|
+
async fromDTO(dto) {
|
|
317
|
+
if (dto.profileIds && !Array.isArray(dto.profileIds)) {
|
|
308
318
|
dto.profileIds = [dto.profileIds];
|
|
309
319
|
}
|
|
310
320
|
|
|
@@ -317,14 +327,14 @@ class UserRepository extends Repository {
|
|
|
317
327
|
// if the user exists (has an _id) but no profile associated: there is a
|
|
318
328
|
// database inconsistency
|
|
319
329
|
if (user.profileIds.length === 0) {
|
|
320
|
-
throw kerror.get(
|
|
330
|
+
throw kerror.get("security", "user", "no_profile", user._id);
|
|
321
331
|
}
|
|
322
332
|
|
|
323
333
|
const profiles = await this.module.profile.loadProfiles(user.profileIds);
|
|
324
334
|
|
|
325
335
|
// Fail if not all profiles are found
|
|
326
|
-
if (profiles.some(p => p === null)) {
|
|
327
|
-
throw kerror.get(
|
|
336
|
+
if (profiles.some((p) => p === null)) {
|
|
337
|
+
throw kerror.get("security", "user", "cannot_hydrate", dto._id);
|
|
328
338
|
}
|
|
329
339
|
|
|
330
340
|
return user;
|
|
@@ -338,7 +348,7 @@ class UserRepository extends Repository {
|
|
|
338
348
|
* @param {Object} [options]
|
|
339
349
|
* @returns {Promise}
|
|
340
350
|
*/
|
|
341
|
-
async deleteById
|
|
351
|
+
async deleteById(id, opts) {
|
|
342
352
|
const user = await this.load(id);
|
|
343
353
|
|
|
344
354
|
return this.delete(user, opts);
|
|
@@ -347,8 +357,8 @@ class UserRepository extends Repository {
|
|
|
347
357
|
/**
|
|
348
358
|
* @override
|
|
349
359
|
*/
|
|
350
|
-
async delete
|
|
351
|
-
debug(
|
|
360
|
+
async delete(user, { refresh = "false" } = {}) {
|
|
361
|
+
debug("Delete user: %s", user);
|
|
352
362
|
|
|
353
363
|
await this._removeUserStrategies(user);
|
|
354
364
|
await ApiKey.deleteByUser(user, { refresh });
|
|
@@ -356,7 +366,7 @@ class UserRepository extends Repository {
|
|
|
356
366
|
await super.delete(user, { refresh });
|
|
357
367
|
}
|
|
358
368
|
|
|
359
|
-
async _removeUserStrategies
|
|
369
|
+
async _removeUserStrategies(user) {
|
|
360
370
|
const availableStrategies = global.kuzzle.pluginsManager.listStrategies();
|
|
361
371
|
const userStrategies = [];
|
|
362
372
|
const request = new Request({ _id: user._id });
|
|
@@ -364,7 +374,8 @@ class UserRepository extends Repository {
|
|
|
364
374
|
for (const strategy of availableStrategies) {
|
|
365
375
|
const existStrategy = global.kuzzle.pluginsManager.getStrategyMethod(
|
|
366
376
|
strategy,
|
|
367
|
-
|
|
377
|
+
"exists"
|
|
378
|
+
);
|
|
368
379
|
|
|
369
380
|
if (await existStrategy(request, user._id, strategy)) {
|
|
370
381
|
userStrategies.push(strategy);
|
|
@@ -376,15 +387,19 @@ class UserRepository extends Repository {
|
|
|
376
387
|
for (const strategy of userStrategies) {
|
|
377
388
|
const deleteStrategy = global.kuzzle.pluginsManager.getStrategyMethod(
|
|
378
389
|
strategy,
|
|
379
|
-
|
|
390
|
+
"delete"
|
|
391
|
+
);
|
|
380
392
|
|
|
381
393
|
// We catch any error produced by delete as we want to make as much
|
|
382
394
|
// cleanup as possible
|
|
383
395
|
try {
|
|
384
|
-
debug(
|
|
396
|
+
debug(
|
|
397
|
+
"Deleting credentials on strategy %s for user %s",
|
|
398
|
+
strategy,
|
|
399
|
+
user._id
|
|
400
|
+
);
|
|
385
401
|
await deleteStrategy(request, user._id, strategy);
|
|
386
|
-
}
|
|
387
|
-
catch (error) {
|
|
402
|
+
} catch (error) {
|
|
388
403
|
errors.push(error);
|
|
389
404
|
}
|
|
390
405
|
}
|
|
@@ -392,36 +407,37 @@ class UserRepository extends Repository {
|
|
|
392
407
|
|
|
393
408
|
if (errors.length > 0) {
|
|
394
409
|
throw kerror.get(
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
errors.join(
|
|
410
|
+
"security",
|
|
411
|
+
"credentials",
|
|
412
|
+
"rejected",
|
|
413
|
+
errors.join("\n\t- ")
|
|
414
|
+
);
|
|
399
415
|
}
|
|
400
416
|
}
|
|
401
417
|
|
|
402
418
|
/**
|
|
403
419
|
* @override
|
|
404
420
|
*/
|
|
405
|
-
async loadOneFromDatabase
|
|
421
|
+
async loadOneFromDatabase(id) {
|
|
406
422
|
try {
|
|
407
423
|
return await super.loadOneFromDatabase(id);
|
|
408
|
-
}
|
|
409
|
-
catch (err) {
|
|
424
|
+
} catch (err) {
|
|
410
425
|
if (err.status === 404) {
|
|
411
|
-
throw kerror.get(
|
|
426
|
+
throw kerror.get("security", "user", "not_found", id);
|
|
412
427
|
}
|
|
413
428
|
throw err;
|
|
414
429
|
}
|
|
415
430
|
}
|
|
416
431
|
|
|
417
|
-
async adminExists
|
|
432
|
+
async adminExists() {
|
|
418
433
|
const { total } = await this.search(
|
|
419
434
|
{
|
|
420
435
|
query: {
|
|
421
|
-
term: { profileIds:
|
|
422
|
-
}
|
|
436
|
+
term: { profileIds: "admin" },
|
|
437
|
+
},
|
|
423
438
|
},
|
|
424
|
-
{ size: 1 }
|
|
439
|
+
{ size: 1 }
|
|
440
|
+
);
|
|
425
441
|
|
|
426
442
|
return total >= 1;
|
|
427
443
|
}
|
|
@@ -82,7 +82,9 @@ class Koncorde {
|
|
|
82
82
|
* @return {boolean}
|
|
83
83
|
*/
|
|
84
84
|
exists(index, collection) {
|
|
85
|
-
return this.koncorde
|
|
85
|
+
return this.koncorde
|
|
86
|
+
.getIndexes()
|
|
87
|
+
.includes((0, koncordeCompat_1.toKoncordeIndex)(index, collection));
|
|
86
88
|
}
|
|
87
89
|
/**
|
|
88
90
|
* Returns the list of collections associated to an index registered in this
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const _ = require(
|
|
25
|
-
const path = require(
|
|
26
|
-
const semver = require(
|
|
24
|
+
const _ = require("lodash");
|
|
25
|
+
const path = require("path");
|
|
26
|
+
const semver = require("semver");
|
|
27
27
|
|
|
28
|
-
const kerror = require(
|
|
28
|
+
const kerror = require("../../kerror").wrap("plugin", "manifest");
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Abstract class used to load a manifest.json file.
|
|
@@ -35,46 +35,45 @@ const kerror = require('../../kerror').wrap('plugin', 'manifest');
|
|
|
35
35
|
* @param {string} pluginPath - Absolute path to the plugin directory
|
|
36
36
|
*/
|
|
37
37
|
class AbstractManifest {
|
|
38
|
-
constructor
|
|
38
|
+
constructor(pluginPath) {
|
|
39
39
|
this.path = pluginPath;
|
|
40
40
|
|
|
41
|
-
this.manifestPath = path.resolve(this.path,
|
|
41
|
+
this.manifestPath = path.resolve(this.path, "manifest.json");
|
|
42
42
|
this.name = null;
|
|
43
43
|
this.kuzzleVersion = null;
|
|
44
44
|
this.raw = null;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
load
|
|
47
|
+
load() {
|
|
48
48
|
try {
|
|
49
49
|
this.raw = require(this.manifestPath);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
throw kerror.get('cannot_load', this.manifestPath, e.message);
|
|
50
|
+
} catch (e) {
|
|
51
|
+
throw kerror.get("cannot_load", this.manifestPath, e.message);
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
if (_.isNil(this.raw.kuzzleVersion)) {
|
|
56
|
-
throw kerror.get(
|
|
55
|
+
throw kerror.get("missing_version", this.manifestPath);
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
this.kuzzleVersion = this.raw.kuzzleVersion;
|
|
60
59
|
|
|
61
|
-
if (!
|
|
60
|
+
if (!semver.satisfies(global.kuzzle.config.version, this.kuzzleVersion)) {
|
|
62
61
|
throw kerror.get(
|
|
63
|
-
|
|
62
|
+
"version_mismatch",
|
|
64
63
|
this.path,
|
|
65
64
|
global.kuzzle.config.version,
|
|
66
|
-
this.kuzzleVersion
|
|
65
|
+
this.kuzzleVersion
|
|
66
|
+
);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
if (!
|
|
70
|
-
if (typeof this.raw.name !==
|
|
71
|
-
throw kerror.get(
|
|
69
|
+
if (!_.isNil(this.raw.name)) {
|
|
70
|
+
if (typeof this.raw.name !== "string" || this.raw.name.length === 0) {
|
|
71
|
+
throw kerror.get("invalid_name_type", this.manifestPath);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
this.name = this.raw.name;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
throw kerror.get('missing_name', this.manifestPath);
|
|
75
|
+
} else {
|
|
76
|
+
throw kerror.get("missing_name", this.manifestPath);
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
|
|
@@ -87,11 +86,11 @@ class AbstractManifest {
|
|
|
87
86
|
*
|
|
88
87
|
* @returns {Object}
|
|
89
88
|
*/
|
|
90
|
-
toJSON
|
|
89
|
+
toJSON() {
|
|
91
90
|
return {
|
|
92
91
|
kuzzleVersion: this.kuzzleVersion,
|
|
93
92
|
name: this.name,
|
|
94
|
-
path: this.path
|
|
93
|
+
path: this.path,
|
|
95
94
|
};
|
|
96
95
|
}
|
|
97
96
|
}
|