def pin_login(user, pin, device=None): """ Login using the user's email and the quick login pin :param user: The active user :param pin: The quick login pin :param device: Clear all sessions of device """ from frappe.sessions import clear_sessions login = LoginManager() if not frappe.cache().get_value( f'can_use_quick_login_pin', user=user, expires=True): login.fail('Quick Login PIN time expired', user=user) login.check_if_enabled(user) if not check_password( user, pin, doctype='User', fieldname='quick_login_pin'): login.fail('Incorrect password', user=user) login.login_as(user) login.resume = False login.run_trigger('on_session_creation') if device: clear_sessions(user, True, device) return frappe.session.user
def get_token(user, pwd, expires_in=3600, expire_on=None, device=None): """ Get the JWT Token :param user: The user in ctx :param pwd: Pwd to auth :param expires_in: number of seconds till expiry :param expire_on: yyyy-mm-dd HH:mm:ss to specify the expiry (deprecated) :param device: The device in ctx """ if not frappe.db.exists("User", user): raise frappe.ValidationError(_("Invalide User")) from frappe.sessions import clear_sessions login = LoginManager() login.check_if_enabled(user) if not check_password(user, pwd): login.fail('Incorrect password', user=user) login.login_as(user) login.resume = False login.run_trigger('on_session_creation') _expires_in = 3600 if cint(expires_in): _expires_in = cint(expires_in) elif expire_on: _expires_in = (get_datetime(expire_on) - get_datetime()).total_seconds() token = get_bearer_token(user=user, expires_in=_expires_in) frappe.local.response["token"] = token["access_token"] frappe.local.response.update(token)
def pin_login(user, pin, device=None): from frappe.sessions import clear_sessions login = LoginManager() login.check_if_enabled(user) p = frappe.db.get_value("User", user, "quick_login_pin") if pin != p: login.fail('Incorrect password', user=user) login.login_as(user) login.resume = False login.run_trigger('on_session_creation') if device: clear_sessions(user, True, device) return frappe.session.user
def get_token(user, pwd, expire_on=None, device=None): if not frappe.db.exists("User", user): raise frappe.ValidationError(_("Invalide User")) from frappe.sessions import clear_sessions login = LoginManager() login.check_if_enabled(user) if not check_password(user, pwd): login.fail('Incorrect password', user=user) login.login_as(user) login.resume = False login.run_trigger('on_session_creation') clear_sessions(user, True, device) if expire_on: frappe.flags.jwt_expire_on = expire_on
def verify_otp(medium="sms", medium_id=None, otp=None, login_to_user=False, purpose="login"): """ Verify the OTP against the previously generated OTP. :param medium: 'email' or 'sms' :param medium_id: The actual email/mobile_no :param otp: User input :param login_to_user: Check this flag to login to the associated user :param purpose: If purpose was specified while calling generate_otp, it is mandatory to use the same here """ if medium not in ("sms", "email"): frappe.throw("medium can only be 'sms' or 'email'") if not medium_id: frappe.throw(f"medium_id is mandatory") def http_response(out): r = frappe._dict(status=out, medium=medium_id) return r user = None if login_to_user: user = get_linked_user(id_type=medium, id=medium_id) if not user: return http_response("no_linked_user") redis_key = get_otp_redis_key(medium, medium_id, purpose) hashed_otp = frappe.safe_decode(frappe.cache().get_value(redis_key, expires=True)) if not hashed_otp: return http_response("no_otp_for_mobile") if not passlibctx.verify(otp, hashed_otp): return http_response("invalid_otp") if login_to_user == 1: l = LoginManager() l.login_as(user) l.resume = False l.run_trigger('on_session_creation') return http_response("verified")
def get_token(user, pwd, expire_on=None, device=None): """ Get the JWT Token :param user: The user in ctx :param pwd: Pwd to auth :param expire_on: yyyy-mm-dd HH:mm:ss to specify the expiry :param device: The device in ctx """ if not frappe.db.exists("User", user): raise frappe.ValidationError(_("Invalide User")) from frappe.sessions import clear_sessions login = LoginManager() login.check_if_enabled(user) if not check_password(user, pwd): login.fail('Incorrect password', user=user) login.login_as(user) login.resume = False login.run_trigger('on_session_creation') clear_sessions(user, True, device) if expire_on: frappe.flags.jwt_expire_on = expire_on
def verify_sms_pin(): mobile = frappe.local.form_dict.mobile pin = frappe.local.form_dict.pin login = cint(frappe.local.form_dict.loginToUser or "0") if not mobile: frappe.throw("No Mobile Number") verify_pin = frappe.safe_decode(frappe.cache().get("sms:" + mobile)) user = get_linked_user(mobile) if user: # try to get from User pin_from_db = frappe.db.get_value("User", user, "renovation_sms_pin") if (not pin_from_db or len(pin_from_db) < 2) and verify_pin: frappe.db.set_value("User", user, "renovation_sms_pin", verify_pin) elif pin_from_db != verify_pin: # preference for db pin frappe.cache().set("sms:" + mobile, pin) verify_pin = pin_from_db out = "no_pin_for_mobile" if login: out = "no_linked_user" if verify_pin: out = "invalid_pin" if verify_pin and pin == verify_pin: out = "verified" if login == 1: if user: l = LoginManager() l.login_as(user) l.resume = False l.run_trigger('on_session_creation') else: out = "user_not_found" update_http_response({"status": out, "mobile": mobile})