kuzzle 2.49.1 → 2.50.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. package/dist/bin/check-node-version.js +11 -0
  2. package/dist/bin/copy-protobuf.js +17 -0
  3. package/dist/lib/api/controllers/adminController.d.ts +51 -0
  4. package/dist/lib/api/controllers/adminController.js +191 -0
  5. package/{lib → dist/lib}/api/controllers/authController.d.ts +20 -40
  6. package/{lib → dist/lib}/api/controllers/authController.js +23 -24
  7. package/dist/lib/api/controllers/bulkController.d.ts +46 -0
  8. package/dist/lib/api/controllers/bulkController.js +132 -0
  9. package/dist/lib/api/controllers/clusterController.d.ts +6 -0
  10. package/{lib → dist/lib}/api/controllers/clusterController.js +7 -11
  11. package/dist/lib/api/controllers/collectionController.d.ts +136 -0
  12. package/dist/lib/api/controllers/collectionController.js +356 -0
  13. package/dist/lib/api/controllers/documentController.d.ts +181 -0
  14. package/dist/lib/api/controllers/documentController.js +768 -0
  15. package/dist/lib/api/controllers/index.d.ts +12 -0
  16. package/{lib → dist/lib}/api/controllers/index.js +13 -14
  17. package/dist/lib/api/controllers/indexController.d.ts +65 -0
  18. package/dist/lib/api/controllers/indexController.js +139 -0
  19. package/dist/lib/api/controllers/memoryStorageController.d.ts +8 -0
  20. package/dist/lib/api/controllers/memoryStorageController.js +867 -0
  21. package/dist/lib/api/controllers/realtimeController.d.ts +47 -0
  22. package/dist/lib/api/controllers/realtimeController.js +128 -0
  23. package/dist/lib/api/controllers/securityController.d.ts +423 -0
  24. package/dist/lib/api/controllers/securityController.js +1139 -0
  25. package/dist/lib/api/controllers/serverController.d.ts +82 -0
  26. package/dist/lib/api/controllers/serverController.js +321 -0
  27. package/dist/lib/api/documentExtractor.d.ts +9 -0
  28. package/dist/lib/api/documentExtractor.js +274 -0
  29. package/dist/lib/api/funnel.d.ts +183 -0
  30. package/dist/lib/api/funnel.js +821 -0
  31. package/dist/lib/api/httpRoutes.d.ts +17 -0
  32. package/dist/lib/api/httpRoutes.js +1496 -0
  33. package/dist/lib/api/rateLimiter.d.ts +18 -0
  34. package/dist/lib/api/rateLimiter.js +74 -0
  35. package/{lib → dist/lib}/api/request/kuzzleRequest.d.ts +2 -2
  36. package/{lib → dist/lib}/api/request/requestContext.d.ts +2 -1
  37. package/dist/lib/cluster/command.d.ts +73 -0
  38. package/dist/lib/cluster/command.js +236 -0
  39. package/dist/lib/cluster/index.d.ts +2 -0
  40. package/{lib → dist/lib}/cluster/index.js +1 -2
  41. package/dist/lib/cluster/node.d.ts +278 -0
  42. package/dist/lib/cluster/node.js +876 -0
  43. package/dist/lib/cluster/publisher.d.ts +188 -0
  44. package/dist/lib/cluster/publisher.js +347 -0
  45. package/dist/lib/cluster/subscriber.d.ts +269 -0
  46. package/dist/lib/cluster/subscriber.js +555 -0
  47. package/dist/lib/cluster/workers/IDCardRenewer.d.ts +13 -0
  48. package/dist/lib/cluster/workers/IDCardRenewer.js +120 -0
  49. package/{lib → dist/lib}/config/documentEventAliases.d.ts +1 -2
  50. package/dist/lib/config/index.d.ts +5 -0
  51. package/dist/lib/config/index.js +244 -0
  52. package/dist/lib/config/sdkCompatibility.json +9 -0
  53. package/dist/lib/core/auth/formatProcessing.d.ts +30 -0
  54. package/dist/lib/core/auth/formatProcessing.js +55 -0
  55. package/dist/lib/core/auth/passportResponse.d.ts +15 -0
  56. package/{lib → dist/lib}/core/auth/passportResponse.js +24 -30
  57. package/dist/lib/core/auth/passportWrapper.d.ts +28 -0
  58. package/dist/lib/core/auth/passportWrapper.js +126 -0
  59. package/{lib → dist/lib}/core/backend/backendConfig.js +2 -2
  60. package/{lib → dist/lib}/core/backend/backendErrors.js +9 -12
  61. package/dist/lib/core/cache/cacheEngine.d.ts +15 -0
  62. package/dist/lib/core/cache/cacheEngine.js +205 -0
  63. package/dist/lib/core/network/accessLogger.d.ts +29 -0
  64. package/dist/lib/core/network/accessLogger.js +250 -0
  65. package/dist/lib/core/network/clientConnection.d.ts +15 -0
  66. package/{lib → dist/lib}/core/network/clientConnection.js +17 -24
  67. package/dist/lib/core/network/context.d.ts +42 -0
  68. package/dist/lib/core/network/context.js +57 -0
  69. package/dist/lib/core/network/entryPoint.d.ts +62 -0
  70. package/dist/lib/core/network/entryPoint.js +261 -0
  71. package/dist/lib/core/network/httpRouter/index.d.ts +85 -0
  72. package/dist/lib/core/network/httpRouter/index.js +258 -0
  73. package/dist/lib/core/network/httpRouter/routeHandler.d.ts +46 -0
  74. package/dist/lib/core/network/httpRouter/routeHandler.js +101 -0
  75. package/dist/lib/core/network/httpRouter/routePart.d.ts +35 -0
  76. package/dist/lib/core/network/httpRouter/routePart.js +117 -0
  77. package/dist/lib/core/network/protocolManifest.d.ts +6 -0
  78. package/{lib → dist/lib}/core/network/protocolManifest.js +5 -9
  79. package/dist/lib/core/network/protocols/httpMessage.d.ts +22 -0
  80. package/dist/lib/core/network/protocols/httpMessage.js +62 -0
  81. package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +171 -0
  82. package/dist/lib/core/network/protocols/httpwsProtocol.js +921 -0
  83. package/dist/lib/core/network/protocols/internalProtocol.d.ts +27 -0
  84. package/dist/lib/core/network/protocols/internalProtocol.js +82 -0
  85. package/dist/lib/core/network/protocols/mqttProtocol.d.ts +39 -0
  86. package/dist/lib/core/network/protocols/mqttProtocol.js +219 -0
  87. package/dist/lib/core/network/protocols/protocol.d.ts +26 -0
  88. package/dist/lib/core/network/protocols/protocol.js +74 -0
  89. package/dist/lib/core/network/router.d.ts +49 -0
  90. package/dist/lib/core/network/router.js +193 -0
  91. package/dist/lib/core/plugin/plugin.d.ts +56 -0
  92. package/dist/lib/core/plugin/plugin.js +282 -0
  93. package/{lib → dist/lib}/core/plugin/pluginContext.js +2 -2
  94. package/dist/lib/core/plugin/pluginManifest.d.ts +5 -0
  95. package/{lib → dist/lib}/core/plugin/pluginManifest.js +16 -27
  96. package/dist/lib/core/plugin/pluginRepository.d.ts +53 -0
  97. package/dist/lib/core/plugin/pluginRepository.js +112 -0
  98. package/dist/lib/core/plugin/pluginsManager.d.ts +190 -0
  99. package/dist/lib/core/plugin/pluginsManager.js +817 -0
  100. package/dist/lib/core/plugin/privilegedContext.d.ts +14 -0
  101. package/{lib → dist/lib}/core/plugin/privilegedContext.js +10 -14
  102. package/dist/lib/core/realtime/actionEnum.d.ts +25 -0
  103. package/{lib → dist/lib}/core/realtime/actionEnum.js +7 -10
  104. package/dist/lib/core/realtime/index.d.ts +8 -0
  105. package/{lib → dist/lib}/core/realtime/index.js +9 -13
  106. package/dist/lib/core/realtime/notification/document.d.ts +34 -0
  107. package/dist/lib/core/realtime/notification/document.js +98 -0
  108. package/dist/lib/core/realtime/notification/index.d.ts +3 -0
  109. package/{lib → dist/lib}/core/realtime/notification/index.js +4 -5
  110. package/dist/lib/core/realtime/notification/server.d.ts +17 -0
  111. package/{lib → dist/lib}/core/realtime/notification/server.js +8 -10
  112. package/dist/lib/core/realtime/notification/user.d.ts +29 -0
  113. package/dist/lib/core/realtime/notification/user.js +66 -0
  114. package/dist/lib/core/realtime/notifier.d.ts +171 -0
  115. package/dist/lib/core/realtime/notifier.js +405 -0
  116. package/dist/lib/core/security/index.d.ts +14 -0
  117. package/{lib → dist/lib}/core/security/index.js +15 -19
  118. package/dist/lib/core/security/roleRepository.d.ts +143 -0
  119. package/dist/lib/core/security/roleRepository.js +445 -0
  120. package/dist/lib/core/security/securityLoader.d.ts +24 -0
  121. package/dist/lib/core/security/securityLoader.js +125 -0
  122. package/{lib → dist/lib}/core/security/tokenRepository.js +1 -1
  123. package/dist/lib/core/security/userRepository.d.ts +81 -0
  124. package/dist/lib/core/security/userRepository.js +346 -0
  125. package/dist/lib/core/shared/abstractManifest.d.ts +27 -0
  126. package/dist/lib/core/shared/abstractManifest.js +85 -0
  127. package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +7 -0
  128. package/dist/lib/core/shared/sdk/impersonatedSdk.js +80 -0
  129. package/{lib → dist/lib}/core/shared/store.d.ts +2 -2
  130. package/dist/lib/core/statistics/statistics.d.ts +94 -0
  131. package/dist/lib/core/statistics/statistics.js +287 -0
  132. package/dist/lib/core/storage/clientAdapter.d.ts +62 -0
  133. package/dist/lib/core/storage/clientAdapter.js +756 -0
  134. package/dist/lib/core/storage/storageEngine.d.ts +13 -0
  135. package/dist/lib/core/storage/storageEngine.js +52 -0
  136. package/dist/lib/core/validation/baseType.d.ts +35 -0
  137. package/dist/lib/core/validation/baseType.js +70 -0
  138. package/dist/lib/core/validation/types/anything.d.ts +10 -0
  139. package/{lib → dist/lib}/core/validation/types/anything.js +7 -10
  140. package/dist/lib/core/validation/types/boolean.d.ts +16 -0
  141. package/{lib → dist/lib}/core/validation/types/boolean.js +18 -23
  142. package/dist/lib/core/validation/types/date.d.ts +17 -0
  143. package/dist/lib/core/validation/types/date.js +215 -0
  144. package/dist/lib/core/validation/types/email.d.ts +17 -0
  145. package/dist/lib/core/validation/types/email.js +80 -0
  146. package/dist/lib/core/validation/types/enum.d.ts +17 -0
  147. package/dist/lib/core/validation/types/enum.js +70 -0
  148. package/dist/lib/core/validation/types/geoPoint.d.ts +17 -0
  149. package/{lib → dist/lib}/core/validation/types/geoPoint.js +19 -24
  150. package/dist/lib/core/validation/types/geoShape.d.ts +31 -0
  151. package/dist/lib/core/validation/types/geoShape.js +280 -0
  152. package/dist/lib/core/validation/types/integer.d.ts +7 -0
  153. package/{lib → dist/lib}/core/validation/types/integer.js +21 -27
  154. package/dist/lib/core/validation/types/ipAddress.d.ts +17 -0
  155. package/dist/lib/core/validation/types/ipAddress.js +73 -0
  156. package/dist/lib/core/validation/types/numeric.d.ts +17 -0
  157. package/dist/lib/core/validation/types/numeric.js +84 -0
  158. package/dist/lib/core/validation/types/object.d.ts +24 -0
  159. package/dist/lib/core/validation/types/object.js +74 -0
  160. package/dist/lib/core/validation/types/string.d.ts +17 -0
  161. package/dist/lib/core/validation/types/string.js +85 -0
  162. package/dist/lib/core/validation/types/url.d.ts +17 -0
  163. package/dist/lib/core/validation/types/url.js +73 -0
  164. package/dist/lib/core/validation/validation.d.ts +113 -0
  165. package/dist/lib/core/validation/validation.js +692 -0
  166. package/dist/lib/kerror/codes/0-core.json +194 -0
  167. package/dist/lib/kerror/codes/1-services.json +351 -0
  168. package/dist/lib/kerror/codes/2-api.json +195 -0
  169. package/dist/lib/kerror/codes/3-network.json +151 -0
  170. package/dist/lib/kerror/codes/4-plugin.json +498 -0
  171. package/dist/lib/kerror/codes/5-validation.json +158 -0
  172. package/dist/lib/kerror/codes/6-protocol.json +28 -0
  173. package/dist/lib/kerror/codes/7-security.json +283 -0
  174. package/dist/lib/kerror/codes/8-cluster.json +16 -0
  175. package/dist/lib/kerror/codes/index.d.ts +24 -0
  176. package/dist/lib/kerror/codes/index.js +140 -0
  177. package/{lib → dist/lib}/kerror/index.d.ts +5 -5
  178. package/{lib → dist/lib}/kuzzle/Logger.d.ts +6 -0
  179. package/{lib → dist/lib}/kuzzle/Logger.js +26 -5
  180. package/dist/lib/kuzzle/dumpGenerator.d.ts +14 -0
  181. package/dist/lib/kuzzle/dumpGenerator.js +180 -0
  182. package/dist/lib/kuzzle/event/pipeRunner.d.ts +30 -0
  183. package/dist/lib/kuzzle/event/pipeRunner.js +119 -0
  184. package/dist/lib/kuzzle/event/waterfall.d.ts +2 -0
  185. package/dist/lib/kuzzle/event/waterfall.js +90 -0
  186. package/dist/lib/kuzzle/internalIndexHandler.d.ts +186 -0
  187. package/dist/lib/kuzzle/internalIndexHandler.js +174 -0
  188. package/{lib → dist/lib}/kuzzle/kuzzle.d.ts +6 -7
  189. package/{lib → dist/lib}/kuzzle/kuzzle.js +5 -2
  190. package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +20 -0
  191. package/{lib → dist/lib}/kuzzle/kuzzleStateEnum.js +5 -8
  192. package/dist/lib/kuzzle/vault.d.ts +2 -0
  193. package/dist/lib/kuzzle/vault.js +63 -0
  194. package/dist/lib/model/security/rights.d.ts +8 -0
  195. package/{lib → dist/lib}/model/security/rights.js +4 -8
  196. package/{lib → dist/lib}/model/security/role.d.ts +1 -1
  197. package/{lib → dist/lib}/model/security/user.d.ts +1 -0
  198. package/dist/lib/model/storage/apiKey.d.ts +49 -0
  199. package/dist/lib/model/storage/apiKey.js +126 -0
  200. package/dist/lib/model/storage/baseModel.d.ts +100 -0
  201. package/dist/lib/model/storage/baseModel.js +211 -0
  202. package/dist/lib/service/cache/redis.d.ts +74 -0
  203. package/dist/lib/service/cache/redis.js +237 -0
  204. package/dist/lib/service/service.d.ts +30 -0
  205. package/dist/lib/service/service.js +74 -0
  206. package/{lib → dist/lib}/service/storage/7/elasticsearch.d.ts +2 -2
  207. package/{lib → dist/lib}/service/storage/7/elasticsearch.js +23 -25
  208. package/dist/lib/service/storage/7/esWrapper.d.ts +19 -0
  209. package/dist/lib/service/storage/7/esWrapper.js +245 -0
  210. package/{lib → dist/lib}/service/storage/8/elasticsearch.js +23 -25
  211. package/dist/lib/service/storage/8/esWrapper.d.ts +19 -0
  212. package/dist/lib/service/storage/8/esWrapper.js +245 -0
  213. package/{lib → dist/lib}/types/Plugin.d.ts +1 -1
  214. package/{lib/types → dist/lib/types/controllers}/Controller.d.ts +2 -2
  215. package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.d.ts +1 -1
  216. package/dist/lib/types/controllers/adminControlller.type.d.ts +5 -0
  217. package/dist/lib/types/controllers/adminControlller.type.js +3 -0
  218. package/dist/lib/types/controllers/authController.type.d.ts +5 -0
  219. package/dist/lib/types/controllers/authController.type.js +3 -0
  220. package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -0
  221. package/dist/lib/types/core/auth/formatProcessing.type.js +3 -0
  222. package/{lib → dist/lib}/types/index.d.ts +3 -3
  223. package/{lib → dist/lib}/types/index.js +3 -3
  224. package/dist/lib/util/assertType.d.ts +41 -0
  225. package/{lib → dist/lib}/util/assertType.js +38 -56
  226. package/dist/lib/util/asyncStore.d.ts +38 -0
  227. package/dist/lib/util/asyncStore.js +70 -0
  228. package/dist/lib/util/bytes.d.ts +2 -0
  229. package/dist/lib/util/bytes.js +33 -0
  230. package/dist/lib/util/debug.d.ts +2 -0
  231. package/{lib → dist/lib}/util/debug.js +15 -23
  232. package/dist/lib/util/deprecate.d.ts +1 -0
  233. package/dist/lib/util/deprecate.js +64 -0
  234. package/dist/lib/util/didYouMean.d.ts +2 -0
  235. package/{lib → dist/lib}/util/didYouMean.js +9 -15
  236. package/dist/lib/util/extractFields.d.ts +17 -0
  237. package/{lib → dist/lib}/util/extractFields.js +18 -32
  238. package/dist/lib/util/memoize.d.ts +7 -0
  239. package/{lib → dist/lib}/util/memoize.js +14 -21
  240. package/dist/lib/util/promback.d.ts +13 -0
  241. package/dist/lib/util/promback.js +60 -0
  242. package/dist/lib/util/requestAssertions.d.ts +10 -0
  243. package/dist/lib/util/requestAssertions.js +143 -0
  244. package/dist/lib/util/safeObject.d.ts +3 -0
  245. package/{lib → dist/lib}/util/safeObject.js +7 -13
  246. package/dist/lib/util/stackTrace.d.ts +19 -0
  247. package/{lib → dist/lib}/util/stackTrace.js +35 -41
  248. package/dist/lib/util/wildcard.d.ts +1 -0
  249. package/{lib → dist/lib}/util/wildcard.js +21 -30
  250. package/dist/package.json +120 -0
  251. package/package.json +45 -58
  252. package/bin/start-kuzzle-server +0 -126
  253. package/check-node-version.js +0 -17
  254. package/lib/api/controllers/adminController.js +0 -229
  255. package/lib/api/controllers/bulkController.js +0 -210
  256. package/lib/api/controllers/collectionController.js +0 -502
  257. package/lib/api/controllers/documentController.js +0 -1156
  258. package/lib/api/controllers/indexController.js +0 -179
  259. package/lib/api/controllers/memoryStorageController.js +0 -1023
  260. package/lib/api/controllers/realtimeController.js +0 -155
  261. package/lib/api/controllers/securityController.js +0 -1571
  262. package/lib/api/controllers/serverController.js +0 -381
  263. package/lib/api/documentExtractor.js +0 -309
  264. package/lib/api/funnel.js +0 -1143
  265. package/lib/api/httpRoutes.js +0 -1547
  266. package/lib/api/rateLimiter.js +0 -87
  267. package/lib/cluster/command.js +0 -284
  268. package/lib/cluster/node.js +0 -1203
  269. package/lib/cluster/publisher.js +0 -386
  270. package/lib/cluster/subscriber.js +0 -776
  271. package/lib/cluster/workers/IDCardRenewer.js +0 -144
  272. package/lib/config/index.js +0 -351
  273. package/lib/config/sdkCompatibility.json +0 -9
  274. package/lib/core/auth/formatProcessing.js +0 -66
  275. package/lib/core/auth/passportWrapper.js +0 -126
  276. package/lib/core/cache/cacheEngine.js +0 -278
  277. package/lib/core/network/accessLogger.js +0 -322
  278. package/lib/core/network/context.js +0 -80
  279. package/lib/core/network/entryPoint.js +0 -358
  280. package/lib/core/network/httpRouter/index.js +0 -316
  281. package/lib/core/network/httpRouter/routeHandler.js +0 -111
  282. package/lib/core/network/httpRouter/routePart.js +0 -147
  283. package/lib/core/network/protocols/httpMessage.js +0 -69
  284. package/lib/core/network/protocols/httpwsProtocol.js +0 -1254
  285. package/lib/core/network/protocols/internalProtocol.js +0 -109
  286. package/lib/core/network/protocols/mqttProtocol.js +0 -291
  287. package/lib/core/network/protocols/protocol.js +0 -102
  288. package/lib/core/network/router.js +0 -255
  289. package/lib/core/plugin/plugin.js +0 -436
  290. package/lib/core/plugin/pluginRepository.js +0 -132
  291. package/lib/core/plugin/pluginsManager.js +0 -1244
  292. package/lib/core/realtime/notification/document.js +0 -108
  293. package/lib/core/realtime/notification/user.js +0 -70
  294. package/lib/core/realtime/notifier.js +0 -541
  295. package/lib/core/security/README.md +0 -223
  296. package/lib/core/security/roleRepository.js +0 -569
  297. package/lib/core/security/securityLoader.js +0 -174
  298. package/lib/core/security/userRepository.js +0 -446
  299. package/lib/core/shared/README.md +0 -3
  300. package/lib/core/shared/abstractManifest.js +0 -102
  301. package/lib/core/shared/sdk/impersonatedSdk.js +0 -94
  302. package/lib/core/statistics/index.js +0 -24
  303. package/lib/core/statistics/statistics.js +0 -373
  304. package/lib/core/storage/clientAdapter.js +0 -1045
  305. package/lib/core/storage/storageEngine.js +0 -63
  306. package/lib/core/validation/baseType.js +0 -80
  307. package/lib/core/validation/index.js +0 -24
  308. package/lib/core/validation/types/date.js +0 -284
  309. package/lib/core/validation/types/email.js +0 -92
  310. package/lib/core/validation/types/enum.js +0 -100
  311. package/lib/core/validation/types/geoShape.js +0 -370
  312. package/lib/core/validation/types/ipAddress.js +0 -83
  313. package/lib/core/validation/types/numeric.js +0 -108
  314. package/lib/core/validation/types/object.js +0 -88
  315. package/lib/core/validation/types/string.js +0 -110
  316. package/lib/core/validation/types/url.js +0 -83
  317. package/lib/core/validation/validation.js +0 -1180
  318. package/lib/kerror/codes/0-core.json +0 -194
  319. package/lib/kerror/codes/1-services.json +0 -351
  320. package/lib/kerror/codes/2-api.json +0 -195
  321. package/lib/kerror/codes/3-network.json +0 -151
  322. package/lib/kerror/codes/4-plugin.json +0 -498
  323. package/lib/kerror/codes/5-validation.json +0 -158
  324. package/lib/kerror/codes/6-protocol.json +0 -28
  325. package/lib/kerror/codes/7-security.json +0 -283
  326. package/lib/kerror/codes/8-cluster.json +0 -16
  327. package/lib/kerror/codes/index.js +0 -208
  328. package/lib/kuzzle/dumpGenerator.js +0 -259
  329. package/lib/kuzzle/event/pipeRunner.js +0 -144
  330. package/lib/kuzzle/event/waterfall.js +0 -101
  331. package/lib/kuzzle/internalIndexHandler.js +0 -234
  332. package/lib/kuzzle/vault.js +0 -89
  333. package/lib/model/storage/apiKey.js +0 -158
  334. package/lib/model/storage/baseModel.js +0 -275
  335. package/lib/service/cache/redis.js +0 -282
  336. package/lib/service/service.js +0 -84
  337. package/lib/service/storage/7/esWrapper.js +0 -303
  338. package/lib/service/storage/8/esWrapper.js +0 -303
  339. package/lib/util/asyncStore.js +0 -112
  340. package/lib/util/bytes.js +0 -36
  341. package/lib/util/deprecate.js +0 -82
  342. package/lib/util/promback.js +0 -66
  343. package/lib/util/readYamlFile.d.ts +0 -2
  344. package/lib/util/readYamlFile.js +0 -10
  345. package/lib/util/requestAssertions.js +0 -157
  346. /package/{index.d.ts → dist/index.d.ts} +0 -0
  347. /package/{index.js → dist/index.js} +0 -0
  348. /package/{lib → dist/lib}/api/controllers/baseController.d.ts +0 -0
  349. /package/{lib → dist/lib}/api/controllers/baseController.js +0 -0
  350. /package/{lib → dist/lib}/api/controllers/debugController.d.ts +0 -0
  351. /package/{lib → dist/lib}/api/controllers/debugController.js +0 -0
  352. /package/{lib → dist/lib}/api/openapi/OpenApiManager.d.ts +0 -0
  353. /package/{lib → dist/lib}/api/openapi/OpenApiManager.js +0 -0
  354. /package/{lib → dist/lib}/api/openapi/index.d.ts +0 -0
  355. /package/{lib → dist/lib}/api/openapi/index.js +0 -0
  356. /package/{lib → dist/lib}/api/openapi/openApiGenerator.d.ts +0 -0
  357. /package/{lib → dist/lib}/api/openapi/openApiGenerator.js +0 -0
  358. /package/{lib → dist/lib}/api/request/index.d.ts +0 -0
  359. /package/{lib → dist/lib}/api/request/index.js +0 -0
  360. /package/{lib → dist/lib}/api/request/kuzzleRequest.js +0 -0
  361. /package/{lib → dist/lib}/api/request/requestContext.js +0 -0
  362. /package/{lib → dist/lib}/api/request/requestInput.d.ts +0 -0
  363. /package/{lib → dist/lib}/api/request/requestInput.js +0 -0
  364. /package/{lib → dist/lib}/api/request/requestResponse.d.ts +0 -0
  365. /package/{lib → dist/lib}/api/request/requestResponse.js +0 -0
  366. /package/{lib → dist/lib}/cluster/idCardHandler.d.ts +0 -0
  367. /package/{lib → dist/lib}/cluster/idCardHandler.js +0 -0
  368. /package/{lib → dist/lib}/cluster/protobuf/command.proto +0 -0
  369. /package/{lib → dist/lib}/cluster/protobuf/sync.proto +0 -0
  370. /package/{lib → dist/lib}/cluster/state.d.ts +0 -0
  371. /package/{lib → dist/lib}/cluster/state.js +0 -0
  372. /package/{lib → dist/lib}/config/default.config.d.ts +0 -0
  373. /package/{lib → dist/lib}/config/default.config.js +0 -0
  374. /package/{lib → dist/lib}/config/documentEventAliases.js +0 -0
  375. /package/{lib → dist/lib}/core/auth/tokenManager.d.ts +0 -0
  376. /package/{lib → dist/lib}/core/auth/tokenManager.js +0 -0
  377. /package/{lib → dist/lib}/core/backend/applicationManager.d.ts +0 -0
  378. /package/{lib → dist/lib}/core/backend/applicationManager.js +0 -0
  379. /package/{lib → dist/lib}/core/backend/backend.d.ts +0 -0
  380. /package/{lib → dist/lib}/core/backend/backend.js +0 -0
  381. /package/{lib → dist/lib}/core/backend/backendCluster.d.ts +0 -0
  382. /package/{lib → dist/lib}/core/backend/backendCluster.js +0 -0
  383. /package/{lib → dist/lib}/core/backend/backendConfig.d.ts +0 -0
  384. /package/{lib → dist/lib}/core/backend/backendController.d.ts +0 -0
  385. /package/{lib → dist/lib}/core/backend/backendController.js +0 -0
  386. /package/{lib → dist/lib}/core/backend/backendErrors.d.ts +0 -0
  387. /package/{lib → dist/lib}/core/backend/backendHook.d.ts +0 -0
  388. /package/{lib → dist/lib}/core/backend/backendHook.js +0 -0
  389. /package/{lib → dist/lib}/core/backend/backendImport.d.ts +0 -0
  390. /package/{lib → dist/lib}/core/backend/backendImport.js +0 -0
  391. /package/{lib → dist/lib}/core/backend/backendOpenApi.d.ts +0 -0
  392. /package/{lib → dist/lib}/core/backend/backendOpenApi.js +0 -0
  393. /package/{lib → dist/lib}/core/backend/backendPipe.d.ts +0 -0
  394. /package/{lib → dist/lib}/core/backend/backendPipe.js +0 -0
  395. /package/{lib → dist/lib}/core/backend/backendPlugin.d.ts +0 -0
  396. /package/{lib → dist/lib}/core/backend/backendPlugin.js +0 -0
  397. /package/{lib → dist/lib}/core/backend/backendStorage.d.ts +0 -0
  398. /package/{lib → dist/lib}/core/backend/backendStorage.js +0 -0
  399. /package/{lib → dist/lib}/core/backend/backendSubscription.d.ts +0 -0
  400. /package/{lib → dist/lib}/core/backend/backendSubscription.js +0 -0
  401. /package/{lib → dist/lib}/core/backend/backendVault.d.ts +0 -0
  402. /package/{lib → dist/lib}/core/backend/backendVault.js +0 -0
  403. /package/{lib → dist/lib}/core/backend/index.d.ts +0 -0
  404. /package/{lib → dist/lib}/core/backend/index.js +0 -0
  405. /package/{lib → dist/lib}/core/backend/internalLogger.d.ts +0 -0
  406. /package/{lib → dist/lib}/core/backend/internalLogger.js +0 -0
  407. /package/{lib → dist/lib}/core/cache/cacheDbEnum.d.ts +0 -0
  408. /package/{lib → dist/lib}/core/cache/cacheDbEnum.js +0 -0
  409. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.d.ts +0 -0
  410. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.js +0 -0
  411. /package/{lib → dist/lib}/core/plugin/pluginContext.d.ts +0 -0
  412. /package/{lib → dist/lib}/core/realtime/channel.d.ts +0 -0
  413. /package/{lib → dist/lib}/core/realtime/channel.js +0 -0
  414. /package/{lib → dist/lib}/core/realtime/connectionRooms.d.ts +0 -0
  415. /package/{lib → dist/lib}/core/realtime/connectionRooms.js +0 -0
  416. /package/{lib → dist/lib}/core/realtime/hotelClerk.d.ts +0 -0
  417. /package/{lib → dist/lib}/core/realtime/hotelClerk.js +0 -0
  418. /package/{lib → dist/lib}/core/realtime/room.d.ts +0 -0
  419. /package/{lib → dist/lib}/core/realtime/room.js +0 -0
  420. /package/{lib → dist/lib}/core/realtime/subscription.d.ts +0 -0
  421. /package/{lib → dist/lib}/core/realtime/subscription.js +0 -0
  422. /package/{lib → dist/lib}/core/security/profileRepository.d.ts +0 -0
  423. /package/{lib → dist/lib}/core/security/profileRepository.js +0 -0
  424. /package/{lib → dist/lib}/core/security/tokenRepository.d.ts +0 -0
  425. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.d.ts +0 -0
  426. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.js +0 -0
  427. /package/{lib → dist/lib}/core/shared/ObjectRepository.d.ts +0 -0
  428. /package/{lib → dist/lib}/core/shared/ObjectRepository.js +0 -0
  429. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.d.ts +0 -0
  430. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.js +0 -0
  431. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.d.ts +0 -0
  432. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.js +0 -0
  433. /package/{lib → dist/lib}/core/shared/store.js +0 -0
  434. /package/{lib → dist/lib}/core/storage/indexCache.d.ts +0 -0
  435. /package/{lib → dist/lib}/core/storage/indexCache.js +0 -0
  436. /package/{lib → dist/lib}/core/storage/storeScopeEnum.d.ts +0 -0
  437. /package/{lib → dist/lib}/core/storage/storeScopeEnum.js +0 -0
  438. /package/{lib → dist/lib}/kerror/errors/badRequestError.d.ts +0 -0
  439. /package/{lib → dist/lib}/kerror/errors/badRequestError.js +0 -0
  440. /package/{lib → dist/lib}/kerror/errors/externalServiceError.d.ts +0 -0
  441. /package/{lib → dist/lib}/kerror/errors/externalServiceError.js +0 -0
  442. /package/{lib → dist/lib}/kerror/errors/forbiddenError.d.ts +0 -0
  443. /package/{lib → dist/lib}/kerror/errors/forbiddenError.js +0 -0
  444. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.d.ts +0 -0
  445. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.js +0 -0
  446. /package/{lib → dist/lib}/kerror/errors/index.d.ts +0 -0
  447. /package/{lib → dist/lib}/kerror/errors/index.js +0 -0
  448. /package/{lib → dist/lib}/kerror/errors/internalError.d.ts +0 -0
  449. /package/{lib → dist/lib}/kerror/errors/internalError.js +0 -0
  450. /package/{lib → dist/lib}/kerror/errors/kuzzleError.d.ts +0 -0
  451. /package/{lib → dist/lib}/kerror/errors/kuzzleError.js +0 -0
  452. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.d.ts +0 -0
  453. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.js +0 -0
  454. /package/{lib → dist/lib}/kerror/errors/notFoundError.d.ts +0 -0
  455. /package/{lib → dist/lib}/kerror/errors/notFoundError.js +0 -0
  456. /package/{lib → dist/lib}/kerror/errors/partialError.d.ts +0 -0
  457. /package/{lib → dist/lib}/kerror/errors/partialError.js +0 -0
  458. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.d.ts +0 -0
  459. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.js +0 -0
  460. /package/{lib → dist/lib}/kerror/errors/preconditionError.d.ts +0 -0
  461. /package/{lib → dist/lib}/kerror/errors/preconditionError.js +0 -0
  462. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.d.ts +0 -0
  463. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.js +0 -0
  464. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.d.ts +0 -0
  465. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.js +0 -0
  466. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.d.ts +0 -0
  467. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.js +0 -0
  468. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.d.ts +0 -0
  469. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.js +0 -0
  470. /package/{lib → dist/lib}/kerror/index.js +0 -0
  471. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.d.ts +0 -0
  472. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.js +0 -0
  473. /package/{lib → dist/lib}/kuzzle/index.d.ts +0 -0
  474. /package/{lib → dist/lib}/kuzzle/index.js +0 -0
  475. /package/{lib → dist/lib}/model/security/profile.d.ts +0 -0
  476. /package/{lib → dist/lib}/model/security/profile.js +0 -0
  477. /package/{lib → dist/lib}/model/security/role.js +0 -0
  478. /package/{lib → dist/lib}/model/security/token.d.ts +0 -0
  479. /package/{lib → dist/lib}/model/security/token.js +0 -0
  480. /package/{lib → dist/lib}/model/security/user.js +0 -0
  481. /package/{lib → dist/lib}/service/storage/8/elasticsearch.d.ts +0 -0
  482. /package/{lib → dist/lib}/service/storage/Elasticsearch.d.ts +0 -0
  483. /package/{lib → dist/lib}/service/storage/Elasticsearch.js +0 -0
  484. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.d.ts +0 -0
  485. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.js +0 -0
  486. /package/{lib → dist/lib}/types/ClientConnection.d.ts +0 -0
  487. /package/{lib → dist/lib}/types/ClientConnection.js +0 -0
  488. /package/{lib → dist/lib}/types/Deprecation.d.ts +0 -0
  489. /package/{lib → dist/lib}/types/Deprecation.js +0 -0
  490. /package/{lib → dist/lib}/types/EventHandler.d.ts +0 -0
  491. /package/{lib → dist/lib}/types/EventHandler.js +0 -0
  492. /package/{lib → dist/lib}/types/Global.d.ts +0 -0
  493. /package/{lib → dist/lib}/types/Global.js +0 -0
  494. /package/{lib → dist/lib}/types/HttpMessage.d.ts +0 -0
  495. /package/{lib → dist/lib}/types/HttpMessage.js +0 -0
  496. /package/{lib → dist/lib}/types/HttpStream.d.ts +0 -0
  497. /package/{lib → dist/lib}/types/HttpStream.js +0 -0
  498. /package/{lib → dist/lib}/types/Kuzzle.d.ts +0 -0
  499. /package/{lib → dist/lib}/types/Kuzzle.js +0 -0
  500. /package/{lib → dist/lib}/types/KuzzleDocument.d.ts +0 -0
  501. /package/{lib → dist/lib}/types/KuzzleDocument.js +0 -0
  502. /package/{lib → dist/lib}/types/OpenApiDefinition.d.ts +0 -0
  503. /package/{lib → dist/lib}/types/OpenApiDefinition.js +0 -0
  504. /package/{lib → dist/lib}/types/PasswordPolicy.d.ts +0 -0
  505. /package/{lib → dist/lib}/types/PasswordPolicy.js +0 -0
  506. /package/{lib → dist/lib}/types/Plugin.js +0 -0
  507. /package/{lib → dist/lib}/types/PluginManifest.d.ts +0 -0
  508. /package/{lib → dist/lib}/types/PluginManifest.js +0 -0
  509. /package/{lib → dist/lib}/types/Policy.d.ts +0 -0
  510. /package/{lib → dist/lib}/types/Policy.js +0 -0
  511. /package/{lib → dist/lib}/types/PolicyRestrictions.d.ts +0 -0
  512. /package/{lib → dist/lib}/types/PolicyRestrictions.js +0 -0
  513. /package/{lib → dist/lib}/types/ProfileDefinition.d.ts +0 -0
  514. /package/{lib → dist/lib}/types/ProfileDefinition.js +0 -0
  515. /package/{lib → dist/lib}/types/RoleDefinition.d.ts +0 -0
  516. /package/{lib → dist/lib}/types/RoleDefinition.js +0 -0
  517. /package/{lib → dist/lib}/types/StrategyDefinition.d.ts +0 -0
  518. /package/{lib → dist/lib}/types/StrategyDefinition.js +0 -0
  519. /package/{lib → dist/lib}/types/Target.d.ts +0 -0
  520. /package/{lib → dist/lib}/types/Target.js +0 -0
  521. /package/{lib → dist/lib}/types/Token.d.ts +0 -0
  522. /package/{lib → dist/lib}/types/Token.js +0 -0
  523. /package/{lib → dist/lib}/types/User.d.ts +0 -0
  524. /package/{lib → dist/lib}/types/User.js +0 -0
  525. /package/{lib → dist/lib}/types/config/DumpConfiguration.d.ts +0 -0
  526. /package/{lib → dist/lib}/types/config/DumpConfiguration.js +0 -0
  527. /package/{lib → dist/lib}/types/config/HttpConfiguration.d.ts +0 -0
  528. /package/{lib → dist/lib}/types/config/HttpConfiguration.js +0 -0
  529. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.d.ts +0 -0
  530. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.js +0 -0
  531. /package/{lib → dist/lib}/types/config/LimitsConfiguration.d.ts +0 -0
  532. /package/{lib → dist/lib}/types/config/LimitsConfiguration.js +0 -0
  533. /package/{lib → dist/lib}/types/config/PluginsConfiguration.d.ts +0 -0
  534. /package/{lib → dist/lib}/types/config/PluginsConfiguration.js +0 -0
  535. /package/{lib → dist/lib}/types/config/SecurityConfiguration.d.ts +0 -0
  536. /package/{lib → dist/lib}/types/config/SecurityConfiguration.js +0 -0
  537. /package/{lib → dist/lib}/types/config/ServerConfiguration.d.ts +0 -0
  538. /package/{lib → dist/lib}/types/config/ServerConfiguration.js +0 -0
  539. /package/{lib → dist/lib}/types/config/ServicesConfiguration.d.ts +0 -0
  540. /package/{lib → dist/lib}/types/config/ServicesConfiguration.js +0 -0
  541. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +0 -0
  542. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.js +0 -0
  543. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +0 -0
  544. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.js +0 -0
  545. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +0 -0
  546. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.js +0 -0
  547. /package/{lib/types → dist/lib/types/controllers}/Controller.js +0 -0
  548. /package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.js +0 -0
  549. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.d.ts +0 -0
  550. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.js +0 -0
  551. /package/{lib → dist/lib}/types/errors/ErrorDefinition.d.ts +0 -0
  552. /package/{lib → dist/lib}/types/errors/ErrorDefinition.js +0 -0
  553. /package/{lib → dist/lib}/types/errors/ErrorDomains.d.ts +0 -0
  554. /package/{lib → dist/lib}/types/errors/ErrorDomains.js +0 -0
  555. /package/{lib → dist/lib}/types/events/EventGenericDocument.d.ts +0 -0
  556. /package/{lib → dist/lib}/types/events/EventGenericDocument.js +0 -0
  557. /package/{lib → dist/lib}/types/events/EventProtocol.d.ts +0 -0
  558. /package/{lib → dist/lib}/types/events/EventProtocol.js +0 -0
  559. /package/{lib → dist/lib}/types/realtime/RealtimeScope.d.ts +0 -0
  560. /package/{lib → dist/lib}/types/realtime/RealtimeScope.js +0 -0
  561. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.d.ts +0 -0
  562. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.js +0 -0
  563. /package/{lib → dist/lib}/types/realtime/RoomList.d.ts +0 -0
  564. /package/{lib → dist/lib}/types/realtime/RoomList.js +0 -0
  565. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.d.ts +0 -0
  566. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.js +0 -0
  567. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.d.ts +0 -0
  568. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.js +0 -0
  569. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.d.ts +0 -0
  570. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.js +0 -0
  571. /package/{lib → dist/lib}/util/Inflector.d.ts +0 -0
  572. /package/{lib → dist/lib}/util/Inflector.js +0 -0
  573. /package/{lib → dist/lib}/util/array.d.ts +0 -0
  574. /package/{lib → dist/lib}/util/array.js +0 -0
  575. /package/{lib → dist/lib}/util/async.d.ts +0 -0
  576. /package/{lib → dist/lib}/util/async.js +0 -0
  577. /package/{lib → dist/lib}/util/bufferedPassThrough.d.ts +0 -0
  578. /package/{lib → dist/lib}/util/bufferedPassThrough.js +0 -0
  579. /package/{lib → dist/lib}/util/crypto.d.ts +0 -0
  580. /package/{lib → dist/lib}/util/crypto.js +0 -0
  581. /package/{lib → dist/lib}/util/dump-collection.d.ts +0 -0
  582. /package/{lib → dist/lib}/util/dump-collection.js +0 -0
  583. /package/{lib → dist/lib}/util/esRequest.d.ts +0 -0
  584. /package/{lib → dist/lib}/util/esRequest.js +0 -0
  585. /package/{lib → dist/lib}/util/koncordeCompat.d.ts +0 -0
  586. /package/{lib → dist/lib}/util/koncordeCompat.js +0 -0
  587. /package/{lib → dist/lib}/util/mutex.d.ts +0 -0
  588. /package/{lib → dist/lib}/util/mutex.js +0 -0
  589. /package/{lib → dist/lib}/util/name-generator.d.ts +0 -0
  590. /package/{lib → dist/lib}/util/name-generator.js +0 -0
  591. /package/{lib → dist/lib}/util/time.d.ts +0 -0
  592. /package/{lib → dist/lib}/util/time.js +0 -0
