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
package/lib/config/index.js
CHANGED
|
@@ -19,29 +19,28 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const assert = require(
|
|
24
|
+
const assert = require("assert");
|
|
25
25
|
|
|
26
|
-
const rc = require(
|
|
27
|
-
const defaultConfig = require(
|
|
28
|
-
const packageJson = require(
|
|
29
|
-
const kerror = require(
|
|
30
|
-
const { isPlainObject } = require(
|
|
31
|
-
const bytes = require(
|
|
26
|
+
const rc = require("rc");
|
|
27
|
+
const defaultConfig = require("./default.config");
|
|
28
|
+
const packageJson = require("../../package.json");
|
|
29
|
+
const kerror = require("../kerror").wrap("core", "configuration");
|
|
30
|
+
const { isPlainObject } = require("../util/safeObject");
|
|
31
|
+
const bytes = require("../util/bytes");
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Loads, interprets and checks configuration files
|
|
35
35
|
* @returns {object}
|
|
36
36
|
*/
|
|
37
|
-
function loadConfig
|
|
37
|
+
function loadConfig() {
|
|
38
38
|
let config;
|
|
39
39
|
|
|
40
40
|
try {
|
|
41
|
-
config = rc(
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
throw kerror.get('cannot_parse', e.message);
|
|
41
|
+
config = rc("kuzzle", defaultConfig.default);
|
|
42
|
+
} catch (e) {
|
|
43
|
+
throw kerror.get("cannot_parse", e.message);
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
config = unstringify(config);
|
|
@@ -53,8 +52,8 @@ function loadConfig () {
|
|
|
53
52
|
|
|
54
53
|
config.internal = {
|
|
55
54
|
hash: {
|
|
56
|
-
seed: Buffer.from(
|
|
57
|
-
}
|
|
55
|
+
seed: Buffer.from("^m&mOISKBvb1xpl1mRsrylaQXpjb&IJX"),
|
|
56
|
+
},
|
|
58
57
|
};
|
|
59
58
|
|
|
60
59
|
preprocessHttpOptions(config);
|
|
@@ -78,33 +77,34 @@ function loadConfig () {
|
|
|
78
77
|
* @param {object} cfg - configuration loaded using RC
|
|
79
78
|
* @returns {object} correctly typed configuration
|
|
80
79
|
*/
|
|
81
|
-
function unstringify
|
|
80
|
+
function unstringify(cfg) {
|
|
82
81
|
Object.keys(cfg)
|
|
83
|
-
.filter(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
.filter(
|
|
83
|
+
(k) =>
|
|
84
|
+
!/version$/i.test(k) &&
|
|
85
|
+
(typeof cfg[k] === "string" || cfg[k] instanceof Object)
|
|
86
|
+
)
|
|
87
|
+
.forEach((k) => {
|
|
88
|
+
if (typeof cfg[k] === "string") {
|
|
89
|
+
if (cfg[k] === "true") {
|
|
87
90
|
cfg[k] = true;
|
|
88
|
-
}
|
|
89
|
-
else if (cfg[k] === 'false') {
|
|
91
|
+
} else if (cfg[k] === "false") {
|
|
90
92
|
cfg[k] = false;
|
|
91
|
-
}
|
|
92
|
-
else if (cfg[k].startsWith('*json:')) {
|
|
93
|
+
} else if (cfg[k].startsWith("*json:")) {
|
|
93
94
|
try {
|
|
94
|
-
cfg[k] = JSON.parse(cfg[k].replace(/^\*json:/,
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
cfg[k] = JSON.parse(cfg[k].replace(/^\*json:/, ""));
|
|
96
|
+
} catch (e) {
|
|
97
|
+
throw kerror.get(
|
|
98
|
+
"cannot_parse",
|
|
99
|
+
`the key "${k}" does not contain a valid stringified JSON (${cfg[k]})`
|
|
100
|
+
);
|
|
98
101
|
}
|
|
99
|
-
}
|
|
100
|
-
else if (/^(-|\+)?([0-9]+)$/.test(cfg[k])) {
|
|
102
|
+
} else if (/^(-|\+)?([0-9]+)$/.test(cfg[k])) {
|
|
101
103
|
cfg[k] = Number.parseInt(cfg[k]);
|
|
102
|
-
}
|
|
103
|
-
else if (/^(-|\+)?([0-9]+(\.[0-9]+)?)$/.test(cfg[k])) {
|
|
104
|
+
} else if (/^(-|\+)?([0-9]+(\.[0-9]+)?)$/.test(cfg[k])) {
|
|
104
105
|
cfg[k] = parseFloat(cfg[k]);
|
|
105
106
|
}
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
107
|
+
} else {
|
|
108
108
|
cfg[k] = unstringify(cfg[k]);
|
|
109
109
|
}
|
|
110
110
|
});
|
|
@@ -119,139 +119,202 @@ function unstringify (cfg) {
|
|
|
119
119
|
*
|
|
120
120
|
* @param {object} cfg
|
|
121
121
|
*/
|
|
122
|
-
function checkLimitsConfig
|
|
122
|
+
function checkLimitsConfig(cfg) {
|
|
123
123
|
const limits = [
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
124
|
+
"concurrentRequests",
|
|
125
|
+
"documentsFetchCount",
|
|
126
|
+
"documentsWriteCount",
|
|
127
|
+
"loginsPerSecond",
|
|
128
|
+
"requestsBufferSize",
|
|
129
|
+
"requestsBufferWarningThreshold",
|
|
130
|
+
"subscriptionConditionsCount",
|
|
131
|
+
"subscriptionMinterms",
|
|
132
|
+
"subscriptionRooms",
|
|
133
|
+
"subscriptionDocumentTTL",
|
|
134
134
|
];
|
|
135
135
|
const canBeZero = [
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
136
|
+
"subscriptionMinterms",
|
|
137
|
+
"subscriptionRooms",
|
|
138
|
+
"subscriptionDocumentTTL",
|
|
139
139
|
];
|
|
140
140
|
|
|
141
|
-
if (!
|
|
142
|
-
throw kerror.get(
|
|
141
|
+
if (!isPlainObject(cfg.limits)) {
|
|
142
|
+
throw kerror.get("invalid_type", "limits", "object");
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
for (const opt of limits) {
|
|
146
|
-
if (typeof cfg.limits[opt] !==
|
|
147
|
-
throw kerror.get(
|
|
146
|
+
if (typeof cfg.limits[opt] !== "number") {
|
|
147
|
+
throw kerror.get("invalid_type", `limits.${opt}`, "number");
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
if (
|
|
151
|
-
|
|
150
|
+
if (
|
|
151
|
+
cfg.limits[opt] < 0 ||
|
|
152
|
+
(cfg.limits[opt] === 0 && !canBeZero.includes(opt))
|
|
152
153
|
) {
|
|
153
|
-
const allowed = `>= ${canBeZero.includes(opt) ?
|
|
154
|
-
throw kerror.get(
|
|
154
|
+
const allowed = `>= ${canBeZero.includes(opt) ? "0" : "1"}`;
|
|
155
|
+
throw kerror.get("out_of_range", `limits.${opt}`, allowed);
|
|
155
156
|
}
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
if (cfg.limits.concurrentRequests >= cfg.limits.requestsBufferSize) {
|
|
159
|
-
throw kerror.get(
|
|
160
|
+
throw kerror.get(
|
|
161
|
+
"out_of_range",
|
|
162
|
+
"limits.concurrentRequests",
|
|
163
|
+
'lower than "limits.requestsBufferSize"'
|
|
164
|
+
);
|
|
160
165
|
}
|
|
161
166
|
|
|
162
|
-
if (
|
|
163
|
-
|
|
167
|
+
if (
|
|
168
|
+
cfg.limits.requestsBufferWarningThreshold < cfg.limits.concurrentRequests ||
|
|
169
|
+
cfg.limits.requestsBufferWarningThreshold > cfg.limits.requestsBufferSize
|
|
164
170
|
) {
|
|
165
171
|
throw kerror.get(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
172
|
+
"out_of_range",
|
|
173
|
+
"limits.requestsBufferWarningThreshold",
|
|
174
|
+
"[limits.concurrentRequests, limits.requestsBufferSize]"
|
|
175
|
+
);
|
|
169
176
|
}
|
|
170
177
|
}
|
|
171
178
|
|
|
172
|
-
function checkWebSocketOptions
|
|
179
|
+
function checkWebSocketOptions(config) {
|
|
173
180
|
const cfg = config.server.protocols.websocket;
|
|
174
181
|
|
|
175
182
|
if (cfg === undefined) {
|
|
176
183
|
return;
|
|
177
184
|
}
|
|
178
185
|
|
|
179
|
-
assert(
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
186
|
+
assert(
|
|
187
|
+
typeof cfg.enabled === "boolean",
|
|
188
|
+
`[websocket] "enabled" parameter: invalid value "${cfg.enabled}" (boolean expected)`
|
|
189
|
+
);
|
|
190
|
+
assert(
|
|
191
|
+
Number.isInteger(cfg.idleTimeout) && cfg.idleTimeout >= 0,
|
|
192
|
+
`[websocket] "idleTimeout" parameter: invalid value "${cfg.idleTimeout}" (integer >= 1000 expected)`
|
|
193
|
+
);
|
|
194
|
+
assert(
|
|
195
|
+
Number.isInteger(cfg.rateLimit) && cfg.rateLimit >= 0,
|
|
196
|
+
`[websocket] "rateLimit" parameter: invalid value "${cfg.rateLimit}" (integer >= 0 expected)`
|
|
197
|
+
);
|
|
198
|
+
assert(
|
|
199
|
+
typeof cfg.compression === "boolean",
|
|
200
|
+
`[websocket] "compression" parameter: invalid value "${cfg.compression}" (boolean value expected)`
|
|
201
|
+
);
|
|
183
202
|
}
|
|
184
203
|
|
|
185
|
-
function checkHttpOptions
|
|
204
|
+
function checkHttpOptions(config) {
|
|
186
205
|
const cfg = config.server.protocols.http;
|
|
187
206
|
|
|
188
207
|
if (cfg === undefined) {
|
|
189
208
|
return;
|
|
190
209
|
}
|
|
191
210
|
|
|
192
|
-
assert(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
211
|
+
assert(
|
|
212
|
+
typeof config.http.accessControlAllowOrigin === "string" ||
|
|
213
|
+
Array.isArray(config.http.accessControlAllowOrigin),
|
|
214
|
+
`[http] "accessControlAllowOrigin" parameter: invalid value "${config.http.accessControlAllowOrigin}" (array or string expected)`
|
|
215
|
+
);
|
|
216
|
+
assert(
|
|
217
|
+
typeof config.http.accessControlAllowOriginUseRegExp === "boolean",
|
|
218
|
+
`[http] "accessControlAllowOriginUseRegExp" parameter: invalid value "${cfg.accessControlAllowOriginUseRegExp}" (boolean expected)`
|
|
219
|
+
);
|
|
220
|
+
assert(
|
|
221
|
+
typeof cfg.enabled === "boolean",
|
|
222
|
+
`[http] "enabled" parameter: invalid value "${cfg.enabled}" (boolean expected)`
|
|
223
|
+
);
|
|
224
|
+
assert(
|
|
225
|
+
typeof cfg.allowCompression === "boolean",
|
|
226
|
+
`[http] "allowCompression" parameter: invalid value "${cfg.allowCompression}" (boolean expected)`
|
|
227
|
+
);
|
|
228
|
+
assert(
|
|
229
|
+
Number.isInteger(cfg.maxEncodingLayers) && cfg.maxEncodingLayers >= 1,
|
|
230
|
+
`[http] "maxEncodingLayers" parameter: invalid value "${cfg.maxEncodingLayers}" (integer >= 1 expected)`
|
|
231
|
+
);
|
|
197
232
|
|
|
198
233
|
const maxFormFileSize = bytes(cfg.maxFormFileSize);
|
|
199
|
-
assert(
|
|
234
|
+
assert(
|
|
235
|
+
Number.isInteger(maxFormFileSize) && maxFormFileSize >= 0,
|
|
236
|
+
`[http] "maxFormFileSize" parameter: cannot parse "${cfg.maxFormFileSize}"`
|
|
237
|
+
);
|
|
200
238
|
cfg.maxFormFileSize = maxFormFileSize;
|
|
201
|
-
assert(
|
|
239
|
+
assert(
|
|
240
|
+
typeof config.http.cookieAuthentication === "boolean",
|
|
241
|
+
`[http] "cookieAuthentication" parameter: invalid value "${config.http.cookieAuthentication}" (boolean expected)`
|
|
242
|
+
);
|
|
202
243
|
}
|
|
203
244
|
|
|
204
|
-
|
|
205
|
-
function checkClusterOptions (config) {
|
|
245
|
+
function checkClusterOptions(config) {
|
|
206
246
|
const cfg = config.cluster;
|
|
207
247
|
|
|
208
|
-
for (const prop of [
|
|
209
|
-
|
|
248
|
+
for (const prop of [
|
|
249
|
+
"heartbeat",
|
|
250
|
+
"joinTimeout",
|
|
251
|
+
"minimumNodes",
|
|
252
|
+
"activityDepth",
|
|
253
|
+
"syncTimeout",
|
|
254
|
+
]) {
|
|
255
|
+
assert(
|
|
256
|
+
typeof cfg[prop] === "number" && cfg[prop] > 0,
|
|
257
|
+
`[CONFIG] kuzzlerc.cluster.${prop}: value must be a number greater than 0`
|
|
258
|
+
);
|
|
210
259
|
}
|
|
211
260
|
|
|
212
|
-
assert(
|
|
261
|
+
assert(
|
|
262
|
+
cfg.syncTimeout < cfg.joinTimeout,
|
|
263
|
+
"[CONFIG] kuzzlerc.cluster.syncTimeout: value must be lower than kuzzlerc.cluster.joinTimeout"
|
|
264
|
+
);
|
|
213
265
|
|
|
214
|
-
for (const prop of [
|
|
215
|
-
assert(
|
|
266
|
+
for (const prop of ["command", "sync"]) {
|
|
267
|
+
assert(
|
|
268
|
+
typeof cfg.ports[prop] === "number" && cfg.ports[prop] > 0,
|
|
269
|
+
`[CONFIG] kuzzlerc.cluster.ports.${prop}: value must be a number greater than 0`
|
|
270
|
+
);
|
|
216
271
|
}
|
|
217
272
|
|
|
218
|
-
assert(
|
|
273
|
+
assert(
|
|
274
|
+
typeof cfg.ipv6 === "boolean",
|
|
275
|
+
"[CONFIG] kuzzlerc.cluster.ipv6: boolean expected"
|
|
276
|
+
);
|
|
219
277
|
// If config is passed with env variable, ip cannot be the value null
|
|
220
278
|
// but only blank string or the string "null"
|
|
221
|
-
if (`${cfg.ip}`.length === 0 || cfg.ip ===
|
|
279
|
+
if (`${cfg.ip}`.length === 0 || cfg.ip === "null") {
|
|
222
280
|
cfg.ip = null;
|
|
223
281
|
}
|
|
224
|
-
assert(
|
|
225
|
-
|
|
226
|
-
|
|
282
|
+
assert(
|
|
283
|
+
!cfg.ip || ["private", "public"].includes(cfg.ip),
|
|
284
|
+
"[CONFIG] kuzzlerc.cluster.ip: invalid value (accepted values: public, private)"
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
assert(
|
|
288
|
+
!cfg.interface || typeof cfg.interface === "string",
|
|
289
|
+
"[CONFIG] kuzzlerc.cluster.interface: value must be either null, or a string"
|
|
290
|
+
);
|
|
227
291
|
}
|
|
228
292
|
|
|
229
|
-
function preprocessHttpOptions
|
|
293
|
+
function preprocessHttpOptions(config) {
|
|
230
294
|
const httpConfig = config.http;
|
|
231
295
|
|
|
232
296
|
if (httpConfig === undefined) {
|
|
233
297
|
return;
|
|
234
298
|
}
|
|
235
299
|
|
|
236
|
-
if (typeof httpConfig.accessControlAllowOrigin ===
|
|
237
|
-
httpConfig.accessControlAllowOrigin =
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
.map(value => value.trim());
|
|
300
|
+
if (typeof httpConfig.accessControlAllowOrigin === "string") {
|
|
301
|
+
httpConfig.accessControlAllowOrigin = httpConfig.accessControlAllowOrigin
|
|
302
|
+
.split(",")
|
|
303
|
+
.map((value) => value.trim());
|
|
241
304
|
}
|
|
242
305
|
|
|
243
306
|
// Stored to avoid doing includes multiple times later
|
|
244
|
-
config.internal.allowAllOrigins =
|
|
307
|
+
config.internal.allowAllOrigins =
|
|
308
|
+
httpConfig.accessControlAllowOrigin.includes("*");
|
|
245
309
|
|
|
246
310
|
// If Regular Expression is enabled for accessControlAllowOrigin header we convert every string to a RegExp
|
|
247
311
|
if (httpConfig.accessControlAllowOriginUseRegExp) {
|
|
248
312
|
httpConfig.accessControlAllowOrigin =
|
|
249
|
-
httpConfig.accessControlAllowOrigin
|
|
250
|
-
.map(pattern => new RegExp(pattern));
|
|
313
|
+
httpConfig.accessControlAllowOrigin.map((pattern) => new RegExp(pattern));
|
|
251
314
|
}
|
|
252
315
|
}
|
|
253
316
|
|
|
254
|
-
function preprocessProtocolsOptions
|
|
317
|
+
function preprocessProtocolsOptions(config) {
|
|
255
318
|
const protocols = config.server.protocols;
|
|
256
319
|
|
|
257
320
|
config.internal.notifiableProtocols = [];
|
|
@@ -263,7 +326,7 @@ function preprocessProtocolsOptions (config) {
|
|
|
263
326
|
}
|
|
264
327
|
}
|
|
265
328
|
|
|
266
|
-
function preprocessRedisOptions
|
|
329
|
+
function preprocessRedisOptions(redisConfig) {
|
|
267
330
|
// @deprecated Remove those lines for Kuzzle v3 then
|
|
268
331
|
// remove also 'database' from .kuzzlerc.sample and default.config
|
|
269
332
|
if (redisConfig.database) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"js":
|
|
3
|
-
"csharp":
|
|
4
|
-
"cpp":
|
|
5
|
-
"java":
|
|
6
|
-
"android":
|
|
7
|
-
"go":
|
|
8
|
-
"php":
|
|
9
|
-
}
|
|
2
|
+
"js": { "min": 7 },
|
|
3
|
+
"csharp": { "min": 2 },
|
|
4
|
+
"cpp": { "min": 2 },
|
|
5
|
+
"java": { "min": 3 },
|
|
6
|
+
"android": { "min": 5 },
|
|
7
|
+
"go": { "min": 3 },
|
|
8
|
+
"php": { "min": 4 }
|
|
9
|
+
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
module.exports = {
|
|
25
25
|
/**
|
|
@@ -28,7 +28,7 @@ module.exports = {
|
|
|
28
28
|
* @param {Role} role
|
|
29
29
|
* @returns {object}
|
|
30
30
|
*/
|
|
31
|
-
serializeProfile: profile => {
|
|
31
|
+
serializeProfile: (profile) => {
|
|
32
32
|
const { _id, ..._source } = profile;
|
|
33
33
|
|
|
34
34
|
return { _id, _source };
|
|
@@ -40,11 +40,11 @@ module.exports = {
|
|
|
40
40
|
* @param {Profile} profile
|
|
41
41
|
* @returns {Object}
|
|
42
42
|
*/
|
|
43
|
-
serializeRole: role => {
|
|
43
|
+
serializeRole: (role) => {
|
|
44
44
|
const _source = {};
|
|
45
45
|
|
|
46
|
-
Object.keys(role).forEach(key => {
|
|
47
|
-
if (key !==
|
|
46
|
+
Object.keys(role).forEach((key) => {
|
|
47
|
+
if (key !== "_id" && key !== "restrictedTo") {
|
|
48
48
|
_source[key] = role[key];
|
|
49
49
|
}
|
|
50
50
|
});
|
|
@@ -58,9 +58,9 @@ module.exports = {
|
|
|
58
58
|
* @param {User} user
|
|
59
59
|
* @returns {Object}
|
|
60
60
|
*/
|
|
61
|
-
serializeUser: user => {
|
|
61
|
+
serializeUser: (user) => {
|
|
62
62
|
const { _id, ..._source } = user;
|
|
63
63
|
|
|
64
64
|
return { _id, _source };
|
|
65
|
-
}
|
|
65
|
+
},
|
|
66
66
|
};
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
/*
|
|
25
25
|
HTTP Response Mockup to emulate response objects for Passport Authentication
|
|
@@ -31,30 +31,30 @@ HTTP Response Mockup to emulate response objects for Passport Authentication
|
|
|
31
31
|
* @class PassportResponse
|
|
32
32
|
*/
|
|
33
33
|
class PassportResponse {
|
|
34
|
-
constructor
|
|
34
|
+
constructor() {
|
|
35
35
|
this.headers = {};
|
|
36
36
|
this.statusCode = 200;
|
|
37
37
|
this.onEndListener = null;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
setHeader
|
|
40
|
+
setHeader(field, value) {
|
|
41
41
|
this.headers[field] = value;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
end
|
|
44
|
+
end(statusCode) {
|
|
45
45
|
if (statusCode) {
|
|
46
46
|
this.statusCode = statusCode;
|
|
47
47
|
}
|
|
48
|
-
if (typeof this.onEndListener ===
|
|
48
|
+
if (typeof this.onEndListener === "function") {
|
|
49
49
|
this.onEndListener();
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
getHeader
|
|
53
|
+
getHeader(key) {
|
|
54
54
|
return this.headers[key];
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
addEndListener
|
|
57
|
+
addEndListener(listener) {
|
|
58
58
|
this.onEndListener = listener;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -19,20 +19,20 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const Bluebird = require(
|
|
25
|
-
const passport = require(
|
|
24
|
+
const Bluebird = require("bluebird");
|
|
25
|
+
const passport = require("passport");
|
|
26
26
|
|
|
27
|
-
const { KuzzleError } = require(
|
|
28
|
-
const kerror = require(
|
|
29
|
-
const PassportResponse = require(
|
|
27
|
+
const { KuzzleError } = require("../../kerror/errors");
|
|
28
|
+
const kerror = require("../../kerror");
|
|
29
|
+
const PassportResponse = require("./passportResponse");
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* @class PassportWrapper
|
|
33
33
|
*/
|
|
34
34
|
class PassportWrapper {
|
|
35
|
-
constructor
|
|
35
|
+
constructor() {
|
|
36
36
|
this.options = {};
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -41,7 +41,7 @@ class PassportWrapper {
|
|
|
41
41
|
* @param strategyName
|
|
42
42
|
* @returns {Promise.<*>}
|
|
43
43
|
*/
|
|
44
|
-
authenticate
|
|
44
|
+
authenticate(request, strategyName) {
|
|
45
45
|
const response = new PassportResponse();
|
|
46
46
|
|
|
47
47
|
return new Bluebird((resolve, reject) => {
|
|
@@ -56,41 +56,45 @@ class PassportWrapper {
|
|
|
56
56
|
if (err !== null) {
|
|
57
57
|
if (err instanceof KuzzleError) {
|
|
58
58
|
reject(err);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
59
|
+
} else {
|
|
61
60
|
reject(
|
|
62
61
|
kerror.getFrom(
|
|
63
62
|
err,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
err.message
|
|
63
|
+
"plugin",
|
|
64
|
+
"runtime",
|
|
65
|
+
"unexpected_error",
|
|
66
|
+
err.message
|
|
67
|
+
)
|
|
68
|
+
);
|
|
68
69
|
}
|
|
69
|
-
}
|
|
70
|
-
else if (! user) {
|
|
70
|
+
} else if (!user) {
|
|
71
71
|
reject(
|
|
72
|
-
kerror.get(
|
|
73
|
-
|
|
74
|
-
else {
|
|
72
|
+
kerror.get("plugin", "strategy", "missing_user", info.message)
|
|
73
|
+
);
|
|
74
|
+
} else {
|
|
75
75
|
resolve(user);
|
|
76
76
|
}
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
try {
|
|
80
|
-
passport.authenticate(
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
passport.authenticate(
|
|
81
|
+
strategyName,
|
|
82
|
+
this.options[strategyName] || {},
|
|
83
|
+
authCB
|
|
84
|
+
)(request, response);
|
|
85
|
+
} catch (e) {
|
|
83
86
|
if (e instanceof KuzzleError) {
|
|
84
87
|
reject(e);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
88
|
+
} else {
|
|
87
89
|
reject(
|
|
88
90
|
kerror.getFrom(
|
|
89
91
|
e,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
e.message
|
|
92
|
+
"plugin",
|
|
93
|
+
"runtime",
|
|
94
|
+
"unexpected_error",
|
|
95
|
+
e.message
|
|
96
|
+
)
|
|
97
|
+
);
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
100
|
});
|
|
@@ -103,7 +107,7 @@ class PassportWrapper {
|
|
|
103
107
|
* @param {object} strategy - instantiated strategy object
|
|
104
108
|
* @param {object} opts - options to provide to authenticate with the strategy
|
|
105
109
|
*/
|
|
106
|
-
use
|
|
110
|
+
use(name, strategy, opts = {}) {
|
|
107
111
|
passport.use(name, strategy);
|
|
108
112
|
this.options[name] = opts;
|
|
109
113
|
}
|
|
@@ -113,7 +117,7 @@ class PassportWrapper {
|
|
|
113
117
|
*
|
|
114
118
|
* @param {string} name - name of the strategy to unregister
|
|
115
119
|
*/
|
|
116
|
-
unuse
|
|
120
|
+
unuse(name) {
|
|
117
121
|
passport.unuse(name);
|
|
118
122
|
delete this.options[name];
|
|
119
123
|
}
|