Example #1
0
def register():
    if request.method == 'POST':
        # Validate
        kwargs = dict()
        followMod = request.form.get('follow-mod')
        email = request.form.get('email')
        username = request.form.get('username')
        password = request.form.get('password')
        confirmPassword = request.form.get('repeatPassword')
        if not email:
            kwargs['emailError'] = 'Email is required.'
        else:
            if not re.match(r"^[^@]+@[^@]+\.[^@]+$", email):
                kwargs['emailError'] = 'Please specify a valid email address.'
            elif db.query(User).filter(User.email == email).first():
                kwargs['emailError'] = 'A user with this email already exists.'
        if not username:
            kwargs['usernameError'] = 'Username is required.'
        else:
            if not re.match(r"^[A-Za-z0-9_]+$", username):
                kwargs[
                    'usernameError'] = 'Please only use letters, numbers, and underscores.'
            if len(username) < 3 or len(username) > 24:
                kwargs[
                    'usernameError'] = 'Usernames must be between 3 and 24 characters.'
            if db.query(User).filter(User.username.ilike(username)).first():
                kwargs['usernameError'] = 'A user by this name already exists.'
        if not password:
            kwargs['passwordError'] = 'Password is required.'
        else:
            if password != confirmPassword:
                kwargs['repeatPasswordError'] = 'Passwords do not match.'
            if len(password) < 5:
                kwargs[
                    'passwordError'] = 'Your password must be greater than 5 characters.'
            if len(password) > 256:
                kwargs[
                    'passwordError'] = 'We admire your dedication to security, but please use a shorter password.'
        if not kwargs == dict():
            if email is not None:
                kwargs['email'] = email
            if username is not None:
                kwargs['username'] = username
            return render_template("register.html", **kwargs)
        # All valid, let's make them an account
        user = User(username, email, password)
        user.confirmation = binascii.b2a_hex(os.urandom(20)).decode("utf-8")
        db.add(user)
        db.commit(
        )  # We do this manually so that we're sure everything's hunky dory before the email leaves
        if followMod:
            send_confirmation(user, followMod)
        else:
            send_confirmation(user)
        return redirect("/account-pending")
    else:
        return render_template("register.html")
def register():
    if request.method == 'POST':
        # Validate
        kwargs = dict()
        followMod = request.form.get('follow-mod')
        email = request.form.get('email')
        username = request.form.get('username')
        password = request.form.get('password')
        confirmPassword = request.form.get('repeatPassword')
        if not email:
            kwargs['emailError'] = 'Email is required.'
        else:
            if not re.match(r"^[^@]+@[^@]+\.[^@]+$", email):
                kwargs['emailError'] = 'Please specify a valid email address.'
            elif db.query(User).filter(User.email == email).first():
                kwargs['emailError'] = 'A user with this email already exists.'
            elif _mailbans.isMailBanned(email):
                kwargs['emailError'] = 'This email host is banned, please use an alternative, this is to prevent botting, sorry.'
        if not username:
            kwargs['usernameError'] = 'Username is required.'
        else:
            if not re.match(r"^[A-Za-z0-9_]+$", username):
                kwargs['usernameError'] = 'Please only use letters, numbers, and underscores.'
            if len(username) < 3 or len(username) > 24:
                kwargs['usernameError'] = 'Usernames must be between 3 and 24 characters.'
            if db.query(User).filter(User.username.ilike(username)).first():
                kwargs['usernameError'] = 'A user by this name already exists.'
        if not password:
            kwargs['passwordError'] = 'Password is required.'
        else:
            if password != confirmPassword:
                kwargs['repeatPasswordError'] = 'Passwords do not match.'
            if len(password) < 5:
                kwargs['passwordError'] = 'Your password must be greater than 5 characters.'
            if len(password) > 256:
                kwargs['passwordError'] = 'We admire your dedication to security, but please use a shorter password.'
        if not kwargs == dict():
            if email is not None:
                kwargs['email'] = email
            if username is not None:
                kwargs['username'] = username
            return render_template("register.html", **kwargs)
        # All valid, let's make them an account
        user = User(username, email, password)
        user.confirmation = binascii.b2a_hex(os.urandom(20)).decode("utf-8")
        db.add(user)
        db.commit() # We do this manually so that we're sure everything's hunky dory before the email leaves
        if followMod:
            send_confirmation(user, followMod)
        else:
            send_confirmation(user)
        return redirect("/account-pending")
    else:
        return render_template("register.html")
