Exemple #1
0
def p_sign_up(username, password, password2, code, email=None, mobile_phone_number=None):
    '''
    普通用户注册函数
    :return:
    '''
    data = {}
    if current_user.is_authenticated:
        data['msg'] = gettext("Is logged in")
        data["msg_type"] = "s"
        data["http_status"] = 201
        data['to_url'] = request.argget.all('next') or get_config("login_manager", "LOGIN_IN_TO")
        return data

    # 用户名格式验证
    s1, r1 = short_str_verifi(username, project="username")
    # 密码格式验证
    s2, r2 = password_format_ver(password)
    if not s1:
        data = {'msg':r1, 'msg_type':"e", "http_status":422}
    elif mdb_user.db.user.find_one({"username": username}):
        # 是否存在用户名
        data = {'msg': gettext("Name has been used"), 'msg_type': "w", "http_status": 403}
    elif not s2:
        data = {'msg': r2, 'msg_type': "e", "http_status": 400}
        return data
    elif password2 != password:
        # 检验两次密码
        data = {'msg': gettext("The two passwords don't match"), 'msg_type': "e", "http_status": 400}
    if data:
        return data

    if email:
        # 邮件注册
        # 邮箱格式验证
        s, r = email_format_ver(email)
        if not s:
            data = {'msg':r, 'msg_type':"e", "http_status":422}
        elif mdb_user.db.user.find_one({"email": email}):
            # 邮箱是否注册过
            data = {'msg': gettext("This email has been registered in the site oh, please login directly."),
                    'msg_type': "w", "http_status": 403}
        if data:
            return data

        # 检验验证码
        r = verify_code(code=code, email=email)
        if not r:
            data = {'msg': gettext("Verification code error"), 'msg_type': "e", "http_status": 401}
            return data

    elif mobile_phone_number:
        # 手机注册
        s, r = mobile_phone_format_ver(mobile_phone_number)
        if not s:
            data = {'msg': r, 'msg_type': "e", "http_status": 422}
        elif mdb_user.db.user.find_one({"mphone_num": mobile_phone_number}):
            # 手机是否注册过
            data = {'msg': gettext("This number has been registered in the site oh, please login directly."),
                    'msg_type': "w", "http_status": 403}

        if data:
            return data

        # 检验验证码
        r = verify_code(code=code, tel_number=True)
        if not r:
            data = {'msg': gettext("Verification code error"), 'msg_type': "e", "http_status": 401}
            return data

    if not data:
        # 用户基本信息
        role_id = mdb_user.db.role.find_one({"default":{"$in":[True, 1]}})["_id"]
        user = user_model(username=username,
                          email=email,
                          mphone_num = mobile_phone_number,
                          password=password,
                          custom_domain=-1,
                          role_id=str(role_id),
                          active=True)
        r = mdb_user.db.user.insert_one(user)

        if r.inserted_id:
            if email:
                # 发送邮件
                subject = gettext("Registration success notification")
                body = "Welcome to register <b>{}</b>.<br><a>{}</a> registered the account successfully.".format(
                    get_config("site_config", "APP_NAME"),
                    email
                )
                data = {"title": subject,
                        "body": body,
                        "other_info": gettext("End"),
                        }
                html = get_email_html(data)
                send_email(subject=subject,
                           recipients=[email],
                           html_msg=html)
            elif mobile_phone_number:
                # 发送短信
                content = "[{}] Successful registration account.".format(
                    get_config("site_config", "APP_NAME"))
                send_mobile_msg(mobile_phone_number, content)

            data = {'msg':gettext('Registered successfully'),
                     'to_url':'/sign-in',
                    'msg_type':'s',"http_status":201}
        else:
            data = {'msg': gettext('Data saved incorrectly, please try again'),
                    'msg_type': 'e', "http_status": 201}
        return data

    return data
