Пример #1
0
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
Пример #2
0
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)
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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")
Пример #6
0
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
Пример #7
0
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})