Example #3
0
def register():
    if request.method == 'POST':
        # Validate
        kwargs = dict()
        email = request.form.get('email')
        username = request.form.get('username')
        password = request.form.get('password')
        confirmPassword = request.form.get('repeatPassword')
        if not email:
            kwargs['emailError'] = 'Email is required.'
        else:
            if not re.match(r"[^@]+@[^@]+\.[^@]+", email):
                kwargs['emailError'] = 'Please specify a valid email address.'
            elif db.query(User).filter(User.email == email).first():
                kwargs['emailError'] = 'A user with this email already exists.'
        if not username:
            kwargs['usernameError'] = 'Username is required.'
        else:
            if not re.match(r"[A-Za-z0-9_]+", username):
                kwargs['usernameError'] = 'Please only use letters, numbers, and underscores.'
            if len(username) < 3 or len(username) > 12:
                kwargs['usernameError'] = 'Usernames must be between 3 and 12 characters.'
            if db.query(User).filter(User.username == username).first():
                kwargs['usernameError'] = 'A user by this name already exists.'
        if not password:
            kwargs['passwordError'] = 'Password is required.'
        else:
            if password != confirmPassword:
                kwargs['repeatPasswordError'] = 'Passwords do not match.'
            if len(password) < 5:
                kwargs['passwordError'] = 'Your password must be greater than 5 characters.'
            if len(password) > 256:
                kwargs['passwordError'] = 'We admire your dedication to security, but please use a shorter password.'
        if not kwargs == dict():
            if email is not None:
                kwargs['email'] = email
            if username is not None:
                kwargs['username'] = username
            return render_template("register.html", **kwargs)
        # All valid, let's make them an account
        user = User(username, email, password)
        user.confirmation = binascii.b2a_hex(os.urandom(20)).decode("utf-8")
        db.add(user)
        db.commit()
        send_confirmation(user)
        return redirect("/account-pending")
    else:
        return render_template("register.html")
Example #4
0
def search_mods(text, page, limit):
    terms = text.split(' ')
    query = db.query(Mod).join(Mod.user).join(Mod.versions)
    filters = list()
    for term in terms:
        if term.startswith("ksp:"):
            filters.append(Mod.versions.any(ModVersion.ksp_version == term[4:]))
        elif term.startswith("user:"******"downloads:>"):
            filters.append(Mod.download_count > int(term[11:]))
        elif term.startswith("downloads:<"):
            filters.append(Mod.download_count < int(term[11:]))
        elif term.startswith("followers:>"):
            filters.append(Mod.follower_count > int(term[11:]))
        elif term.startswith("followers:<"):
            filters.append(Mod.follower_count < int(term[11:]))
        else:
            filters.append(Mod.name.ilike('%' + term + '%'))
            filters.append(User.username.ilike('%' + term + '%'))
            filters.append(Mod.short_description.ilike('%' + term + '%'))
    query = query.filter(or_(*filters))
    query = query.filter(Mod.published == True)
    query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment
    total = math.ceil(query.count() / limit)
    if page > total:
        page = total
    if page < 1:
        page = 1
    results = sorted(query.all(), key=lambda r: weigh_result(r, terms), reverse=True)
    return results[(page - 1) * limit:page * limit], total
Example #5
0
def check_email_for_registration(email):
    if not email:
        return 'Email is required.'
    if not re.match(r"^[^@]+@[^@]+\.[^@]+$", email):
        return 'Please specify a valid email address.'
    elif db.query(User).filter(User.email == email).first():
        return 'A user with this email already exists.'
    return None
Example #6
0
def check_email_for_registration(email):
    if not email:
        return 'Email is required.'
    if not re.match(r"^[^@]+@[^@]+\.[^@]+$", email):
        return 'Please specify a valid email address.'
    elif db.query(User).filter(User.email == email).first():
        return 'A user with this email already exists.'
    return None
