]> git.lizzy.rs Git - cheatdb.git/blobdiff - app/utils.py
Improve MinetestCheck name validation
[cheatdb.git] / app / utils.py
index ed369b74ba8414d16127c3faee4477125b293a6c..d0dfd6aa7d09fdc6fc28877e23563881df27e6d3 100644 (file)
@@ -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"]