From cb7fb97a132b95f94d65497201ea6a61f2856296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 18 Dec 2017 11:14:27 +0100 Subject: [PATCH 1/5] escape chars function --- lib/cartodb/middleware/error-middleware.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/cartodb/middleware/error-middleware.js b/lib/cartodb/middleware/error-middleware.js index f3f2eb36..6e45f1da 100644 --- a/lib/cartodb/middleware/error-middleware.js +++ b/lib/cartodb/middleware/error-middleware.js @@ -189,3 +189,22 @@ function setErrorHeader(errors, statusCode, res) { res.set('X-Tiler-Errors', JSON.stringify(errorsLog)); } + +/** + * Remove problematic nested characters + * from object for logs RegEx + * + * @param {Object} object + */ +function stringifyForLogs(object) { + Object.keys(object).map(key => { + const value = object[key]; + if (object instanceof Object) { + stringifyForLogs(value); + } else { + object[key] = object[key].replace(/[^a-zA-Z0-9]/g, ' '); + } + }); + + return JSON.stringify(object); +} \ No newline at end of file From a46f7b309955179139a5eaa29733fa1104d82d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 18 Dec 2017 12:34:56 +0100 Subject: [PATCH 2/5] nested options and using it --- lib/cartodb/middleware/error-middleware.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/cartodb/middleware/error-middleware.js b/lib/cartodb/middleware/error-middleware.js index 6e45f1da..9246ca7f 100644 --- a/lib/cartodb/middleware/error-middleware.js +++ b/lib/cartodb/middleware/error-middleware.js @@ -187,7 +187,7 @@ function setErrorHeader(errors, statusCode, res) { }; }); - res.set('X-Tiler-Errors', JSON.stringify(errorsLog)); + res.set('X-Tiler-Errors', stringifyForLogs(errorsLog)); } /** @@ -198,13 +198,16 @@ function setErrorHeader(errors, statusCode, res) { */ function stringifyForLogs(object) { Object.keys(object).map(key => { - const value = object[key]; - if (object instanceof Object) { - stringifyForLogs(value); - } else { + if (typeof object[key] === 'object') { + stringifyForLogs(object[key]); + } else if (object[key] instanceof Array) { + for (let element of object[key]) { + stringifyForLogs(element); + } + } else if(typeof object[key] === 'string') { object[key] = object[key].replace(/[^a-zA-Z0-9]/g, ' '); } }); return JSON.stringify(object); -} \ No newline at end of file +} \ No newline at end of file From a57cd25bece34f98f02fb573f0b35cb9133ce80a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 18 Dec 2017 12:35:44 +0100 Subject: [PATCH 3/5] test escape chars function --- test/unit/cartodb/error-middleware.test.js | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/test/unit/cartodb/error-middleware.test.js b/test/unit/cartodb/error-middleware.test.js index 4e235c4a..861bec54 100644 --- a/test/unit/cartodb/error-middleware.test.js +++ b/test/unit/cartodb/error-middleware.test.js @@ -122,4 +122,57 @@ describe('error-middleware', function() { done(); }); + + it('should escape chars that broke logs regex', function (done) { + const badString = 'error: ( ) = " \" \' * $ & |'; + const escapedString = 'error '; + + const error = new Error(badString); + error.label = badString; + error.type = badString; + error.subtype = badString; + + const errors = [error, error]; + + const req = {}; + const res = { + headers: {}, + set (key, value) { + this.headers[key] = value; + }, + statusCode: 0, + status (status) { + this.statusCode = status; + }, + json () {}, + send () {} + }; + + const errorHeader = { + mainError: { + statusCode: 400, + message: escapedString, + name: error.name, + label: escapedString, + type: escapedString, + subtype: escapedString, + }, + moreErrors: [{ + message: escapedString, + name: error.name, + label: escapedString, + type: escapedString, + subtype: escapedString + }] + }; + + const errorFn = errorMiddleware(); + errorFn(errors, req, res); + + assert.deepEqual(res.headers, { + 'X-Tiler-Errors': JSON.stringify(errorHeader) + }); + + done(); + }); }); From 14e90a6c7633803b02d053bbeab30be4923a6470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 18 Dec 2017 12:59:44 +0100 Subject: [PATCH 4/5] add line at EOF --- lib/cartodb/middleware/error-middleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/middleware/error-middleware.js b/lib/cartodb/middleware/error-middleware.js index 9246ca7f..12406019 100644 --- a/lib/cartodb/middleware/error-middleware.js +++ b/lib/cartodb/middleware/error-middleware.js @@ -210,4 +210,4 @@ function stringifyForLogs(object) { }); return JSON.stringify(object); -} \ No newline at end of file +} From 77f64bee8c9299adb2a96b305917daa3d6aa0806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Mon, 18 Dec 2017 14:54:36 +0100 Subject: [PATCH 5/5] stringifyForLogs more usual case first --- lib/cartodb/middleware/error-middleware.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/middleware/error-middleware.js b/lib/cartodb/middleware/error-middleware.js index 12406019..85f38936 100644 --- a/lib/cartodb/middleware/error-middleware.js +++ b/lib/cartodb/middleware/error-middleware.js @@ -198,14 +198,14 @@ function setErrorHeader(errors, statusCode, res) { */ function stringifyForLogs(object) { Object.keys(object).map(key => { - if (typeof object[key] === 'object') { + if(typeof object[key] === 'string') { + object[key] = object[key].replace(/[^a-zA-Z0-9]/g, ' '); + } else if (typeof object[key] === 'object') { stringifyForLogs(object[key]); } else if (object[key] instanceof Array) { for (let element of object[key]) { stringifyForLogs(element); } - } else if(typeof object[key] === 'string') { - object[key] = object[key].replace(/[^a-zA-Z0-9]/g, ' '); } });