Windshaft-cartodb/test/unit/prepare-context-test.js

237 lines
8.3 KiB
JavaScript
Raw Normal View History

'use strict';
2015-03-24 00:54:37 +08:00
var assert = require('assert');
var _ = require('underscore');
var RedisPool = require('redis-mpool');
var cartodbRedis = require('cartodb-redis');
2019-10-07 17:29:07 +08:00
var PgConnection = require('../../lib/backends/pg-connection');
var AuthBackend = require('../../lib/backends/auth');
var TemplateMaps = require('../../lib/backends/template-maps');
const MapStore = require('../support/map-store');
2019-10-07 17:29:07 +08:00
const cleanUpQueryParamsMiddleware = require('../../lib/api/middlewares/clean-up-query-params');
const authorizeMiddleware = require('../../lib/api/middlewares/authorize');
const dbConnSetupMiddleware = require('../../lib/api/middlewares/db-conn-setup');
const credentialsMiddleware = require('../../lib/api/middlewares/credentials');
2019-10-22 01:07:24 +08:00
describe('prepare-context', function () {
2019-11-06 23:44:17 +08:00
var testUser = _.template(global.environment.postgres_auth_user, { user_id: 1 });
var testPubuser = global.environment.postgres.user;
var testDatabase = testUser + '_db';
let cleanUpQueryParams;
let dbConnSetup;
let authorize;
2018-03-12 18:52:38 +08:00
let setCredentials;
2019-10-22 01:07:24 +08:00
before(function () {
var redisPool = new RedisPool(global.environment.redis);
var mapStore = new MapStore(redisPool);
2019-10-22 01:07:24 +08:00
var metadataBackend = cartodbRedis({ pool: redisPool });
var pgConnection = new PgConnection(metadataBackend);
var templateMaps = new TemplateMaps(redisPool);
2018-04-10 00:08:56 +08:00
var authBackend = new AuthBackend(pgConnection, metadataBackend, mapStore, templateMaps);
cleanUpQueryParams = cleanUpQueryParamsMiddleware();
2018-04-10 00:08:56 +08:00
authorize = authorizeMiddleware(authBackend);
dbConnSetup = dbConnSetupMiddleware(pgConnection);
2018-03-12 18:52:38 +08:00
setCredentials = credentialsMiddleware();
});
2019-10-22 01:07:24 +08:00
it('can be found in server-options', function () {
assert.ok(_.isFunction(authorize));
assert.ok(_.isFunction(dbConnSetup));
assert.ok(_.isFunction(cleanUpQueryParams));
});
2019-10-22 01:07:24 +08:00
function prepareRequest (req) {
req.profiler = {
2019-10-22 01:07:24 +08:00
done: function () {}
};
2017-10-03 23:47:57 +08:00
return req;
}
2019-10-22 01:07:24 +08:00
function prepareResponse (res) {
if (!res.locals) {
2017-10-03 23:47:57 +08:00
res.locals = {};
}
res.locals.user = 'localhost';
2018-03-06 22:26:35 +08:00
res.set = function () {};
return res;
2015-07-08 21:34:46 +08:00
}
2019-10-22 01:07:24 +08:00
it('cleans up request', function (done) {
var req = { headers: { host: 'localhost' }, query: { dbuser: 'hacker', dbname: 'secret' } };
var res = {};
cleanUpQueryParams(prepareRequest(req), prepareResponse(res), function (err) {
if (err) { done(err); return; }
assert.ok(_.isObject(req.query), 'request has query');
assert.ok(!Object.prototype.hasOwnProperty.call(req.query, 'dbuser'), 'dbuser was removed from query');
assert.ok(Object.prototype.hasOwnProperty.call(res, 'locals'), 'response has locals');
assert.ok(!Object.prototype.hasOwnProperty.call(res.locals, 'interactivity'), 'response locals do not have interactivity');
2019-10-22 01:07:24 +08:00
done();
});
});
2019-10-22 01:07:24 +08:00
it('sets dbname from redis metadata', function (done) {
var req = { headers: { host: 'localhost' }, query: {} };
var res = { set: function () {} };
dbConnSetup(prepareRequest(req), prepareResponse(res), function (err) {
if (err) { done(err); return; }
assert.ok(_.isObject(req.query), 'request has query');
assert.ok(!Object.prototype.hasOwnProperty.call(req.query, 'dbuser'), 'dbuser was removed from query');
assert.ok(Object.prototype.hasOwnProperty.call(res, 'locals'), 'response has locals');
assert.ok(!Object.prototype.hasOwnProperty.call(res.locals, 'interactivity'), 'response locals do not have interactivity');
2019-11-06 23:44:17 +08:00
assert.strictEqual(res.locals.dbname, testDatabase);
assert.ok(res.locals.dbuser === testPubuser, 'could inject dbuser (' + res.locals.dbuser + ')');
2019-10-22 01:07:24 +08:00
done();
});
});
2019-10-22 01:07:24 +08:00
it('sets also dbuser for authenticated requests', function (done) {
2018-03-12 18:52:38 +08:00
var req = {
headers: {
host: 'localhost'
},
2018-02-08 00:14:46 +08:00
query: {
api_key: '1234'
}
};
2018-03-12 18:52:38 +08:00
var res = {
2018-02-08 00:14:46 +08:00
set: function () {},
locals: {
2018-03-12 18:52:38 +08:00
api_key: '1234'
2018-02-08 00:14:46 +08:00
}
};
// FIXME: review authorize-pgconnsetup workflow, It might we are doing authorization twice.
authorize(prepareRequest(req), prepareResponse(res), function (err) {
if (err) { done(err); return; }
2019-10-22 01:07:24 +08:00
dbConnSetup(req, res, function (err) {
if (err) { done(err); return; }
assert.ok(_.isObject(req.query), 'request has query');
assert.ok(!Object.prototype.hasOwnProperty.call(req.query, 'dbuser'), 'dbuser was removed from query');
assert.ok(Object.prototype.hasOwnProperty.call(res, 'locals'), 'response has locals');
assert.ok(!Object.prototype.hasOwnProperty.call(res.locals, 'interactivity'), 'request params do not have interactivity');
2019-11-06 23:44:17 +08:00
assert.strictEqual(res.locals.dbname, testDatabase);
assert.strictEqual(res.locals.dbuser, testUser);
req = {
headers: {
2019-10-22 01:07:24 +08:00
host: 'localhost'
},
query: {
map_key: '1235'
2017-10-02 18:28:29 +08:00
}
};
res = { set: function () {} };
2017-10-03 23:47:57 +08:00
2019-10-22 01:07:24 +08:00
dbConnSetup(prepareRequest(req), prepareResponse(res), function () {
// wrong key resets params to no user
2019-11-06 23:44:17 +08:00
assert.ok(res.locals.dbuser === testPubuser, 'could inject dbuser (' + res.locals.dbuser + ')');
done();
});
});
});
});
2019-10-22 01:07:24 +08:00
it('it should remove invalid params', function (done) {
var config = {
version: '1.3.0'
};
var req = {
headers: {
2019-10-22 01:07:24 +08:00
host: 'localhost'
},
query: {
non_included: 'toberemoved',
api_key: 'test',
style: 'override',
config: config
}
2015-03-24 00:54:37 +08:00
};
var res = {};
2018-03-12 18:52:38 +08:00
cleanUpQueryParams(prepareRequest(req), prepareResponse(res), function (err) {
2019-10-22 01:07:24 +08:00
if (err) {
return done(err);
}
assert.deepStrictEqual(config, req.query.config);
assert.strictEqual('test', req.query.api_key);
assert.strictEqual(undefined, req.query.non_included);
done();
});
});
2015-03-24 00:54:37 +08:00
2019-10-22 01:07:24 +08:00
describe('Set apikey token', function () {
2018-02-15 19:50:42 +08:00
it('from query param', function (done) {
var req = {
headers: {
host: 'localhost'
},
query: {
2019-10-22 01:07:24 +08:00
api_key: '1234'
2018-02-15 19:50:42 +08:00
}
};
var res = {};
2018-03-12 18:52:38 +08:00
setCredentials(prepareRequest(req), prepareResponse(res), function (err) {
2018-02-15 19:50:42 +08:00
if (err) {
return done(err);
}
var query = res.locals;
2018-03-12 18:52:38 +08:00
assert.strictEqual('1234', query.api_key);
done();
});
});
it('from body param', function (done) {
var req = {
headers: {
host: 'localhost'
},
body: {
2019-10-22 01:07:24 +08:00
api_key: '1234'
}
};
var res = {};
2018-03-12 18:52:38 +08:00
setCredentials(prepareRequest(req), prepareResponse(res), function (err) {
if (err) {
return done(err);
}
var query = res.locals;
assert.strictEqual('1234', query.api_key);
done();
});
});
it('from http header', function (done) {
var req = {
headers: {
host: 'localhost',
2019-10-22 01:07:24 +08:00
authorization: 'Basic bG9jYWxob3N0OjEyMzQ=' // user: localhost, password: 1234
}
};
var res = {};
2018-03-12 18:52:38 +08:00
setCredentials(prepareRequest(req), prepareResponse(res), function (err) {
if (err) {
return done(err);
}
var query = res.locals;
assert.strictEqual('1234', query.api_key);
done();
});
});
2018-02-15 19:50:42 +08:00
});
});