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,7 +19,7 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
// winston is CPU-hungry: isolating it in a worker thread allows for a more
|
|
25
25
|
// efficient CPU resources management, and more performances in the end
|
|
@@ -28,57 +28,55 @@ const {
|
|
|
28
28
|
isMainThread,
|
|
29
29
|
parentPort,
|
|
30
30
|
workerData,
|
|
31
|
-
} = require(
|
|
31
|
+
} = require("worker_threads");
|
|
32
32
|
|
|
33
|
-
const winston = require(
|
|
34
|
-
const WinstonElasticsearch = require(
|
|
35
|
-
const WinstonSyslog = require(
|
|
36
|
-
const moment = require(
|
|
33
|
+
const winston = require("winston");
|
|
34
|
+
const WinstonElasticsearch = require("winston-elasticsearch");
|
|
35
|
+
const WinstonSyslog = require("winston-syslog");
|
|
36
|
+
const moment = require("moment");
|
|
37
37
|
|
|
38
|
-
const { KuzzleRequest } = require(
|
|
38
|
+
const { KuzzleRequest } = require("../../api/request");
|
|
39
39
|
|
|
40
|
-
const ALLOWED_TRANSPORTS = [
|
|
41
|
-
'console',
|
|
42
|
-
'elasticsearch',
|
|
43
|
-
'file',
|
|
44
|
-
'syslog',
|
|
45
|
-
];
|
|
40
|
+
const ALLOWED_TRANSPORTS = ["console", "elasticsearch", "file", "syslog"];
|
|
46
41
|
|
|
47
42
|
class AccessLogger {
|
|
48
|
-
constructor
|
|
43
|
+
constructor() {
|
|
49
44
|
this.isActive = false;
|
|
50
45
|
this.worker = null;
|
|
51
46
|
}
|
|
52
47
|
|
|
53
|
-
async init
|
|
48
|
+
async init() {
|
|
54
49
|
const config = global.kuzzle.config.server;
|
|
55
50
|
|
|
56
51
|
for (const out of config.logs.transports) {
|
|
57
|
-
if (out.transport && !
|
|
58
|
-
global.kuzzle.log.error(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
if (out.transport && !ALLOWED_TRANSPORTS.includes(out.transport)) {
|
|
53
|
+
global.kuzzle.log.error(
|
|
54
|
+
`Failed to initialize logger transport "${out.transport}": unsupported transport. Skipped.`
|
|
55
|
+
);
|
|
56
|
+
} else {
|
|
57
|
+
this.isActive = this.isActive || !out.silent;
|
|
62
58
|
}
|
|
63
59
|
}
|
|
64
60
|
|
|
65
|
-
if (!
|
|
61
|
+
if (!this.isActive) {
|
|
66
62
|
return;
|
|
67
63
|
}
|
|
68
64
|
|
|
69
|
-
const anonymous = await global.kuzzle.ask(
|
|
65
|
+
const anonymous = await global.kuzzle.ask(
|
|
66
|
+
"core:security:user:anonymous:get"
|
|
67
|
+
);
|
|
70
68
|
|
|
71
69
|
this.worker = new Worker(__filename, {
|
|
72
70
|
workerData: {
|
|
73
71
|
anonymousUserId: anonymous._id,
|
|
74
72
|
config,
|
|
75
73
|
kuzzleId: global.kuzzle.id,
|
|
76
|
-
}
|
|
74
|
+
},
|
|
77
75
|
});
|
|
78
76
|
}
|
|
79
77
|
|
|
80
|
-
log
|
|
81
|
-
if (!
|
|
78
|
+
log(connection, request, extra) {
|
|
79
|
+
if (!this.isActive) {
|
|
82
80
|
return;
|
|
83
81
|
}
|
|
84
82
|
|
|
@@ -94,7 +92,7 @@ class AccessLogger {
|
|
|
94
92
|
// logs
|
|
95
93
|
const size = request.response
|
|
96
94
|
? Buffer.byteLength(JSON.stringify(request.response)).toString()
|
|
97
|
-
:
|
|
95
|
+
: "-";
|
|
98
96
|
|
|
99
97
|
try {
|
|
100
98
|
this.worker.postMessage({
|
|
@@ -103,117 +101,116 @@ class AccessLogger {
|
|
|
103
101
|
request: serialized,
|
|
104
102
|
size,
|
|
105
103
|
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
} catch (error) {
|
|
105
|
+
global.kuzzle.log.error(
|
|
106
|
+
`Failed to write access log for request "${request.id}": ${error.message}`
|
|
107
|
+
);
|
|
109
108
|
}
|
|
110
109
|
}
|
|
111
110
|
}
|
|
112
111
|
|
|
113
112
|
class AccessLoggerWorker {
|
|
114
|
-
constructor
|
|
113
|
+
constructor(config, anonymousUserId) {
|
|
115
114
|
this.config = config;
|
|
116
115
|
this.logger = null;
|
|
117
116
|
this.anonymousUserId = anonymousUserId;
|
|
118
117
|
}
|
|
119
118
|
|
|
120
|
-
init
|
|
119
|
+
init() {
|
|
121
120
|
this.initTransport();
|
|
122
121
|
|
|
123
|
-
parentPort.on(
|
|
122
|
+
parentPort.on("message", ({ connection, extra, request, size }) => {
|
|
124
123
|
this.logAccess(
|
|
125
124
|
connection,
|
|
126
125
|
new KuzzleRequest(request.data, request.options),
|
|
127
126
|
size,
|
|
128
|
-
extra
|
|
127
|
+
extra
|
|
128
|
+
);
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
initTransport
|
|
132
|
+
initTransport() {
|
|
133
133
|
const transports = [];
|
|
134
134
|
|
|
135
135
|
for (const conf of this.config.logs.transports) {
|
|
136
136
|
const opts = {
|
|
137
|
-
colorize: conf.colorize === true
|
|
138
|
-
? winston.format.colorize()
|
|
139
|
-
: false,
|
|
137
|
+
colorize: conf.colorize === true ? winston.format.colorize() : false,
|
|
140
138
|
depth: conf.depth || false,
|
|
141
139
|
format: conf.format
|
|
142
140
|
? winston.format[conf.format]()
|
|
143
141
|
: winston.format.json(),
|
|
144
|
-
level: conf.level ||
|
|
145
|
-
prettyPrint:
|
|
146
|
-
? winston.format.prettyPrint()
|
|
147
|
-
: false,
|
|
142
|
+
level: conf.level || "info",
|
|
143
|
+
prettyPrint:
|
|
144
|
+
conf.prettyPrint === true ? winston.format.prettyPrint() : false,
|
|
148
145
|
silent: conf.silent || false,
|
|
149
|
-
timestamp: conf.timestamp === true
|
|
150
|
-
? winston.format.timestamp()
|
|
151
|
-
: false
|
|
146
|
+
timestamp: conf.timestamp === true ? winston.format.timestamp() : false,
|
|
152
147
|
};
|
|
153
148
|
|
|
154
|
-
switch (conf.transport ||
|
|
155
|
-
case
|
|
149
|
+
switch (conf.transport || "console") {
|
|
150
|
+
case "console":
|
|
156
151
|
transports.push(
|
|
157
152
|
new winston.transports.Console(
|
|
158
|
-
Object.assign(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
153
|
+
Object.assign(opts, {
|
|
154
|
+
humanReadableUnhandledException:
|
|
155
|
+
conf.humanReadableUnhandledException || true,
|
|
156
|
+
stderrLevels: conf.stderrLevels || ["error", "debug"],
|
|
157
|
+
})
|
|
158
|
+
)
|
|
159
|
+
);
|
|
164
160
|
break;
|
|
165
|
-
case
|
|
161
|
+
case "elasticsearch":
|
|
166
162
|
transports.push(
|
|
167
163
|
new WinstonElasticsearch(
|
|
168
|
-
Object.assign(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
164
|
+
Object.assign(opts, {
|
|
165
|
+
clientOpts: conf.clientOpts || {},
|
|
166
|
+
ensureMappingTemplate: conf.ensureMappingTemplate !== false,
|
|
167
|
+
flushInterval: conf.flushInterval || 2000,
|
|
168
|
+
index: conf.index,
|
|
169
|
+
indexPrefix: conf.indexPrefix || "kuzzle-access",
|
|
170
|
+
indexSuffixPattern: conf.indexSuffixPattern || "YYYY.MM",
|
|
171
|
+
mappingTemplate:
|
|
172
|
+
conf.mappingTemplate || "access.log.mapping.json",
|
|
173
|
+
messageType: conf.messageType || "access",
|
|
174
|
+
})
|
|
175
|
+
)
|
|
176
|
+
);
|
|
180
177
|
break;
|
|
181
|
-
case
|
|
178
|
+
case "file":
|
|
182
179
|
transports.push(
|
|
183
180
|
new winston.transports.File(
|
|
184
|
-
Object.assign(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
181
|
+
Object.assign(opts, {
|
|
182
|
+
eol: conf.eol || "\n",
|
|
183
|
+
filename: conf.filename || "kuzzle.access.log",
|
|
184
|
+
logstash: conf.logstash || false,
|
|
185
|
+
maxFiles: conf.maxFiles,
|
|
186
|
+
maxRetries: conf.maxRetries || 2,
|
|
187
|
+
maxSize: conf.maxSize,
|
|
188
|
+
tailable: conf.tailable,
|
|
189
|
+
zippedArchive: conf.zippedArchive || false,
|
|
190
|
+
})
|
|
191
|
+
)
|
|
192
|
+
);
|
|
196
193
|
break;
|
|
197
|
-
case
|
|
194
|
+
case "syslog":
|
|
198
195
|
transports.push(
|
|
199
196
|
new WinstonSyslog(
|
|
200
|
-
Object.assign(
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
197
|
+
Object.assign(opts, {
|
|
198
|
+
app_name: conf.app_name || process.title,
|
|
199
|
+
eol: conf.eol,
|
|
200
|
+
facility: conf.facility || "local0",
|
|
201
|
+
host: conf.host || "localhost",
|
|
202
|
+
localhost: conf.localhost || "localhost",
|
|
203
|
+
path: conf.path || "/dev/log",
|
|
204
|
+
pid: conf.pid || process.pid,
|
|
205
|
+
port: conf.port || 514,
|
|
206
|
+
protocol: conf.protocol || "udp4",
|
|
207
|
+
type: conf.type || "BSD",
|
|
208
|
+
})
|
|
209
|
+
)
|
|
210
|
+
);
|
|
214
211
|
break;
|
|
215
212
|
default:
|
|
216
|
-
|
|
213
|
+
// do nothing
|
|
217
214
|
}
|
|
218
215
|
}
|
|
219
216
|
|
|
@@ -226,15 +223,15 @@ class AccessLoggerWorker {
|
|
|
226
223
|
* @param {String} size - response size, in bytes
|
|
227
224
|
* @param {Object} [extra]
|
|
228
225
|
*/
|
|
229
|
-
logAccess
|
|
230
|
-
if (this.config.logs.accessLogFormat ===
|
|
226
|
+
logAccess(connection, request, size, extra = null) {
|
|
227
|
+
if (this.config.logs.accessLogFormat === "logstash") {
|
|
231
228
|
// custom kuzzle logs to be exported to logstash
|
|
232
229
|
this.logger.info({
|
|
233
230
|
connection,
|
|
234
231
|
error: request.error,
|
|
235
232
|
extra,
|
|
236
233
|
request: request.input,
|
|
237
|
-
status: request.status
|
|
234
|
+
status: request.status,
|
|
238
235
|
});
|
|
239
236
|
return;
|
|
240
237
|
}
|
|
@@ -246,17 +243,18 @@ class AccessLoggerWorker {
|
|
|
246
243
|
let user = null;
|
|
247
244
|
|
|
248
245
|
if (request.context.token !== null) {
|
|
249
|
-
user =
|
|
250
|
-
|
|
251
|
-
|
|
246
|
+
user =
|
|
247
|
+
request.context.token.userId === this.anonymousUserId
|
|
248
|
+
? "(anonymous)"
|
|
249
|
+
: request.context.token.userId;
|
|
252
250
|
}
|
|
253
251
|
|
|
254
252
|
// = apache combined
|
|
255
253
|
const protocol = connection.protocol.toUpperCase();
|
|
256
254
|
let url;
|
|
257
|
-
let verb =
|
|
255
|
+
let verb = "DO";
|
|
258
256
|
|
|
259
|
-
if (connection.protocol.indexOf(
|
|
257
|
+
if (connection.protocol.indexOf("HTTP/") === 0) {
|
|
260
258
|
verb = extra.method;
|
|
261
259
|
url = extra.url;
|
|
262
260
|
}
|
|
@@ -276,20 +274,22 @@ class AccessLoggerWorker {
|
|
|
276
274
|
url += `/${request.input.args._id}`;
|
|
277
275
|
}
|
|
278
276
|
|
|
279
|
-
let queryString =
|
|
277
|
+
let queryString = "";
|
|
280
278
|
|
|
281
279
|
for (const k of Object.keys(request.input.args)) {
|
|
282
|
-
if (k ===
|
|
280
|
+
if (k === "_id" || k === "index" || k === "collection") {
|
|
283
281
|
continue;
|
|
284
282
|
}
|
|
285
283
|
|
|
286
284
|
const val = request.input.args[k];
|
|
287
285
|
|
|
288
286
|
if (queryString.length > 0) {
|
|
289
|
-
queryString +=
|
|
287
|
+
queryString += "&";
|
|
290
288
|
}
|
|
291
289
|
|
|
292
|
-
queryString += `${k}=${
|
|
290
|
+
queryString += `${k}=${
|
|
291
|
+
typeof val === "object" ? JSON.stringify(val) : val
|
|
292
|
+
}`;
|
|
293
293
|
}
|
|
294
294
|
|
|
295
295
|
if (queryString.length > 0) {
|
|
@@ -298,45 +298,51 @@ class AccessLoggerWorker {
|
|
|
298
298
|
}
|
|
299
299
|
|
|
300
300
|
if (user === null) {
|
|
301
|
-
user =
|
|
301
|
+
user = "(unknown)";
|
|
302
302
|
}
|
|
303
303
|
|
|
304
304
|
const ip = this.getIP(connection);
|
|
305
|
-
const when = moment().format(
|
|
306
|
-
const status = request.status ||
|
|
305
|
+
const when = moment().format("DD/MMM/YYYY:HH:mm:ss ZZ");
|
|
306
|
+
const status = request.status || "-";
|
|
307
307
|
const referer = connection.headers.referer
|
|
308
308
|
? `"${connection.headers.referer}"`
|
|
309
|
-
:
|
|
310
|
-
const agent = connection.headers[
|
|
311
|
-
? `"${connection.headers[
|
|
312
|
-
:
|
|
313
|
-
|
|
314
|
-
this.logger.info(
|
|
309
|
+
: "-";
|
|
310
|
+
const agent = connection.headers["user-agent"]
|
|
311
|
+
? `"${connection.headers["user-agent"]}"`
|
|
312
|
+
: "-";
|
|
313
|
+
|
|
314
|
+
this.logger.info(
|
|
315
|
+
`${ip} - ${user} [${when}] "${verb} ${url} ${protocol}" ${status} ${size} ${referer} ${agent}`
|
|
316
|
+
);
|
|
315
317
|
}
|
|
316
318
|
|
|
317
319
|
/**
|
|
318
320
|
* @param {ClientConnection} connection
|
|
319
321
|
*/
|
|
320
|
-
getIP
|
|
322
|
+
getIP(connection) {
|
|
321
323
|
const { ips } = connection;
|
|
322
324
|
|
|
323
325
|
if (ips.length === 0) {
|
|
324
|
-
return
|
|
326
|
+
return "-";
|
|
325
327
|
}
|
|
326
328
|
|
|
327
|
-
const idx = Math.max(
|
|
329
|
+
const idx = Math.max(
|
|
330
|
+
0,
|
|
331
|
+
ips.length - 1 - this.config.logs.accessLogIpOffset
|
|
332
|
+
);
|
|
328
333
|
|
|
329
334
|
return ips[idx];
|
|
330
335
|
}
|
|
331
336
|
}
|
|
332
337
|
|
|
333
|
-
if (!
|
|
338
|
+
if (!isMainThread) {
|
|
334
339
|
// Needed for instantiating a serialized KuzzleRequest object
|
|
335
340
|
global.kuzzle = { id: workerData.kuzzleId };
|
|
336
341
|
|
|
337
342
|
const worker = new AccessLoggerWorker(
|
|
338
343
|
workerData.config,
|
|
339
|
-
workerData.anonymousUserId
|
|
344
|
+
workerData.anonymousUserId
|
|
345
|
+
);
|
|
340
346
|
|
|
341
347
|
worker.init();
|
|
342
348
|
}
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { isPlainObject } = require(
|
|
25
|
-
const uuid = require(
|
|
24
|
+
const { isPlainObject } = require("../../util/safeObject");
|
|
25
|
+
const uuid = require("uuid");
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* @class ClientConnection
|
|
@@ -31,12 +31,12 @@ const uuid = require('uuid');
|
|
|
31
31
|
* @param {object} [headers] - Optional extra key-value object. I.e., for http, will receive the request headers
|
|
32
32
|
*/
|
|
33
33
|
class ClientConnection {
|
|
34
|
-
constructor
|
|
34
|
+
constructor(protocol, ips, headers = null) {
|
|
35
35
|
this.id = uuid.v4();
|
|
36
36
|
this.protocol = protocol;
|
|
37
37
|
this.headers = {};
|
|
38
38
|
|
|
39
|
-
if (!
|
|
39
|
+
if (!Array.isArray(ips)) {
|
|
40
40
|
throw new TypeError(`Expected ips to be an Array, got ${typeof ips}`);
|
|
41
41
|
}
|
|
42
42
|
this.ips = ips;
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
const {
|
|
25
25
|
BadRequestError,
|
|
@@ -38,15 +38,15 @@ const {
|
|
|
38
38
|
UnauthorizedError,
|
|
39
39
|
Request,
|
|
40
40
|
RequestContext,
|
|
41
|
-
RequestInput
|
|
42
|
-
} = require(
|
|
43
|
-
const ClientConnection = require(
|
|
44
|
-
const ProtocolBase = require(
|
|
41
|
+
RequestInput,
|
|
42
|
+
} = require("../../kerror/errors");
|
|
43
|
+
const ClientConnection = require("./clientConnection");
|
|
44
|
+
const ProtocolBase = require("./protocols/protocol");
|
|
45
45
|
|
|
46
|
-
const debug = require(
|
|
46
|
+
const debug = require("../../util/debug")("kuzzle:network:protocols");
|
|
47
47
|
|
|
48
48
|
class Context {
|
|
49
|
-
constructor
|
|
49
|
+
constructor() {
|
|
50
50
|
this.ClientConnection = ClientConnection;
|
|
51
51
|
this.debug = debug;
|
|
52
52
|
this.errors = {
|
|
@@ -71,7 +71,7 @@ class Context {
|
|
|
71
71
|
this.RequestInput = RequestInput;
|
|
72
72
|
|
|
73
73
|
this.log = {};
|
|
74
|
-
for (const type of [
|
|
74
|
+
for (const type of ["silly", "debug", "verbose", "info", "warn", "error"]) {
|
|
75
75
|
this.log[type] = (...args) => global.kuzzle.log[type](...args);
|
|
76
76
|
}
|
|
77
77
|
}
|