From 0c6b1c4481fa3114e2f059d56eaffa50c1e25acb Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 19 Jun 2017 21:39:09 +0530 Subject: [PATCH] [fix] fixes to oauth 2 token generation for frappe cloud users --- .../dropbox_settings/dropbox_settings.js | 13 +++++++- .../dropbox_settings/dropbox_settings.py | 31 +++++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js index 8b4215baac..272f8060ac 100644 --- a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js +++ b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js @@ -8,7 +8,7 @@ frappe.ui.form.on('Dropbox Settings', { }, allow_dropbox_access: function(frm) { - if ((frm.doc.app_access_key && frm.doc.app_secret_key) || frm.doc.dropbox_setup_via_site_config) { + if (frm.doc.app_access_key && frm.doc.app_secret_key) { frappe.call({ method: "frappe.integrations.doctype.dropbox_settings.dropbox_settings.get_dropbox_authorize_url", freeze: true, @@ -19,6 +19,17 @@ frappe.ui.form.on('Dropbox Settings', { } }) } + else if (frm.doc.dropbox_setup_via_site_config) { + frappe.call({ + method: "frappe.integrations.doctype.dropbox_settings.dropbox_settings.get_redirect_url", + freeze: true, + callback: function(r) { + if(!r.exc) { + window.open(r.message.redirect_to); + } + } + }) + } else { frappe.msgprint(__("Please enter values for App Access Key and App Secret Key")) } diff --git a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py index 479b8189e4..acd04a0d63 100644 --- a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +++ b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py @@ -10,8 +10,9 @@ from frappe.model.document import Document import dropbox from frappe.utils.backups import new_backup from frappe.utils.background_jobs import enqueue +from urlparse import urlparse, parse_qs from frappe.utils import (cint, split_emails, get_request_site_address, cstr, - get_files_path, get_backups_path, encode) + get_files_path, get_backups_path, encode, get_url) ignore_list = [".DS_Store"] @@ -180,7 +181,8 @@ def get_dropbox_settings(redirect_uri=False): app_details.update({ 'rediret_uri': get_request_site_address(True) \ + '/api/method/frappe.integrations.doctype.dropbox_settings.dropbox_settings.dropbox_auth_finish' \ - if settings.app_secret_key else frappe.conf.dropbox_rediret_uri, + if settings.app_secret_key else frappe.conf.dropbox_broker_site\ + + '/api/method/dropbox_erpnext_broker.www.setup_dropbox.generate_dropbox_access_token', }) if not app_details['app_key'] or not app_details['app_secret']: @@ -188,6 +190,12 @@ def get_dropbox_settings(redirect_uri=False): return app_details +@frappe.whitelist() +def get_redirect_url(): + return { + "redirect_to": "{0}/setup_dropbox?site={1}".format(frappe.conf.dropbox_broker_site, get_url()) + } + @frappe.whitelist() def get_dropbox_authorize_url(): app_details = get_dropbox_settings(redirect_uri=True) @@ -200,10 +208,14 @@ def get_dropbox_authorize_url(): ) auth_url = dropbox_oauth_flow.start() - return {"auth_url": auth_url} + + return { + "auth_url": auth_url, + "args": parse_qs(urlparse(auth_url).query) + } @frappe.whitelist() -def dropbox_auth_finish(): +def dropbox_auth_finish(return_access_token=False): app_details = get_dropbox_settings(redirect_uri=True) callback = frappe.form_dict close = '

' + _('Please close this window') + '

' @@ -218,8 +230,10 @@ def dropbox_auth_finish(): if callback.state or callback.code: token = dropbox_oauth_flow.finish({'state': callback.state, 'code': callback.code}) - frappe.db.set_value("Dropbox Settings", None, 'dropbox_access_token', token.access_token) - frappe.db.commit() + if return_access_token and token.access_token: + return token.access_token, callback.state + + set_dropbox_access_token(token.access_token) else: frappe.respond_as_web_page(_("Dropbox Setup"), _("Illegal Access Token. Please try again") + close, @@ -229,3 +243,8 @@ def dropbox_auth_finish(): frappe.respond_as_web_page(_("Dropbox Setup"), _("Dropbox access is approved!") + close, indicator_color='green') + +@frappe.whitelist(allow_guest=True) +def set_dropbox_access_token(access_token): + frappe.db.set_value("Dropbox Settings", None, 'dropbox_access_token', access_token) + frappe.db.commit()