diff --git a/frappe/auth.py b/frappe/auth.py index 003637da5c..90c4a4cf49 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -140,7 +140,7 @@ class LoginManager: if self.verification_method == 'SMS': user_phone = frappe.db.get_value('User', self.user, ['phone','mobile_no'], as_dict=1) usr_phone = user_phone.mobile_no or user_phone.phone - status = self.send_token_via_sms(token=token, phone_no=usr_phone, otpsecret=self.otp_secret) + status = self.send_token_via_sms(token=self.token, phone_no=usr_phone, otpsecret=self.otp_secret) verification_obj = {'token_delivery': status, 'prompt': status and 'Enter verification code sent to {}'.format(usr_phone[:4] + '******' + usr_phone[-3:]), 'method': 'SMS'} @@ -157,7 +157,7 @@ class LoginManager: 'qrcode': get_qr_svg_code(totp_uri), 'setup': otp_setup_completed } elif self.verification_method == 'Email': - status = self.send_token_via_email(token=token,otpsecret=self.otp_secret) + status = self.send_token_via_email(token=self.token, otpsecret=self.otp_secret) verification_obj = {'token_delivery': status, 'prompt': status and 'Enter verification code sent to your registered email address', 'method': 'Email'} @@ -165,7 +165,7 @@ class LoginManager: def process_2fa(self): if self.two_factor_auth_user(): - token = int(pyotp.TOTP(self.otp_secret).now()) + self.token = int(pyotp.TOTP(self.otp_secret).now()) verification_obj = self.get_verification_obj() tmp_id = frappe.generate_hash(length=8) @@ -175,7 +175,7 @@ class LoginManager: # set increased expiry time for SMS and Email if self.verification_method in ['SMS', 'Email']: expiry_time = 300 - frappe.cache().set(tmp_id + '_token', token) + frappe.cache().set(tmp_id + '_token', self.token) frappe.cache().expire(tmp_id + '_token', expiry_time) else: expiry_time = 180 @@ -212,7 +212,7 @@ class LoginManager: self.post_login() else: self.authenticate() - if frappe.db.get_value('System Settings', 'System Settings', 'enable_two_factor_auth') == unicode(1): + if (self.user != 'Administrator') and (frappe.db.get_value('System Settings', 'System Settings', 'enable_two_factor_auth') == unicode(1)): self.process_2fa() else: self.post_login(no_two_auth=True) @@ -417,21 +417,22 @@ class LoginManager: args[ss.receiver_parameter] = phone_no - status = send_request(ss.sms_gateway_url, args) - - if 200 <= status < 300: - return True - else: - return False + sms_args = {'gateway_url':ss.sms_gateway_url,'params':args} + enqueue(method=send_request, queue='short', timeout=300, event=None, async=True, job_name=None, now=False, **sms_args) + return True def send_token_via_email(self, token, otpsecret): + from frappe.utils.background_jobs import enqueue user_email = frappe.db.get_value('User', self.user, 'email') if not user_email: return False hotp = pyotp.HOTP(otpsecret) - frappe.sendmail(recipients=user_email, sender=None, subject='Verification Code', - message='
Your verification code is {}
'.format(hotp.at(int(token))), - delayed=False, retry=3) + email_args = { + 'recipients':user_email, 'sender':None, 'subject':'Verification Code', + 'message':'Your verification code is {}
'.format(hotp.at(int(token))), + 'delayed':False, 'retry':3 } + + enqueue(method=frappe.sendmail, queue='short', timeout=300, event=None, async=True, job_name=None, now=False, **email_args) return True class CookieManager: diff --git a/frappe/templates/includes/login/login.js b/frappe/templates/includes/login/login.js index 8d3c7f63f3..91477069ba 100644 --- a/frappe/templates/includes/login/login.js +++ b/frappe/templates/includes/login/login.js @@ -167,7 +167,7 @@ login.login_handlers = (function() { } else if (data.verification.method == 'SMS'){ continue_sms(data.verification.setup, data.verification.prompt); } else if (data.verification.method == 'Email'){ - continue_sms(data.verification.setup, data.verification.prompt); + continue_email(data.verification.setup, data.verification.prompt); } return false; @@ -288,7 +288,7 @@ var continue_sms = function(setup, prompt){ request_otp(); var sms_div = $('Verification code email will be sent to registered email address. Enter code received below
') $('#otp_div').prepend(email_div); frappe.call({