@kalisio/kdk 1.4.2 → 1.6.0

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 (410) hide show
  1. package/.nyc_output/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
  2. package/.nyc_output/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
  3. package/.nyc_output/{2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json → 27401f21-8ccf-42fa-8230-4232189d86b3.json} +0 -0
  4. package/.nyc_output/{81d21e46-766a-46bc-b1b7-143ca577347a.json → 52278ef5-c337-4724-97be-e2e4416847c5.json} +0 -0
  5. package/.nyc_output/{aaf3ebbb-f895-4d7b-9255-bc5dee832570.json → 5dd49b8a-4c84-42f9-a3d5-712247a84775.json} +0 -0
  6. package/.nyc_output/{dbeb2602-0ac2-4e66-978b-0d29548359ca.json → 612b4859-9645-45c1-a41e-1fae420518c4.json} +0 -0
  7. package/.nyc_output/{e47d1e4c-2fff-4dcb-908f-d3081162547c.json → bab87fe9-d99a-4759-99e6-3fc4622eeca0.json} +0 -0
  8. package/.nyc_output/processinfo/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
  9. package/.nyc_output/processinfo/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
  10. package/.nyc_output/processinfo/27401f21-8ccf-42fa-8230-4232189d86b3.json +1 -0
  11. package/.nyc_output/processinfo/52278ef5-c337-4724-97be-e2e4416847c5.json +1 -0
  12. package/.nyc_output/processinfo/5dd49b8a-4c84-42f9-a3d5-712247a84775.json +1 -0
  13. package/.nyc_output/processinfo/612b4859-9645-45c1-a41e-1fae420518c4.json +1 -0
  14. package/.nyc_output/processinfo/bab87fe9-d99a-4759-99e6-3fc4622eeca0.json +1 -0
  15. package/.nyc_output/processinfo/index.json +1 -1
  16. package/CHANGELOG.md +69 -10
  17. package/coverage/core/api/application.js.html +500 -422
  18. package/coverage/core/api/authentication.js.html +119 -119
  19. package/coverage/core/api/db.js.html +172 -172
  20. package/coverage/core/api/hooks/hooks.account.js.html +45 -45
  21. package/coverage/core/api/hooks/hooks.authentication.js.html +71 -71
  22. package/coverage/core/api/hooks/hooks.authorisations.js.html +368 -353
  23. package/coverage/core/api/hooks/hooks.devices.js.html +49 -49
  24. package/coverage/core/api/hooks/hooks.groups.js.html +37 -37
  25. package/coverage/core/api/hooks/hooks.logger.js.html +27 -27
  26. package/coverage/core/api/hooks/hooks.model.js.html +269 -269
  27. package/coverage/core/api/hooks/hooks.organisations.js.html +190 -190
  28. package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
  29. package/coverage/core/api/hooks/hooks.query.js.html +277 -211
  30. package/coverage/core/api/hooks/hooks.service.js.html +82 -82
  31. package/coverage/core/api/hooks/hooks.storage.js.html +121 -121
  32. package/coverage/core/api/hooks/hooks.tags.js.html +232 -232
  33. package/coverage/core/api/hooks/hooks.users.js.html +263 -263
  34. package/coverage/core/api/hooks/index.html +172 -172
  35. package/coverage/core/api/hooks/index.js.html +24 -24
  36. package/coverage/core/api/index.html +76 -76
  37. package/coverage/core/api/index.js.html +30 -30
  38. package/coverage/core/api/marshall.js.html +57 -57
  39. package/coverage/core/api/models/groups.model.mongodb.js.html +20 -20
  40. package/coverage/core/api/models/index.html +50 -50
  41. package/coverage/core/api/models/organisations.model.mongodb.js.html +12 -12
  42. package/coverage/core/api/models/tags.model.mongodb.js.html +22 -22
  43. package/coverage/core/api/models/users.model.mongodb.js.html +20 -20
  44. package/coverage/core/api/oauth2-handler.js.html +18 -18
  45. package/coverage/core/api/oauth2-verifier.js.html +38 -38
  46. package/coverage/core/api/services/account/account.hooks.js.html +16 -16
  47. package/coverage/core/api/services/account/account.service.js.html +104 -104
  48. package/coverage/core/api/services/account/index.html +32 -32
  49. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  50. package/coverage/core/api/services/authorisations/authorisations.service.js.html +156 -132
  51. package/coverage/core/api/services/authorisations/index.html +28 -28
  52. package/coverage/core/api/services/databases/databases.hooks.js.html +9 -9
  53. package/coverage/core/api/services/databases/databases.service.js.html +12 -12
  54. package/coverage/core/api/services/databases/index.html +24 -24
  55. package/coverage/core/api/services/devices/devices.hooks.js.html +9 -9
  56. package/coverage/core/api/services/devices/devices.service.js.html +121 -121
  57. package/coverage/core/api/services/devices/index.html +28 -28
  58. package/coverage/core/api/services/groups/groups.hooks.js.html +9 -9
  59. package/coverage/core/api/services/groups/index.html +13 -13
  60. package/coverage/core/api/services/index.html +21 -21
  61. package/coverage/core/api/services/index.js.html +118 -118
  62. package/coverage/core/api/services/mailer/index.html +24 -24
  63. package/coverage/core/api/services/mailer/mailer.hooks.js.html +9 -9
  64. package/coverage/core/api/services/mailer/mailer.service.js.html +19 -19
  65. package/coverage/core/api/services/organisations/index.html +24 -24
  66. package/coverage/core/api/services/organisations/organisations.hooks.js.html +8 -8
  67. package/coverage/core/api/services/organisations/organisations.service.js.html +67 -67
  68. package/coverage/core/api/services/pusher/index.html +34 -34
  69. package/coverage/core/api/services/pusher/pusher.channels.js.html +8 -8
  70. package/coverage/core/api/services/pusher/pusher.hooks.js.html +10 -10
  71. package/coverage/core/api/services/pusher/pusher.service.js.html +414 -414
  72. package/coverage/core/api/services/storage/index.html +21 -21
  73. package/coverage/core/api/services/storage/storage.hooks.js.html +35 -35
  74. package/coverage/core/api/services/tags/index.html +21 -21
  75. package/coverage/core/api/services/tags/tags.hooks.js.html +25 -25
  76. package/coverage/core/api/services/users/index.html +21 -21
  77. package/coverage/core/api/services/users/users.hooks.js.html +33 -33
  78. package/coverage/core/common/errors.js.html +1 -1
  79. package/coverage/core/common/index.html +42 -27
  80. package/coverage/core/common/index.js.html +16 -16
  81. package/coverage/core/common/permissions.js.html +320 -290
  82. package/coverage/index.html +181 -181
  83. package/coverage/lcov-report/core/api/application.js.html +500 -422
  84. package/coverage/lcov-report/core/api/authentication.js.html +119 -119
  85. package/coverage/lcov-report/core/api/db.js.html +172 -172
  86. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +45 -45
  87. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +71 -71
  88. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +368 -353
  89. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +49 -49
  90. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +37 -37
  91. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +27 -27
  92. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +269 -269
  93. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +190 -190
  94. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
  95. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +277 -211
  96. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +82 -82
  97. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +121 -121
  98. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +232 -232
  99. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +263 -263
  100. package/coverage/lcov-report/core/api/hooks/index.html +172 -172
  101. package/coverage/lcov-report/core/api/hooks/index.js.html +24 -24
  102. package/coverage/lcov-report/core/api/index.html +76 -76
  103. package/coverage/lcov-report/core/api/index.js.html +30 -30
  104. package/coverage/lcov-report/core/api/marshall.js.html +57 -57
  105. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +20 -20
  106. package/coverage/lcov-report/core/api/models/index.html +50 -50
  107. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +12 -12
  108. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +22 -22
  109. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +20 -20
  110. package/coverage/lcov-report/core/api/oauth2-handler.js.html +18 -18
  111. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +38 -38
  112. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +16 -16
  113. package/coverage/lcov-report/core/api/services/account/account.service.js.html +104 -104
  114. package/coverage/lcov-report/core/api/services/account/index.html +32 -32
  115. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  116. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +156 -132
  117. package/coverage/lcov-report/core/api/services/authorisations/index.html +28 -28
  118. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +9 -9
  119. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +12 -12
  120. package/coverage/lcov-report/core/api/services/databases/index.html +24 -24
  121. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +9 -9
  122. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +121 -121
  123. package/coverage/lcov-report/core/api/services/devices/index.html +28 -28
  124. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +9 -9
  125. package/coverage/lcov-report/core/api/services/groups/index.html +13 -13
  126. package/coverage/lcov-report/core/api/services/index.html +21 -21
  127. package/coverage/lcov-report/core/api/services/index.js.html +118 -118
  128. package/coverage/lcov-report/core/api/services/mailer/index.html +24 -24
  129. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +9 -9
  130. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +19 -19
  131. package/coverage/lcov-report/core/api/services/organisations/index.html +24 -24
  132. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +8 -8
  133. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +67 -67
  134. package/coverage/lcov-report/core/api/services/pusher/index.html +34 -34
  135. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +8 -8
  136. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +10 -10
  137. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +414 -414
  138. package/coverage/lcov-report/core/api/services/storage/index.html +21 -21
  139. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +35 -35
  140. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  141. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +25 -25
  142. package/coverage/lcov-report/core/api/services/users/index.html +21 -21
  143. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +33 -33
  144. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  145. package/coverage/lcov-report/core/common/index.html +42 -27
  146. package/coverage/lcov-report/core/common/index.js.html +16 -16
  147. package/coverage/lcov-report/core/common/permissions.js.html +320 -290
  148. package/coverage/lcov-report/index.html +181 -181
  149. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  150. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +25 -7
  151. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  152. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  153. package/coverage/lcov-report/map/api/index.html +1 -1
  154. package/coverage/lcov-report/map/api/index.js.html +1 -1
  155. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  156. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  157. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  158. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +14 -5
  159. package/coverage/lcov-report/map/api/models/index.html +7 -7
  160. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  161. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  162. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  163. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
  164. package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
  165. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  166. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  167. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +1 -1
  168. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  169. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  170. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
  171. package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
  172. package/coverage/lcov-report/map/api/services/index.html +1 -1
  173. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  174. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  175. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  176. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  177. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  178. package/coverage/lcov-report/map/common/index.html +1 -1
  179. package/coverage/lcov-report/map/common/index.js.html +1 -1
  180. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  181. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  182. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  183. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  184. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  185. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  186. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  187. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  188. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  189. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  190. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  191. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  192. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  193. package/coverage/lcov.info +3683 -3825
  194. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  195. package/coverage/map/api/hooks/hooks.query.js.html +25 -7
  196. package/coverage/map/api/hooks/index.html +7 -7
  197. package/coverage/map/api/hooks/index.js.html +1 -1
  198. package/coverage/map/api/index.html +1 -1
  199. package/coverage/map/api/index.js.html +1 -1
  200. package/coverage/map/api/marshall.js.html +1 -1
  201. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  202. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  203. package/coverage/map/api/models/features.model.mongodb.js.html +14 -5
  204. package/coverage/map/api/models/index.html +7 -7
  205. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  206. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  207. package/coverage/map/api/services/alerts/index.html +1 -1
  208. package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
  209. package/coverage/map/api/services/catalog/index.html +1 -1
  210. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  211. package/coverage/map/api/services/daptiles/index.html +1 -1
  212. package/coverage/map/api/services/features/features.hooks.js.html +1 -1
  213. package/coverage/map/api/services/features/index.html +1 -1
  214. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  215. package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
  216. package/coverage/map/api/services/geocoder/index.html +1 -1
  217. package/coverage/map/api/services/index.html +1 -1
  218. package/coverage/map/api/services/index.js.html +1 -1
  219. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  220. package/coverage/map/common/errors.js.html +1 -1
  221. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  222. package/coverage/map/common/grid.js.html +1 -1
  223. package/coverage/map/common/index.html +1 -1
  224. package/coverage/map/common/index.js.html +1 -1
  225. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  226. package/coverage/map/common/moment-utils.js.html +1 -1
  227. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  228. package/coverage/map/common/opendap-utils.js.html +1 -1
  229. package/coverage/map/common/permissions.js.html +1 -1
  230. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  231. package/coverage/map/common/tms-utils.js.html +1 -1
  232. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  233. package/coverage/map/common/wcs-utils.js.html +1 -1
  234. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  235. package/coverage/map/common/wfs-utils.js.html +1 -1
  236. package/coverage/map/common/wms-utils.js.html +1 -1
  237. package/coverage/map/common/wmts-utils.js.html +1 -1
  238. package/extras/tours/map/navigation-bar.js +49 -1
  239. package/lib/core/api/application.js +35 -9
  240. package/lib/core/api/application.js.map +1 -1
  241. package/lib/core/api/hooks/hooks.authorisations.js +8 -1
  242. package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
  243. package/lib/core/api/hooks/hooks.query.js +135 -100
  244. package/lib/core/api/hooks/hooks.query.js.map +1 -1
  245. package/lib/core/api/services/authorisations/authorisations.service.js +13 -1
  246. package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
  247. package/lib/core/api/services/pusher/pusher.service.js +40 -16
  248. package/lib/core/api/services/pusher/pusher.service.js.map +1 -1
  249. package/lib/core/client/components/collection/KColumn.vue +29 -28
  250. package/lib/core/client/components/collection/KFilter.vue +97 -72
  251. package/lib/core/client/components/editor/KModalEditor.vue +3 -4
  252. package/lib/core/client/components/editor/KSettingsEditor.vue +6 -2
  253. package/lib/core/client/components/form/KFileField.vue +14 -36
  254. package/lib/core/client/components/form/KRoleField.vue +5 -2
  255. package/lib/core/client/components/form/KTextField.vue +12 -2
  256. package/lib/core/client/components/form/KUnitField.vue +57 -0
  257. package/lib/core/client/components/form/KUrlField.vue +1 -1
  258. package/lib/core/client/components/frame/KAction.vue +1 -2
  259. package/lib/core/client/components/frame/KModal.vue +66 -20
  260. package/lib/core/client/components/frame/KScrollArea.vue +65 -0
  261. package/lib/core/client/components/frame/index.js +6 -1
  262. package/lib/core/client/components/frame/index.js.map +1 -1
  263. package/lib/core/client/components/input/KColorChooser.vue +3 -5
  264. package/lib/core/client/components/input/KIconChooser.vue +38 -40
  265. package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
  266. package/lib/core/client/components/layout/KAbout.vue +47 -49
  267. package/lib/core/client/components/team/KAddMember.vue +1 -1
  268. package/lib/core/client/components/team/KChangeRole.vue +11 -14
  269. package/lib/core/client/components/team/KGroupCard.vue +12 -5
  270. package/lib/core/client/components/team/KGroupsActivity.vue +1 -1
  271. package/lib/core/client/components/team/KJoinGroup.vue +22 -22
  272. package/lib/core/client/components/team/KMemberCard.vue +19 -4
  273. package/lib/core/client/components/viewer/KModalViewer.vue +10 -9
  274. package/lib/core/client/i18n/core_en.json +72 -8
  275. package/lib/core/client/i18n/core_fr.json +66 -8
  276. package/lib/core/client/index.js +31 -0
  277. package/lib/core/client/index.js.map +1 -1
  278. package/lib/core/client/layout.js +8 -1
  279. package/lib/core/client/layout.js.map +1 -1
  280. package/lib/core/client/mixins/mixin.base-widget.js +5 -3
  281. package/lib/core/client/mixins/mixin.base-widget.js.map +1 -1
  282. package/lib/core/client/reader.js +85 -0
  283. package/lib/core/client/reader.js.map +1 -0
  284. package/lib/core/client/readers/index.js +30 -0
  285. package/lib/core/client/readers/index.js.map +1 -0
  286. package/lib/core/client/readers/reader.csv.js +54 -0
  287. package/lib/core/client/readers/reader.csv.js.map +1 -0
  288. package/lib/core/client/readers/reader.json.js +49 -0
  289. package/lib/core/client/readers/reader.json.js.map +1 -0
  290. package/lib/core/client/services/index.js +14 -3
  291. package/lib/core/client/services/index.js.map +1 -1
  292. package/lib/core/client/services/local-settings.service.js +6 -4
  293. package/lib/core/client/services/local-settings.service.js.map +1 -1
  294. package/lib/core/client/time.js +4 -3
  295. package/lib/core/client/time.js.map +1 -1
  296. package/lib/core/client/units.js +195 -0
  297. package/lib/core/client/units.js.map +1 -0
  298. package/lib/core/common/permissions.js +44 -34
  299. package/lib/core/common/permissions.js.map +1 -1
  300. package/lib/core/common/schemas/settings.update.json +72 -0
  301. package/lib/map/api/hooks/hooks.query.js +7 -2
  302. package/lib/map/api/hooks/hooks.query.js.map +1 -1
  303. package/lib/map/api/models/features.model.mongodb.js +3 -0
  304. package/lib/map/api/models/features.model.mongodb.js.map +1 -1
  305. package/lib/map/client/components/KCaptureToolbar.vue +151 -0
  306. package/lib/map/client/components/KColorLegend.vue +16 -4
  307. package/lib/map/client/components/KFeaturesChart.vue +10 -11
  308. package/lib/map/client/components/KFeaturesFilter.vue +40 -39
  309. package/lib/map/client/components/KFeaturesTable.vue +15 -16
  310. package/lib/map/client/components/KLayerEditionToolbar.vue +19 -11
  311. package/lib/map/client/components/KLayerStyleEditor.vue +3 -2
  312. package/lib/map/client/components/KLayerStyleForm.vue +38 -27
  313. package/lib/map/client/components/KMeasureTool.vue +337 -0
  314. package/lib/map/client/components/KTimeline.vue +5 -9
  315. package/lib/map/client/components/catalog/KAddLayer.vue +3 -2
  316. package/lib/map/client/components/catalog/KCatalog.vue +26 -7
  317. package/lib/map/client/components/catalog/KImportLayer.vue +8 -35
  318. package/lib/map/client/components/catalog/KLayerCategories.vue +3 -2
  319. package/lib/map/client/components/catalog/KLayersSelector.vue +8 -6
  320. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +1 -1
  321. package/lib/map/client/components/widget/KInformationBox.vue +8 -17
  322. package/lib/map/client/components/widget/KMapillaryViewer.vue +5 -1
  323. package/lib/map/client/components/widget/KTimeSeries.vue +92 -9
  324. package/lib/map/client/i18n/map_en.json +51 -20
  325. package/lib/map/client/i18n/map_fr.json +51 -20
  326. package/lib/map/client/init.js +7 -1
  327. package/lib/map/client/init.js.map +1 -1
  328. package/lib/map/client/leaflet/MaskLayer.js +9 -0
  329. package/lib/map/client/leaflet/MaskLayer.js.map +1 -1
  330. package/lib/map/client/mixins/globe/mixin.base-globe.js +3 -5
  331. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  332. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +16 -21
  333. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  334. package/lib/map/client/mixins/globe/mixin.popup.js +7 -1
  335. package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
  336. package/lib/map/client/mixins/globe/mixin.tooltip.js +7 -1
  337. package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
  338. package/lib/map/client/mixins/map/mixin.base-map.js +54 -9
  339. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  340. package/lib/map/client/mixins/map/mixin.canvas-layers.js +2 -0
  341. package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
  342. package/lib/map/client/mixins/map/mixin.file-layers.js +51 -97
  343. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  344. package/lib/map/client/mixins/map/mixin.geojson-layers.js +43 -11
  345. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  346. package/lib/map/client/mixins/map/mixin.popup.js +7 -1
  347. package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
  348. package/lib/map/client/mixins/map/mixin.style.js +1 -1
  349. package/lib/map/client/mixins/map/mixin.style.js.map +1 -1
  350. package/lib/map/client/mixins/map/mixin.tooltip.js +7 -1
  351. package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
  352. package/lib/map/client/mixins/mixin.activity.js +2 -0
  353. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  354. package/lib/map/client/mixins/mixin.context.js +26 -3
  355. package/lib/map/client/mixins/mixin.context.js.map +1 -1
  356. package/lib/map/client/mixins/mixin.feature-service.js +3 -3
  357. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  358. package/lib/map/client/mixins/mixin.infobox.js +4 -0
  359. package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
  360. package/lib/map/client/mixins/mixin.weacast.js +7 -5
  361. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  362. package/lib/map/client/readers/index.js +54 -0
  363. package/lib/map/client/readers/index.js.map +1 -0
  364. package/lib/map/client/readers/reader.geojson.js +87 -0
  365. package/lib/map/client/readers/reader.geojson.js.map +1 -0
  366. package/lib/map/client/readers/reader.gpx.js +52 -0
  367. package/lib/map/client/readers/reader.gpx.js.map +1 -0
  368. package/lib/map/client/readers/reader.kml.js +52 -0
  369. package/lib/map/client/readers/reader.kml.js.map +1 -0
  370. package/lib/map/client/readers/reader.shp.js +116 -0
  371. package/lib/map/client/readers/reader.shp.js.map +1 -0
  372. package/lib/map/client/utils.js +0 -7
  373. package/lib/map/client/utils.js.map +1 -1
  374. package/lib/test/client/core/account.js +1 -1
  375. package/lib/test/client/core/account.js.map +1 -1
  376. package/lib/test/client/core/runner.js +1 -2
  377. package/lib/test/client/core/runner.js.map +1 -1
  378. package/lib/test/client/core/screens.js +1 -1
  379. package/lib/test/client/core/screens.js.map +1 -1
  380. package/lib/test/client/core/utils.js +2 -2
  381. package/lib/test/client/core/utils.js.map +1 -1
  382. package/lib/test/client/map/catalog.js +50 -49
  383. package/lib/test/client/map/catalog.js.map +1 -1
  384. package/package.json +3 -3
  385. package/.nyc_output/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
  386. package/.nyc_output/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
  387. package/.nyc_output/processinfo/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
  388. package/.nyc_output/processinfo/2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json +0 -1
  389. package/.nyc_output/processinfo/81d21e46-766a-46bc-b1b7-143ca577347a.json +0 -1
  390. package/.nyc_output/processinfo/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
  391. package/.nyc_output/processinfo/aaf3ebbb-f895-4d7b-9255-bc5dee832570.json +0 -1
  392. package/.nyc_output/processinfo/dbeb2602-0ac2-4e66-978b-0d29548359ca.json +0 -1
  393. package/.nyc_output/processinfo/e47d1e4c-2fff-4dcb-908f-d3081162547c.json +0 -1
  394. package/extras/testcafe/Dockerfile +0 -48
  395. package/extras/testcafe/docker-entrypoint.sh +0 -27
  396. package/extras/testcafe/page-models/core/account.js +0 -75
  397. package/extras/testcafe/page-models/core/base-collection.js +0 -41
  398. package/extras/testcafe/page-models/core/base-page.js +0 -25
  399. package/extras/testcafe/page-models/core/groups.js +0 -36
  400. package/extras/testcafe/page-models/core/index.js +0 -140
  401. package/extras/testcafe/page-models/core/layout.js +0 -145
  402. package/extras/testcafe/page-models/core/members.js +0 -98
  403. package/extras/testcafe/page-models/core/organisations.js +0 -76
  404. package/extras/testcafe/page-models/core/screens.js +0 -99
  405. package/extras/testcafe/page-models/core/tags.js +0 -21
  406. package/extras/testcafe/page-models/map/add-layer.js +0 -51
  407. package/extras/testcafe/page-models/map/catalog.js +0 -132
  408. package/extras/testcafe/page-models/map/index.js +0 -36
  409. package/extras/testcafe/page-models/map/map-activity.js +0 -42
  410. package/extras/testcafe/page-models/map/timeline.js +0 -67