Exemple #2
0
def p_retrieve_password(email, code, password, password2):
    """
    密码重设
    :param account:
    :param code:
    :param password:
    :param password2:
    :return:
    """

    data = {}
    if not email:
        data = {
            'msg': gettext('Account does not exist'),
            'msg_type': 'e',
            "http_status": 404
        }
        return data

    s, r = email_format_ver(email=email)
    if s:
        user = get_one_user(email=email)
    else:
        data = {"msg": r, "msg_type": "e", "http_status": 403}
        return data

    if user:
        r = verify_code(code, email=user["email"])
    else:
        data = {
            'msg': gettext('Account does not exist'),
            'msg_type': 'e',
            "http_status": 404
        }
        return data

    if not r:
        data = {
            'msg': gettext('Email or SMS verification code error'),
            'msg_type': 'e',
            "http_status": 401
        }
    else:
        if user:
            r = password_format_ver(password)
            if not r:
                data = {"msg": r, "msg_type": "e", "http_status": "403"}
                return data
            elif password != password2:
                data = {
                    'msg': gettext('Two password is not the same'),
                    'msg_type': 'w',
                    "http_status": 400
                }
            else:
                password_hash = generate_password_hash(password)
                # 将jwt_login_time设为{}退出所有jwt登录的用户
                r = update_one_user(user_id=str(user["_id"]),
                                    updata={
                                        "$set": {
                                            "password": password_hash,
                                            "jwt_login_time": {}
                                        }
                                    })

                if r.modified_count:
                    oplog = {
                        'op_type': 'retrieve_pass',
                        'time': time.time(),
                        'status': 's',
                        'info': '',
                        'ip': request.remote_addr
                    }
                    insert_op_log(oplog, user_id=user["_id"])

                    # 发送邮件
                    subject = gettext("Password reset notification")
                    body = "Your account <a>{}</a> has reset your password. <br>Please keep it safe.".format(
                        user["email"])
                    data = {
                        "title": subject,
                        "body": body,
                        "other_info": gettext("End"),
                    }
                    html = get_email_html(data)

                    send_email(subject=subject,
                               recipients=[user["email"]],
                               html_msg=html)
                    data = {
                        'msg':
                        gettext(
                            'Password reset successfully.Please return to login page to login'
                        ),
                        'msg_type':
                        's',
                        "http_status":
                        201
                    }
                    logout_user()
                else:
                    data = {
                        "msg_type": "w",
                        "msg": gettext("Reset password failed(unknown error)"),
                        "http_status": 400
                    }
                return data
    return data
Exemple #3
0
def p_email_change(new_email_code, current_email_code, email, password):
    """
    用户邮箱修改
    :param code_group:(code_id, code)
    :param current_code_group:(current_email_code_id, current_email_code)
    :param email:
    :param password:
    :return:
    """
    # 验证当前邮箱收到的验证码,保证用户自己修改的
    if current_user.email:
        r = verify_code(current_email_code, current_user.email)
        if not r:
            oplog = {
                'op_type': 'set_email',
                'time': time.time(),
                'status': 'f',
                'info': 'Verification code mistake[currently bound]',
                'ip': request.remote_addr
            }

            insert_op_log(oplog)
            data = {
                "msg": gettext("Verification code error [currently bound]"),
                "msg_type": "w",
                "custom_status": 401
            }
            return data

    # 验证新邮箱收到的验证码,保证绑定的邮箱无误
    r = verify_code(new_email_code, email)
    if not r:
        oplog = {
            'op_type': 'set_email',
            'time': time.time(),
            'status': 'f',
            'info': 'Verification code mistake[ready to bind]',
            'ip': request.remote_addr
        }

        insert_op_log(oplog)
        data = {
            "msg": gettext("Verification code error [ready to bind]"),
            "msg_type": "w",
            "custom_status": 401
        }
        return data

    if current_user.verify_password(password) or not current_user.email:
        update_one_user(user_id=current_user.str_id,
                        updata={"$set": {
                            "email": email
                        }})
        oplog = {
            'op_type': 'set_email',
            'time': time.time(),
            'status': 's',
            'info': '',
            'ip': request.remote_addr
        }

        insert_op_log(oplog)
        data = {
            "msg": gettext("Email is changed"),
            "msg_type": "s",
            "custom_status": 201
        }
    else:
        oplog = {
            'op_type': 'set_email',
            'time': time.time(),
            'status': 'f',
            'info': 'Password mistake',
            'ip': request.remote_addr
        }
        insert_op_log(oplog)
        data = {
            'msg': gettext('Password mistake'),
            'msg_type': 'e',
            "custom_status": 401
        }

    return data