X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=app%2Futils.py;h=d0dfd6aa7d09fdc6fc28877e23563881df27e6d3;hb=0c81d0ae2bbabc3ec50febaabdbbb40b71d47c63;hp=ed369b74ba8414d16127c3faee4477125b293a6c;hpb=31b8a7931bdb95b296e236c11705206507b035d8;p=cheatdb.git diff --git a/app/utils.py b/app/utils.py index ed369b7..d0dfd6a 100644 --- a/app/utils.py +++ b/app/utils.py @@ -1,4 +1,4 @@ -# Content DB +# ContentDB # Copyright (C) 2018 rubenwardy # # This program is free software: you can redistribute it and/or modify @@ -20,8 +20,11 @@ from flask_user import * from flask_login import login_user, logout_user from .models import * from . import app -import random, string, os, imghdr +import random, string, os, imghdr, user_agents from urllib.parse import urljoin +from werkzeug.datastructures import MultiDict + +# These are given to Jinja in template_filters.py def abs_url_for(path, **kwargs): scheme = "https" if app.config["BASE_URL"][:5] == "https" else "http" @@ -30,6 +33,28 @@ def abs_url_for(path, **kwargs): def abs_url(path): return urljoin(app.config["BASE_URL"], path) +def url_set_query(**kwargs): + args = MultiDict(request.args) + + for key, value in kwargs.items(): + if key == "_add": + for key2, value_to_add in value.items(): + values = set(args.getlist(key2)) + values.add(value_to_add) + args.setlist(key2, list(values)) + elif key == "_remove": + for key2, value_to_remove in value.items(): + values = set(args.getlist(key2)) + values.discard(value_to_remove) + args.setlist(key2, list(values)) + else: + args.setlist(key, [ value ]) + + + dargs = dict(args.lists()) + + return url_for(request.endpoint, **dargs) + def get_int_or_abort(v, default=None): if v is None: return default @@ -39,6 +64,14 @@ def get_int_or_abort(v, default=None): except ValueError: abort(400) +def is_user_bot(): + user_agent = request.headers.get('User-Agent') + if user_agent is None: + return True + + user_agent = user_agents.parse(user_agent) + return user_agent.is_bot + def getExtension(filename): return filename.rsplit(".", 1)[1].lower() if "." in filename else None @@ -165,11 +198,11 @@ def rank_required(rank): def getPackageByInfo(author, name): user = User.query.filter_by(username=author).first() if user is None: - abort(404) + return None package = Package.query.filter_by(name=name, author_id=user.id, soft_deleted=False).first() if package is None: - abort(404) + return None return package @@ -179,7 +212,18 @@ def is_package_page(f): if not ("author" in kwargs and "name" in kwargs): abort(400) - package = getPackageByInfo(kwargs["author"], kwargs["name"]) + author = kwargs["author"] + name = kwargs["name"] + + package = getPackageByInfo(author, name) + if package is None: + package = getPackageByInfo(author, name + "_game") + if package is None or package.type != PackageType.GAME: + abort(404) + + args = dict(kwargs) + args["name"] = name + "_game" + return redirect(url_for(request.endpoint, **args)) del kwargs["author"] del kwargs["name"]