From f0d190d1572e9dca747f38aba24dd84896d7c0f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Fri, 22 Jun 2018 17:31:05 +0200 Subject: [PATCH 1/6] tests tiles base urls with api key --- test/acceptance/layergroup-metadata.js | 46 ++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 test/acceptance/layergroup-metadata.js diff --git a/test/acceptance/layergroup-metadata.js b/test/acceptance/layergroup-metadata.js new file mode 100644 index 00000000..57b21f8b --- /dev/null +++ b/test/acceptance/layergroup-metadata.js @@ -0,0 +1,46 @@ +require('../support/test_helper'); + +const assert = require('../support/assert'); +const TestClient = require('../support/test-client'); + +describe('layergroup metadata', function () { + [1234, false].forEach(api_key => { + it(`tiles base urls ${api_key ? 'with api key' : 'without api key'}`, function (done) { + const mapConfig = { + version: '1.7.0', + layers: [ + { + type: 'cartodb', + options: { + sql: 'select * from populated_places_simple_reduced', + } + } + ] + }; + + const host = `https://localhost.localhost.lan:${global.environment.port}`; + + const testClient = new TestClient(mapConfig, api_key); + testClient.getLayergroup((err, body) => { + if (err) { + return done(err); + } + + let urlLayer = `${host}/api/v1/map/${body.layergroupid}/layer0/{z}/{x}/{y}.mvt`; + let urlNoLayer = `${host}/api/v1/map/${body.layergroupid}/{z}/{x}/{y}.mvt`; + + if (api_key) { + urlLayer += `?api_key=${api_key}`; + urlNoLayer += `?api_key=${api_key}`; + } + + assert.ok(body.layergroupid); + assert.equal(body.metadata.layers[0].tilejson.vector.tiles[0], urlLayer); + assert.equal(body.metadata.tilejson.vector.tiles[0], urlNoLayer); + assert.equal(body.metadata.url.vector.urlTemplate, urlNoLayer); + + testClient.drain(done); + }); + }); + }); +}); From 762dce785360613b17d348f09e4e9813d7e0423e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Fri, 22 Jun 2018 17:31:45 +0200 Subject: [PATCH 2/6] adding api key to tiles base urls --- lib/cartodb/api/middlewares/layergroup-metadata.js | 4 ++-- lib/cartodb/utils/layergroup-metadata.js | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/cartodb/api/middlewares/layergroup-metadata.js b/lib/cartodb/api/middlewares/layergroup-metadata.js index bbb1fbe4..a9cec443 100644 --- a/lib/cartodb/api/middlewares/layergroup-metadata.js +++ b/lib/cartodb/api/middlewares/layergroup-metadata.js @@ -1,6 +1,6 @@ module.exports = function setMetadataToLayergroup (layergroupMetadata, includeQuery) { return function setMetadataToLayergroupMiddleware (req, res, next) { - const { user, mapConfig, analysesResults = [], context } = res.locals; + const { user, mapConfig, analysesResults = [], context, api_key: userApiKey } = res.locals; const layergroup = res.body; layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapConfig.obj()); @@ -8,7 +8,7 @@ module.exports = function setMetadataToLayergroup (layergroupMetadata, includeQu layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapConfig.obj(), context); layergroupMetadata.addAggregationContextMetadata(layergroup, mapConfig.obj(), context); layergroupMetadata.addDateWrappingMetadata (layergroup, mapConfig.obj()); - layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig); + layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig, userApiKey); next(); }; diff --git a/lib/cartodb/utils/layergroup-metadata.js b/lib/cartodb/utils/layergroup-metadata.js index 41c3c9af..22f7c8f3 100644 --- a/lib/cartodb/utils/layergroup-metadata.js +++ b/lib/cartodb/utils/layergroup-metadata.js @@ -84,16 +84,18 @@ module.exports = class LayergroupMetadata { } } - addTileJsonMetadata (layergroup, user, mapconfig) { + addTileJsonMetadata (layergroup, user, mapconfig, userApiKey = null) { const isVectorOnlyMapConfig = mapconfig.isVectorOnlyMapConfig(); let hasMapnikLayers = false; + const apiKey = userApiKey ? `?api_key=${userApiKey}` : ''; layergroup.metadata.layers.forEach((layerMetadata, index) => { const layerId = mapconfig.getLayerId(index); - const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png`; + const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png${apiKey}`; + if (mapconfig.layerType(index) === 'mapnik') { hasMapnikLayers = true; - const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt`; + const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt${apiKey}`; const layerTilejson = { vector: this._getTilejson(this.resourceLocator.getTileUrls(user, vectorResource)) }; @@ -101,7 +103,7 @@ module.exports = class LayergroupMetadata { let grids = null; const layer = mapconfig.getLayer(index); if (layer.options.interactivity) { - const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json`; + const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json${apiKey}`; grids = this.resourceLocator.getTileUrls(user, gridResource); } layerTilejson.raster = this._getTilejson( @@ -121,14 +123,14 @@ module.exports = class LayergroupMetadata { const url = {}; if (hasMapnikLayers) { - const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt`; + const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt${apiKey}`; tilejson.vector = this._getTilejson( this.resourceLocator.getTileUrls(user, vectorResource) ); url.vector = this._getTemplateUrl(this.resourceLocator.getTemplateUrls(user, vectorResource)); if (!isVectorOnlyMapConfig) { - const rasterResource = `${layergroup.layergroupid}/{z}/{x}/{y}.png`; + const rasterResource = `${layergroup.layergroupid}/{z}/{x}/{y}.png${apiKey}`; tilejson.raster = this._getTilejson( this.resourceLocator.getTileUrls(user, rasterResource) ); From abb194ca9cc1b24dee87333cc2329c96e88ca197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 25 Jun 2018 15:06:27 +0200 Subject: [PATCH 3/6] test tiles base urls with default_public api key --- test/acceptance/layergroup-metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/layergroup-metadata.js b/test/acceptance/layergroup-metadata.js index 57b21f8b..b29f6cca 100644 --- a/test/acceptance/layergroup-metadata.js +++ b/test/acceptance/layergroup-metadata.js @@ -4,7 +4,7 @@ const assert = require('../support/assert'); const TestClient = require('../support/test-client'); describe('layergroup metadata', function () { - [1234, false].forEach(api_key => { + [1234, 'default_public', false].forEach(api_key => { it(`tiles base urls ${api_key ? 'with api key' : 'without api key'}`, function (done) { const mapConfig = { version: '1.7.0', From 32ce033c06324eecca8bbb86f6eb83cde16b5857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 25 Jun 2018 15:09:18 +0200 Subject: [PATCH 4/6] improve tests titles --- test/acceptance/layergroup-metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/layergroup-metadata.js b/test/acceptance/layergroup-metadata.js index b29f6cca..4da60ef4 100644 --- a/test/acceptance/layergroup-metadata.js +++ b/test/acceptance/layergroup-metadata.js @@ -5,7 +5,7 @@ const TestClient = require('../support/test-client'); describe('layergroup metadata', function () { [1234, 'default_public', false].forEach(api_key => { - it(`tiles base urls ${api_key ? 'with api key' : 'without api key'}`, function (done) { + it(`tiles base urls ${api_key ? `with api key: ${api_key}` : 'without api key'}`, function (done) { const mapConfig = { version: '1.7.0', layers: [ From 79fdd07d8fc38d5c68f7825bc269bcee2ebb8b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 25 Jun 2018 16:23:23 +0200 Subject: [PATCH 5/6] adding api key to tiles base urls with querystring --- lib/cartodb/utils/layergroup-metadata.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/utils/layergroup-metadata.js b/lib/cartodb/utils/layergroup-metadata.js index 22f7c8f3..ee2e78c4 100644 --- a/lib/cartodb/utils/layergroup-metadata.js +++ b/lib/cartodb/utils/layergroup-metadata.js @@ -1,4 +1,5 @@ const dateWrapper = require('./date-wrapper'); +const querystring = require('querystring'); module.exports = class LayergroupMetadata { constructor (resourceLocator) { @@ -87,7 +88,7 @@ module.exports = class LayergroupMetadata { addTileJsonMetadata (layergroup, user, mapconfig, userApiKey = null) { const isVectorOnlyMapConfig = mapconfig.isVectorOnlyMapConfig(); let hasMapnikLayers = false; - const apiKey = userApiKey ? `?api_key=${userApiKey}` : ''; + const apiKey = userApiKey ? '?' + querystring.stringify({api_key: userApiKey}) : ''; layergroup.metadata.layers.forEach((layerMetadata, index) => { const layerId = mapconfig.getLayerId(index); From fcc36ddc8307bb91d0a59f9c939a7198e0daec83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 25 Jun 2018 16:31:13 +0200 Subject: [PATCH 6/6] News --- NEWS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 6f119d7f..25b434b2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -13,7 +13,7 @@ New features: - Fix a bug with zero length lines not being rendered when using the marker symbolizer. - Upgrades Camshaft to [0.61.11](https://github.com/CartoDB/camshaft/releases/tag/0.61.11): - Use Dollar-Quoted String Constants to avoid Syntax Error while running moran analyses. [0.61.10](https://github.com/CartoDB/camshaft/releases/tag/0.61.10) - - Quote name columns when performing trade area analysis to avoid Syntax Errors. [0.61.11](https://github.com/CartoDB/camshaft/releases/tag/0.61.11) + - Quote name columns when performing trade area analysis to avoid Syntax Errors. [0.61.11](https://github.com/CartoDB/camshaft/releases/tag/0.61.11) - Update other deps: - body-parser: 1.18.3 - cartodb-psql: 0.11.0 @@ -35,6 +35,7 @@ New features: - strftime: 0.10.0 - Optional instantiation metadata stats (https://github.com/CartoDB/Windshaft-cartodb/pull/952) - Experimental dates_as_numbers support +- Tiles base urls with api key Bug Fixes: - Validates tile coordinates (z/x/y) from request params to be a valid integer value.