Example #7
0
def typeahead_mods(text):
    query = db.query(Mod)
    filters = list()
    filters.append(Mod.name.ilike('%' + text + '%'))
    query = query.filter(or_(*filters))
    query = query.filter(Mod.published == True)
    query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment
    results = sorted(query.all(), key=lambda r: weigh_result(r, text.split(' ')), reverse=True)
    return results
Example #8
0
def check_username_for_registration(username):
    if not username:
        return 'Username is required.'
    if not re.match(r"^[A-Za-z0-9_]+$", username):
        return 'Please only use letters, numbers, and underscores.'
    if len(username) < 3 or len(username) > 24:
        return 'Usernames must be between 3 and 24 characters.'
    if db.query(User).filter(User.username.ilike(username)).first():
        return 'A user by this name already exists.'
    return None
Example #9
0
def check_username_for_registration(username):
    if not username:
        return 'Username is required.'
    if not re.match(r"^[A-Za-z0-9_]+$", username):
        return 'Please only use letters, numbers, and underscores.'
    if len(username) < 3 or len(username) > 24:
        return 'Usernames must be between 3 and 24 characters.'
    if db.query(User).filter(User.username.ilike(username)).first():
        return 'A user by this name already exists.'
    return None
Example #10
0
def search_mods(text, page):
    terms = text.split(' ')
    query = db.query(Mod).join(Mod.user)
    filters = list()
    for term in terms:
        filters.append(Mod.name.ilike('%' + term + '%'))
        filters.append(User.username.ilike('%' + term + '%'))
        filters.append(Mod.description.ilike('%' + term + '%'))
        filters.append(Mod.short_description.ilike('%' + term + '%'))
    query = query.filter(or_(*filters))
    query = query.filter(Mod.published == True)
    query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment
    query = query.limit(100)
    results = sorted(query.all(), key=weigh_result, reverse=True)
    return results[page * 10:page * 10 + 10]
Example #11
0
def search_mods(text, page):
    terms = text.split(' ')
    query = db.query(Mod).join(Mod.user)
    filters = list()
    for term in terms:
        filters.append(Mod.name.ilike('%' + term + '%'))
        filters.append(User.username.ilike('%' + term + '%'))
        filters.append(Mod.description.ilike('%' + term + '%'))
        filters.append(Mod.short_description.ilike('%' + term + '%'))
    query = query.filter(or_(*filters))
    query = query.filter(Mod.published == True)
    query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment
    query = query.limit(100)
    results = sorted(query.all(), key=weigh_result, reverse=True)
    return results[page * 10:page * 10 + 10]
Example #12
0
def search_users(text, page):
    terms = text.split(' ')
    query = db.query(User)
    filters = list()
    for term in terms:
        filters.append(User.username.ilike('%' + term + '%'))
        filters.append(User.description.ilike('%' + term + '%'))
        filters.append(User.forumUsername.ilike('%' + term + '%'))
        filters.append(User.ircNick.ilike('%' + term + '%'))
        filters.append(User.twitterUsername.ilike('%' + term + '%'))
        filters.append(User.redditUsername.ilike('%' + term + '%'))
    query = query.filter(or_(*filters))
    query = query.filter(User.public == True)
    query = query.order_by(User.username)
    query = query.limit(100)
    results = query.all()
    return results[page * 10:page * 10 + 10]
Example #13
0
def search_mods(text, page, limit):
    terms = text.split(' ')
    query = db.query(Mod).join(Mod.user)
    filters = list()
    for term in terms:
        filters.append(Mod.name.ilike('%' + term + '%'))
        filters.append(User.username.ilike('%' + term + '%'))
        filters.append(Mod.short_description.ilike('%' + term + '%'))
    query = query.filter(or_(*filters))
    query = query.filter(Mod.published == True)
    query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment
    total = math.ceil(query.count() / limit)
    if page > total:
        page = total
    if page < 1:
        page = 1
    results = sorted(query.all(), key=lambda r: weigh_result(r, terms), reverse=True)
    return results[(page - 1) * limit:page * limit], total
