From 97ba7be42de4c60e53de883609621732f4369297 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Thu, 13 Oct 2011 12:47:50 +0200 Subject: [PATCH 1/2] [IMP] res.users,web_services: new authenticate() API method for testing credentials Provides a way to login for a given environment, passing user agent environment parameters. Currently used to initialize the web.base.url config parameter based on the web host whenever the admin user logs in. bzr revid: odo@openerp.com-20111013104750-y0natm9v3wapn10l --- openerp/addons/base/res/res_users.py | 27 +++++++++++++++++++++++++++ openerp/service/web_services.py | 27 +++++++++++++++++---------- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 2275ba76014..0eb70945b6d 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -35,6 +35,7 @@ from osv import fields,osv from osv.orm import browse_record from service import security from tools.translate import _ +import openerp import openerp.exceptions class groups(osv.osv): @@ -417,6 +418,32 @@ class users(osv.osv): data_id = dataobj._get_id(cr, 1, 'base', 'action_res_users_my') return dataobj.browse(cr, uid, data_id, context=context).res_id + def authenticate(self, db, login, password, user_agent_env): + """Verifies and returns the user ID corresponding to the given + ``login`` and ``password`` combination, or False if there was + no matching user. + + :param str db: the database on which user is trying to authenticate + :param str login: username + :param str password: user password + :param dict user_agent_env: environment dictionary describing any + relevant environment attributes + """ + uid = self.login(db, login, password) + if uid == openerp.SUPERUSER_ID: + # Successfully logged in as admin! + # Attempt to guess the web base url... + if user_agent_env and 'host' in user_agent_env: + cr = pooler.get_db(db).cursor() + try: + self.pool.get('ir.config_parameter').set_param(cr, uid, 'web.base.url', + user_agent_env['host']) + cr.commit() + except Exception: + logging.getLogger('res.users').exception("Failed to update web.base.url configuration parameter") + finally: + cr.close() + return uid def login(self, db, login, password): if not password: diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index 5f0a1dccff9..2cf8a848378 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -366,20 +366,15 @@ class db(netsvc.ExportService): return True class common(netsvc.ExportService): + _logger = logging.getLogger('web-services') + def __init__(self,name="common"): netsvc.ExportService.__init__(self,name) def dispatch(self, method, params): - logger = netsvc.Logger() - if method == 'login': - res = security.login(params[0], params[1], params[2]) - msg = res and 'successful login' or 'bad login or password' - # TODO log the client ip address.. - logger.notifyChannel("web-service", netsvc.LOG_INFO, "%s from '%s' using database '%s'" % (msg, params[1], params[0].lower())) - return res or False - elif method in ['about', 'timezone_get', 'get_server_environment', - 'login_message','get_stats', 'check_connectivity', - 'list_http_services', 'version']: + if method in ['login', 'about', 'timezone_get', 'get_server_environment', + 'login_message','get_stats', 'check_connectivity', + 'list_http_services', 'version', 'authenticate']: pass elif method in ['get_available_updates', 'get_migration_scripts', 'set_loglevel', 'get_os_time', 'get_sqlcount']: passwd = params[0] @@ -391,6 +386,18 @@ class common(netsvc.ExportService): fn = getattr(self, 'exp_'+method) return fn(*params) + def exp_login(self, db, login, password): + # TODO: legacy indirection through 'security', should use directly + # the res.users model + res = security.login(db, login, password) + msg = res and 'successful login' or 'bad login or password' + self._logger.info("%s from '%s' using database '%s'", msg, login, db.lower()) + return res or False + + def exp_authenticate(self, db, login, password, user_agent_env): + res_users = pooler.get_pool(db).get('res.users') + return res_users.authenticate(db, login, password, user_agent_env) + def exp_version(self): return RPC_VERSION_1 From bd7c5ee6f86e53e5ece986cd703b2c123f2e971f Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 13 Oct 2011 16:32:45 +0200 Subject: [PATCH 2/2] [IMP] base: authenticate: use "base_location" key instead on "host" bzr revid: chs@openerp.com-20111013143245-vrcs89hennc2beu4 --- openerp/addons/base/res/res_users.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 0eb70945b6d..740876eea83 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -433,11 +433,11 @@ class users(osv.osv): if uid == openerp.SUPERUSER_ID: # Successfully logged in as admin! # Attempt to guess the web base url... - if user_agent_env and 'host' in user_agent_env: + if user_agent_env and user_agent_env.get('base_location'): cr = pooler.get_db(db).cursor() try: self.pool.get('ir.config_parameter').set_param(cr, uid, 'web.base.url', - user_agent_env['host']) + user_agent_env['base_location']) cr.commit() except Exception: logging.getLogger('res.users').exception("Failed to update web.base.url configuration parameter")