Beispiel #1
0
def add_user(mdb_user):
    """
        初始化root用户角色, 管理员, 管理员基本资料

        :return:
        """
    from werkzeug.security import generate_password_hash
    from apps.utils.validation.str_format import email_format_ver, password_format_ver
    from apps.modules.user.models.user import user_model

    print(' * [User] add')
    is_continue = False
    while True:
        username = input("Input username:"******"[\.\*#\?]+", username):
            print(
                "[Warning]: The name format is not correct,You can't use '.','*','#','?'\n")
        else:
            break

    while not is_continue:
        email = input("Input email:")
        s, r = email_format_ver(email)
        if not s:
            print("[Warning]: {}".format(r))
        else:
            break

    while not is_continue:
        password = getpass("Input password(Password at least 8 characters):")
        s, r = password_format_ver(password)
        if not s:
            print("[Warning]: {}\n".format(r))
        else:
            break
    try:
        mdb_user.db.create_collection("role")
        print(' * Created role collection')
    except BaseException:
        pass
    try:
        mdb_user.db.create_collection("user")
        print(' * Created user collection')
    except BaseException:
        pass

    # 初始化角色
    root_per = SUPER_PER
    role_root = mdb_user.db.role.find_one({"permissions": root_per})
    if not role_root:
        print(" * Create root role...")
        r = mdb_user.db.role.insert_one({"name": "Root",
                                         "default": 0,
                                         "permissions": root_per,
                                         "instructions": 'Root'})

        if r.inserted_id:
            print("Create root user role successfully")
        else:
            print("[Error] Failed to create superuser role")
            sys.exit(-1)

        root_id = r.inserted_id
    else:
        root_id = role_root['_id']

    password_hash = generate_password_hash(password)
    user = get_one_user_mfilter(username=username, email=email, op="or")
    if user:
        update_one_user(user_id=str(user["_id"]),
                        updata={"$set": {"password": password_hash,
                                         "role_id": str(root_id)}})
        print(" * This user already exists, updated password.")
    else:
        print(' * Create root user...')
        user = user_model(
            username=username,
            email=email,
            password=password,
            custom_domain=-1,
            role_id=str(root_id),
            active=True)
        r = insert_one_user(updata=user)
        if r.inserted_id:
            print(" * Create a root user role successfully")
        else:
            print(" * [Error] Failed to create a root user role")
            sys.exit(-1)

    # To create the average user role
    average_user = mdb_user.db.role.find_one({"permissions": 1})
    if not average_user:
        print(" * Create the average user role...")
        r = mdb_user.db.role.insert_one({
            "name": "User",
            "default": 1,
            "permissions": 1,
            "instructions": 'The average user',
        })
        if r.inserted_id:
            print(" * Create a generic user role successfully")
        else:
            print(" * Failed to create a generic user role")

    role = mdb_user.db.role.find_one({"_id": root_id})
    hidden_password = "******".format(password[0:2], password[6:])
    print('The basic information is as follows')
    print('Username: {}\nEmail: {}\nUser role: {}\nPassword: {}'.format(
        username, email, role["name"], hidden_password))
    print('End')
