def send_user_otp(mobile=None, user=None): try: '''Authenticate using otp.''' from frappe.twofactor import (should_run_2fa, authenticate_for_2factor,get_otpsecret_for_, confirm_otp_token, send_token_via_sms, send_token_via_email) import pyotp, os if mobile: user = frappe.db.get_value('User', {"mobile_no":mobile},'name') recipients = [] recipients = recipients + mobile.split("\n") recipients = list(set(recipients)) otp_secret = get_otpsecret_for_(user) token = int(pyotp.TOTP(otp_secret).now()) hotp = pyotp.HOTP(otp_secret) otp = hotp.at(int(token)) frappe.log_error(otp, "userverification") # otp_issuer="INGC" message = 'Your verification code is {otp}'.format(otp=otp) status = send_sms(recipients, message) verification_obj = { 'token_delivery': status, 'prompt': status and 'Enter verification code sent to {}'.format(mobile[:4] + '******' + mobile[-3:]), "user": user, "tmp_id":token } return verification_obj except Exception as e: frappe.log_error(frappe.get_traceback(), "myjobpro.api.send_user_otp")
def user_verification(otp=None, mobile=None, tmp_id=None, user=None): try: import pyotp, os from frappe.twofactor import get_otpsecret_for_ if mobile: user = frappe.db.get_value('User', {"mobile_no":mobile},'name') otp_secret = get_otpsecret_for_(user) hotp = pyotp.HOTP(otp_secret) if tmp_id: if hotp.verify(otp, int(tmp_id)): return { 'status': 'success', 'user':user } # frappe.local.login_manager.login_as(user) # frappe.local.response['status'] = 'Success' # frappe.local.response['message'] = 'Logged In' # frappe.local.response["home_page"] = "/" else: return frappe.throw(_('Incorrect Verification code'), user) except Exception as e: frappe.log_error(frappe.get_traceback(), "myjobpro.api.verify_user_otp") return { 'status':'failed' }
def get_otp(user): otp_secret = get_otpsecret_for_(user) otp = pyotp.TOTP(otp_secret) return otp.now()
def test_get_verification_obj(self): '''Confirm verification object is returned.''' otp_secret = get_otpsecret_for_(self.user) token = int(pyotp.TOTP(otp_secret).now()) self.assertTrue(get_verification_obj(self.user, token, otp_secret))
def test_get_otpsecret_for_user(self): '''OTP secret should be set for user.''' self.assertTrue(get_otpsecret_for_(self.user)) self.assertTrue(frappe.db.get_default(self.user + '_otpsecret'))
def test_get_otpsecret_for_user(self): """OTP secret should be set for user.""" self.assertTrue(get_otpsecret_for_(self.user)) self.assertTrue(frappe.db.get_default(self.user + "_otpsecret"))
def test_get_verification_obj(self): '''Confirm verification object is returned.''' otp_secret = get_otpsecret_for_(self.user) token = int(pyotp.TOTP(otp_secret).now()) self.assertTrue(get_verification_obj(self.user,token,otp_secret))