@@ -805,7 +805,7 @@ export class OpenDAPGrid extends BaseGrid {
805
805
  <div class='footer quiet pad2 space-top1 center small'>
806
806
  Code coverage generated by
807
807
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
808
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
808
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
809
809
  </div>
810
810
  </div>
811
811
  <script src="../../prettify.js"></script>
@@ -97,7 +97,7 @@ export function <span class="fstat-no" title="function not covered" >defineUserA
97
97
  <div class='footer quiet pad2 space-top1 center small'>
98
98
  Code coverage generated by
99
99
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
100
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
100
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
101
101
  </div>
102
102
  </div>
103
103
  <script src="../../prettify.js"></script>
@@ -388,7 +388,7 @@ export class TimeBasedGridSource extends DynamicGridSource {
388
388
  <div class='footer quiet pad2 space-top1 center small'>
389
389
  Code coverage generated by
390
390
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
391
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
391
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
392
392
  </div>
393
393
  </div>
394
394
  <script src="../../prettify.js"></script>
@@ -247,7 +247,7 @@ export async function <span class="fstat-no" title="function not covered" >disco
247
247
  <div class='footer quiet pad2 space-top1 center small'>
248
248
  Code coverage generated by
249
249
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
250
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
250
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
251
251
  </div>
252
252
  </div>
253
253
  <script src="../../prettify.js"></script>
@@ -343,7 +343,7 @@ export class WcsGridSource extends GridSource {
343
343
  <div class='footer quiet pad2 space-top1 center small'>
344
344
  Code coverage generated by
345
345
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
346
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
346
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
347
347
  </div>
348
348
  </div>
349
349
  <script src="../../prettify.js"></script>
@@ -565,7 +565,7 @@ export function GetCoverageSpatialBounds (coverage) {
565
565
  <div class='footer quiet pad2 space-top1 center small'>
566
566
  Code coverage generated by
567
567
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
568
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
568
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
569
569
  </div>
570
570
  </div>
571
571
  <script src="../../prettify.js"></script>
@@ -1012,7 +1012,7 @@ export class WeacastGridSource extends GridSource {
1012
1012
  <div class='footer quiet pad2 space-top1 center small'>
1013
1013
  Code coverage generated by
1014
1014
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1015
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
1015
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
1016
1016
  </div>
1017
1017
  </div>
1018
1018
  <script src="../../prettify.js"></script>
@@ -550,7 +550,7 @@ export function <span class="fstat-no" title="function not covered" >generatePro
550
550
  <div class='footer quiet pad2 space-top1 center small'>
551
551
  Code coverage generated by
552
552
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
553
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
553
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
554
554
  </div>
555
555
  </div>
556
556
  <script src="../../prettify.js"></script>
@@ -412,7 +412,7 @@ export async function <span class="fstat-no" title="function not covered" >disco
412
412
  <div class='footer quiet pad2 space-top1 center small'>
413
413
  Code coverage generated by
414
414
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
415
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
415
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
416
416
  </div>
417
417
  </div>
418
418
  <script src="../../prettify.js"></script>
@@ -526,7 +526,7 @@ export function <span class="fstat-no" title="function not covered" >buildLeafle
526
526
  <div class='footer quiet pad2 space-top1 center small'>
527
527
  Code coverage generated by
528
528
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
529
- at Wed Dec 08 2021 20:41:51 GMT+0100 (GMT+01:00)
529
+ at Thu Feb 17 2022 13:49:01 GMT+0100 (GMT+01:00)
530
530
  </div>
531
531
  </div>
532
532
  <script src="../../prettify.js"></script>
@@ -69,7 +69,8 @@ module.exports = [{
69
69
  title: 'tours.navigation-bar.TOOLS_LABEL',
70
70
  params: {
71
71
  placement: 'bottom',
72
- clickOnNext: '#tools',
72
+ clickOn: '#tools',
73
+ clickDelay: 500,
73
74
  nextDelay: 500
74
75
  }
75
76
  }, {
@@ -103,6 +104,53 @@ module.exports = [{
103
104
  nextDelay: 500
104
105
  }
105
106
  }, {
107
+ target: '#tools',
108
+ title: 'tours.navigation-bar.TOOLS_LABEL',
109
+ params: {
110
+ placement: 'bottom',
111
+ clickOn: '#tools',
112
+ clickDelay: 500,
113
+ nextDelay: 500
114
+ }
115
+ }, {
116
+ target: '#measure-tool',
117
+ title: 'tours.navigation-bar.MEASURE_LABEL',
118
+ params: {
119
+ placement: 'bottom',
120
+ clickOnNext: '#measure-tool',
121
+ nextDelay: 500
122
+ }
123
+ }, {
124
+ target: '#measure-distance',
125
+ title: 'tours.navigation-bar.MEASURE_DISTANCE_LABEL',
126
+ content: 'tours.navigation-bar.MEASURE_DISTANCE_DETAILS_LABEL',
127
+ params: {
128
+ placement: 'bottom',
129
+ clickOnPrevious: '#back',
130
+ previousDelay: 500
131
+ }
132
+ }, {
133
+ target: '#measure-area',
134
+ title: 'tours.navigation-bar.MEASURE_AREA_LABEL',
135
+ content: 'tours.navigation-bar.MEASURE_AREA_DETAILS_LABEL',
136
+ params: {
137
+ placement: 'bottom'
138
+ }
139
+ }, {
140
+ target: '#clear-measurements',
141
+ title: 'tours.navigation-bar.CLEAR_MEASURE_LABEL',
142
+ params: {
143
+ placement: 'bottom'
144
+ }
145
+ }, {
146
+ target: '#back',
147
+ title: 'tours.navigation-bar.MEASURE_BACK_LABEL',
148
+ params: {
149
+ placement: 'bottom',
150
+ clickOnNext: '#back',
151
+ nextDelay: 500
152
+ }
153
+ }, , {
106
154
  target: '#toggle-vr',
107
155
  title: 'tours.navigation-bar.TOGGLE_VR_LABEL',
108
156
  params: {
@@ -324,31 +324,57 @@ function createWebhook(path, app, options = {}) {
324
324
  var _ref = _asyncToGenerator(function* (req, res, next) {
325
325
  const payload = req.body;
326
326
  const config = app.get('authentication');
327
- res.set('Content-Type', 'application/json');
327
+ res.set('content-type', 'application/json');
328
328
  const params = {};
329
329
  try {
330
+ if (options.preprocessor) {
331
+ yield options.preprocessor(req, res, payload);
332
+ }
330
333
  // Authenticate when required
331
334
  if (config) {
332
335
  try {
333
- const tokenPayload = yield app.passport.verifyJWT(payload.accessToken, config);
334
- if (tokenPayload.userId) {
335
- params.user = yield app.getService('users').get(tokenPayload.userId);
336
- params.checkAuthorisation = true;
336
+ // Token is in header or payload
337
+ const header = req.headers.authorization;
338
+ let accessToken;
339
+ if (header) {
340
+ // Should be of the form: 'Bearer xxx'
341
+ const tokens = header.match(/(\S+)\s+(\S+)/);
342
+ if (tokens.length >= 2) accessToken = tokens[2];
343
+ } else {
344
+ accessToken = payload.accessToken;
337
345
  }
346
+ const tokenPayload = yield app.passport.verifyJWT(accessToken, config);
347
+ params.user = yield app.getService('users').get(tokenPayload.userId);
348
+ params.checkAuthorisation = true;
338
349
  } catch (error) {
339
350
  throw new _errors.Forbidden('Could not verify webhook');
340
351
  }
341
352
  }
342
- if (!isAllowed(payload)) throw new _errors.Forbidden('Service not allowed for webhook');
353
+ if (req.headers['content-type'] !== 'application/json') {
354
+ throw new _errors.BadRequest('Webhooks expect application/json content type');
355
+ }
356
+ if (!isAllowed(payload)) throw new _errors.Forbidden('Service or operation not allowed for webhook');
343
357
  const service = app.getService(payload.service, options.context || payload.context);
344
358
  if (!service) throw new _errors.BadRequest('Service could not be found');
359
+ if (typeof service[payload.operation] !== 'function') throw new _errors.BadRequest('Service operation could not be found');
345
360
  const args = [];
346
- // Update/Patch/Remove
347
- if (_lodash2.default.has(payload, 'id')) args.push(_lodash2.default.get(payload, 'id'));
361
+ // Get/Update/Patch/Remove
362
+ const operationsWithId = ['get', 'update', 'patch', 'remove'];
363
+ if (operationsWithId.includes(payload.operation)) {
364
+ if (!_lodash2.default.has(payload, 'id')) throw new _errors.BadRequest('Missing id for operation');
365
+ args.push(_lodash2.default.get(payload, 'id'));
366
+ }
348
367
  // Create/Update/Patch
349
- if (_lodash2.default.has(payload, 'data')) args.push(_lodash2.default.get(payload, 'data'));
368
+ const operationsWithData = ['create', 'update', 'patch'];
369
+ if (operationsWithData.includes(payload.operation)) {
370
+ if (!_lodash2.default.has(payload, 'data')) throw new _errors.BadRequest('Missing data for operation');
371
+ args.push(_lodash2.default.get(payload, 'data'));
372
+ }
350
373
  // Params
351
374
  args.push(params);
375
+ if (options.postprocessor) {
376
+ yield options.postprocessor(service, args, payload);
377
+ }
352
378
  try {
353
379
  const result = yield service[payload.operation].apply(service, args);
354
380
  // Send back result
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../core/api/application.js"],"names":["declareService","configureService","createProxyService","createService","createWebhook","kalisio","debug","debugLimiter","tooManyRequests","socket","message","key","error","TooManyRequests","translation","emit","setTimeout","disconnect","path","app","service","middlewares","feathersPath","get","feathersService","args","before","concat","push","after","use","apply","name","servicesPath","hooks","require","join","code","channels","_","forOwn","publisher","event","publish","options","targetService","proxyParams","params","proxiedParams","merge","proxyId","id","proxyData","data","proxyResult","result","find","create","update","patch","remove","createFeathersService","db","adapter","paginate","serviceOptions","Object","assign","disabled","undefined","fileName","dbService","modelsPath","configureModel","proxy","events","servicePath","contextId","context","serviceMixin","bind","mixin","getPath","withApiPrefix","getContextId","webhookPath","isAllowed","payload","filter","length","post","req","res","next","body","config","set","tokenPayload","passport","verifyJWT","accessToken","userId","user","getService","checkAuthorisation","Forbidden","BadRequest","has","operation","json","status","toJSON","setupLogger","logsConfig","logger","clear","console","logsTypes","getOwnPropertyNames","forEach","logType","level","process","env","NODE_ENV","add","transports","setupSockets","apiLimiter","connections","nbConnections","io","sockets","setMaxListeners","maxConnections","maxIpConnections","on","pid","conn","remoteAddress","reason","nbIpConnections","websocket","tokensPerInterval","interval","services","socketLimiter","SocketLimiter","packet","getTokensRemaining","tryRemoveTokens","configure","getServiceOptions","ObjectID","isValid","toString","_id","fn","call","http","handler","serviceUrl","url","URL","originalUrl","pathname","method","HttpLimiter","bodyParserConfig","bodyParser","urlencoded","extended","socketioConfig","auth","Database"],"mappings":"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","file":"application.js","sourcesContent":["import path from 'path'\r\nimport url from 'url'\r\nimport makeDebug from 'debug'\r\nimport logger from 'winston'\r\nimport _ from 'lodash'\r\nimport sift from 'sift'\r\nimport 'winston-daily-rotate-file'\r\nimport compress from 'compression'\r\nimport cors from 'cors'\r\nimport helmet from 'helmet'\r\nimport bodyParser from 'body-parser'\r\nimport { RateLimiter as SocketLimiter } from 'limiter'\r\nimport HttpLimiter from 'express-rate-limit'\r\nimport feathers from '@feathersjs/feathers'\r\nimport configuration from '@feathersjs/configuration'\r\nimport { TooManyRequests, Forbidden, BadRequest } from '@feathersjs/errors'\r\nimport express from '@feathersjs/express'\r\nimport rest from '@feathersjs/express/rest'\r\nimport socketio from '@feathersjs/socketio'\r\nimport { ObjectID } from 'mongodb'\r\nimport { Database, idToString } from './db'\r\nimport auth, { authSocket } from './authentication'\r\n\r\nconst debug = makeDebug('kdk:core:application')\r\nconst debugLimiter = makeDebug('kdk:core:application:limiter')\r\n\r\nfunction tooManyRequests (socket, message, key) {\r\n debug(message)\r\n const error = new TooManyRequests(message, { translation: { key } })\r\n socket.emit('rate-limit', error)\r\n // Add a timeout so that error message is correctly handled\r\n setTimeout(() => socket.disconnect(true), 3000)\r\n}\r\n\r\nexport function declareService (path, app, service, middlewares = {}) {\r\n const feathersPath = app.get('apiPath') + '/' + path\r\n const feathersService = app.service(feathersPath)\r\n // Some internal Feathers service might internally declare the service\r\n if (feathersService) {\r\n return feathersService\r\n }\r\n // Initialize our service by providing any middleware as well\r\n let args = [feathersPath]\r\n if (middlewares.before) args = args.concat(middlewares.before)\r\n args.push(service)\r\n if (middlewares.after) args = args.concat(middlewares.after)\r\n app.use.apply(app, args)\r\n debug('Service declared on path ' + feathersPath)\r\n // Return the Feathers service, ie base service + Feathers' internals\r\n return app.service(feathersPath)\r\n}\r\n\r\nexport function configureService (name, service, servicesPath) {\r\n try {\r\n const hooks = require(path.join(servicesPath, name, name + '.hooks'))\r\n service.hooks(hooks)\r\n debug(name + ' service hooks configured on path ' + servicesPath)\r\n } catch (error) {\r\n debug('No ' + name + ' service hooks configured on path ' + servicesPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n\r\n try {\r\n const channels = require(path.join(servicesPath, name, name + '.channels'))\r\n _.forOwn(channels, (publisher, event) => {\r\n if (event === 'all') service.publish(publisher)\r\n else service.publish(event, publisher)\r\n })\r\n debug(name + ' service channels configured on path ' + servicesPath)\r\n } catch (error) {\r\n debug('No ' + name + ' service channels configured on path ' + servicesPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n\r\n return service\r\n}\r\n\r\nexport function createProxyService (options) {\r\n const targetService = options.service\r\n function proxyParams (params) {\r\n if (options.params) {\r\n let proxiedParams\r\n if (typeof options.params === 'function') {\r\n proxiedParams = options.params(params)\r\n } else {\r\n proxiedParams = _.merge(params, options.params)\r\n }\r\n return proxiedParams\r\n } else return params\r\n }\r\n function proxyId (id) {\r\n if (options.id) return options.id(id)\r\n else return id\r\n }\r\n function proxyData (data) {\r\n if (options.data) return options.data(data)\r\n else return data\r\n }\r\n function proxyResult (data) {\r\n if (options.result) return options.result(data)\r\n else return data\r\n }\r\n return {\r\n async find (params) { return proxyResult(await targetService.find(proxyParams(params))) },\r\n async get (id, params) { return proxyResult(await targetService.get(proxyId(id), proxyParams(params))) },\r\n async create (data, params) { return proxyResult(await targetService.create(proxyData(data), proxyParams(params))) },\r\n async update (id, data, params) { return proxyResult(await targetService.update(proxyId(id), proxyData(data), proxyParams(params))) },\r\n async patch (id, data, params) { return proxyResult(await targetService.patch(proxyId(id), proxyData(data), proxyParams(params))) },\r\n async remove (id, params) { return proxyResult(await targetService.remove(proxyId(id), proxyParams(params))) }\r\n }\r\n}\r\n\r\nexport function createService (name, app, options = {}) {\r\n const createFeathersService = require('feathers-' + app.db.adapter)\r\n\r\n const paginate = app.get('paginate')\r\n const serviceOptions = Object.assign({\r\n name: name,\r\n paginate\r\n }, options)\r\n if (serviceOptions.disabled) return undefined\r\n // For DB services a model has to be provided\r\n const fileName = serviceOptions.fileName || name\r\n\r\n let dbService = false\r\n try {\r\n if (serviceOptions.modelsPath) {\r\n const configureModel = require(path.join(serviceOptions.modelsPath, fileName + '.model.' + app.db.adapter))\r\n configureModel(app, serviceOptions)\r\n dbService = true\r\n }\r\n } catch (error) {\r\n debug('No ' + fileName + ' service model configured on path ' + serviceOptions.modelsPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n\r\n // Initialize our service with any options it requires\r\n let service\r\n if (dbService) {\r\n service = createFeathersService(serviceOptions)\r\n dbService = service\r\n } else if (serviceOptions.proxy) {\r\n service = createProxyService(serviceOptions.proxy)\r\n } else {\r\n // Otherwise we expect the service to be provided as a Feathers service interface\r\n service = require(path.join(serviceOptions.servicesPath, fileName, fileName + '.service'))\r\n // If we get a function try to call it assuming it will return the service object\r\n if (typeof service === 'function') {\r\n service = service(name, app, serviceOptions)\r\n }\r\n // Need to set this manually for services not using class inheritance or default adapters\r\n if (serviceOptions.events) service.events = serviceOptions.events\r\n }\r\n\r\n // Get our initialized service so that we can register hooks and filters\r\n let servicePath = serviceOptions.path || name\r\n let contextId\r\n if (serviceOptions.context) {\r\n contextId = idToString(serviceOptions.context)\r\n servicePath = contextId + '/' + servicePath\r\n }\r\n service = declareService(servicePath, app, service, serviceOptions.middlewares)\r\n // Register hooks and event filters\r\n service = configureService(fileName, service, serviceOptions.servicesPath)\r\n // Optionnally a specific service mixin can be provided, apply it\r\n if (dbService && serviceOptions.servicesPath) {\r\n try {\r\n let serviceMixin = require(path.join(serviceOptions.servicesPath, fileName, fileName + '.service'))\r\n // If we get a function try to call it assuming it will return the mixin object\r\n if (typeof serviceMixin === 'function') {\r\n serviceMixin = serviceMixin.bind(dbService)(fileName, app, serviceOptions)\r\n }\r\n service.mixin(serviceMixin)\r\n } catch (error) {\r\n debug('No ' + fileName + ' service mixin configured on path ' + serviceOptions.servicesPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n }\r\n // Then configuration\r\n service.name = name\r\n service.app = app\r\n service.options = serviceOptions\r\n service.path = servicePath\r\n service.context = serviceOptions.context\r\n\r\n // Add some utility functions\r\n service.getPath = function (withApiPrefix) {\r\n let path = service.path\r\n if (withApiPrefix) {\r\n path = app.get('apiPath') + '/' + path\r\n }\r\n return path\r\n }\r\n service.getContextId = function () {\r\n return contextId // As string\r\n }\r\n\r\n debug(service.name + ' service registration completed')\r\n app.emit('service', service)\r\n\r\n return service\r\n}\r\n\r\nexport function createWebhook (path, app, options = {}) {\r\n let webhookPath = path\r\n if (options.context) {\r\n webhookPath = idToString(options.context) + '/' + webhookPath\r\n }\r\n const isAllowed = (payload) => {\r\n // Default is to expose all services/operations\r\n if (!options.filter) return true\r\n const result = [payload].filter(sift(options.filter))\r\n return result.length > 0\r\n }\r\n\r\n app.post(app.get('apiPath') + '/webhooks/' + webhookPath, async (req, res, next) => {\r\n const payload = req.body\r\n const config = app.get('authentication')\r\n res.set('Content-Type', 'application/json')\r\n const params = {}\r\n try {\r\n // Authenticate when required\r\n if (config) {\r\n try {\r\n const tokenPayload = await app.passport.verifyJWT(payload.accessToken, config)\r\n if (tokenPayload.userId) {\r\n params.user = await app.getService('users').get(tokenPayload.userId)\r\n params.checkAuthorisation = true\r\n }\r\n } catch (error) {\r\n throw new Forbidden('Could not verify webhook')\r\n }\r\n }\r\n if (!isAllowed(payload)) throw new Forbidden('Service not allowed for webhook')\r\n const service = app.getService(payload.service, options.context || payload.context)\r\n if (!service) throw new BadRequest('Service could not be found')\r\n const args = []\r\n // Update/Patch/Remove\r\n if (_.has(payload, 'id')) args.push(_.get(payload, 'id'))\r\n // Create/Update/Patch\r\n if (_.has(payload, 'data')) args.push(_.get(payload, 'data'))\r\n // Params\r\n args.push(params)\r\n try {\r\n const result = await service[payload.operation].apply(service, args)\r\n // Send back result\r\n res.json(result)\r\n } catch (error) {\r\n throw new BadRequest('Service operation could not be performed')\r\n }\r\n } catch (error) {\r\n // Send back error\r\n res.status(error.code).json(error.toJSON())\r\n }\r\n })\r\n\r\n debug(`Webhook ${webhookPath} registration completed`)\r\n}\r\n\r\nfunction setupLogger (app) {\r\n debug('Setup application loggers')\r\n const logsConfig = app.get('logs')\r\n // Use winston default logger\r\n app.logger = logger\r\n // Remove winston defaults\r\n try {\r\n logger.clear()\r\n } catch (error) {\r\n // Logger might be down, use console\r\n console.error('Could not remove default logger transport(s)', error)\r\n }\r\n // We have one entry per log type\r\n const logsTypes = logsConfig ? Object.getOwnPropertyNames(logsConfig) : []\r\n // Create corresponding winston transports with options\r\n logsTypes.forEach(logType => {\r\n const options = logsConfig[logType]\r\n // Setup default log level if not defined\r\n if (!options.level) {\r\n options.level = (process.env.NODE_ENV === 'development' ? 'debug' : 'info')\r\n }\r\n try {\r\n logger.add(new logger.transports[logType](options))\r\n } catch (error) {\r\n // Logger might be down, use console\r\n console.error('Could not setup default log levels', error)\r\n }\r\n })\r\n}\r\n\r\nfunction setupSockets (app) {\r\n const apiLimiter = app.get('apiLimiter')\r\n const connections = {}\r\n let nbConnections = 0\r\n\r\n return io => {\r\n // By default EventEmitters will print a warning if more than 10 listeners are added for a particular event.\r\n // The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.\r\n io.sockets.setMaxListeners(0)\r\n const maxConnections = _.get(apiLimiter, 'websocket.maxConcurrency', 0)\r\n const maxIpConnections = _.get(apiLimiter, 'websocket.concurrency', 0)\r\n\r\n io.on('connection', socket => {\r\n nbConnections++\r\n debug(`New socket connection on server with pid ${process.pid}`, socket.id, socket.conn.remoteAddress, nbConnections)\r\n // Setup disconnect handler first\r\n socket.on('disconnect', (reason) => {\r\n nbConnections--\r\n debug(reason)\r\n debug(`Socket disconnection on server with pid ${process.pid}`, socket.id, socket.conn.remoteAddress, nbConnections)\r\n if (maxIpConnections > 0) {\r\n const nbIpConnections = _.get(connections, socket.conn.remoteAddress) - 1\r\n debug('Total number of connections for', socket.id, socket.conn.remoteAddress, nbIpConnections)\r\n _.set(connections, socket.conn.remoteAddress, nbIpConnections)\r\n }\r\n })\r\n if (maxConnections > 0) {\r\n if (nbConnections > maxConnections) {\r\n tooManyRequests(socket, 'Too many concurrent connections (rate limiting)', 'RATE_LIMITING_CONCURRENCY')\r\n return\r\n }\r\n }\r\n if (maxIpConnections > 0) {\r\n if (_.has(connections, socket.conn.remoteAddress)) {\r\n const nbIpConnections = _.get(connections, socket.conn.remoteAddress) + 1\r\n debug('Total number of connections for', socket.id, socket.conn.remoteAddress, nbConnections)\r\n _.set(connections, socket.conn.remoteAddress, nbIpConnections)\r\n if (nbIpConnections > maxIpConnections) {\r\n tooManyRequests(socket, 'Too many concurrent connections (rate limiting)', 'RATE_LIMITING_CONCURRENCY')\r\n return\r\n }\r\n } else {\r\n _.set(connections, socket.conn.remoteAddress, 1)\r\n }\r\n }\r\n /* For debug purpose: trace all data received\r\n socket.use((packet, next) => {\r\n console.log(packet)\r\n next()\r\n })\r\n */\r\n if (apiLimiter && apiLimiter.websocket) {\r\n const { tokensPerInterval, interval } = apiLimiter.websocket\r\n // Function used to filter whitelisted services, defaults to none\r\n const services = _.get(apiLimiter.websocket, 'services', (service) => false)\r\n socket.socketLimiter = new SocketLimiter(tokensPerInterval, interval)\r\n socket.use((packet, next) => {\r\n if (packet.length > 0) {\r\n // Packets are formatted according to service interface,\r\n // e.g. like [service_method, service_path, id or data, params]\r\n // Bypass rate limiting on whitelist\r\n if ((packet.length > 1) && (typeof packet[1] === 'string')) {\r\n const service = app.service(packet[1])\r\n if (service && services(service)) {\r\n debugLimiter('By-pass rate limiting on whitelisted service operation', socket.id, socket.conn.remoteAddress, packet[0], packet[1])\r\n next()\r\n return\r\n }\r\n }\r\n debugLimiter(socket.socketLimiter.getTokensRemaining() + ' remaining API token for socket', socket.id, socket.conn.remoteAddress)\r\n if (!socket.socketLimiter.tryRemoveTokens(1)) { // if exceeded\r\n tooManyRequests(socket, 'Too many requests in a given amount of time (rate limiting)', 'RATE_LIMITING')\r\n // FIXME: calling this causes a client timeout\r\n // next(error)\r\n // Need to normalize the error object as JSON\r\n // let result = {}\r\n // Object.getOwnPropertyNames(error).forEach(key => (result[key] = error[key]))\r\n // Trying to send error like in https://github.com/feathersjs/transport-commons/blob/auk/src/events.js#L103\r\n // does not work either (also generates a client timeout)\r\n // socket.emit(`${servicePath} error`, result)\r\n // socket.emit(result)\r\n return\r\n }\r\n }\r\n next()\r\n })\r\n }\r\n\r\n authSocket(app, socket)\r\n })\r\n }\r\n}\r\n\r\nexport function kalisio () {\r\n const app = express(feathers())\r\n // By default EventEmitters will print a warning if more than 10 listeners are added for a particular event.\r\n // The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.\r\n app.setMaxListeners(0)\r\n // Load app configuration first\r\n app.configure(configuration())\r\n // Then setup logger\r\n setupLogger(app)\r\n\r\n // This retrieve corresponding service options from app config if any\r\n app.getServiceOptions = function (name) {\r\n const services = app.get('services')\r\n if (!services) return {}\r\n return _.get(services, name, {})\r\n }\r\n // This avoid managing the API path before each service name\r\n app.getService = function (path, context) {\r\n // Context is given as string ID\r\n if (context && typeof context === 'string') {\r\n return app.service(app.get('apiPath') + '/' + context + '/' + path)\r\n } else if (context && typeof context === 'object') {\r\n // Could be Object ID or raw object\r\n if (ObjectID.isValid(context)) return app.service(app.get('apiPath') + '/' + context.toString() + '/' + path)\r\n else return app.service(app.get('apiPath') + '/' + context._id.toString() + '/' + path)\r\n } else {\r\n return app.service(app.get('apiPath') + '/' + path)\r\n }\r\n }\r\n // This is used to add hooks/filters to services\r\n app.configureService = function (name, service, servicesPath) {\r\n return configureService(name, service, servicesPath)\r\n }\r\n // This is used to create standard services\r\n app.createService = function (name, options) {\r\n return createService(name, app, options)\r\n }\r\n // This is used to create webhooks\r\n app.createWebhook = function (path, options) {\r\n return createWebhook(path, app, options)\r\n }\r\n // Override Feathers configure that do not manage async operations,\r\n // here we also simply call the function given as parameter but await for it\r\n app.configure = async function (fn) {\r\n await fn.call(this, this)\r\n return this\r\n }\r\n const apiLimiter = app.get('apiLimiter')\r\n if (apiLimiter && apiLimiter.http) {\r\n // Function used to filter whitelisted services, defaults to none\r\n const services = _.get(apiLimiter.http, 'services', (service) => false)\r\n const handler = (req, res, next) => {\r\n // Bypass rate limiting on whitelist\r\n let service\r\n try {\r\n const serviceUrl = new url.URL(req.originalUrl)\r\n service = app.service(serviceUrl.pathname)\r\n } catch (error) {\r\n debugLimiter(error)\r\n }\r\n if (service && services(service)) {\r\n debugLimiter('By-pass rate limiting on whitelisted service operation', req.method, path)\r\n next()\r\n } else {\r\n const error = new TooManyRequests('Too many requests in a given amount of time (rate limiting)',\r\n { translation: { key: 'RATE_LIMITING' } })\r\n res.status(error.code)\r\n res.set('Content-Type', 'application/json')\r\n res.json(Object.assign({}, error.toJSON()))\r\n }\r\n }\r\n app.use(app.get('apiPath'), new HttpLimiter(Object.assign({ handler }, apiLimiter.http)))\r\n }\r\n\r\n // Enable CORS, security, compression, and body parsing\r\n app.use(cors(app.get('cors')))\r\n app.use(helmet(app.get('helmet')))\r\n app.use(compress(app.get('compression')))\r\n const bodyParserConfig = app.get('bodyParser')\r\n app.use(bodyParser.json(_.get(bodyParserConfig, 'json')))\r\n app.use(bodyParser.urlencoded(Object.assign({ extended: true }, _.get(bodyParserConfig, 'urlencoded'))))\r\n\r\n // Set up plugins and providers\r\n app.configure(rest())\r\n const socketioConfig = app.get('socketio') || {}\r\n app.configure(socketio(Object.assign({ path: app.get('apiPath') + 'ws' }, socketioConfig), setupSockets(app)))\r\n app.configure(auth)\r\n\r\n // Initialize DB\r\n app.db = Database.create(app)\r\n\r\n return app\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../core/api/application.js"],"names":["declareService","configureService","createProxyService","createService","createWebhook","kalisio","debug","debugLimiter","tooManyRequests","socket","message","key","error","TooManyRequests","translation","emit","setTimeout","disconnect","path","app","service","middlewares","feathersPath","get","feathersService","args","before","concat","push","after","use","apply","name","servicesPath","hooks","require","join","code","channels","_","forOwn","publisher","event","publish","options","targetService","proxyParams","params","proxiedParams","merge","proxyId","id","proxyData","data","proxyResult","result","find","create","update","patch","remove","createFeathersService","db","adapter","paginate","serviceOptions","Object","assign","disabled","undefined","fileName","dbService","modelsPath","configureModel","proxy","events","servicePath","contextId","context","serviceMixin","bind","mixin","getPath","withApiPrefix","getContextId","webhookPath","isAllowed","payload","filter","length","post","req","res","next","body","config","set","preprocessor","header","headers","authorization","accessToken","tokens","match","tokenPayload","passport","verifyJWT","user","getService","userId","checkAuthorisation","Forbidden","BadRequest","operation","operationsWithId","includes","has","operationsWithData","postprocessor","json","status","toJSON","setupLogger","logsConfig","logger","clear","console","logsTypes","getOwnPropertyNames","forEach","logType","level","process","env","NODE_ENV","add","transports","setupSockets","apiLimiter","connections","nbConnections","io","sockets","setMaxListeners","maxConnections","maxIpConnections","on","pid","conn","remoteAddress","reason","nbIpConnections","websocket","tokensPerInterval","interval","services","socketLimiter","SocketLimiter","packet","getTokensRemaining","tryRemoveTokens","configure","getServiceOptions","ObjectID","isValid","toString","_id","fn","call","http","handler","serviceUrl","url","URL","originalUrl","pathname","method","HttpLimiter","bodyParserConfig","bodyParser","urlencoded","extended","socketioConfig","auth","Database"],"mappings":"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","file":"application.js","sourcesContent":["import path from 'path'\r\nimport url from 'url'\r\nimport makeDebug from 'debug'\r\nimport logger from 'winston'\r\nimport _ from 'lodash'\r\nimport sift from 'sift'\r\nimport 'winston-daily-rotate-file'\r\nimport compress from 'compression'\r\nimport cors from 'cors'\r\nimport helmet from 'helmet'\r\nimport bodyParser from 'body-parser'\r\nimport { RateLimiter as SocketLimiter } from 'limiter'\r\nimport HttpLimiter from 'express-rate-limit'\r\nimport feathers from '@feathersjs/feathers'\r\nimport configuration from '@feathersjs/configuration'\r\nimport { TooManyRequests, Forbidden, BadRequest } from '@feathersjs/errors'\r\nimport express from '@feathersjs/express'\r\nimport rest from '@feathersjs/express/rest'\r\nimport socketio from '@feathersjs/socketio'\r\nimport { ObjectID } from 'mongodb'\r\nimport { Database, idToString } from './db'\r\nimport auth, { authSocket } from './authentication'\r\n\r\nconst debug = makeDebug('kdk:core:application')\r\nconst debugLimiter = makeDebug('kdk:core:application:limiter')\r\n\r\nfunction tooManyRequests (socket, message, key) {\r\n debug(message)\r\n const error = new TooManyRequests(message, { translation: { key } })\r\n socket.emit('rate-limit', error)\r\n // Add a timeout so that error message is correctly handled\r\n setTimeout(() => socket.disconnect(true), 3000)\r\n}\r\n\r\nexport function declareService (path, app, service, middlewares = {}) {\r\n const feathersPath = app.get('apiPath') + '/' + path\r\n const feathersService = app.service(feathersPath)\r\n // Some internal Feathers service might internally declare the service\r\n if (feathersService) {\r\n return feathersService\r\n }\r\n // Initialize our service by providing any middleware as well\r\n let args = [feathersPath]\r\n if (middlewares.before) args = args.concat(middlewares.before)\r\n args.push(service)\r\n if (middlewares.after) args = args.concat(middlewares.after)\r\n app.use.apply(app, args)\r\n debug('Service declared on path ' + feathersPath)\r\n // Return the Feathers service, ie base service + Feathers' internals\r\n return app.service(feathersPath)\r\n}\r\n\r\nexport function configureService (name, service, servicesPath) {\r\n try {\r\n const hooks = require(path.join(servicesPath, name, name + '.hooks'))\r\n service.hooks(hooks)\r\n debug(name + ' service hooks configured on path ' + servicesPath)\r\n } catch (error) {\r\n debug('No ' + name + ' service hooks configured on path ' + servicesPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n\r\n try {\r\n const channels = require(path.join(servicesPath, name, name + '.channels'))\r\n _.forOwn(channels, (publisher, event) => {\r\n if (event === 'all') service.publish(publisher)\r\n else service.publish(event, publisher)\r\n })\r\n debug(name + ' service channels configured on path ' + servicesPath)\r\n } catch (error) {\r\n debug('No ' + name + ' service channels configured on path ' + servicesPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n\r\n return service\r\n}\r\n\r\nexport function createProxyService (options) {\r\n const targetService = options.service\r\n function proxyParams (params) {\r\n if (options.params) {\r\n let proxiedParams\r\n if (typeof options.params === 'function') {\r\n proxiedParams = options.params(params)\r\n } else {\r\n proxiedParams = _.merge(params, options.params)\r\n }\r\n return proxiedParams\r\n } else return params\r\n }\r\n function proxyId (id) {\r\n if (options.id) return options.id(id)\r\n else return id\r\n }\r\n function proxyData (data) {\r\n if (options.data) return options.data(data)\r\n else return data\r\n }\r\n function proxyResult (data) {\r\n if (options.result) return options.result(data)\r\n else return data\r\n }\r\n return {\r\n async find (params) { return proxyResult(await targetService.find(proxyParams(params))) },\r\n async get (id, params) { return proxyResult(await targetService.get(proxyId(id), proxyParams(params))) },\r\n async create (data, params) { return proxyResult(await targetService.create(proxyData(data), proxyParams(params))) },\r\n async update (id, data, params) { return proxyResult(await targetService.update(proxyId(id), proxyData(data), proxyParams(params))) },\r\n async patch (id, data, params) { return proxyResult(await targetService.patch(proxyId(id), proxyData(data), proxyParams(params))) },\r\n async remove (id, params) { return proxyResult(await targetService.remove(proxyId(id), proxyParams(params))) }\r\n }\r\n}\r\n\r\nexport function createService (name, app, options = {}) {\r\n const createFeathersService = require('feathers-' + app.db.adapter)\r\n\r\n const paginate = app.get('paginate')\r\n const serviceOptions = Object.assign({\r\n name: name,\r\n paginate\r\n }, options)\r\n if (serviceOptions.disabled) return undefined\r\n // For DB services a model has to be provided\r\n const fileName = serviceOptions.fileName || name\r\n\r\n let dbService = false\r\n try {\r\n if (serviceOptions.modelsPath) {\r\n const configureModel = require(path.join(serviceOptions.modelsPath, fileName + '.model.' + app.db.adapter))\r\n configureModel(app, serviceOptions)\r\n dbService = true\r\n }\r\n } catch (error) {\r\n debug('No ' + fileName + ' service model configured on path ' + serviceOptions.modelsPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n\r\n // Initialize our service with any options it requires\r\n let service\r\n if (dbService) {\r\n service = createFeathersService(serviceOptions)\r\n dbService = service\r\n } else if (serviceOptions.proxy) {\r\n service = createProxyService(serviceOptions.proxy)\r\n } else {\r\n // Otherwise we expect the service to be provided as a Feathers service interface\r\n service = require(path.join(serviceOptions.servicesPath, fileName, fileName + '.service'))\r\n // If we get a function try to call it assuming it will return the service object\r\n if (typeof service === 'function') {\r\n service = service(name, app, serviceOptions)\r\n }\r\n // Need to set this manually for services not using class inheritance or default adapters\r\n if (serviceOptions.events) service.events = serviceOptions.events\r\n }\r\n\r\n // Get our initialized service so that we can register hooks and filters\r\n let servicePath = serviceOptions.path || name\r\n let contextId\r\n if (serviceOptions.context) {\r\n contextId = idToString(serviceOptions.context)\r\n servicePath = contextId + '/' + servicePath\r\n }\r\n service = declareService(servicePath, app, service, serviceOptions.middlewares)\r\n // Register hooks and event filters\r\n service = configureService(fileName, service, serviceOptions.servicesPath)\r\n // Optionnally a specific service mixin can be provided, apply it\r\n if (dbService && serviceOptions.servicesPath) {\r\n try {\r\n let serviceMixin = require(path.join(serviceOptions.servicesPath, fileName, fileName + '.service'))\r\n // If we get a function try to call it assuming it will return the mixin object\r\n if (typeof serviceMixin === 'function') {\r\n serviceMixin = serviceMixin.bind(dbService)(fileName, app, serviceOptions)\r\n }\r\n service.mixin(serviceMixin)\r\n } catch (error) {\r\n debug('No ' + fileName + ' service mixin configured on path ' + serviceOptions.servicesPath)\r\n if (error.code !== 'MODULE_NOT_FOUND') {\r\n // Log error in this case as this might be linked to a syntax error in required file\r\n debug(error)\r\n }\r\n // As this is optionnal this require has to fail silently\r\n }\r\n }\r\n // Then configuration\r\n service.name = name\r\n service.app = app\r\n service.options = serviceOptions\r\n service.path = servicePath\r\n service.context = serviceOptions.context\r\n\r\n // Add some utility functions\r\n service.getPath = function (withApiPrefix) {\r\n let path = service.path\r\n if (withApiPrefix) {\r\n path = app.get('apiPath') + '/' + path\r\n }\r\n return path\r\n }\r\n service.getContextId = function () {\r\n return contextId // As string\r\n }\r\n\r\n debug(service.name + ' service registration completed')\r\n app.emit('service', service)\r\n\r\n return service\r\n}\r\n\r\nexport function createWebhook (path, app, options = {}) {\r\n let webhookPath = path\r\n if (options.context) {\r\n webhookPath = idToString(options.context) + '/' + webhookPath\r\n }\r\n const isAllowed = (payload) => {\r\n // Default is to expose all services/operations\r\n if (!options.filter) return true\r\n const result = [payload].filter(sift(options.filter))\r\n return result.length > 0\r\n }\r\n\r\n app.post(app.get('apiPath') + '/webhooks/' + webhookPath, async (req, res, next) => {\r\n const payload = req.body\r\n const config = app.get('authentication')\r\n res.set('content-type', 'application/json')\r\n const params = {}\r\n try {\r\n if (options.preprocessor) {\r\n await options.preprocessor(req, res, payload)\r\n }\r\n // Authenticate when required\r\n if (config) {\r\n try {\r\n // Token is in header or payload\r\n const header = req.headers.authorization\r\n let accessToken\r\n if (header) {\r\n // Should be of the form: 'Bearer xxx'\r\n const tokens = header.match(/(\\S+)\\s+(\\S+)/)\r\n if (tokens.length >= 2) accessToken = tokens[2]\r\n } else {\r\n accessToken = payload.accessToken\r\n }\r\n const tokenPayload = await app.passport.verifyJWT(accessToken, config)\r\n params.user = await app.getService('users').get(tokenPayload.userId)\r\n params.checkAuthorisation = true\r\n } catch (error) {\r\n throw new Forbidden('Could not verify webhook')\r\n }\r\n }\r\n if (req.headers['content-type'] !== 'application/json') {\r\n throw new BadRequest('Webhooks expect application/json content type')\r\n }\r\n if (!isAllowed(payload)) throw new Forbidden('Service or operation not allowed for webhook')\r\n const service = app.getService(payload.service, options.context || payload.context)\r\n if (!service) throw new BadRequest('Service could not be found')\r\n if (typeof service[payload.operation] !== 'function') throw new BadRequest('Service operation could not be found')\r\n const args = []\r\n // Get/Update/Patch/Remove\r\n const operationsWithId = ['get', 'update', 'patch', 'remove']\r\n if (operationsWithId.includes(payload.operation)) {\r\n if (!_.has(payload, 'id')) throw new BadRequest('Missing id for operation')\r\n args.push(_.get(payload, 'id'))\r\n }\r\n // Create/Update/Patch\r\n const operationsWithData = ['create', 'update', 'patch']\r\n if (operationsWithData.includes(payload.operation)) {\r\n if (!_.has(payload, 'data')) throw new BadRequest('Missing data for operation')\r\n args.push(_.get(payload, 'data'))\r\n }\r\n // Params\r\n args.push(params)\r\n if (options.postprocessor) {\r\n await options.postprocessor(service, args, payload)\r\n }\r\n try {\r\n const result = await service[payload.operation].apply(service, args)\r\n // Send back result\r\n res.json(result)\r\n } catch (error) {\r\n throw new BadRequest('Service operation could not be performed')\r\n }\r\n } catch (error) {\r\n // Send back error\r\n res.status(error.code).json(error.toJSON())\r\n }\r\n })\r\n\r\n debug(`Webhook ${webhookPath} registration completed`)\r\n}\r\n\r\nfunction setupLogger (app) {\r\n debug('Setup application loggers')\r\n const logsConfig = app.get('logs')\r\n // Use winston default logger\r\n app.logger = logger\r\n // Remove winston defaults\r\n try {\r\n logger.clear()\r\n } catch (error) {\r\n // Logger might be down, use console\r\n console.error('Could not remove default logger transport(s)', error)\r\n }\r\n // We have one entry per log type\r\n const logsTypes = logsConfig ? Object.getOwnPropertyNames(logsConfig) : []\r\n // Create corresponding winston transports with options\r\n logsTypes.forEach(logType => {\r\n const options = logsConfig[logType]\r\n // Setup default log level if not defined\r\n if (!options.level) {\r\n options.level = (process.env.NODE_ENV === 'development' ? 'debug' : 'info')\r\n }\r\n try {\r\n logger.add(new logger.transports[logType](options))\r\n } catch (error) {\r\n // Logger might be down, use console\r\n console.error('Could not setup default log levels', error)\r\n }\r\n })\r\n}\r\n\r\nfunction setupSockets (app) {\r\n const apiLimiter = app.get('apiLimiter')\r\n const connections = {}\r\n let nbConnections = 0\r\n\r\n return io => {\r\n // By default EventEmitters will print a warning if more than 10 listeners are added for a particular event.\r\n // The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.\r\n io.sockets.setMaxListeners(0)\r\n const maxConnections = _.get(apiLimiter, 'websocket.maxConcurrency', 0)\r\n const maxIpConnections = _.get(apiLimiter, 'websocket.concurrency', 0)\r\n\r\n io.on('connection', socket => {\r\n nbConnections++\r\n debug(`New socket connection on server with pid ${process.pid}`, socket.id, socket.conn.remoteAddress, nbConnections)\r\n // Setup disconnect handler first\r\n socket.on('disconnect', (reason) => {\r\n nbConnections--\r\n debug(reason)\r\n debug(`Socket disconnection on server with pid ${process.pid}`, socket.id, socket.conn.remoteAddress, nbConnections)\r\n if (maxIpConnections > 0) {\r\n const nbIpConnections = _.get(connections, socket.conn.remoteAddress) - 1\r\n debug('Total number of connections for', socket.id, socket.conn.remoteAddress, nbIpConnections)\r\n _.set(connections, socket.conn.remoteAddress, nbIpConnections)\r\n }\r\n })\r\n if (maxConnections > 0) {\r\n if (nbConnections > maxConnections) {\r\n tooManyRequests(socket, 'Too many concurrent connections (rate limiting)', 'RATE_LIMITING_CONCURRENCY')\r\n return\r\n }\r\n }\r\n if (maxIpConnections > 0) {\r\n if (_.has(connections, socket.conn.remoteAddress)) {\r\n const nbIpConnections = _.get(connections, socket.conn.remoteAddress) + 1\r\n debug('Total number of connections for', socket.id, socket.conn.remoteAddress, nbConnections)\r\n _.set(connections, socket.conn.remoteAddress, nbIpConnections)\r\n if (nbIpConnections > maxIpConnections) {\r\n tooManyRequests(socket, 'Too many concurrent connections (rate limiting)', 'RATE_LIMITING_CONCURRENCY')\r\n return\r\n }\r\n } else {\r\n _.set(connections, socket.conn.remoteAddress, 1)\r\n }\r\n }\r\n /* For debug purpose: trace all data received\r\n socket.use((packet, next) => {\r\n console.log(packet)\r\n next()\r\n })\r\n */\r\n if (apiLimiter && apiLimiter.websocket) {\r\n const { tokensPerInterval, interval } = apiLimiter.websocket\r\n // Function used to filter whitelisted services, defaults to none\r\n const services = _.get(apiLimiter.websocket, 'services', (service) => false)\r\n socket.socketLimiter = new SocketLimiter(tokensPerInterval, interval)\r\n socket.use((packet, next) => {\r\n if (packet.length > 0) {\r\n // Packets are formatted according to service interface,\r\n // e.g. like [service_method, service_path, id or data, params]\r\n // Bypass rate limiting on whitelist\r\n if ((packet.length > 1) && (typeof packet[1] === 'string')) {\r\n const service = app.service(packet[1])\r\n if (service && services(service)) {\r\n debugLimiter('By-pass rate limiting on whitelisted service operation', socket.id, socket.conn.remoteAddress, packet[0], packet[1])\r\n next()\r\n return\r\n }\r\n }\r\n debugLimiter(socket.socketLimiter.getTokensRemaining() + ' remaining API token for socket', socket.id, socket.conn.remoteAddress)\r\n if (!socket.socketLimiter.tryRemoveTokens(1)) { // if exceeded\r\n tooManyRequests(socket, 'Too many requests in a given amount of time (rate limiting)', 'RATE_LIMITING')\r\n // FIXME: calling this causes a client timeout\r\n // next(error)\r\n // Need to normalize the error object as JSON\r\n // let result = {}\r\n // Object.getOwnPropertyNames(error).forEach(key => (result[key] = error[key]))\r\n // Trying to send error like in https://github.com/feathersjs/transport-commons/blob/auk/src/events.js#L103\r\n // does not work either (also generates a client timeout)\r\n // socket.emit(`${servicePath} error`, result)\r\n // socket.emit(result)\r\n return\r\n }\r\n }\r\n next()\r\n })\r\n }\r\n\r\n authSocket(app, socket)\r\n })\r\n }\r\n}\r\n\r\nexport function kalisio () {\r\n const app = express(feathers())\r\n // By default EventEmitters will print a warning if more than 10 listeners are added for a particular event.\r\n // The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.\r\n app.setMaxListeners(0)\r\n // Load app configuration first\r\n app.configure(configuration())\r\n // Then setup logger\r\n setupLogger(app)\r\n\r\n // This retrieve corresponding service options from app config if any\r\n app.getServiceOptions = function (name) {\r\n const services = app.get('services')\r\n if (!services) return {}\r\n return _.get(services, name, {})\r\n }\r\n // This avoid managing the API path before each service name\r\n app.getService = function (path, context) {\r\n // Context is given as string ID\r\n if (context && typeof context === 'string') {\r\n return app.service(app.get('apiPath') + '/' + context + '/' + path)\r\n } else if (context && typeof context === 'object') {\r\n // Could be Object ID or raw object\r\n if (ObjectID.isValid(context)) return app.service(app.get('apiPath') + '/' + context.toString() + '/' + path)\r\n else return app.service(app.get('apiPath') + '/' + context._id.toString() + '/' + path)\r\n } else {\r\n return app.service(app.get('apiPath') + '/' + path)\r\n }\r\n }\r\n // This is used to add hooks/filters to services\r\n app.configureService = function (name, service, servicesPath) {\r\n return configureService(name, service, servicesPath)\r\n }\r\n // This is used to create standard services\r\n app.createService = function (name, options) {\r\n return createService(name, app, options)\r\n }\r\n // This is used to create webhooks\r\n app.createWebhook = function (path, options) {\r\n return createWebhook(path, app, options)\r\n }\r\n // Override Feathers configure that do not manage async operations,\r\n // here we also simply call the function given as parameter but await for it\r\n app.configure = async function (fn) {\r\n await fn.call(this, this)\r\n return this\r\n }\r\n const apiLimiter = app.get('apiLimiter')\r\n if (apiLimiter && apiLimiter.http) {\r\n // Function used to filter whitelisted services, defaults to none\r\n const services = _.get(apiLimiter.http, 'services', (service) => false)\r\n const handler = (req, res, next) => {\r\n // Bypass rate limiting on whitelist\r\n let service\r\n try {\r\n const serviceUrl = new url.URL(req.originalUrl)\r\n service = app.service(serviceUrl.pathname)\r\n } catch (error) {\r\n debugLimiter(error)\r\n }\r\n if (service && services(service)) {\r\n debugLimiter('By-pass rate limiting on whitelisted service operation', req.method, path)\r\n next()\r\n } else {\r\n const error = new TooManyRequests('Too many requests in a given amount of time (rate limiting)',\r\n { translation: { key: 'RATE_LIMITING' } })\r\n res.status(error.code)\r\n res.set('Content-Type', 'application/json')\r\n res.json(Object.assign({}, error.toJSON()))\r\n }\r\n }\r\n app.use(app.get('apiPath'), new HttpLimiter(Object.assign({ handler }, apiLimiter.http)))\r\n }\r\n\r\n // Enable CORS, security, compression, and body parsing\r\n app.use(cors(app.get('cors')))\r\n app.use(helmet(app.get('helmet')))\r\n app.use(compress(app.get('compression')))\r\n const bodyParserConfig = app.get('bodyParser')\r\n app.use(bodyParser.json(_.get(bodyParserConfig, 'json')))\r\n app.use(bodyParser.urlencoded(Object.assign({ extended: true }, _.get(bodyParserConfig, 'urlencoded'))))\r\n\r\n // Set up plugins and providers\r\n app.configure(rest())\r\n const socketioConfig = app.get('socketio') || {}\r\n app.configure(socketio(Object.assign({ path: app.get('apiPath') + 'ws' }, socketioConfig), setupSockets(app)))\r\n app.configure(auth)\r\n\r\n // Initialize DB\r\n app.db = Database.create(app)\r\n\r\n return app\r\n}\r\n"]}
@@ -73,7 +73,14 @@ let authorise = exports.authorise = (() => {
73
73
  }, {});
74
74
  _lodash2.default.merge(hook.params.query, dbQuery);
75
75
  } else {
76
- hook.result = { total: 0, skip: 0, data: [] };
76
+ if (operation === 'find') {
77
+ // You don't have right to read any items but you have access to the service so the result is empty
78
+ hook.result = !_lodash2.default.get(hook, 'params.paginate', true) ? [] : { total: 0, skip: 0, data: [] };
79
+ } else {
80
+ // You don't have the right to update/patch/remove any items so any tentative should throw
81
+ debug('Resource access not granted');
82
+ throw new _errors.Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`);
83
+ }
77
84
  }
78
85
  }
79
86
  debug('Resource access granted');