Beispiel #2
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
Beispiel #3
0
def add_user():

    email = request.argget.all('email')
    mobile_phone_number = str_to_num(
        request.argget.all('mobile_phone_number', 0))
    username = request.argget.all('username', '').strip()
    password = request.argget.all('password', '').strip()
    password2 = request.argget.all('password2', '').strip()

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

    if email:
        # 邮件注册
        # 邮箱格式验证
        s, r = email_format_ver(email)
        if not s:
            data = {'msg': r, 'msg_type': "e", "custom_status": 422}
        elif mdbs["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",
                "custom_status":
                403
            }
        if data:
            return data

    elif mobile_phone_number:
        # 手机注册
        s, r = mobile_phone_format_ver(mobile_phone_number)
        if not s:
            data = {'msg': r, 'msg_type': "e", "custom_status": 422}
        elif mdbs["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",
                "custom_status":
                403
            }

        if data:
            return data

    if not data:
        # 用户基本信息
        role_id = mdbs["user"].db.role.find_one(
            {"default": {
                "$in": [True, 1]
            }})["_id"]
        if not email:
            email = None
        if not mobile_phone_number:
            mobile_phone_number = None
        user = user_model(username=username,
                          email=email,
                          mphone_num=mobile_phone_number,
                          password=password,
                          custom_domain=-1,
                          role_id=str(role_id),
                          active=True,
                          is_adm_add_user=True)
        r = insert_one_user(updata=user)
        if r.inserted_id:
            if email:
                # 发送邮件
                subject = gettext("Registration success notification")
                body = [
                    gettext("Welcome to register {}.").format(
                        get_config("site_config", "APP_NAME")),
                    gettext("{} registered the account successfully.").format(
                        email)
                ]
                data = {
                    "title": subject,
                    "body": body,
                    "username": username,
                    "site_url": get_config("site_config", "SITE_URL")
                }
                html = get_email_html(data)

                msg = {
                    "subject": subject,
                    "recipients": [email],
                    "html_msg": html
                }
                send_email(msg=msg, ctype="nt")

            elif mobile_phone_number:
                # 发送短信
                content = gettext(
                    "[{}] Successful registration account.").format(
                        get_config("site_config", "APP_NAME"))
                send_mobile_msg(mobile_phone_number, content)

            data = {
                'msg': gettext('Added successfully'),
                'msg_type': 's',
                "custom_status": 201
            }
    return data
Beispiel #4
0
def third_party_sign_in(platform_name):

    '''
    第三方登录回调函数
    :param hook_name: 第三方登录钩子名称,如:"wechat_login"
    :return:
    '''

    # 检测插件
    data = plugin_manager.call_plug(hook_name="{}_login".format(platform_name),
                                    request_argget_all=request.argget.all)
    if data == "__no_plugin__":
        data = {"msg":gettext("No login processing plugin for this platform, please install the relevant plugin first"),
                "msg_type":"e", "http_status":400}
        return data


    unionid = data.get("unionid")
    # 检测用户是否等录过
    query = {
        "login_platform.{}.unionid".format(platform_name):unionid
    }
    user = mdb_user.db.user.find_one(query)
    if user:
        # 此用户已经在当前平台登录过, 直接登录
        user = User(user["_id"])
        if user.is_active:
            login_user(user, False)

            # 记录登录日志
            login_log(user, client="unknown:{}".format(platform_name))
            data = {"msg":gettext("Sign in success"), "msg_type":"s", "http_status":201}
        else:

            # 未激活
            data = {"msg":gettext("Account is inactive or frozen"), "msg_type":"w",
                    "http_status":401}

    else:
        # 第一次登录, 注册信息
        # 用户基本信息
        nickname = "{}_{}".format(data.get("nickname"),randint(10000000,99999999))
        gender = data.get("gender")
        email = data.get("email")
        avatar_url = data.get("avatar_url")
        province = data.get("province")
        city = data.get("city")
        country = data.get("country")

        address = {"province":province,  "city":city, "country":country}
        s, r = arg_verify(reqargs=[("unionid", unionid)], required=True)
        if not s:
            return r
        s, r = arg_verify(reqargs=[(gettext("gender"), gender)], only=["secret", "m", "f"])
        if not s:
            return r

        role_id = mdb_user.db.role.find_one({"default": {"$in": [True, 1]}})["_id"]
        user = user_model(
                         unionid=unionid,
                         platform_name=platform_name,
                         username=nickname,
                          email=email,
                          mphone_num=None,
                          password=None,
                          custom_domain=-1,
                          address=address,
                          avatar_url=avatar_url,
                          role_id=role_id,
                          active=True
                          )
        r = mdb_user.db.user.insert_one(user)

        if r.inserted_id:

            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": 400}
    return data
