@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.
- package/.nyc_output/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
- package/.nyc_output/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
- package/.nyc_output/{2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json → 27401f21-8ccf-42fa-8230-4232189d86b3.json} +0 -0
- package/.nyc_output/{81d21e46-766a-46bc-b1b7-143ca577347a.json → 52278ef5-c337-4724-97be-e2e4416847c5.json} +0 -0
- package/.nyc_output/{aaf3ebbb-f895-4d7b-9255-bc5dee832570.json → 5dd49b8a-4c84-42f9-a3d5-712247a84775.json} +0 -0
- package/.nyc_output/{dbeb2602-0ac2-4e66-978b-0d29548359ca.json → 612b4859-9645-45c1-a41e-1fae420518c4.json} +0 -0
- package/.nyc_output/{e47d1e4c-2fff-4dcb-908f-d3081162547c.json → bab87fe9-d99a-4759-99e6-3fc4622eeca0.json} +0 -0
- package/.nyc_output/processinfo/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
- package/.nyc_output/processinfo/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
- package/.nyc_output/processinfo/27401f21-8ccf-42fa-8230-4232189d86b3.json +1 -0
- package/.nyc_output/processinfo/52278ef5-c337-4724-97be-e2e4416847c5.json +1 -0
- package/.nyc_output/processinfo/5dd49b8a-4c84-42f9-a3d5-712247a84775.json +1 -0
- package/.nyc_output/processinfo/612b4859-9645-45c1-a41e-1fae420518c4.json +1 -0
- package/.nyc_output/processinfo/bab87fe9-d99a-4759-99e6-3fc4622eeca0.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/CHANGELOG.md +69 -10
- package/coverage/core/api/application.js.html +500 -422
- package/coverage/core/api/authentication.js.html +119 -119
- package/coverage/core/api/db.js.html +172 -172
- package/coverage/core/api/hooks/hooks.account.js.html +45 -45
- package/coverage/core/api/hooks/hooks.authentication.js.html +71 -71
- package/coverage/core/api/hooks/hooks.authorisations.js.html +368 -353
- package/coverage/core/api/hooks/hooks.devices.js.html +49 -49
- package/coverage/core/api/hooks/hooks.groups.js.html +37 -37
- package/coverage/core/api/hooks/hooks.logger.js.html +27 -27
- package/coverage/core/api/hooks/hooks.model.js.html +269 -269
- package/coverage/core/api/hooks/hooks.organisations.js.html +190 -190
- package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
- package/coverage/core/api/hooks/hooks.query.js.html +277 -211
- package/coverage/core/api/hooks/hooks.service.js.html +82 -82
- package/coverage/core/api/hooks/hooks.storage.js.html +121 -121
- package/coverage/core/api/hooks/hooks.tags.js.html +232 -232
- package/coverage/core/api/hooks/hooks.users.js.html +263 -263
- package/coverage/core/api/hooks/index.html +172 -172
- package/coverage/core/api/hooks/index.js.html +24 -24
- package/coverage/core/api/index.html +76 -76
- package/coverage/core/api/index.js.html +30 -30
- package/coverage/core/api/marshall.js.html +57 -57
- package/coverage/core/api/models/groups.model.mongodb.js.html +20 -20
- package/coverage/core/api/models/index.html +50 -50
- package/coverage/core/api/models/organisations.model.mongodb.js.html +12 -12
- package/coverage/core/api/models/tags.model.mongodb.js.html +22 -22
- package/coverage/core/api/models/users.model.mongodb.js.html +20 -20
- package/coverage/core/api/oauth2-handler.js.html +18 -18
- package/coverage/core/api/oauth2-verifier.js.html +38 -38
- package/coverage/core/api/services/account/account.hooks.js.html +16 -16
- package/coverage/core/api/services/account/account.service.js.html +104 -104
- package/coverage/core/api/services/account/index.html +32 -32
- package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
- package/coverage/core/api/services/authorisations/authorisations.service.js.html +156 -132
- package/coverage/core/api/services/authorisations/index.html +28 -28
- package/coverage/core/api/services/databases/databases.hooks.js.html +9 -9
- package/coverage/core/api/services/databases/databases.service.js.html +12 -12
- package/coverage/core/api/services/databases/index.html +24 -24
- package/coverage/core/api/services/devices/devices.hooks.js.html +9 -9
- package/coverage/core/api/services/devices/devices.service.js.html +121 -121
- package/coverage/core/api/services/devices/index.html +28 -28
- package/coverage/core/api/services/groups/groups.hooks.js.html +9 -9
- package/coverage/core/api/services/groups/index.html +13 -13
- package/coverage/core/api/services/index.html +21 -21
- package/coverage/core/api/services/index.js.html +118 -118
- package/coverage/core/api/services/mailer/index.html +24 -24
- package/coverage/core/api/services/mailer/mailer.hooks.js.html +9 -9
- package/coverage/core/api/services/mailer/mailer.service.js.html +19 -19
- package/coverage/core/api/services/organisations/index.html +24 -24
- package/coverage/core/api/services/organisations/organisations.hooks.js.html +8 -8
- package/coverage/core/api/services/organisations/organisations.service.js.html +67 -67
- package/coverage/core/api/services/pusher/index.html +34 -34
- package/coverage/core/api/services/pusher/pusher.channels.js.html +8 -8
- package/coverage/core/api/services/pusher/pusher.hooks.js.html +10 -10
- package/coverage/core/api/services/pusher/pusher.service.js.html +414 -414
- package/coverage/core/api/services/storage/index.html +21 -21
- package/coverage/core/api/services/storage/storage.hooks.js.html +35 -35
- package/coverage/core/api/services/tags/index.html +21 -21
- package/coverage/core/api/services/tags/tags.hooks.js.html +25 -25
- package/coverage/core/api/services/users/index.html +21 -21
- package/coverage/core/api/services/users/users.hooks.js.html +33 -33
- package/coverage/core/common/errors.js.html +1 -1
- package/coverage/core/common/index.html +42 -27
- package/coverage/core/common/index.js.html +16 -16
- package/coverage/core/common/permissions.js.html +320 -290
- package/coverage/index.html +181 -181
- package/coverage/lcov-report/core/api/application.js.html +500 -422
- package/coverage/lcov-report/core/api/authentication.js.html +119 -119
- package/coverage/lcov-report/core/api/db.js.html +172 -172
- package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +45 -45
- package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +71 -71
- package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +368 -353
- package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +49 -49
- package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +37 -37
- package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +27 -27
- package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +269 -269
- package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +190 -190
- package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
- package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +277 -211
- package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +82 -82
- package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +121 -121
- package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +232 -232
- package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +263 -263
- package/coverage/lcov-report/core/api/hooks/index.html +172 -172
- package/coverage/lcov-report/core/api/hooks/index.js.html +24 -24
- package/coverage/lcov-report/core/api/index.html +76 -76
- package/coverage/lcov-report/core/api/index.js.html +30 -30
- package/coverage/lcov-report/core/api/marshall.js.html +57 -57
- package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +20 -20
- package/coverage/lcov-report/core/api/models/index.html +50 -50
- package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +12 -12
- package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +22 -22
- package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +20 -20
- package/coverage/lcov-report/core/api/oauth2-handler.js.html +18 -18
- package/coverage/lcov-report/core/api/oauth2-verifier.js.html +38 -38
- package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +16 -16
- package/coverage/lcov-report/core/api/services/account/account.service.js.html +104 -104
- package/coverage/lcov-report/core/api/services/account/index.html +32 -32
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +156 -132
- package/coverage/lcov-report/core/api/services/authorisations/index.html +28 -28
- package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +12 -12
- package/coverage/lcov-report/core/api/services/databases/index.html +24 -24
- package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +121 -121
- package/coverage/lcov-report/core/api/services/devices/index.html +28 -28
- package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/groups/index.html +13 -13
- package/coverage/lcov-report/core/api/services/index.html +21 -21
- package/coverage/lcov-report/core/api/services/index.js.html +118 -118
- package/coverage/lcov-report/core/api/services/mailer/index.html +24 -24
- package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +19 -19
- package/coverage/lcov-report/core/api/services/organisations/index.html +24 -24
- package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +8 -8
- package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +67 -67
- package/coverage/lcov-report/core/api/services/pusher/index.html +34 -34
- package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +8 -8
- package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +10 -10
- package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +414 -414
- package/coverage/lcov-report/core/api/services/storage/index.html +21 -21
- package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +35 -35
- package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
- package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +25 -25
- package/coverage/lcov-report/core/api/services/users/index.html +21 -21
- package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +33 -33
- package/coverage/lcov-report/core/common/errors.js.html +1 -1
- package/coverage/lcov-report/core/common/index.html +42 -27
- package/coverage/lcov-report/core/common/index.js.html +16 -16
- package/coverage/lcov-report/core/common/permissions.js.html +320 -290
- package/coverage/lcov-report/index.html +181 -181
- package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
- package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +25 -7
- package/coverage/lcov-report/map/api/hooks/index.html +7 -7
- package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
- package/coverage/lcov-report/map/api/index.html +1 -1
- package/coverage/lcov-report/map/api/index.js.html +1 -1
- package/coverage/lcov-report/map/api/marshall.js.html +1 -1
- package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +14 -5
- package/coverage/lcov-report/map/api/models/index.html +7 -7
- package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
- package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
- package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
- package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/features/index.html +1 -1
- package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
- package/coverage/lcov-report/map/api/services/index.html +1 -1
- package/coverage/lcov-report/map/api/services/index.js.html +1 -1
- package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/errors.js.html +1 -1
- package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/grid.js.html +1 -1
- package/coverage/lcov-report/map/common/index.html +1 -1
- package/coverage/lcov-report/map/common/index.js.html +1 -1
- package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/permissions.js.html +1 -1
- package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
- package/coverage/lcov.info +3683 -3825
- package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
- package/coverage/map/api/hooks/hooks.query.js.html +25 -7
- package/coverage/map/api/hooks/index.html +7 -7
- package/coverage/map/api/hooks/index.js.html +1 -1
- package/coverage/map/api/index.html +1 -1
- package/coverage/map/api/index.js.html +1 -1
- package/coverage/map/api/marshall.js.html +1 -1
- package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
- package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
- package/coverage/map/api/models/features.model.mongodb.js.html +14 -5
- package/coverage/map/api/models/index.html +7 -7
- package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
- package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
- package/coverage/map/api/services/alerts/index.html +1 -1
- package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
- package/coverage/map/api/services/catalog/index.html +1 -1
- package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
- package/coverage/map/api/services/daptiles/index.html +1 -1
- package/coverage/map/api/services/features/features.hooks.js.html +1 -1
- package/coverage/map/api/services/features/index.html +1 -1
- package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
- package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
- package/coverage/map/api/services/geocoder/index.html +1 -1
- package/coverage/map/api/services/index.html +1 -1
- package/coverage/map/api/services/index.js.html +1 -1
- package/coverage/map/common/dynamic-grid-source.js.html +1 -1
- package/coverage/map/common/errors.js.html +1 -1
- package/coverage/map/common/geotiff-grid-source.js.html +1 -1
- package/coverage/map/common/grid.js.html +1 -1
- package/coverage/map/common/index.html +1 -1
- package/coverage/map/common/index.js.html +1 -1
- package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
- package/coverage/map/common/moment-utils.js.html +1 -1
- package/coverage/map/common/opendap-grid-source.js.html +1 -1
- package/coverage/map/common/opendap-utils.js.html +1 -1
- package/coverage/map/common/permissions.js.html +1 -1
- package/coverage/map/common/time-based-grid-source.js.html +1 -1
- package/coverage/map/common/tms-utils.js.html +1 -1
- package/coverage/map/common/wcs-grid-source.js.html +1 -1
- package/coverage/map/common/wcs-utils.js.html +1 -1
- package/coverage/map/common/weacast-grid-source.js.html +1 -1
- package/coverage/map/common/wfs-utils.js.html +1 -1
- package/coverage/map/common/wms-utils.js.html +1 -1
- package/coverage/map/common/wmts-utils.js.html +1 -1
- package/extras/tours/map/navigation-bar.js +49 -1
- package/lib/core/api/application.js +35 -9
- package/lib/core/api/application.js.map +1 -1
- package/lib/core/api/hooks/hooks.authorisations.js +8 -1
- package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
- package/lib/core/api/hooks/hooks.query.js +135 -100
- package/lib/core/api/hooks/hooks.query.js.map +1 -1
- package/lib/core/api/services/authorisations/authorisations.service.js +13 -1
- package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
- package/lib/core/api/services/pusher/pusher.service.js +40 -16
- package/lib/core/api/services/pusher/pusher.service.js.map +1 -1
- package/lib/core/client/components/collection/KColumn.vue +29 -28
- package/lib/core/client/components/collection/KFilter.vue +97 -72
- package/lib/core/client/components/editor/KModalEditor.vue +3 -4
- package/lib/core/client/components/editor/KSettingsEditor.vue +6 -2
- package/lib/core/client/components/form/KFileField.vue +14 -36
- package/lib/core/client/components/form/KRoleField.vue +5 -2
- package/lib/core/client/components/form/KTextField.vue +12 -2
- package/lib/core/client/components/form/KUnitField.vue +57 -0
- package/lib/core/client/components/form/KUrlField.vue +1 -1
- package/lib/core/client/components/frame/KAction.vue +1 -2
- package/lib/core/client/components/frame/KModal.vue +66 -20
- package/lib/core/client/components/frame/KScrollArea.vue +65 -0
- package/lib/core/client/components/frame/index.js +6 -1
- package/lib/core/client/components/frame/index.js.map +1 -1
- package/lib/core/client/components/input/KColorChooser.vue +3 -5
- package/lib/core/client/components/input/KIconChooser.vue +38 -40
- package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
- package/lib/core/client/components/layout/KAbout.vue +47 -49
- package/lib/core/client/components/team/KAddMember.vue +1 -1
- package/lib/core/client/components/team/KChangeRole.vue +11 -14
- package/lib/core/client/components/team/KGroupCard.vue +12 -5
- package/lib/core/client/components/team/KGroupsActivity.vue +1 -1
- package/lib/core/client/components/team/KJoinGroup.vue +22 -22
- package/lib/core/client/components/team/KMemberCard.vue +19 -4
- package/lib/core/client/components/viewer/KModalViewer.vue +10 -9
- package/lib/core/client/i18n/core_en.json +72 -8
- package/lib/core/client/i18n/core_fr.json +66 -8
- package/lib/core/client/index.js +31 -0
- package/lib/core/client/index.js.map +1 -1
- package/lib/core/client/layout.js +8 -1
- package/lib/core/client/layout.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-widget.js +5 -3
- package/lib/core/client/mixins/mixin.base-widget.js.map +1 -1
- package/lib/core/client/reader.js +85 -0
- package/lib/core/client/reader.js.map +1 -0
- package/lib/core/client/readers/index.js +30 -0
- package/lib/core/client/readers/index.js.map +1 -0
- package/lib/core/client/readers/reader.csv.js +54 -0
- package/lib/core/client/readers/reader.csv.js.map +1 -0
- package/lib/core/client/readers/reader.json.js +49 -0
- package/lib/core/client/readers/reader.json.js.map +1 -0
- package/lib/core/client/services/index.js +14 -3
- package/lib/core/client/services/index.js.map +1 -1
- package/lib/core/client/services/local-settings.service.js +6 -4
- package/lib/core/client/services/local-settings.service.js.map +1 -1
- package/lib/core/client/time.js +4 -3
- package/lib/core/client/time.js.map +1 -1
- package/lib/core/client/units.js +195 -0
- package/lib/core/client/units.js.map +1 -0
- package/lib/core/common/permissions.js +44 -34
- package/lib/core/common/permissions.js.map +1 -1
- package/lib/core/common/schemas/settings.update.json +72 -0
- package/lib/map/api/hooks/hooks.query.js +7 -2
- package/lib/map/api/hooks/hooks.query.js.map +1 -1
- package/lib/map/api/models/features.model.mongodb.js +3 -0
- package/lib/map/api/models/features.model.mongodb.js.map +1 -1
- package/lib/map/client/components/KCaptureToolbar.vue +151 -0
- package/lib/map/client/components/KColorLegend.vue +16 -4
- package/lib/map/client/components/KFeaturesChart.vue +10 -11
- package/lib/map/client/components/KFeaturesFilter.vue +40 -39
- package/lib/map/client/components/KFeaturesTable.vue +15 -16
- package/lib/map/client/components/KLayerEditionToolbar.vue +19 -11
- package/lib/map/client/components/KLayerStyleEditor.vue +3 -2
- package/lib/map/client/components/KLayerStyleForm.vue +38 -27
- package/lib/map/client/components/KMeasureTool.vue +337 -0
- package/lib/map/client/components/KTimeline.vue +5 -9
- package/lib/map/client/components/catalog/KAddLayer.vue +3 -2
- package/lib/map/client/components/catalog/KCatalog.vue +26 -7
- package/lib/map/client/components/catalog/KImportLayer.vue +8 -35
- package/lib/map/client/components/catalog/KLayerCategories.vue +3 -2
- package/lib/map/client/components/catalog/KLayersSelector.vue +8 -6
- package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +1 -1
- package/lib/map/client/components/widget/KInformationBox.vue +8 -17
- package/lib/map/client/components/widget/KMapillaryViewer.vue +5 -1
- package/lib/map/client/components/widget/KTimeSeries.vue +92 -9
- package/lib/map/client/i18n/map_en.json +51 -20
- package/lib/map/client/i18n/map_fr.json +51 -20
- package/lib/map/client/init.js +7 -1
- package/lib/map/client/init.js.map +1 -1
- package/lib/map/client/leaflet/MaskLayer.js +9 -0
- package/lib/map/client/leaflet/MaskLayer.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.base-globe.js +3 -5
- package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js +16 -21
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.popup.js +7 -1
- package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.tooltip.js +7 -1
- package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.base-map.js +54 -9
- package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.canvas-layers.js +2 -0
- package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.file-layers.js +51 -97
- package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.geojson-layers.js +43 -11
- package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.popup.js +7 -1
- package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.style.js +1 -1
- package/lib/map/client/mixins/map/mixin.style.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tooltip.js +7 -1
- package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/mixin.activity.js +2 -0
- package/lib/map/client/mixins/mixin.activity.js.map +1 -1
- package/lib/map/client/mixins/mixin.context.js +26 -3
- package/lib/map/client/mixins/mixin.context.js.map +1 -1
- package/lib/map/client/mixins/mixin.feature-service.js +3 -3
- package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
- package/lib/map/client/mixins/mixin.infobox.js +4 -0
- package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
- package/lib/map/client/mixins/mixin.weacast.js +7 -5
- package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
- package/lib/map/client/readers/index.js +54 -0
- package/lib/map/client/readers/index.js.map +1 -0
- package/lib/map/client/readers/reader.geojson.js +87 -0
- package/lib/map/client/readers/reader.geojson.js.map +1 -0
- package/lib/map/client/readers/reader.gpx.js +52 -0
- package/lib/map/client/readers/reader.gpx.js.map +1 -0
- package/lib/map/client/readers/reader.kml.js +52 -0
- package/lib/map/client/readers/reader.kml.js.map +1 -0
- package/lib/map/client/readers/reader.shp.js +116 -0
- package/lib/map/client/readers/reader.shp.js.map +1 -0
- package/lib/map/client/utils.js +0 -7
- package/lib/map/client/utils.js.map +1 -1
- package/lib/test/client/core/account.js +1 -1
- package/lib/test/client/core/account.js.map +1 -1
- package/lib/test/client/core/runner.js +1 -2
- package/lib/test/client/core/runner.js.map +1 -1
- package/lib/test/client/core/screens.js +1 -1
- package/lib/test/client/core/screens.js.map +1 -1
- package/lib/test/client/core/utils.js +2 -2
- package/lib/test/client/core/utils.js.map +1 -1
- package/lib/test/client/map/catalog.js +50 -49
- package/lib/test/client/map/catalog.js.map +1 -1
- package/package.json +3 -3
- package/.nyc_output/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
- package/.nyc_output/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
- package/.nyc_output/processinfo/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
- package/.nyc_output/processinfo/2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json +0 -1
- package/.nyc_output/processinfo/81d21e46-766a-46bc-b1b7-143ca577347a.json +0 -1
- package/.nyc_output/processinfo/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
- package/.nyc_output/processinfo/aaf3ebbb-f895-4d7b-9255-bc5dee832570.json +0 -1
- package/.nyc_output/processinfo/dbeb2602-0ac2-4e66-978b-0d29548359ca.json +0 -1
- package/.nyc_output/processinfo/e47d1e4c-2fff-4dcb-908f-d3081162547c.json +0 -1
- package/extras/testcafe/Dockerfile +0 -48
- package/extras/testcafe/docker-entrypoint.sh +0 -27
- package/extras/testcafe/page-models/core/account.js +0 -75
- package/extras/testcafe/page-models/core/base-collection.js +0 -41
- package/extras/testcafe/page-models/core/base-page.js +0 -25
- package/extras/testcafe/page-models/core/groups.js +0 -36
- package/extras/testcafe/page-models/core/index.js +0 -140
- package/extras/testcafe/page-models/core/layout.js +0 -145
- package/extras/testcafe/page-models/core/members.js +0 -98
- package/extras/testcafe/page-models/core/organisations.js +0 -76
- package/extras/testcafe/page-models/core/screens.js +0 -99
- package/extras/testcafe/page-models/core/tags.js +0 -21
- package/extras/testcafe/page-models/map/add-layer.js +0 -51
- package/extras/testcafe/page-models/map/catalog.js +0 -132
- package/extras/testcafe/page-models/map/index.js +0 -36
- package/extras/testcafe/page-models/map/map-activity.js +0 -42
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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('
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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');
|