From 23b209047bae1848c75cf9f8810f13b7803013f6 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 16 Oct 2013 18:39:08 +0200 Subject: [PATCH] [FIX] google_drive, google_base_account: safer management of auth code, better usability Persist the auth code in the settings to show that it has already been set, even if it is not technically used by the system. Also fixed a variable referenced before assignment. bzr revid: odo@openerp.com-20131016163908-9d05x85me3n30ala --- .../google_base_account.py | 29 +++++++++---------- addons/google_drive/google_drive.py | 9 ++++-- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/addons/google_base_account/google_base_account.py b/addons/google_base_account/google_base_account.py index 50fbf233ce6..4f85db0582b 100644 --- a/addons/google_base_account/google_base_account.py +++ b/addons/google_base_account/google_base_account.py @@ -32,23 +32,22 @@ class google_service(osv.osv_memory): _name = 'google.service' def generate_refresh_token(self, cr, uid, service, authorization_code, context=None): - if authorization_code: - ir_config = self.pool['ir.config_parameter'] - client_id = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service) - client_secret = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_secret' % service) - redirect_uri = ir_config.get_param(cr, SUPERUSER_ID, 'google_redirect_uri') + ir_config = self.pool['ir.config_parameter'] + client_id = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service) + client_secret = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_secret' % service) + redirect_uri = ir_config.get_param(cr, SUPERUSER_ID, 'google_redirect_uri') - #Get the Refresh Token From Google And store it in ir.config_parameter - headers = {"Content-type": "application/x-www-form-urlencoded"} - data = dict(code=authorization_code, client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, grant_type="authorization_code") - data = urllib.urlencode(data) - try: - req = urllib2.Request("https://accounts.google.com/o/oauth2/token", data, headers) - content = urllib2.urlopen(req).read() - except urllib2.HTTPError: - raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong during your token generation. Maybe your Authorization Code is invalid or already expired"), context=context) + #Get the Refresh Token From Google And store it in ir.config_parameter + headers = {"Content-type": "application/x-www-form-urlencoded"} + data = dict(code=authorization_code, client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, grant_type="authorization_code") + data = urllib.urlencode(data) + try: + req = urllib2.Request("https://accounts.google.com/o/oauth2/token", data, headers) + content = urllib2.urlopen(req).read() + except urllib2.HTTPError: + raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong during your token generation. Maybe your Authorization Code is invalid or already expired"), context=context) - content = simplejson.loads(content) + content = simplejson.loads(content) return content.get('refresh_token') def _get_google_token_uri(self, cr, uid, service, scope, context=None): diff --git a/addons/google_drive/google_drive.py b/addons/google_drive/google_drive.py index 8bc487ada7c..8da706c5ffa 100644 --- a/addons/google_drive/google_drive.py +++ b/addons/google_drive/google_drive.py @@ -219,9 +219,14 @@ class base_config_settings(osv.osv): } _defaults = { 'google_drive_uri': lambda s, cr, uid, c: s.pool['google.service']._get_google_token_uri(cr, uid, 'drive', scope=s.pool['google.drive.config'].get_google_scope(), context=c), + 'google_drive_authorization_code': lambda s, cr, uid, c: s.pool['ir.config_parameter'].get_param(cr, uid, 'google_drive_authorization_code', context=c), } def set_google_authorization_code(self, cr, uid, ids, context=None): + ir_config_param = self.pool['ir.config_parameter'] config = self.browse(cr, uid, ids[0], context) - refresh_token = self.pool['google.service'].generate_refresh_token(cr, uid, 'drive', config.google_drive_authorization_code, context=context) - self.pool['ir.config_parameter'].set_param(cr, uid, 'google_drive_refresh_token', refresh_token) + auth_code = config.google_drive_authorization_code + if auth_code and auth_code != ir_config_param.get_param(cr, uid, 'google_drive_authorization_code', context=context): + refresh_token = self.pool['google.service'].generate_refresh_token(cr, uid, 'drive', config.google_drive_authorization_code, context=context) + ir_config_param.set_param(cr, uid, 'google_drive_authorization_code', auth_code) + ir_config_param.set_param(cr, uid, 'google_drive_refresh_token', refresh_token)