diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index ba040b58..f3f1acef 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -1,6 +1,6 @@ var _ = require('underscore') , Step = require('step') - , cartoData = require('cartodb-redis') + , cartoData = require('cartodb-redis')(global.environment.redis) , Cache = require('./cache_validator') , mapnik = require('mapnik') , crypto = require('crypto') @@ -304,6 +304,73 @@ module.exports = function(){ /* X-Cache-Channel generation } */ + /** + * Get privacy for cartodb table + * + * @param req - standard req object. Importantly contains table and host information + * @param callback - is the table private or not? + */ + me.authorize= function(req, callback) { + var that = this; + + Step( + function(){ + cartoData.checkMapKey(req, this); + }, + function checkIfInternal(err, check_result){ + if (err) throw err; + + // if unauthorized continue to check table privacy + if (check_result !== 1) return true; + + // authorized by key, login as db owner + var user_params = {}; + var auth_user = global.environment.postgres_auth_user; + var auth_pass = global.environment.postgres_auth_pass; + Step( + function getId() { + cartoData.getId(req, this); + }, + function(err, user_id) { + if (err) throw err; + user_params['user_id'] = user_id; + var dbuser = _.template(auth_user, user_params); + _.extend(req.params, {dbuser:dbuser}); + + // skip looking up user_password if postgres_auth_pass + // doesn't contain the "user_password" label + if ( ! auth_pass.match(/\buser_password\b/) ) return null; + + cartoData.getDatabasePassword(req, this); + }, + function(err, user_password) { + if (err) throw err; + user_params['user_password'] = user_password; + if ( auth_pass ) { + var dbpass = _.template(auth_pass, user_params); + _.extend(req.params, {dbpassword:dbpass}); + } + return true; + }, + function finish(err) { + callback(err, true); // authorized (or error) + } + ); + } + ,function getDatabase(err, data){ + if (err) throw err; + cartoData.getDatabase(req, this); + }, + function getPrivacy(err, data){ + if (err) throw err; + cartoData.getTablePrivacy(data, req.params.table, this); + }, + function(err, data){ + callback(err, data); + } + ); + }; + /** * Whitelist input and get database name & default geometry type from * subdomain/user metadata held in CartoDB Redis @@ -363,17 +430,17 @@ module.exports = function(){ req.params.processXML = function(req, xml, callback) { // Replace dbuser - var dbuser = req.params.dbuser || global.settings.postgres.user; + var dbuser = req.params.dbuser || global.environment.postgres.user; if ( ! me.rx_dbuser ) me.rx_dbuser = /(<\/Parameter>)/g; xml = xml.replace(me.rx_dbuser, "$1" + dbuser + "$2"); // Replace dbpass - var dbpass = req.params.dbpassword || global.settings.postgres.password; + var dbpass = req.params.dbpassword || global.environment.postgres.password; if ( ! me.rx_dbpass ) me.rx_dbpass = /(<\/Parameter>)/g; xml = xml.replace(me.rx_dbpass, "$1" + dbpass + "$2"); // Replace or set dbhost - var dbhost = req.params.dbhost || global.settings.postgres.host; + var dbhost = req.params.dbhost || global.environment.postgres.host; if ( ! me.rx_dbhost ) me.rx_dbhost = /(<\/Parameter>)/g; xml = xml.replace(me.rx_dbhost, "$1" + dbhost + "$2"); @@ -386,7 +453,7 @@ module.exports = function(){ Step( function getPrivacy(){ - cartoData.authorize(req, this); + me.authorize(req, this); }, function gatekeep(err, data){ if (req.profiler) req.profiler.done('cartoData.authorize'); diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 12ccc61d..2b739d45 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -273,7 +273,7 @@ "version": "2.9.202" }, "cartodb-redis": { - "version": "0.0.1", + "version": "0.1.0", "dependencies": { "generic-pool": { "version": "2.0.4" @@ -286,12 +286,12 @@ "lzma": { "version": "1.2.3" }, - "semver": { - "version": "1.1.4" - }, "strftime": { "version": "0.6.2" }, + "semver": { + "version": "1.1.4" + }, "redis": { "version": "0.8.6" }, diff --git a/package.json b/package.json index 4b6abde9..0fd708cc 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "windshaft" : "~0.14.3", "step": "0.0.x", "request": "2.9.202", - "cartodb-redis": "~0.0.1", + "cartodb-redis": "~0.1.0", "mapnik": "~0.7.22", "lzma": "~1.2.3" },