@@ -1,1571 +0,0 @@
1
- /*
2
- * Kuzzle, a backend software, self-hostable and ready to use
3
- * to power modern apps
4
- *
5
- * Copyright 2015-2022 Kuzzle
6
- * mailto: support AT kuzzle.io
7
- * website: http://kuzzle.io
8
- *
9
- * Licensed under the Apache License, Version 2.0 (the "License");
10
- * you may not use this file except in compliance with the License.
11
- * You may obtain a copy of the License at
12
- *
13
- * https://www.apache.org/licenses/LICENSE-2.0
14
- *
15
- * Unless required by applicable law or agreed to in writing, software
16
- * distributed under the License is distributed on an "AS IS" BASIS,
17
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- * See the License for the specific language governing permissions and
19
- * limitations under the License.
20
- */
21
-
22
- "use strict";
23
-
24
- const { isEmpty, isNil } = require("lodash");
25
- const Bluebird = require("bluebird");
26
- const { v4: uuidv4 } = require("uuid");
27
-
28
- const { KuzzleError, BadRequestError } = require("../../kerror/errors");
29
- const { Request } = require("../request");
30
- const { NativeController } = require("./baseController");
31
- const formatProcessing = require("../../core/auth/formatProcessing");
32
- const ApiKey = require("../../model/storage/apiKey");
33
- const kerror = require("../../kerror");
34
- const { has } = require("../../util/safeObject");
35
- const { NameGenerator } = require("../../util/name-generator");
36
-
37
- /**
38
- * @class SecurityController
39
- */
40
- class SecurityController extends NativeController {
41
- static userOrSdk(userId) {
42
- return userId === null ? "EmbeddedSDK" : `User "${userId}"`;
43
- }
44
-
45
- constructor() {
46
- super([
47
- "checkRights",
48
- "createApiKey",
49
- "createCredentials",
50
- "createFirstAdmin",
51
- "createOrReplaceProfile",
52
- "createOrReplaceRole",
53
- "createProfile",
54
- "createRestrictedUser",
55
- "createRole",
56
- "createUser",
57
- "deleteApiKey",
58
- "deleteCredentials",
59
- "deleteProfile",
60
- "deleteRole",
61
- "deleteUser",
62
- "getAllCredentialFields",
63
- "getCredentialFields",
64
- "getCredentials",
65
- "getCredentialsById",
66
- "getProfile",
67
- "getProfileMapping",
68
- "getProfileRights",
69
- "getRole",
70
- "getRoleMapping",
71
- "getUser",
72
- "getUserMapping",
73
- "getUserRights",
74
- "getUserStrategies",
75
- "hasCredentials",
76
- "mDeleteProfiles",
77
- "mDeleteRoles",
78
- "mDeleteUsers",
79
- "mGetProfiles",
80
- "mGetRoles",
81
- "mGetUsers",
82
- "refresh",
83
- "replaceUser",
84
- "revokeTokens",
85
- "scrollProfiles",
86
- "scrollUsers",
87
- "searchApiKeys",
88
- "searchProfiles",
89
- "searchRoles",
90
- "searchUsers",
91
- "searchUsersByCredentials",
92
- "updateCredentials",
93
- "updateProfile",
94
- "updateProfileMapping",
95
- "updateRole",
96
- "updateRoleMapping",
97
- "updateUser",
98
- "updateUserMapping",
99
- "upsertUser",
100
- "validateCredentials",
101
- ]);
102
-
103
- this.subdomain = "security";
104
-
105
- this.securityCollections = ["users", "profiles", "roles"];
106
-
107
- // @deprecated - helper, will be loosely coupled in the near future
108
- this.getStrategyMethod =
109
- global.kuzzle.pluginsManager.getStrategyMethod.bind(
110
- global.kuzzle.pluginsManager,
111
- );
112
-
113
- this.logger = global.kuzzle.log.child("api:controllers:security");
114
- }
115
-
116
- /**
117
- * Checks if an API action can be executed by a user
118
- */
119
- async checkRights(request) {
120
- const userId = request.getString("userId");
121
- const requestPayload = request.getBody();
122
-
123
- if (typeof requestPayload.controller !== "string") {
124
- throw kerror.get("api", "assert", "missing_argument", "body.controller");
125
- }
126
-
127
- if (typeof requestPayload.action !== "string") {
128
- throw kerror.get("api", "assert", "missing_argument", "body.action");
129
- }
130
-
131
- const user = await global.kuzzle.ask("core:security:user:get", userId);
132
-
133
- const allowed = await user.isActionAllowed(new Request(requestPayload));
134
-
135
- return {
136
- allowed,
137
- };
138
- }
139
- /**
140
- * Creates a new API key for a user
141
- */
142
- async createApiKey(request) {
143
- const expiresIn = request.input.args.expiresIn || -1;
144
- const refresh = request.getRefresh("wait_for");
145
- const userId = request.getString("userId");
146
- const apiKeyId = request.getId({ ifMissing: "generate" });
147
- const description = request.getBodyString("description");
148
-
149
- const user = await this.ask("core:security:user:get", userId);
150
- const creatorId = request.getKuid();
151
-
152
- const apiKey = await ApiKey.create(user, expiresIn, description, {
153
- apiKeyId,
154
- bypassMaxTTL: true,
155
- creatorId,
156
- refresh,
157
- });
158
-
159
- this.logger.info(
160
- `[SECURITY] ${SecurityController.userOrSdk(creatorId)} applied action "${
161
- request.input.action
162
- }" on user "${userId}."`,
163
- );
164
- return apiKey.serialize({ includeToken: true });
165
- }
166
-
167
- /**
168
- * Search in an user API keys
169
- */
170
- async searchApiKeys(request) {
171
- const userId = request.getString("userId");
172
- let query = request.getBody({});
173
- const { from, size, scrollTTL } = request.getSearchParams();
174
- const lang = request.getLangParam();
175
-
176
- if (lang === "koncorde") {
177
- query = await this.translateKoncorde(query);
178
- }
179
-
180
- const searchBody = {
181
- query: {
182
- bool: {
183
- filter: { bool: { must: { term: { userId } } } },
184
- must: isEmpty(query) ? { match_all: {} } : query,
185
- },
186
- },
187
- };
188
-
189
- const apiKeys = await ApiKey.search(searchBody, {
190
- from,
191
- scroll: scrollTTL,
192
- size,
193
- });
194
-
195
- return {
196
- hits: apiKeys.map((apiKey) => apiKey.serialize()),
197
- total: apiKeys.length,
198
- };
199
- }
200
-
201
- /**
202
- * Deletes an user API key
203
- */
204
- async deleteApiKey(request) {
205
- const userId = request.getString("userId");
206
- const apiKeyId = request.getId();
207
- const refresh = request.getRefresh("wait_for");
208
-
209
- const apiKey = await ApiKey.load(userId, apiKeyId);
210
-
211
- await apiKey.delete({ refresh });
212
-
213
- return {
214
- _id: apiKeyId,
215
- };
216
- }
217
-
218
- /**
219
- * Get the role mapping
220
- *
221
- * @returns {Promise}
222
- */
223
- async getRoleMapping() {
224
- const { properties } =
225
- await global.kuzzle.internalIndex.getMapping("roles");
226
-
227
- return { mapping: properties };
228
- }
229
-
230
- /**
231
- * Update the roles collection mapping
232
- * @param {Request} request
233
- * @returns {Promise}
234
- */
235
- async updateRoleMapping(request) {
236
- const mappings = request.getBody();
237
-
238
- return global.kuzzle.internalIndex.updateMapping("roles", mappings);
239
- }
240
-
241
- /**
242
- * Get the profile mapping
243
- *
244
- * @returns {Promise}
245
- */
246
- async getProfileMapping() {
247
- const { properties } =
248
- await global.kuzzle.internalIndex.getMapping("profiles");
249
-
250
- return { mapping: properties };
251
- }
252
-
253
- /**
254
- * Update the profiles collection mapping
255
-
256
- * @param {Request} request
257
- * @returns {Promise}
258
- */
259
- updateProfileMapping(request) {
260
- const mappings = request.getBody();
261
-
262
- return global.kuzzle.internalIndex.updateMapping("profiles", mappings);
263
- }
264
-
265
- /**
266
- * Get the user mapping
267
- *
268
- * @returns {Promise}
269
- */
270
- async getUserMapping() {
271
- const { properties } =
272
- await global.kuzzle.internalIndex.getMapping("users");
273
-
274
- return { mapping: properties };
275
- }
276
-
277
- /**
278
- * Update the users collection mapping
279
-
280
- * @param {Request} request
281
- * @returns {Promise}
282
- */
283
- async updateUserMapping(request) {
284
- const mappings = request.getBody();
285
-
286
- return global.kuzzle.internalIndex.updateMapping("users", mappings);
287
- }
288
-
289
- /**
290
- * Get a specific role according to the given id
291
- *
292
- * @param {Request} request
293
- * @returns {Promise<Object>}
294
- */
295
- async getRole(request) {
296
- const id = request.getId();
297
-
298
- const role = await this.ask("core:security:role:get", id);
299
-
300
- return formatProcessing.serializeRole(role);
301
- }
302
-
303
- /**
304
- * Get specific roles according to given ids
305
- *
306
- * @param {Request} request
307
- * @returns {Promise<Object>}
308
- */
309
- async mGetRoles(request) {
310
- const ids = request.getBodyArray("ids");
311
- const roles = await this.ask("core:security:role:mGet", ids);
312
-
313
- return { hits: roles.map(formatProcessing.serializeRole) };
314
- }
315
-
316
- /**
317
- * Refresh a security collection (users, roles, profiles)
318
- *
319
- * @param {Request} request
320
- * @returns {Promise}
321
- */
322
- async refresh(request) {
323
- const collection = request.getCollection();
324
-
325
- if (!this.securityCollections.includes(collection)) {
326
- throw kerror.get(
327
- "api",
328
- "assert",
329
- "unexpected_argument",
330
- collection,
331
- this.securityCollections,
332
- );
333
- }
334
-
335
- await global.kuzzle.internalIndex.refreshCollection(collection);
336
-
337
- return null;
338
- }
339
-
340
- /**
341
- * Search for roles
342
- *
343
- * @param {Request} request
344
- * @returns {Promise<Object>}
345
- */
346
- async searchRoles(request) {
347
- const from = request.getInteger("from", 0);
348
- const size = this._getSearchPageSize(request);
349
- const lang = request.getLangParam();
350
- const body = request.getBody({});
351
-
352
- if (body.controllers && body.query) {
353
- throw new BadRequestError(
354
- 'You cannot specifify both "controllers" and "query". Prefer the usage of "query" property with a search query.',
355
- );
356
- }
357
-
358
- if (body.controllers) {
359
- // Type checking
360
- request.getBodyArray("controllers");
361
- }
362
-
363
- if (lang === "koncorde") {
364
- body.query = await this.translateKoncorde(body.query || {});
365
- }
366
-
367
- const response = await this.ask("core:security:role:search", body, {
368
- from,
369
- size,
370
- });
371
-
372
- response.hits = response.hits.map(formatProcessing.serializeRole);
373
-
374
- return response;
375
- }
376
-
377
- /**
378
- * Create or replace a Role
379
- *
380
- * @param {Request} request
381
- * @returns {Promise<Object>}
382
- */
383
- async createOrReplaceRole(request) {
384
- const id = request.getId();
385
- const body = request.getBody();
386
- const userId = request.getKuid();
387
-
388
- const role = await this.ask(
389
- "core:security:role:createOrReplace",
390
- id,
391
- body,
392
- {
393
- force: request.getBoolean("force"),
394
- refresh: request.getRefresh("wait_for"),
395
- userId,
396
- },
397
- );
398
-
399
- this.logger.info(
400
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
401
- request.input.action
402
- }" on role "${role._id}."`,
403
- );
404
- return formatProcessing.serializeRole(role);
405
- }
406
-
407
- /**
408
- * Create a Role
409
- *
410
- * @param {Request} request
411
- * @returns {Promise<Object>}
412
- */
413
- async createRole(request) {
414
- const id = request.getId();
415
- const body = request.getBody();
416
- const userId = request.getKuid();
417
-
418
- const role = await this.ask("core:security:role:create", id, body, {
419
- force: request.getBoolean("force"),
420
- refresh: request.getRefresh("wait_for"),
421
- userId,
422
- });
423
-
424
- this.logger.info(
425
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
426
- request.input.action
427
- }" on role "${role._id}."`,
428
- );
429
- return formatProcessing.serializeRole(role);
430
- }
431
-
432
- /**
433
- * Remove a role according to the given id
434
- *
435
- * @param {Request} request
436
- * @returns {Promise<Object>}
437
- */
438
- async deleteRole(request) {
439
- const id = request.getId();
440
-
441
- await this.ask("core:security:role:delete", id, {
442
- refresh: request.getRefresh("wait_for"),
443
- });
444
-
445
- this.logger.info(
446
- `[SECURITY] ${SecurityController.userOrSdk(
447
- request.getKuid(),
448
- )} applied action "${request.input.action} on role "${id}."`,
449
- );
450
-
451
- // @todo This avoids a breaking change... but we should really return
452
- // an acknowledgment.
453
- return { _id: id };
454
- }
455
-
456
- /**
457
- * Get a specific profile according to the given id
458
- *
459
- * @param {Request} request
460
- * @returns {Promise<Object>}
461
- */
462
- async getProfile(request) {
463
- const id = request.getId();
464
-
465
- const profile = await this.ask("core:security:profile:get", id);
466
-
467
- return formatProcessing.serializeProfile(profile);
468
- }
469
-
470
- /**
471
- * Get specific profiles according to given ids
472
- *
473
- * @param {Request} request
474
- * @returns {Promise<Object>}
475
- */
476
- async mGetProfiles(request) {
477
- const ids = request.getBodyArray("ids");
478
-
479
- const profiles = await this.ask("core:security:profile:mGet", ids);
480
-
481
- // @todo - should return an array of profiles directly, this is not a
482
- // search route...
483
- return {
484
- hits: profiles.map((profile) =>
485
- formatProcessing.serializeProfile(profile),
486
- ),
487
- };
488
- }
489
-
490
- /**
491
- * Create or replace a Profile
492
- *
493
- * @param {Request} request
494
- * @returns {Promise<Object>}
495
- */
496
- async createOrReplaceProfile(request) {
497
- const id = request.getId();
498
- const content = request.getBody();
499
- const userId = request.getKuid();
500
-
501
- // Assert: must have a "policies" array
502
- request.getBodyArray("policies");
503
-
504
- const profile = await this.ask(
505
- "core:security:profile:createOrReplace",
506
- id,
507
- content,
508
- {
509
- refresh: request.getRefresh("wait_for"),
510
- strict: request.getBoolean("strict"),
511
- userId,
512
- },
513
- );
514
-
515
- this.logger.info(
516
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
517
- request.input.action
518
- }" on profile "${profile._id}."`,
519
- );
520
-
521
- return formatProcessing.serializeProfile(profile);
522
- }
523
-
524
- /**
525
- * Create a Profile
526
- *
527
- * @param {Request} request
528
- * @returns {Promise<Object>}
529
- */
530
- async createProfile(request) {
531
- const id = request.getId();
532
- const content = request.getBody();
533
- const userId = request.getKuid();
534
-
535
- // Assert: must have a "policies" array
536
- request.getBodyArray("policies");
537
-
538
- const profile = await this.ask(
539
- "core:security:profile:create",
540
- id,
541
- content,
542
- {
543
- refresh: request.getRefresh("wait_for"),
544
- strict: request.getBoolean("strict"),
545
- userId,
546
- },
547
- );
548
-
549
- this.logger.info(
550
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
551
- request.input.action
552
- }" on profile "${profile._id}."`,
553
- );
554
-
555
- return formatProcessing.serializeProfile(profile);
556
- }
557
-
558
- /**
559
- * Deletes a profile
560
- *
561
- * @param {Request} request
562
- * @returns {Promise<Object>}
563
- */
564
- async deleteProfile(request) {
565
- const id = request.getId();
566
- const userId = request.getKuid();
567
- const options = {
568
- onAssignedUsers: request.getString("onAssignedUsers", "fail"),
569
- refresh: request.getRefresh("wait_for"),
570
- userId,
571
- };
572
-
573
- await this.ask("core:security:profile:delete", id, options);
574
-
575
- this.logger.info(
576
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
577
- request.input.action
578
- }" on profile "${id}."`,
579
- );
580
-
581
- // @todo - replace by an acknowledgement
582
- return { _id: id };
583
- }
584
-
585
- /**
586
- * Search for profiles
587
- *
588
- * @param {Request} request
589
- * @returns {Promise<Object>}
590
- */
591
- async searchProfiles(request) {
592
- const size = this._getSearchPageSize(request);
593
- const { from, scrollTTL, searchBody } = request.getSearchParams();
594
- const lang = request.getLangParam();
595
- const body = request.getBody({});
596
-
597
- if (body.roles && body.query) {
598
- throw new BadRequestError(
599
- 'You cannot specifify both "roles" and "query". Prefer the usage of "query" property with a search query.',
600
- );
601
- }
602
-
603
- if (body.roles) {
604
- const roles = request.getBodyArray("roles");
605
-
606
- request.addDeprecation(
607
- "auto-version",
608
- 'Usage of the "roles" property is deprecated. Prefer the usage of "query" property with a search query.',
609
- );
610
-
611
- if (roles.length > 0) {
612
- searchBody.query = { terms: { "policies.roleId": roles } };
613
- } else {
614
- searchBody.query = { match_all: {} };
615
- }
616
- delete body.roles;
617
- }
618
-
619
- if (lang === "koncorde") {
620
- searchBody.query = await this.translateKoncorde(searchBody.query || {});
621
- }
622
-
623
- const response = await this.ask(
624
- "core:security:profile:search",
625
- searchBody,
626
- {
627
- from,
628
- scroll: scrollTTL,
629
- size,
630
- },
631
- );
632
-
633
- response.hits = response.hits.map(formatProcessing.serializeProfile);
634
-
635
- return response;
636
- }
637
-
638
- /**
639
- * Given a user id, returns the matching User object
640
- *
641
- * @param {Request} request
642
- * @returns {Promise<Object>}
643
- */
644
- async getUser(request) {
645
- const id = request.getId();
646
- const user = await this.ask("core:security:user:get", id);
647
-
648
- return formatProcessing.serializeUser(user);
649
- }
650
-
651
- /**
652
- * Get specific users according to given ids
653
- *
654
- * @param {Request} request
655
- * @returns {Promise.<Object>}
656
- */
657
- async mGetUsers(request) {
658
- let ids;
659
-
660
- if (
661
- request.input.body &&
662
- request.input.body.ids &&
663
- Object.keys(request.input.body.ids).length
664
- ) {
665
- ids = request.getBodyArray("ids");
666
- } else {
667
- // @deprecated Should be replaced with request.getArray('ids')
668
- ids = request.getArrayLegacy("ids");
669
- }
670
-
671
- const users = await this.ask("core:security:user:mGet", ids);
672
-
673
- return { hits: users.map((user) => formatProcessing.serializeUser(user)) };
674
- }
675
-
676
- /**
677
- * Given a profile id, returns the matching profile's rights as an array.
678
- *
679
- * @param {Request} request
680
- * @returns {Promise<Object>}
681
- */
682
- async getProfileRights(request) {
683
- const id = request.getId();
684
-
685
- const profile = await this.ask("core:security:profile:get", id);
686
- const rights = await profile.getRights();
687
- const hits = Object.keys(rights).reduce(
688
- (array, item) => array.concat(rights[item]),
689
- [],
690
- );
691
-
692
- return {
693
- hits,
694
- total: hits.length,
695
- };
696
- }
697
-
698
- /**
699
- * Given a user id, returns the matching user's rights as an array.
700
- *
701
- * @param {Request} request
702
- * @returns {Promise<Object>}
703
- */
704
- async getUserRights(request) {
705
- const id = request.getId();
706
-
707
- const user = await this.ask("core:security:user:get", id);
708
- const rights = await user.getRights();
709
- const hits = Object.keys(rights).reduce(
710
- (array, item) => array.concat(rights[item]),
711
- [],
712
- );
713
-
714
- return {
715
- hits,
716
- total: hits.length,
717
- };
718
- }
719
-
720
- /**
721
- * Given a user id, returns the matching user's strategies as an array.
722
- *
723
- * @param {Request} request
724
- * @returns {Promise<Object>}
725
- */
726
- async getUserStrategies(request) {
727
- const userId = request.getId();
728
- const checkPromises = [];
729
-
730
- // Throws if the user doesn't exist
731
- await this.ask("core:security:user:get", userId);
732
-
733
- if (this.anonymousId === userId) {
734
- checkPromises.push(Bluebird.resolve(null));
735
- } else {
736
- const availableStrategies = global.kuzzle.pluginsManager.listStrategies();
737
-
738
- for (const strategy of availableStrategies) {
739
- const existMethod = this.getStrategyMethod(strategy, "exists");
740
-
741
- checkPromises.push(
742
- existMethod(request, userId, strategy).then((exists) =>
743
- exists ? strategy : null,
744
- ),
745
- );
746
- }
747
- }
748
-
749
- const strategies = await Bluebird.all(checkPromises).filter(
750
- (item) => item !== null,
751
- );
752
-
753
- return {
754
- strategies,
755
- total: strategies.length,
756
- };
757
- }
758
-
759
- /**
760
- * Returns the User objects matching the given query
761
- *
762
- * @param {Request} request
763
- * @returns {Promise<Object>}
764
- */
765
- async searchUsers(request) {
766
- const size = this._getSearchPageSize(request);
767
- const { from, scrollTTL, searchBody } = request.getSearchParams();
768
- const lang = request.getLangParam();
769
-
770
- if (lang === "koncorde") {
771
- searchBody.query = await this.translateKoncorde(searchBody.query);
772
- }
773
-
774
- const response = await this.ask("core:security:user:search", searchBody, {
775
- from,
776
- scroll: scrollTTL,
777
- size,
778
- });
779
-
780
- return {
781
- hits: response.hits.map(formatProcessing.serializeUser),
782
- scrollId: response.scrollId,
783
- total: response.total,
784
- };
785
- }
786
-
787
- /**
788
- * Given a credentials related search query, returns matched users' kuid.
789
- *
790
- * @param {Request} request
791
- * @returns {Promise<Object>}
792
- */
793
- async searchUsersByCredentials(request) {
794
- const strategy = request.getString("strategy");
795
- const lang = request.getLangParam();
796
- const { from, size, searchBody } = request.getSearchParams();
797
-
798
- this.assertIsStrategyRegistered(strategy);
799
-
800
- const searchMethod = this.getStrategyMethod(strategy, "search");
801
-
802
- if (!searchMethod) {
803
- throw kerror.get(
804
- "plugin",
805
- "strategy",
806
- "missing_optional_method",
807
- "search",
808
- strategy,
809
- );
810
- }
811
-
812
- if (lang === "koncorde") {
813
- searchBody.query = await this.translateKoncorde(searchBody.query || {});
814
- }
815
-
816
- this.assertNotExceedMaxFetch(size - from);
817
-
818
- return searchMethod(searchBody, { from, size });
819
- }
820
-
821
- /**
822
- * Deletes a user from Kuzzle
823
- *
824
- * @param {Request} request
825
- * @returns {Promise<Object>}
826
- */
827
- async deleteUser(request) {
828
- const id = request.getId();
829
- const options = { refresh: request.getRefresh("wait_for") };
830
-
831
- await this.ask("core:security:user:delete", id, options);
832
-
833
- this.logger.info(
834
- `[SECURITY] ${SecurityController.userOrSdk(
835
- request.getKuid(),
836
- )} applied action "${request.input.action}" on user "${id}."`,
837
- );
838
-
839
- return { _id: id };
840
- }
841
-
842
- /**
843
- * Creates a new User object in Kuzzle's database layer
844
- *
845
- * @param {Request} request
846
- * @returns {Promise<Object>}
847
- */
848
- async createUser(request) {
849
- const content = request.getBodyObject("content");
850
- const profileIds = request.getBodyArray("content.profileIds");
851
- const humanReadableId = request.getString("kuid", "human") !== "uuid";
852
-
853
- return this._persistUser(request, profileIds, content, { humanReadableId });
854
- }
855
-
856
- /**
857
- * Creates a new User object in Kuzzle's database layer and applies restricted profileIds
858
- *
859
- * @param {Request} request
860
- * @returns {Promise<Object>}
861
- */
862
- async createRestrictedUser(request) {
863
- const content = request.getBodyObject("content", {});
864
- const humanReadableId = request.getString("kuid", "human") !== "uuid";
865
-
866
- if (has(content, "profileIds")) {
867
- throw kerror.get(
868
- "api",
869
- "assert",
870
- "forbidden_argument",
871
- "body.content.profileIds",
872
- );
873
- }
874
-
875
- return this._persistUser(
876
- request,
877
- global.kuzzle.config.security.restrictedProfileIds,
878
- content,
879
- { humanReadableId },
880
- );
881
- }
882
-
883
- /**
884
- * Updates an existing User
885
- *
886
- * @param {Request} request
887
- * @returns {Promise<Object>}
888
- */
889
- async updateUser(request) {
890
- const id = request.getId();
891
- const content = request.getBody();
892
- const userId = request.getKuid();
893
- const profileIds = isNil(content.profileIds)
894
- ? null
895
- : request.getBodyArray("profileIds");
896
-
897
- return this._changeUser(request, id, content, userId, profileIds);
898
- }
899
-
900
- /**
901
- * Applies a partial update to an existing user.
902
- * If the user doesn't already exist, a new user is created.
903
- *
904
- * @param {Request} request
905
- * @returns {Promise}
906
- */
907
- async upsertUser(request) {
908
- const id = request.getId();
909
- const content = request.getBodyObject("content");
910
- const userId = request.getKuid();
911
- const profileIds = request.getBodyArray("content.profileIds");
912
- const defaultValues = request.getBodyObject("default", {});
913
-
914
- try {
915
- return await this._changeUser(request, id, content, userId, profileIds);
916
- } catch (error) {
917
- if (error.id && error.id === "security.user.not_found") {
918
- const creatingContent = {
919
- ...defaultValues,
920
- ...content, // Order important, content erase default duplicates
921
- };
922
-
923
- return this._persistUser(request, profileIds, creatingContent);
924
- }
925
-
926
- throw error;
927
- }
928
- }
929
-
930
- /**
931
- * Replaces an existing User
932
- *
933
- * @param {Request} request
934
- * @returns {Promise<Object>}
935
- */
936
- async replaceUser(request) {
937
- const id = request.getId();
938
- const content = request.getBody();
939
- const profileIds = request.getBodyArray("profileIds");
940
- const userId = request.getKuid();
941
-
942
- const user = await this.ask(
943
- "core:security:user:replace",
944
- id,
945
- profileIds,
946
- content,
947
- { refresh: request.getRefresh("wait_for"), userId },
948
- );
949
-
950
- this.logger.info(
951
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
952
- request.input.action
953
- }" on user "${id}."`,
954
- );
955
-
956
- return formatProcessing.serializeUser(user);
957
- }
958
-
959
- /**
960
- * Updates an existing profile
961
- *
962
- * @param {Request} request
963
- * @returns {Promise<Object>}
964
- */
965
- async updateProfile(request) {
966
- const id = request.getId();
967
- const body = request.getBody();
968
- const userId = request.getKuid();
969
-
970
- const updated = await this.ask("core:security:profile:update", id, body, {
971
- refresh: request.getRefresh("wait_for"),
972
- retryOnConflict: request.getInteger("retryOnConflict", 10),
973
- strict: request.getBoolean("strict"),
974
- userId,
975
- });
976
-
977
- this.logger.info(
978
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
979
- request.input.action
980
- }" on profile "${id}."`,
981
- );
982
- return formatProcessing.serializeProfile(updated);
983
- }
984
-
985
- /**
986
- * Updates an existing role
987
- *
988
- * @param {Request} request
989
- * @returns {Promise<Object>}
990
- */
991
- async updateRole(request) {
992
- const id = request.getId();
993
- const body = request.getBody();
994
- const userId = request.getKuid();
995
-
996
- const updated = await this.ask("core:security:role:update", id, body, {
997
- force: request.getBoolean("force"),
998
- refresh: request.getRefresh("wait_for"),
999
- retryOnConflict: request.getInteger("retryOnConflict", 10),
1000
- userId,
1001
- });
1002
-
1003
- this.logger.info(
1004
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
1005
- request.input.action
1006
- }" on role "${id}."`,
1007
- );
1008
-
1009
- return formatProcessing.serializeRole(updated);
1010
- }
1011
-
1012
- /**
1013
- * Creates the first admin user if it does not already exist
1014
- *
1015
- * @param {Request} request
1016
- * @returns {Promise<Object>}
1017
- */
1018
- async createFirstAdmin(request) {
1019
- const adminExists = await global.kuzzle.ask(
1020
- "core:security:user:admin:exist",
1021
- );
1022
-
1023
- if (adminExists) {
1024
- throw kerror.get("api", "process", "admin_exists");
1025
- }
1026
-
1027
- const userId = request.getKuid();
1028
- const content = request.getBodyObject("content", {});
1029
- const reset = request.getBoolean("reset");
1030
- const humanReadableId = request.getString("kuid", "human") !== "uuid";
1031
-
1032
- if (has(content, "profileIds")) {
1033
- throw kerror.get(
1034
- "api",
1035
- "assert",
1036
- "forbidden_argument",
1037
- "body.content.profileIds",
1038
- );
1039
- }
1040
-
1041
- const user = await this._persistUser(request, ["admin"], content, {
1042
- humanReadableId,
1043
- });
1044
-
1045
- if (reset) {
1046
- for (const type of ["role", "profile"]) {
1047
- await Bluebird.map(
1048
- Object.entries(global.kuzzle.config.security.standard[`${type}s`]),
1049
- ([name, value]) =>
1050
- this.ask(`core:security:${type}:createOrReplace`, name, value, {
1051
- refresh: "wait_for",
1052
- userId,
1053
- }),
1054
- );
1055
- }
1056
- }
1057
-
1058
- this.logger.info(
1059
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
1060
- request.input.action
1061
- }".`,
1062
- );
1063
-
1064
- return user;
1065
- }
1066
-
1067
- /**
1068
- * Deletes multiple profiles
1069
- *
1070
- * @param {Request} request
1071
- * @returns {Promise<Object>}
1072
- */
1073
- mDeleteProfiles(request) {
1074
- return this._mDelete("profile", request);
1075
- }
1076
-
1077
- /**
1078
- * Deletes multiple roles
1079
- *
1080
- * @param {Request} request
1081
- * @returns {Promise<Object>}
1082
- */
1083
- mDeleteRoles(request) {
1084
- return this._mDelete("role", request);
1085
- }
1086
-
1087
- /**
1088
- * Deletes multiple users
1089
- *
1090
- * @param {Request} request
1091
- * @returns {Promise<Object>}
1092
- */
1093
- mDeleteUsers(request) {
1094
- return this._mDelete("user", request);
1095
- }
1096
-
1097
- /**
1098
- * Scroll a paginated users search result
1099
- *
1100
- * @param {Request} request
1101
- * @returns {Promise<Object>}
1102
- */
1103
- async scrollUsers(request) {
1104
- const id = request.getString("scrollId");
1105
- const ttl = request.getScrollTTLParam();
1106
-
1107
- const response = await this.ask("core:security:user:scroll", id, ttl);
1108
-
1109
- response.hits = response.hits.map(formatProcessing.serializeUser);
1110
-
1111
- return response;
1112
- }
1113
-
1114
- /**
1115
- * Scroll a paginated profiles search result
1116
- *
1117
- * @param {Request} request
1118
- * @returns {Promise<Object>}
1119
- */
1120
- async scrollProfiles(request) {
1121
- const id = request.getString("scrollId");
1122
- const ttl = request.getScrollTTLParam();
1123
-
1124
- const response = await this.ask("core:security:profile:scroll", id, ttl);
1125
-
1126
- response.hits = response.hits.map(formatProcessing.serializeProfile);
1127
-
1128
- return response;
1129
- }
1130
-
1131
- /**
1132
- * @param {Request} request
1133
- * @returns {Promise<Object>}
1134
- */
1135
- async createCredentials(request) {
1136
- const id = request.getId();
1137
- const body = request.getBody();
1138
- const strategy = request.getString("strategy");
1139
-
1140
- this.assertIsStrategyRegistered(strategy);
1141
-
1142
- // Throws if the user doesn't exist
1143
- await this.ask("core:security:user:get", id);
1144
-
1145
- const validateMethod = this.getStrategyMethod(strategy, "validate");
1146
-
1147
- await validateMethod(request, body, id, strategy, false);
1148
-
1149
- const createMethod = this.getStrategyMethod(strategy, "create");
1150
-
1151
- this.logger.info(
1152
- `[SECURITY] ${SecurityController.userOrSdk(
1153
- request.getKuid(),
1154
- )} applied action "${request.input.action}" on user "${id}."`,
1155
- );
1156
- return createMethod(request, body, id, strategy);
1157
- }
1158
-
1159
- /**
1160
- * @param {Request} request
1161
- * @returns {Promise<Object>}
1162
- */
1163
- async updateCredentials(request) {
1164
- const id = request.getId();
1165
- const body = request.getBody();
1166
- const strategy = request.getString("strategy");
1167
-
1168
- this.assertIsStrategyRegistered(strategy);
1169
-
1170
- // Throws if the user doesn't exist
1171
- await this.ask("core:security:user:get", id);
1172
-
1173
- const validateMethod = this.getStrategyMethod(strategy, "validate");
1174
-
1175
- await validateMethod(request, body, id, strategy, true);
1176
-
1177
- const updateMethod = this.getStrategyMethod(strategy, "update");
1178
-
1179
- this.logger.info(
1180
- `[SECURITY] ${SecurityController.userOrSdk(
1181
- request.getKuid(),
1182
- )} applied action "${request.input.action}" on user "${id}."`,
1183
- );
1184
-
1185
- return updateMethod(request, body, id, strategy);
1186
- }
1187
-
1188
- /**
1189
- * @param {Request} request
1190
- * @returns {Promise.<Object>}
1191
- */
1192
- async hasCredentials(request) {
1193
- const id = request.getId();
1194
- const strategy = request.getString("strategy");
1195
-
1196
- this.assertIsStrategyRegistered(strategy);
1197
-
1198
- const existsMethod = this.getStrategyMethod(strategy, "exists");
1199
-
1200
- return existsMethod(request, id, strategy);
1201
- }
1202
-
1203
- /**
1204
- * @param {Request} request
1205
- * @returns {Promise.<Object>}
1206
- */
1207
- async validateCredentials(request) {
1208
- const strategy = request.getString("strategy");
1209
-
1210
- this.assertIsStrategyRegistered(strategy);
1211
-
1212
- const validateMethod = this.getStrategyMethod(strategy, "validate");
1213
-
1214
- return validateMethod(
1215
- request,
1216
- request.getBody(),
1217
- request.getId({ ifMissing: "ignore" }),
1218
- strategy,
1219
- false,
1220
- );
1221
- }
1222
-
1223
- /**
1224
- * @param {Request} request
1225
- * @returns {Promise<Object>}
1226
- */
1227
- async deleteCredentials(request) {
1228
- const id = request.getId();
1229
- const strategy = request.getString("strategy");
1230
-
1231
- this.assertIsStrategyRegistered(strategy);
1232
-
1233
- const deleteMethod = this.getStrategyMethod(strategy, "delete");
1234
-
1235
- await deleteMethod(request, id, strategy);
1236
-
1237
- this.logger.info(
1238
- `[SECURITY] ${SecurityController.userOrSdk(
1239
- request.getKuid(),
1240
- )} applied action "${request.input.action}" on user "${id}."`,
1241
- );
1242
-
1243
- return { acknowledged: true };
1244
- }
1245
-
1246
- /**
1247
- * @param {Request} request
1248
- * @returns {Promise<Object>}
1249
- */
1250
- async getCredentials(request) {
1251
- const id = request.getId();
1252
- const strategy = request.getString("strategy");
1253
-
1254
- this.assertIsStrategyRegistered(strategy);
1255
-
1256
- if (global.kuzzle.pluginsManager.hasStrategyMethod(strategy, "getInfo")) {
1257
- const getInfoMethod = this.getStrategyMethod(strategy, "getInfo");
1258
-
1259
- return getInfoMethod(request, id, strategy);
1260
- }
1261
-
1262
- return {};
1263
- }
1264
-
1265
- /**
1266
- * @param {Request} request
1267
- * @returns {Promise<Object>}
1268
- */
1269
- async getCredentialsById(request) {
1270
- const id = request.getId();
1271
- const strategy = request.getString("strategy");
1272
-
1273
- this.assertIsStrategyRegistered(strategy);
1274
-
1275
- if (global.kuzzle.pluginsManager.hasStrategyMethod(strategy, "getById")) {
1276
- const getByIdMethod = this.getStrategyMethod(strategy, "getById");
1277
-
1278
- return getByIdMethod(request, id, strategy);
1279
- }
1280
-
1281
- return {};
1282
- }
1283
-
1284
- /**
1285
- * @param {Request} request
1286
- * @returns {Promise<Object>}
1287
- */
1288
- async getCredentialFields(request) {
1289
- const strategy = request.getString("strategy");
1290
-
1291
- this.assertIsStrategyRegistered(strategy);
1292
-
1293
- return global.kuzzle.pluginsManager.getStrategyFields(strategy);
1294
- }
1295
-
1296
- /**
1297
- * @returns {Promise<Object>}
1298
- */
1299
- async getAllCredentialFields() {
1300
- const strategyFields = {};
1301
-
1302
- global.kuzzle.pluginsManager.listStrategies().forEach((strategy) => {
1303
- strategyFields[strategy] =
1304
- global.kuzzle.pluginsManager.getStrategyFields(strategy);
1305
- });
1306
-
1307
- return strategyFields;
1308
- }
1309
-
1310
- /**
1311
- * @param {Request} request
1312
- * @returns {Promise.<null>}
1313
- */
1314
- async revokeTokens(request) {
1315
- const id = request.getId();
1316
-
1317
- await this.ask("core:security:token:deleteByKuid", id);
1318
-
1319
- return null;
1320
- }
1321
-
1322
- /**
1323
- * @param {string.<profile|role|user>} type
1324
- * @param {Request} request
1325
- * @returns {Promise.<Array.<string>>}
1326
- * @private
1327
- */
1328
- async _mDelete(type, request) {
1329
- const ids = request.getBodyArray("ids");
1330
- const refresh = request.getRefresh("wait_for");
1331
-
1332
- if (ids.length > global.kuzzle.config.limits.documentsWriteCount) {
1333
- throw kerror.get("services", "storage", "write_limit_exceeded");
1334
- }
1335
-
1336
- const successes = [];
1337
- const errors = [];
1338
-
1339
- await Bluebird.map(ids, (id) =>
1340
- this.ask(`core:security:${type}:delete`, id, { refresh })
1341
- .then(() => successes.push(id))
1342
- .catch((err) => errors.push(err)),
1343
- );
1344
-
1345
- if (errors.length) {
1346
- request.setError(
1347
- kerror.get("services", "storage", "incomplete_delete", errors),
1348
- );
1349
- }
1350
-
1351
- if (successes.length > 1000) {
1352
- this.logger.info(
1353
- `[SECURITY] ${SecurityController.userOrSdk(
1354
- request.getKuid(),
1355
- )} deleted the following ${type}s: ${successes
1356
- .slice(0, 1000)
1357
- .join(", ")}... (${successes.length - 1000} more users deleted)."`,
1358
- );
1359
- } else {
1360
- this.logger.info(
1361
- `[SECURITY] ${SecurityController.userOrSdk(
1362
- request.getKuid(),
1363
- )} deleted the following ${type}s: ${successes.join(", ")}."`,
1364
- );
1365
- }
1366
-
1367
- return successes;
1368
- }
1369
-
1370
- /**
1371
- * @returns {Promise}
1372
- * @private
1373
- */
1374
- async _changeUser(request, id, content, userId, profileIds) {
1375
- const updated = await this.ask(
1376
- "core:security:user:update",
1377
- id,
1378
- profileIds,
1379
- content,
1380
- {
1381
- refresh: request.getRefresh("wait_for"),
1382
- retryOnConflict: request.getInteger("retryOnConflict", 10),
1383
- userId,
1384
- },
1385
- );
1386
-
1387
- this.logger.info(
1388
- `[SECURITY] ${SecurityController.userOrSdk(userId)} applied action "${
1389
- request.input.action
1390
- }" on user "${id}."`,
1391
- );
1392
-
1393
- return formatProcessing.serializeUser(updated);
1394
- }
1395
-
1396
- /**
1397
- * @param {Request} request
1398
- * @returns {Promise}
1399
- * @private
1400
- */
1401
- async _persistUser(
1402
- request,
1403
- profileIds,
1404
- content,
1405
- { humanReadableId = true } = {},
1406
- ) {
1407
- const credentials = request.getBodyObject("credentials", {});
1408
- const strategies = Object.keys(credentials);
1409
- const generator = humanReadableId
1410
- ? () => NameGenerator.generateRandomName({ prefix: "kuid" })
1411
- : () => "kuid-" + uuidv4();
1412
-
1413
- let id = "";
1414
- let alreadyExists = false;
1415
- // Early checks before the user is created
1416
- do {
1417
- let generated = false;
1418
- id = request.getId({
1419
- generator: () => {
1420
- generated = true;
1421
-
1422
- return generator();
1423
- },
1424
- ifMissing: "generate",
1425
- });
1426
-
1427
- for (const strategy of strategies) {
1428
- if (!global.kuzzle.pluginsManager.listStrategies().includes(strategy)) {
1429
- throw kerror.get(
1430
- "security",
1431
- "credentials",
1432
- "unknown_strategy",
1433
- strategy,
1434
- );
1435
- }
1436
-
1437
- const exists = this.getStrategyMethod(strategy, "exists");
1438
- alreadyExists = await exists(request, id, strategy);
1439
- if (alreadyExists) {
1440
- if (generated) {
1441
- break; // exit for loop, to regenerate an id
1442
- }
1443
-
1444
- throw kerror.get(
1445
- "security",
1446
- "credentials",
1447
- "database_inconsistency",
1448
- id,
1449
- );
1450
- }
1451
- }
1452
- } while (alreadyExists);
1453
-
1454
- const user = await this.ask(
1455
- "core:security:user:create",
1456
- id,
1457
- profileIds,
1458
- content,
1459
- { refresh: request.getRefresh("wait_for") },
1460
- );
1461
-
1462
- const createdUser = formatProcessing.serializeUser(user);
1463
-
1464
- // Creating credentials
1465
- let creationFailure = null;
1466
- const createdStrategies = [];
1467
-
1468
- for (const strategy of strategies) {
1469
- try {
1470
- const validate = this.getStrategyMethod(strategy, "validate");
1471
-
1472
- await validate(request, credentials[strategy], id, strategy, false);
1473
- } catch (error) {
1474
- creationFailure = { error, validation: true };
1475
- break;
1476
- }
1477
-
1478
- try {
1479
- const create = this.getStrategyMethod(strategy, "create");
1480
-
1481
- await create(request, credentials[strategy], id, strategy);
1482
- createdStrategies.push(strategy);
1483
- } catch (error) {
1484
- creationFailure = { error, validation: false };
1485
- break;
1486
- }
1487
- }
1488
-
1489
- if (creationFailure === null) {
1490
- this.logger.info(
1491
- `[SECURITY] ${SecurityController.userOrSdk(
1492
- request.getKuid(),
1493
- )} applied action "${request.input.action}" on user "${id}."`,
1494
- );
1495
- return createdUser;
1496
- }
1497
-
1498
- // Failed to create credentials: rollback created strategies
1499
- const deletionErrors = [];
1500
- for (const strategy of createdStrategies) {
1501
- try {
1502
- const del = this.getStrategyMethod(strategy, "delete");
1503
- await del(request, id, strategy);
1504
- } catch (e) {
1505
- // We catch any error produced by delete as we want to make as much
1506
- // cleanup as possible
1507
- deletionErrors.push(e);
1508
- }
1509
- }
1510
-
1511
- try {
1512
- this.ask("core:security:user:delete", id, { refresh: "false" });
1513
- } catch (e) {
1514
- this.logger.error(`User rollback error: ${e}`);
1515
- }
1516
-
1517
- if (deletionErrors.length > 0) {
1518
- // 2 errors > we
1519
- throw kerror.get(
1520
- "plugin",
1521
- "runtime",
1522
- "unexpected_error",
1523
- [
1524
- creationFailure.error.message,
1525
- ...deletionErrors.map((e) => e.message),
1526
- ].join("\n"),
1527
- );
1528
- }
1529
-
1530
- if (creationFailure.error instanceof KuzzleError) {
1531
- throw creationFailure.error;
1532
- }
1533
-
1534
- if (creationFailure.validation) {
1535
- throw kerror.getFrom(
1536
- creationFailure.error,
1537
- "security",
1538
- "credentials",
1539
- "rejected",
1540
- creationFailure.error.message,
1541
- );
1542
- }
1543
-
1544
- throw kerror.getFrom(
1545
- creationFailure.error,
1546
- "plugin",
1547
- "runtime",
1548
- "unexpected_error",
1549
- creationFailure.error.message,
1550
- );
1551
- }
1552
-
1553
- /**
1554
- * Checks if a search result can exceeds the server configured limit
1555
- * @param {Request} request
1556
- * @param {number} limit
1557
- * @throws
1558
- */
1559
- _getSearchPageSize(request) {
1560
- const size = request.getInteger(
1561
- "size",
1562
- global.kuzzle.config.limits.documentsFetchCount,
1563
- );
1564
-
1565
- this.assertNotExceedMaxFetch(size);
1566
-
1567
- return size;
1568
- }
1569
- }
1570
-
1571
- module.exports = SecurityController;