Add XML processor to change database user when authenticated
This commit is contained in:
@@ -90,7 +90,7 @@ module.exports = function() {
|
|||||||
that.getId(req, function(err, user_id) {
|
that.getId(req, function(err, user_id) {
|
||||||
if (err) throw new Error(err);
|
if (err) throw new Error(err);
|
||||||
var dbuser = _.template(global.settings.postgres.db_user, {user_id: user_id});
|
var dbuser = _.template(global.settings.postgres.db_user, {user_id: user_id});
|
||||||
_.extend(req.params, {dbuser:dbuser});
|
_.extend(req, {dbuser:dbuser});
|
||||||
callback(err, true);
|
callback(err, true);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -27,45 +27,12 @@ var CartodbWindshaft = function(serverOptions) {
|
|||||||
|
|
||||||
serverOptions.beforeStateChange = function(req, callback) {
|
serverOptions.beforeStateChange = function(req, callback) {
|
||||||
var err = null;
|
var err = null;
|
||||||
if ( ! req.params.hasOwnProperty('dbuser') ) {
|
if ( ! req.hasOwnProperty('dbuser') ) {
|
||||||
err = new Error("map state cannot be changed by unauthenticated request!");
|
err = new Error("map state cannot be changed by unauthenticated request!");
|
||||||
}
|
}
|
||||||
callback(err, req);
|
callback(err, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
serverOptions.afterStyleChange = function(req, data, callback) {
|
|
||||||
if ( req.params.hasOwnProperty('dbuser') ) {
|
|
||||||
// also change the style of the anonim. request
|
|
||||||
var params = _.extend(req.params); // make a copy here
|
|
||||||
delete params.dbuser;
|
|
||||||
var style = req.body.style;
|
|
||||||
var that = this;
|
|
||||||
this.setStyle(params, style, function(err, data) {
|
|
||||||
if ( err ) callback(err, null);
|
|
||||||
else that.afterStateChange(req, data, callback);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
callback(new Error("map style cannot be changed by unauthenticated request!"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
serverOptions.afterStyleDelete = function(req, data, callback) {
|
|
||||||
if ( req.params.hasOwnProperty('dbuser') ) {
|
|
||||||
// also change the style of the anonim. request
|
|
||||||
var params = _.extend(req.params); // make a copy here
|
|
||||||
delete params.dbuser;
|
|
||||||
var that = this;
|
|
||||||
this.delStyle(params, function(err, data) {
|
|
||||||
if ( err ) callback(err, null);
|
|
||||||
else that.afterStateChange(req, data, callback);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
callback(new Error("map style cannot be deleted by unauthenticated request!"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// boot
|
// boot
|
||||||
var ws = new Windshaft.Server(serverOptions);
|
var ws = new Windshaft.Server(serverOptions);
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,14 @@ module.exports = function(){
|
|||||||
// for cartodb, ensure interactivity is cartodb_id or user specified
|
// for cartodb, ensure interactivity is cartodb_id or user specified
|
||||||
req.params.interactivity = req.params.interactivity || 'cartodb_id';
|
req.params.interactivity = req.params.interactivity || 'cartodb_id';
|
||||||
|
|
||||||
|
req.params.processXML = function(req, xml, callback) {
|
||||||
|
if ( req.dbuser ) {
|
||||||
|
// Only edit XML when authenticated
|
||||||
|
xml = xml.replace(/(<Parameter name="user"><!\[CDATA\[)[^\]]*(]]><\/Parameter>)/, "$1" + req.dbuser + "$2");
|
||||||
|
}
|
||||||
|
callback(null, xml);
|
||||||
|
}
|
||||||
|
|
||||||
Step(
|
Step(
|
||||||
function getPrivacy(){
|
function getPrivacy(){
|
||||||
cartoData.authorize(req, this);
|
cartoData.authorize(req, this);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ suite('req2params', function() {
|
|||||||
assert.ok(req.hasOwnProperty('params'), 'request has params');
|
assert.ok(req.hasOwnProperty('params'), 'request has params');
|
||||||
assert.ok(req.params.hasOwnProperty('interactivity'), 'request params have interactivity');
|
assert.ok(req.params.hasOwnProperty('interactivity'), 'request params have interactivity');
|
||||||
assert.ok(_.isNull(req.params.dbname), 'could forge dbname');
|
assert.ok(_.isNull(req.params.dbname), 'could forge dbname');
|
||||||
assert.ok(!req.params.hasOwnProperty('dbuser'), 'could inject dbuser ('+req.params.dbuser+')');
|
assert.ok(!req.hasOwnProperty('dbuser'), 'could inject dbuser ('+req.params.dbuser+')');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -53,11 +53,11 @@ suite('req2params', function() {
|
|||||||
// database_name for user "vizzuality" (see test/support/prepare_db.sh)
|
// database_name for user "vizzuality" (see test/support/prepare_db.sh)
|
||||||
assert.equal(req.params.dbname, 'cartodb_test_user_1_db');
|
assert.equal(req.params.dbname, 'cartodb_test_user_1_db');
|
||||||
// id for user "vizzuality" (see test/support/prepare_db.sh)
|
// id for user "vizzuality" (see test/support/prepare_db.sh)
|
||||||
assert.equal(req.params.dbuser, 'test_cartodb_user_1');
|
assert.equal(req.dbuser, 'test_cartodb_user_1');
|
||||||
|
|
||||||
opts.req2params({headers: { host:'vizzuality' }, query: {map_key: '1235'} }, function(err, req) {
|
opts.req2params({headers: { host:'vizzuality' }, query: {map_key: '1235'} }, function(err, req) {
|
||||||
// wrong key resets params to no user
|
// wrong key resets params to no user
|
||||||
assert.ok(!req.params.hasOwnProperty('dbuser'), 'could inject dbuser ('+req.params.dbuser+')');
|
assert.ok(!req.hasOwnProperty('dbuser'), 'could inject dbuser ('+req.params.dbuser+')');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user