import jinja2 import os import config import utils template_factory = jinja2.Environment(loader=jinja2.FileSystemLoader('../interface/')) admin_dirs = template_factory.get_template("admin_dirs.tmpl") admin_files = template_factory.get_template("admin_files.tmpl") admin_upload = template_factory.get_template("admin_upload.tmpl") admin_delete = template_factory.get_template("admin_delete.tmpl") admin_rename = template_factory.get_template("admin_rename.tmpl") admin_aliases = template_factory.get_template("admin_aliases.tmpl") def route(path, env, post): auth = config.Auth.get(env) if not auth: print("No authorized user for admin access") return utils.redirect("/") # Directory overview if len(path) == 1: errmsg = None if post and "new" in post: try: dirname = utils.sanitize_filename(post["new"][0]) os.mkdir(utils.userdir(auth["user"]) + dirname) except FileExistsError: errmsg = "This directory already exists" except ValueError: errmsg = "The directory name was invalid" dirs = utils.dirlisting(utils.userdir(auth["user"]), False, True) return [admin_dirs.render({"user": auth["user"], "listing": dirs, "error": errmsg}), [("Content-Type", "text/html")], "200 OK"] # File listing if len(path) == 2 and path[1]: directory = utils.userdir(auth["user"]) + utils.sanitize_filename(path[1]) + "/" if not os.path.isdir(directory): return utils.redirect("/admin") files = utils.dirlisting(directory, True, False) return [admin_files.render({"user": auth["user"], "listing": files, "directory": utils.sanitize_filename(path[1])}), [("Content-Type", "text/html")], "200 OK"] # Upload if len(path) == 3 and path[2] == "upload": return [admin_upload.render({"user": auth["user"], "directory": utils.sanitize_filename(path[1])}), [("Content-Type", "text/html")], "200 OK"] # Alias management / Limits config if len(path) == 3 and path[2] == "aliases": aliases = utils.aliases(auth["user"], utils.sanitize_filename(path[1])) return [admin_aliases.render({"user": auth["user"], "directory": utils.sanitize_filename(path[1]), "aliases": aliases, "baseurl": config.baseurl}), [("Content-Type", "text/html")], "200 OK"] # Renaming if len(path) == 3 and path[2] == "rename": # TODO return [admin_rename.render({"user": auth["user"], "directory": utils.sanitize_filename(path[1])}), [("Content-Type", "text/html")], "200 OK"] # Deletion if len(path) == 3 and path[2] == "delete": directory = utils.userdir(auth["user"]) + utils.sanitize_filename(path[1]) + "/" if not os.path.isdir(directory): return utils.redirect("/admin") files = utils.dirlisting(directory, True, False) if len(files) == 0 or env.get("QUERY_STRING", "") == "confirm": utils.cleanup(auth["user"], utils.sanitize_filename(path[1])) return utils.redirect("/admin") return [admin_delete.render({"user": auth["user"], "listing": files, "directory": utils.sanitize_filename(path[1])}), [("Content-Type", "text/html")], "200 OK"] # Default case for admin / fallthrough return utils.redirect("/")