Beispiel #5
0
def init_admin_user(mdbs):
    """
    初始化root用户角色, 管理员, 管理员基本资料
    :return:
    """
    from werkzeug.security import generate_password_hash
    from apps.modules.user.models.user import user_model
    from apps.modules.user.process.get_or_update_user import get_one_user_mfilter, update_one_user, insert_one_user

    print('\nInit root user')
    # 初始化角色
    root_per = SUPER_PER
    role_root = mdbs["user"].db.role.find_one({"permissions": root_per})
    if not role_root:
        print(" * Create root role...")
        r = mdbs["user"].db.role.insert_one(
            {
                "name": "Root",
                 "default": 0,
                 "permissions": root_per,
                 "instructions": 'Root'
            }
        )

        if r.inserted_id:
            print("Create root user role successfully")
        else:
            print("\033[31m[Error] Failed to create superuser role\033[0m")
            sys.exit(-1)

        root_id = r.inserted_id
    else:
        root_id = role_root['_id']

    root_user = mdbs["user"].dbs["user"].find_one(
        {"role_id": str(root_id)},
        {
            "username": 1,
            "email": 1
        }
    )

    if root_user:
        ch = input("\033[33m\n Root user already exists, need to update its password?[Y/n]\033[0m")
        if ch != "Y":
            print("End")
            sys.exit()
        is_continue = False
        while not is_continue:
            password = getpass("Input password(Password at least 8 characters):")
            if len(password) < 8:
                print("\033[33m[Warning]: {}The password is at least 8 characters\033[0m\n")
            else:
                break
        password_hash = generate_password_hash(password)
        update_one_user(
            user_id=str(root_user["_id"]),
            updata={
                "$set": {
                    "password": password_hash
                }
            })
        username = root_user["username"]
        email = root_user["email"]

    else:
        is_continue = False
        username = "******"
        email = input("Input email:")
        while not is_continue:
            password = getpass("Input password(Password at least 8 characters):")
            if len(password) < 8:
                print("\033[33m[Warning]: {}The password is at least 8 characters\033[0m\n")
            else:
                break
        try:
            mdbs["user"].db.create_collection("role")
            print(' * Created role collection')
        except BaseException:
            pass
        try:
            mdbs["user"].db.create_collection("user")
            print(' * Created user collection')
        except BaseException:
            pass

        password_hash = generate_password_hash(password)
        user = get_one_user_mfilter(email=email, op="or")
        if user:
            update_one_user(user_id=str(user["_id"]),
                            updata={
                                "$set": {
                                    "password": password_hash,
                                    "role_id": str(root_id)
                            }
            })
            username = user["username"]
            print("\033[33m\n * This user already exists, updated password and role.\033[0m")
        else:
            print(' * Create root user...')
            user = user_model(
                username=username,
                email=email,
                password=password,
                custom_domain=-1,
                role_id=str(root_id),
                active=True)
            r = insert_one_user(updata=user)
            if r.inserted_id:
                print(" * Create a root user successfully")
            else:
                print("\033[31m * [Error] Failed to create a root user\033[0m")
                sys.exit(-1)

    # To create the average user role
    average_user = mdbs["user"].db.role.find_one({"permissions": 1})
    if not average_user:
        print(" * Create the average user role...")
        r = mdbs["user"].db.role.insert_one({
            "name": "User",
            "default": 1,
            "permissions": 1,
            "instructions": 'The average user',
        })
        if r.inserted_id:
            print(" * Create a generic role successfully")
        else:
            print(" * Failed to create a generic role")

    role = mdbs["user"].db.role.find_one({"_id": root_id})
    hidden_password = "******".format(password[0:2], password[6:])
    print('\nThe basic information is as follows')
    print('Username: {}\nEmail: {}\nUser role: {}\nPassword: \033[33m{}\033[0m'.format(
        username, email, role["name"], hidden_password))
    print('End')
    sys.exit()