From 281588abd2f35e1366b3106199edaa7524a2d2e8 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 2 Feb 2017 16:12:49 +0100 Subject: [PATCH 1/2] Add test to validate `bins` param is casted as Number --- test/acceptance/dataviews/histogram.js | 20 ++++++++++++++++++++ test/support/test-client.js | 14 ++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/test/acceptance/dataviews/histogram.js b/test/acceptance/dataviews/histogram.js index 5d5ff000..abbaef61 100644 --- a/test/acceptance/dataviews/histogram.js +++ b/test/acceptance/dataviews/histogram.js @@ -77,4 +77,24 @@ describe('histogram-dataview', function() { done(); }); }); + + it('should cast all overridable params to numbers', function(done) { + var params = { + bins: '256 AS other, (select 256 * 2) AS bins_number--', + start: 1e3, + end: 0, + response: TestClient.RESPONSE.ERROR + }; + + this.testClient = new TestClient(mapConfig, 1234); + this.testClient.getDataview('pop_max_histogram', params, function(err, res) { + assert.ok(!err, err); + + assert.ok(res.errors); + assert.equal(res.errors.length, 1); + assert.ok(res.errors[0].match(/Invalid number format for parameter 'bins'/)); + + done(); + }); + }); }); diff --git a/test/support/test-client.js b/test/support/test-client.js index f5d3789c..75fa51e0 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -307,6 +307,13 @@ TestClient.prototype.getDataview = function(dataviewName, params, callback) { url += '?' + qs.stringify(extraParams); } + var expectedResponse = params.response || { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + var layergroupId; step( function createLayergroup() { @@ -372,12 +379,7 @@ TestClient.prototype.getDataview = function(dataviewName, params, callback) { host: 'localhost' } }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, + expectedResponse, function(res, err) { if (err) { return next(err); From 12279d5c00b77f42782f3375689a1b2c4a90880f Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 2 Feb 2017 16:20:16 +0100 Subject: [PATCH 2/2] Cast dataview override values to Number or throw error We were letting params expected as Numbers to be passed as any type when they were not Numbers. --- lib/cartodb/backends/dataview.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/backends/dataview.js b/lib/cartodb/backends/dataview.js index 0be51713..e0515efe 100644 --- a/lib/cartodb/backends/dataview.js +++ b/lib/cartodb/backends/dataview.js @@ -79,7 +79,10 @@ DataviewBackend.prototype.getDataview = function (mapConfigProvider, user, param var overrideParams = _.reduce(_.pick(params, 'start', 'end', 'bins'), function castNumbers(overrides, val, k) { - overrides[k] = Number.isFinite(+val) ? +val : val; + if (!Number.isFinite(+val)) { + throw new Error('Invalid number format for parameter \'' + k + '\''); + } + overrides[k] = +val; return overrides; }, {ownFilter: ownFilter}