Example #14
0
def search_mods(ga, text, page, limit):
    terms = text.split(' ')
    query = db.query(Mod).join(Mod.user).join(Mod.versions).join(Mod.game)
    filters = list()
    for term in terms:
        if term.startswith("ver:"):
            filters.append(
                Mod.versions.any(
                    ModVersion.gameversion.has(
                        GameVersion.friendly_version == term[4:])))
        elif term.startswith("user:"******"game:"):
            filters.append(Mod.game_id == int(term[5:]))
        elif term.startswith("downloads:>"):
            filters.append(Mod.download_count > int(term[11:]))
        elif term.startswith("downloads:<"):
            filters.append(Mod.download_count < int(term[11:]))
        elif term.startswith("followers:>"):
            filters.append(Mod.follower_count > int(term[11:]))
        elif term.startswith("followers:<"):
            filters.append(Mod.follower_count < int(term[11:]))
        else:
            filters.append(Mod.name.ilike('%' + term + '%'))
            filters.append(User.username.ilike('%' + term + '%'))
            filters.append(Mod.short_description.ilike('%' + term + '%'))
    if ga:
        query = query.filter(Mod.game_id == ga.id)
    query = query.filter(or_(*filters))
    query = query.filter(Mod.published == True)
    query = query.order_by(
        desc(Mod.follower_count)
    )  # We'll do a more sophisticated narrowing down of this in a moment
    total = math.ceil(query.count() / limit)
    if page > total:
        page = total
    if page < 1:
        page = 1
    results = sorted(query.all(),
                     key=lambda r: weigh_result(r, terms),
                     reverse=True)
    return results[(page - 1) * limit:page * limit], total
Example #15
0
def search_mods(text, page, limit, category=None, nsfw="only", game = "all"):

    terms = text.split(' ')
    query = db.query(Mod).join(Mod.user).join(Mod.versions).join(Mod.category)
    if nsfw == "" or nsfw == "no" or nsfw == None:
        query = query.filter(Mod.nsfw == False)
    filters = list()
    filtering_by_game = False
    filtering_by_category = False
    category_filtering_by = ""
    game_filtering_by = ""
    for term in terms:
        if term.startswith("game:"):
            filtering_by_game = True
            game_filtering_by = term[5:]
        elif term.startswith("user:"******"downloads:>"):
            filters.append(Mod.download_count > int(term[11:]))
        elif term.startswith("downloads:<"):
            filters.append(Mod.download_count < int(term[11:]))
        elif term.startswith("followers:>"):
            filters.append(Mod.follower_count > int(term[11:]))
        elif term.startswith("followers:<"):
            filters.append(Mod.follower_count < int(term[11:]))
        elif term.startswith("tag:"):
            filters.append(Mod.tags.ilike('% ' + term[4:] + ' %'))
            filters.append(Mod.tags.ilike(term[4:] + ' %'))
            filters.append(Mod.tags.ilike(term[4:]))
            filters.append(Mod.tags.ilike('% ' + term[4:]))
        else:
            filters.append(Mod.name.ilike('%' + term + '%'))
            filters.append(User.username.ilike('%' + term + '%'))
            filters.append(Mod.short_description.ilike('%' + term + '%'))

    if nsfw == "yes":
        filters.append(Mod.nsfw == True)
        print("YESH")
    query = query.filter(or_(*filters))
    if category != None and category != "" and category != "all":
        if isinstance(category, str):
                query = query.filter(Mod.category.has(Category.name == category))
        else:
            query = query.filter(Mod.category.has(Category.id == category))

    if(game != "all"):
        #Modulous games are stored as strings inside KspVersions, ¿Why? I don't know.
        game_version = GameVersion.query.filter(GameVersion.id == game).first()
        if(game_version != None):
            game_name = game_version.friendly_version
            print(game_name)
            query = query.filter(Mod.versions.any(ModVersion.ksp_version == game_name))

    if filtering_by_game == True:
            query = query.filter(Mod.versions.any(ModVersion.ksp_version == game_filtering_by))
    print("NSFW: " + nsfw)
    if nsfw == "only":
        query = query.filter(Mod.nsfw == True)
    query = query.filter(Mod.published == True)
    query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment
    total = math.ceil(query.count() / limit)
    if page > total:
        page = total
    if page < 1:
        page = 1
    results = sorted(query.all(), key=lambda r: weigh_result(r, terms), reverse=True)
    return results[(page - 1) * limit:page * limit], total