From 0c64ab9c4f32efa1ac9ae3f7818dff2b3b925e56 Mon Sep 17 00:00:00 2001 From: maggi373 <40539743+maggi373@users.noreply.github.com> Date: Wed, 24 Jul 2024 20:08:08 +0200 Subject: [PATCH 1/6] fix broken setup with new navbar --- app.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app.py b/app.py index 57341e5..03d32f7 100644 --- a/app.py +++ b/app.py @@ -77,11 +77,16 @@ def allowed_file(filename): @app.context_processor def inject_menu(): - markedbuildid2 = Build.get_marked_build() - if markedbuildid2 == None: + if new_user == False: + markedbuildid2 = Build.get_marked_build() + if markedbuildid2 == None: + markedbuildid2 = 0 + pinnedmodpacks = Modpack.get_by_pinned() + else: markedbuildid2 = 0 + pinnedmodpacks = [] global __version__ - pinnedmodpacks = Modpack.get_by_pinned() + return dict(markedbuildid2=markedbuildid2, solderversion=__version__, pinnedmodpacks=pinnedmodpacks) From 2f8c8ec650fd0cc281e7f3f668812c086633acfe Mon Sep 17 00:00:00 2001 From: maggi373 <40539743+maggi373@users.noreply.github.com> Date: Wed, 24 Jul 2024 20:16:22 +0200 Subject: [PATCH 2/6] add more env in debug --- app.py | 2 +- templates/mainsettings.html | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app.py b/app.py index 03d32f7..8b28778 100644 --- a/app.py +++ b/app.py @@ -329,7 +329,7 @@ def mainsettings(): # New or invalid session, send to login return redirect(url_for("login")) - return render_template("mainsettings.html", nam=__name__, deb=debug, host=host, port=port, mirror_url=mirror_url, repo_url=repo_url, r2_url=R2_URL, db_name=db_name, versr=__version__, r2_bucket=R2_BUCKET) + return render_template("mainsettings.html", nam=__name__, deb=debug, host=host, port=port, mirror_url=mirror_url, repo_url=repo_url, r2_url=R2_URL, db_name=db_name, versr=__version__, r2_bucket=R2_BUCKET, newuser=new_user, technic=migratetechnic) @app.route("/apikeylibrary", methods=["GET"]) diff --git a/templates/mainsettings.html b/templates/mainsettings.html index 5374c9d..8f649d7 100644 --- a/templates/mainsettings.html +++ b/templates/mainsettings.html @@ -26,6 +26,14 @@ DEBUG: {{deb}} + + NEW_USER: + {{newuser}} + + + MIGRATE_TECHNIC: + {{technic}} + NETWORK ENV From 7cc3393c338ecd500a65514328f94c556a8b410f Mon Sep 17 00:00:00 2001 From: maggi373 <40539743+maggi373@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:08:37 +0200 Subject: [PATCH 3/6] readonly proper on checkboxes on mod upload --- templates/modlibrary.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/modlibrary.html b/templates/modlibrary.html index 7282c0d..b269f48 100644 --- a/templates/modlibrary.html +++ b/templates/modlibrary.html @@ -58,19 +58,19 @@
- +
- +
- + From 9ebb878f3a89f0a31c13e7f33ad13466088618a3 Mon Sep 17 00:00:00 2001 From: maggi373 <40539743+maggi373@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:20:10 +0200 Subject: [PATCH 4/6] move site to blueprints login and setup is their own blueprints aswell --- alogin.py | 36 +++ api.py | 9 +- app.py | 639 +------------------------------------- asetup.py | 36 +++ asite.py | 539 ++++++++++++++++++++++++++++++++ models/globals.py | 34 ++ templates/layout.html | 20 +- templates/modlibrary.html | 2 +- 8 files changed, 668 insertions(+), 647 deletions(-) create mode 100644 alogin.py create mode 100644 asetup.py create mode 100644 asite.py create mode 100644 models/globals.py diff --git a/alogin.py b/alogin.py new file mode 100644 index 0000000..eb5e5e5 --- /dev/null +++ b/alogin.py @@ -0,0 +1,36 @@ +from flask import Blueprint, redirect, render_template, request, session, url_for + +from models.session import Session +from models.user import User + +alogin = Blueprint("alogin", __name__) + +@alogin.route("/login", methods=["GET"]) +def login_page(): + if "key" in session and Session.verify_session(session["token"], request.remote_addr): + # Already logged in + return redirect(url_for('asite.index')) + + return render_template("login.html", failed=False) + + +@alogin.route("/login", methods=["POST"]) +def login(): + if "key" in session and Session.verify_session(session["token"], request.remote_addr): + # Already logged in + print("already logged in") + return redirect(url_for('asite.index')) + + user = User.get_by_username(request.form["username"]) + if user is None: + print("login failed") + return render_template("login.html", failed=True) + else: + if user.verify_password(request.form["password"]): + # if new_user: + # return render_template("login.html", failed=True) + session["token"] = Session.new_session(request.remote_addr) + print("login success") + return redirect(url_for('asite.index')) + else: + return render_template("login.html", failed=True) \ No newline at end of file diff --git a/api.py b/api.py index 96d1c3c..374d45b 100644 --- a/api.py +++ b/api.py @@ -1,20 +1,15 @@ -import os - -from dotenv import load_dotenv from flask import Blueprint, jsonify, request from models.key import Key from models.mod import Mod from models.modpack import Modpack +from models.globals import solderpy_version, mirror_url api = Blueprint("api", __name__) -load_dotenv(".env") -mirror_url = os.getenv("SOLDER_MIRROR_URL") - @api.route("/api/") def api_info(): - return jsonify({"api": "solder.py", "version": "v1.3.4", "stream": "DEV"}) + return jsonify({"api": "solder.py", "version": "v" + solderpy_version, "stream": "DEV"}) @api.route("/api/verify") diff --git a/app.py b/app.py index 8b28778..e4a43e4 100644 --- a/app.py +++ b/app.py @@ -1,646 +1,27 @@ -__version__ = "1.3.4" - -import os import secrets -import threading -import boto3 -from api import api -from dotenv import load_dotenv -from flask import Flask, redirect, render_template, request, session, url_for -from models.build import Build -from models.build_modversion import Build_modversion -from models.client import Client -from models.client_modpack import Client_modpack -from models.database import Database -from models.key import Key -from models.mod import Mod -from models.modpack import Modpack -from models.modversion import Modversion -from models.session import Session -from models.user import User -from mysql import connector -from werkzeug.utils import secure_filename +from api import api, solderpy_version +from alogin import alogin +from asetup import asetup +from asite import asite +from flask import Flask, render_template +from models.globals import debug, host, port -new_user = False -migratetechnic = False -load_dotenv(".env") -host = os.getenv("APP_URL") -port = os.getenv("APP_PORT") -new_user = os.getenv("NEW_USER") -migratetechnic = os.getenv("TECHNIC_MIGRATION") -debug = False -try: - debug = os.getenv("APP_DEBUG").lower() in ["true", "t", "1", "yes", "y"] -except AttributeError: - pass -mirror_url = os.getenv("SOLDER_MIRROR_URL") -repo_url = os.getenv("SOLDER_REPO_LOCATION") -r2_url = os.getenv("R2_URL") -db_name = os.getenv("DB_DATABASE") +__version__ = solderpy_version app: Flask = Flask(__name__) app.register_blueprint(api) +app.register_blueprint(alogin) +app.register_blueprint(asetup) +app.register_blueprint(asite) app.config["UPLOAD_FOLDER"] = "./mods/" -ALLOWED_EXTENSIONS = {'zip', 'jar'} app.secret_key = secrets.token_hex() -if migratetechnic: - Database.create_session_table() - -Session.start_session_loop() - -R2_ENDPOINT = os.getenv("R2_ENDPOINT") -R2_URL = os.getenv("R2_URL") -R2_REGION = os.getenv("R2_REGION") -R2_ACCESS_KEY = os.getenv("R2_ACCESS_KEY") -R2_SECRET_KEY = os.getenv("R2_SECRET_KEY") -R2_BUCKET = os.getenv("R2_BUCKET") - - -R2 = boto3.client('s3', - region_name=R2_REGION, - endpoint_url=R2_ENDPOINT, - aws_access_key_id=R2_ACCESS_KEY, - aws_secret_access_key=R2_SECRET_KEY) - - -def createFolder(dirName): - os.makedirs(dirName, exist_ok=True) - - -def allowed_file(filename): - return '.' in filename and \ - filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS - -@app.context_processor -def inject_menu(): - if new_user == False: - markedbuildid2 = Build.get_marked_build() - if markedbuildid2 == None: - markedbuildid2 = 0 - pinnedmodpacks = Modpack.get_by_pinned() - else: - markedbuildid2 = 0 - pinnedmodpacks = [] - global __version__ - - - return dict(markedbuildid2=markedbuildid2, solderversion=__version__, pinnedmodpacks=pinnedmodpacks) - -@app.route("/") -def index(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - return render_template("index.html") - - -@app.route("/setup", methods=["GET"]) -def setup(): - if not Database.is_setup(): - Database.create_tables() - if new_user or not User.any_user_exists(): - if migratetechnic: - Database.migratetechnic_tables() - return render_template("setup.html") - return render_template("setup.html") - else: - return redirect(url_for("index")) - - -@app.route("/setup", methods=["POST"]) -def setup_creation(): - if new_user or not User.any_user_exists(): - if request.form["setupemail"] is None: - print("setup failed") - return render_template("setup.html", failed=True) - if request.form["setuppassword"] is None: - print("setup failed") - return render_template("setup.html", failed=True) - User.new(request.form["setupemail"], request.form["setupemail"], - request.form["setuppassword"], request.remote_addr, '1') - return redirect(url_for("index")) - - -@app.route("/login", methods=["GET"]) -def login_page(): - if "key" in session and Session.verify_session(session["token"], request.remote_addr): - # Already logged in - return redirect(url_for("index")) - - return render_template("login.html", failed=False) - - -@app.route("/login", methods=["POST"]) -def login(): - if "key" in session and Session.verify_session(session["token"], request.remote_addr): - # Already logged in - print("already logged in") - return redirect(url_for("index")) - - user = User.get_by_username(request.form["username"]) - if user is None: - print("login failed") - return render_template("login.html", failed=True) - else: - if user.verify_password(request.form["password"]): - # if new_user: - # return render_template("login.html", failed=True) - session["token"] = Session.new_session(request.remote_addr) - print("login success") - return redirect(url_for("index")) - else: - return render_template("login.html", failed=True) - - -@app.route("/logout") -def logout(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - Session.delete_session(session["token"]) - return redirect(url_for("login")) - - -@app.route("/modversion/", methods=["GET"]) -def modversion(id): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - mod = Mod.get_by_id(id) - - try: - modversions = mod.get_versions() - except connector.ProgrammingError as e: - Database.create_tables() - modversions = [] - - return render_template("modversion.html", modSlug=mod.name, modversions=modversions, mod=mod, mirror_url=mirror_url) - - -@app.route("/modversion/", methods=["POST"]) -def newmodversion(id): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - if "form-submit" in request.form: - mod_side = request.form['flexRadioDefault'] - mod_type = request.form['type'] - Mod.update(id, request.form["name"], request.form["description"], request.form["author"], request.form["link"], request.form["pretty_name"], mod_side, mod_type, request.form["internal_note"]) - return redirect(id) - if "deleteversion_submit" in request.form: - if "delete_id" not in request.form: - return redirect(id) - Modversion.delete_modversion(request.form["delete_id"]) - return redirect(id) - if "addtoselbuild_submit" in request.form: - if "addtoselbuild_id" not in request.form: - return redirect(id) - Modversion.add_modversion_to_selected_build(request.form["addtoselbuild_id"], id, "0", "1", "0") - return redirect(id) - if "deletemod_submit" in request.form: - if "mod_delete_id" not in request.form: - return redirect(id) - Mod.delete_mod(request.form["mod_delete_id"]) - return redirect(url_for("modlibrary")) - if "rehash_submit" in request.form: - if "rehash_id" not in request.form: - return redirect(url_for("clientlibrary")) - - if request.form["rehash_md5"] != "": - version = Modversion.get_by_id(request.form["rehash_id"]) - version.update_hash(request.form["rehash_md5"], mirror_url + request.form["rehash_url"]) - else: - version = Modversion.get_by_id(request.form["rehash_id"]) - t = threading.Thread(target=version.rehash, args=(mirror_url + request.form["rehash_url"],)) - t.start() - print(request.form["rehash_id"]) - print(request.form["rehash_md5"]) - print(request.form["rehash_url"]) - if "newmodvermanual_submit" in request.form: - filesie2 = Modversion.get_file_size(mirror_url + request.form["newmodvermanual_url"]) - print(filesie2) - if request.form["newmodvermanual_md5"] != "": - Modversion.new(id, request.form["newmodvermanual_version"], request.form["newmodvermanual_mcversion"], request.form["newmodvermanual_md5"], filesie2, "0") - else: - # Todo Add filesize rehash and md5 hash, if fails do not add - Modversion.new(id, request.form["newmodvermanual_version"], request.form["newmodvermanual_mcversion"], "0", filesie2, "0", mirror_url + request.form["newmodvermanual_url"]) - return redirect(id) - - -@app.route("/newmod", methods=["GET", "POST"]) -def newmod(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - if request.method == "POST": - mod_side = request.form['flexRadioDefault'] - mod_type = request.form['type'] - Mod.new(request.form["name"], request.form["description"], request.form["author"], request.form["link"], request.form["pretty_name"], mod_side, mod_type, request.form["internal_note"]) - return redirect(url_for("modlibrary")) - - return render_template("newmod.html") - - -@app.route("/modpack/", methods=["GET", "POST"]) -def modpack(id): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - modpack = Modpack.get_by_id(id) - builds = modpack.get_builds() - except connector.ProgrammingError as e: - Database.create_tables() - builds = [] - - if request.method == "POST": - if "form-submit" in request.form: - publish = "0" - private = "0" - if "min_java" in request.form: - min_java = request.form['min_java'] - if "NONE" in min_java: - min_java = None - if "publish" in request.form: - publish = request.form['publish'] - if "private" in request.form: - private = request.form['private'] - clonebuild = "" - if "clonebuild" in request.form and request.form['clonebuild'] != "": - clonebuild = request.form['clonebuild'] - if "clonebuildman" in request.form and request.form['clonebuildman'] != "": - clonebuild = request.form['clonebuildman'] - Build.new(id, request.form["version"], request.form["mcversion"], publish, private, min_java, request.form["memory"], clonebuild) - return redirect(id) - if "recommended_submit" in request.form: - Build.update_checkbox(id, request.form["recommended_modid"], "recommended", "modpacks") - return redirect(id) - if "latest_submit" in request.form: - Build.update_checkbox(id, request.form["latest_modid"], "latest", "modpacks") - return redirect(id) - if "is_published_submit" in request.form: - Build.update_checkbox(request.form["is_published_modid"], request.form["is_published_check"], "is_published", "builds") - return redirect(id) - if "private_submit" in request.form: - Build.update_checkbox(request.form["private_modid"], request.form["private_check"], 'private', 'builds') - return redirect(id) - if "marked_submit" in request.form: - Build.update_checkbox_marked(request.form["marked_modid"], request.form["marked_check"]) - return redirect(id) - if "changelog_submit" in request.form: - oldversion = request.form["changelog_oldver"] - newversion = request.form["changelog_newver"] - return redirect(url_for("changelog", oldver=oldversion, newver=newversion)) - if "deletemod_submit" in request.form: - if "modpack_delete_id" not in request.form: - return redirect(id) - modpack.delete_modpack(request.form["modpack_delete_id"]) - return redirect(url_for("modpacklibrary")) - - return render_template("modpack.html", modpack=builds, modpackname=modpack) - - -@app.route("/changelog/-", methods=["GET", "POST"]) -def changelog(oldver, newver): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - changelog = Build_modversion.get_changelog(oldver, newver) - except connector.ProgrammingError as e: - Database.create_tables() - builds = [] - - return render_template("changelog.html", changelog=changelog) - - -@app.route("/mainsettings") -def mainsettings(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - return render_template("mainsettings.html", nam=__name__, deb=debug, host=host, port=port, mirror_url=mirror_url, repo_url=repo_url, r2_url=R2_URL, db_name=db_name, versr=__version__, r2_bucket=R2_BUCKET, newuser=new_user, technic=migratetechnic) - - -@app.route("/apikeylibrary", methods=["GET"]) -def apikeylibrary(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - keys = Key.get_all_keys() - except connector.ProgrammingError as e: - Database.create_tables() - keys = [] - - return render_template("apikeylibrary.html", keys=keys) - - -@app.route("/apikeylibrary", methods=["POST"]) -def apikeylibrary_post(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - if request.method == "POST": - if "form-submit" in request.form: - if "keyname" not in request.form: - return redirect(url_for("apikeylibrary")) - if "api_key" not in request.form: - return redirect(url_for("apikeylibrary")) - Key.new_key(request.form["keyname"], request.form["api_key"]) - return redirect(url_for("apikeylibrary")) - if "form2-submit" in request.form: - if "delete_id" not in request.form: - return redirect(url_for("apikeylibrary")) - Key.delete_key(request.form["delete_id"]) - return redirect(url_for("apikeylibrary")) - - return redirect(url_for("apikeylibrary")) - - -@app.route("/clientlibrary", methods=["GET"]) -def clientlibrary(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - clients = Client.get_all_clients() - except connector.ProgrammingError as e: - Database.create_tables() - clients = [] - - return render_template("clientlibrary.html", clients=clients) - - -@app.route("/clientlibrary", methods=["POST"]) -def clientlibrary_post(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - if request.method == "POST": - if "form-submit" in request.form: - if "client_name" not in request.form: - return redirect(url_for("clientlibrary")) - if "client_UUID" not in request.form: - return redirect(url_for("clientlibrary")) - Client.new(request.form["client_name"], request.form["client_UUID"]) - return redirect(url_for("clientlibrary")) - if "form2-submit" in request.form: - if "delete_id" not in request.form: - return redirect(url_for("clientlibrary")) - Client.delete_client(request.form["delete_id"]) - return redirect(url_for("clientlibrary")) - - return redirect(url_for("clientlibrary")) - - -@app.route("/userlibrary", methods=["GET"]) -def userlibrary(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - users = User.get_all_users() - except connector.ProgrammingError as e: - Database.create_tables() - users = [] - - return render_template("userlibrary.html", users=users) - - -@app.route("/userlibrary", methods=["POST"]) -def userlibrary_post(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - if request.method == "POST": - if "form-submit" in request.form: - if "newemail" not in request.form: - return redirect(url_for("userlibrary")) - if "newpassword" not in request.form: - return redirect(url_for("userlibrary")) - if "newuser" not in request.form: - return redirect(url_for("userlibrary")) - User.new(request.form["newuser"], request.form["newemail"], request.form["newpassword"], request.remote_addr, '1') - return redirect(url_for("userlibrary")) - if "form2-submit" in request.form: - if "delete_id" not in request.form: - return redirect(url_for("userlibrary")) - User.delete(request.form["delete_id"]) - return redirect(url_for("userlibrary")) - if "changeuser_submit" in request.form: - if "changeuser_id" not in request.form: - return redirect(url_for("userlibrary")) - if "changeuser_password" not in request.form: - return redirect(url_for("userlibrary")) - User.change(request.form["changeuser_id"], request.form["changeuser_password"], request.remote_addr, '1') - return redirect(url_for("userlibrary")) - - return redirect(url_for("userlibrary")) - - -@app.route("/modpackbuild/", methods=["GET", "POST"]) -def modpackbuild(id): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - listmod = Mod.get_all_pretty_names() - packbuild = Build.get_by_id(id) - listmodversions = Modversion.get_all() - buildlist = Build_modversion.get_modpack_build(id) - - packbuildname = Build.get_modpackname_by_id(id) - except connector.ProgrammingError as _: - raise _ - Database.create_tables() - mod_version_combo = [] - - if request.method == "POST": - if "form-submit" in request.form: - publish = "0" - private = "0" - if "min_java" in request.form: - min_java = request.form['min_java'] - if "NONE" in min_java: - min_java = None - if "publish" in request.form: - publish = request.form['publish'] - if "private" in request.form: - private = request.form['private'] - Build.update(id, request.form["version"], request.form["mcversion"], publish, private, min_java, request.form["memory"]) - return redirect(id) - if "optional_submit" in request.form: - Build_modversion.update_optional(request.form["optional_modid"], request.form["optional_check"], id) - return redirect(id) - if "selmodver_submit" in request.form: - Modversion.update_modversion_in_build(request.form["selmodver_oldver"], request.form["selmodver_ver"], id) - return redirect(id) - if "delete_submit" in request.form: - if "delete_id" not in request.form: - return redirect(id) - Build_modversion.delete_build_modversion(request.form["delete_id"]) - return redirect(id) - if "deletebuild_submit" in request.form: - Build.delete_build(id) - return redirect(url_for("modpacklibrary")) - if "add_mod_submit" in request.form: - newoptional = "0" - if "newoptional" in request.form: - newoptional = request.form['newoptional'] - Modversion.add_modversion_to_selected_build(request.form["modversion"], request.form["modnames"], id, "0", newoptional) - return redirect(id) - - return render_template("modpackbuild.html", listmod=listmod, packbuild=packbuild, packbuildname=packbuildname, listmodversions=listmodversions, buildlist=buildlist) - - -@app.route("/modlibrary", methods=["GET"]) -def modlibrary(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - mods = Mod.get_all() - except connector.ProgrammingError as e: - Database.create_tables() - mods = [] - - return render_template("modlibrary.html", mods=mods) - - -@app.route("/modlibrary", methods=["POST", "PUT"]) -def modlibrary_post(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - if "form-submit" in request.form: - markedbuild = "0" - if "markedbuild" in request.form: - markedbuild = request.form['markedbuild'] - Modversion.new(request.form["modid"], request.form["mcversion"] + "-" + request.form["version"], request.form["mcversion"], request.form["md5"], request.form["filesize"], markedbuild, "0", request.form["jarmd5"]) - if 'file' not in request.files: - print('No file part') - return redirect(url_for("modlibrary")) - filew = request.files['file'] - if filew.filename == '': - print('No selected file') - return redirect(url_for("modlibrary")) - if filew and allowed_file(filew.filename): - filename = secure_filename(filew.filename) - print("saving") - createFolder(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/") - filew.save(os.path.join(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/", filename)) - if R2_BUCKET != None: - keyname = "mods/" + request.form["mod"] + "/" + filename - R2.upload_file(app.config["UPLOAD_FOLDER"] + request.form["mod"] + "/" + filename, R2_BUCKET, keyname, ExtraArgs={'ContentType': 'application/zip'}) - jarfilew = request.files['jarfile'] - if jarfilew and allowed_file(jarfilew.filename): - jarfilename = secure_filename(jarfilew.filename) - print("saving jar") - createFolder(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/") - jarfilew.save(os.path.join(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/", jarfilename)) - if R2_BUCKET != None: - jarkeyname = "mods/" + request.form["mod"] + "/" + jarfilename - R2.upload_file(app.config["UPLOAD_FOLDER"] + request.form["mod"] + "/" + jarfilename, R2_BUCKET, jarkeyname, ExtraArgs={'ContentType': 'application/zip'}) - return redirect(url_for("modlibrary")) - - return redirect(url_for("modlibrary")) - - -@app.route("/modpacklibrary", methods=["GET"]) -def modpacklibrary(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - modpacklibrary = Modpack.get_all() - except connector.ProgrammingError as e: - Database.create_tables() - modpacklibrary = [] - - return render_template("modpacklibrary.html", modpacklibrary=modpacklibrary) - - -@app.route("/modpacklibrary", methods=["POST"]) -def modpacklibrary_post(): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - if request.method == "POST": - if "form-submit" in request.form: - hidden = "0" - private = "0" - if "hidden" in request.form: - hidden = request.form['hidden'] - if "private" in request.form: - private = request.form['private'] - Modpack.new(request.form["pretty_name"], request.form["name"], hidden, private, "0") - return redirect(url_for("modpacklibrary")) - if "hidden_submit" in request.form: - Modpack.update_checkbox(request.form["hidden_modid"], request.form["hidden_check"], "hidden", "modpacks") - if "private_submit" in request.form: - Modpack.update_checkbox(request.form["private_modid"], request.form["private_check"], "private", "modpacks") - if "pinned_submit" in request.form: - Modpack.update_checkbox(request.form["pinned_modid"], request.form["pinned_check"], "pinned", "modpacks") - - return redirect(url_for("modpacklibrary")) - - @app.errorhandler(404) def page_not_found(e): return render_template("404.html", error=e), 404 - -@app.route("/clients/", methods=["GET", "POST"]) -def clients(id): - if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): - # New or invalid session, send to login - return redirect(url_for("login")) - - try: - packs = Client_modpack.get_all_client_modpacks(id) - except connector.ProgrammingError as e: - Database.create_tables() - packs = [] - - if request.method == "POST": - if "form-submit" in request.form: - if "modpack" not in request.form: - return redirect(id) - Client_modpack.new(id, request.form["modpack"]) - return redirect(id) - if "form2-submit" in request.form: - if "delete_id" not in request.form: - return redirect(id) - Client_modpack.delete_client_modpack(request.form["delete_id"]) - return redirect(id) - - try: - modpacklibrary = Modpack.get_all() - except connector.ProgrammingError as e: - Database.create_tables() - modpacklibrary = [] - - return render_template("clients.html", clients=packs, modpacklibrary=modpacklibrary) - - if __name__ == "__main__": app.run(debug=debug, use_reloader=False, host=host, port=port) diff --git a/asetup.py b/asetup.py new file mode 100644 index 0000000..f8e2073 --- /dev/null +++ b/asetup.py @@ -0,0 +1,36 @@ +from flask import Blueprint, redirect, render_template, request, url_for + +from models.database import Database +from models.user import User +from models.globals import migratetechnic, new_user + +asetup = Blueprint("asetup", __name__) + +if migratetechnic: + Database.create_session_table() + +@asetup.route("/setup", methods=["GET"]) +def setup(): + if not Database.is_setup(): + Database.create_tables() + if new_user or not User.any_user_exists(): + if migratetechnic: + Database.migratetechnic_tables() + return render_template("setup.html") + return render_template("setup.html") + else: + return redirect(url_for('asite.index')) + + +@asetup.route("/setup", methods=["POST"]) +def setup_creation(): + if new_user or not User.any_user_exists(): + if request.form["setupemail"] is None: + print("setup failed") + return render_template("setup.html", failed=True) + if request.form["setuppassword"] is None: + print("setup failed") + return render_template("setup.html", failed=True) + User.new(request.form["setupemail"], request.form["setupemail"], + request.form["setuppassword"], request.remote_addr, '1') + return redirect(url_for('asite.index')) \ No newline at end of file diff --git a/asite.py b/asite.py new file mode 100644 index 0000000..24ecea5 --- /dev/null +++ b/asite.py @@ -0,0 +1,539 @@ +import os +import threading +import boto3 + +from api import solderpy_version +from flask import Blueprint, app, redirect, render_template, request, session, url_for +from models.build import Build +from models.build_modversion import Build_modversion +from models.client import Client +from models.client_modpack import Client_modpack +from models.database import Database +from models.key import Key +from models.mod import Mod +from models.modpack import Modpack +from models.modversion import Modversion +from models.session import Session +from models.user import User +from mysql import connector +from werkzeug.utils import secure_filename +from models.globals import mirror_url, debug, host, port, repo_url, R2_URL, db_name, R2_BUCKET, new_user, migratetechnic, solderpy_version, R2_REGION, R2_ENDPOINT, R2_ACCESS_KEY, R2_SECRET_KEY + +__version__ = solderpy_version + +asite = Blueprint("asite", __name__) + +Session.start_session_loop() + +## Allowed extensions to be uploaded +ALLOWED_EXTENSIONS = {'zip', 'jar'} + +R2 = boto3.client('s3', + region_name=R2_REGION, + endpoint_url=R2_ENDPOINT, + aws_access_key_id=R2_ACCESS_KEY, + aws_secret_access_key=R2_SECRET_KEY) + +def createFolder(dirName): + os.makedirs(dirName, exist_ok=True) + + +def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + +@asite.context_processor +def inject_menu(): + + markedbuildid2 = Build.get_marked_build() + if markedbuildid2 == None: + markedbuildid2 = 0 + pinnedmodpacks = Modpack.get_by_pinned() + + return dict(markedbuildid2=markedbuildid2, solderversion=solderpy_version, pinnedmodpacks=pinnedmodpacks) + + +@asite.route("/") +def index(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + return render_template('index.html') + + +@asite.route("/logout") +def logout(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + Session.delete_session(session["token"]) + return redirect(url_for("alogin.login")) + + +@asite.route("/modversion/", methods=["GET"]) +def modversion(id): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + mod = Mod.get_by_id(id) + + try: + modversions = mod.get_versions() + except connector.ProgrammingError as e: + Database.create_tables() + modversions = [] + + return render_template("modversion.html", modSlug=mod.name, modversions=modversions, mod=mod, mirror_url=mirror_url) + + +@asite.route("/modversion/", methods=["POST"]) +def newmodversion(id): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + if "form-submit" in request.form: + mod_side = request.form['flexRadioDefault'] + mod_type = request.form['type'] + Mod.update(id, request.form["name"], request.form["description"], request.form["author"], request.form["link"], request.form["pretty_name"], mod_side, mod_type, request.form["internal_note"]) + return redirect(id) + if "deleteversion_submit" in request.form: + if "delete_id" not in request.form: + return redirect(id) + Modversion.delete_modversion(request.form["delete_id"]) + return redirect(id) + if "addtoselbuild_submit" in request.form: + if "addtoselbuild_id" not in request.form: + return redirect(id) + Modversion.add_modversion_to_selected_build(request.form["addtoselbuild_id"], id, "0", "1", "0") + return redirect(id) + if "deletemod_submit" in request.form: + if "mod_delete_id" not in request.form: + return redirect(id) + Mod.delete_mod(request.form["mod_delete_id"]) + return redirect(url_for('asite.modlibrary')) + if "rehash_submit" in request.form: + if "rehash_id" not in request.form: + return redirect(url_for('asite.clientlibrary')) + + if request.form["rehash_md5"] != "": + version = Modversion.get_by_id(request.form["rehash_id"]) + version.update_hash(request.form["rehash_md5"], mirror_url + request.form["rehash_url"]) + else: + version = Modversion.get_by_id(request.form["rehash_id"]) + t = threading.Thread(target=version.rehash, args=(mirror_url + request.form["rehash_url"],)) + t.start() + if "newmodvermanual_submit" in request.form: + filesie2 = Modversion.get_file_size(mirror_url + request.form["newmodvermanual_url"]) + if request.form["newmodvermanual_md5"] != "": + Modversion.new(id, request.form["newmodvermanual_version"], request.form["newmodvermanual_mcversion"], request.form["newmodvermanual_md5"], filesie2, "0") + else: + # Todo Add filesize rehash and md5 hash, if fails do not add + Modversion.new(id, request.form["newmodvermanual_version"], request.form["newmodvermanual_mcversion"], "0", filesie2, "0", mirror_url + request.form["newmodvermanual_url"]) + return redirect(id) + + +@asite.route("/newmod", methods=["GET", "POST"]) +def newmod(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + if request.method == "POST": + mod_side = request.form['flexRadioDefault'] + mod_type = request.form['type'] + Mod.new(request.form["name"], request.form["description"], request.form["author"], request.form["link"], request.form["pretty_name"], mod_side, mod_type, request.form["internal_note"]) + return redirect(url_for('asite.modlibrary')) + + return render_template("newmod.html") + + +@asite.route("/modpack/", methods=["GET", "POST"]) +def modpack(id): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + modpack = Modpack.get_by_id(id) + builds = modpack.get_builds() + except connector.ProgrammingError as e: + Database.create_tables() + builds = [] + + if request.method == "POST": + if "form-submit" in request.form: + publish = "0" + private = "0" + if "min_java" in request.form: + min_java = request.form['min_java'] + if "NONE" in min_java: + min_java = None + if "publish" in request.form: + publish = request.form['publish'] + if "private" in request.form: + private = request.form['private'] + clonebuild = "" + if "clonebuild" in request.form and request.form['clonebuild'] != "": + clonebuild = request.form['clonebuild'] + if "clonebuildman" in request.form and request.form['clonebuildman'] != "": + clonebuild = request.form['clonebuildman'] + Build.new(id, request.form["version"], request.form["mcversion"], publish, private, min_java, request.form["memory"], clonebuild) + return redirect(id) + if "recommended_submit" in request.form: + Build.update_checkbox(id, request.form["recommended_modid"], "recommended", "modpacks") + return redirect(id) + if "latest_submit" in request.form: + Build.update_checkbox(id, request.form["latest_modid"], "latest", "modpacks") + return redirect(id) + if "is_published_submit" in request.form: + Build.update_checkbox(request.form["is_published_modid"], request.form["is_published_check"], "is_published", "builds") + return redirect(id) + if "private_submit" in request.form: + Build.update_checkbox(request.form["private_modid"], request.form["private_check"], 'private', 'builds') + return redirect(id) + if "marked_submit" in request.form: + Build.update_checkbox_marked(request.form["marked_modid"], request.form["marked_check"]) + return redirect(id) + if "changelog_submit" in request.form: + oldversion = request.form["changelog_oldver"] + newversion = request.form["changelog_newver"] + return redirect(url_for('asite.changelog', oldver=oldversion, newver=newversion)) + if "deletemod_submit" in request.form: + if "modpack_delete_id" not in request.form: + return redirect(id) + modpack.delete_modpack(request.form["modpack_delete_id"]) + return redirect(url_for('asite.modpacklibrary')) + + return render_template("modpack.html", modpack=builds, modpackname=modpack) + + +@asite.route("/changelog/-", methods=["GET", "POST"]) +def changelog(oldver, newver): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + changelog = Build_modversion.get_changelog(oldver, newver) + except connector.ProgrammingError as e: + Database.create_tables() + builds = [] + + return render_template("changelog.html", changelog=changelog) + + +@asite.route("/mainsettings") +def mainsettings(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + return render_template("mainsettings.html", nam=__name__, deb=debug, host=host, port=port, mirror_url=mirror_url, repo_url=repo_url, r2_url=R2_URL, db_name=db_name, versr=__version__, r2_bucket=R2_BUCKET, newuser=new_user, technic=migratetechnic) + + +@asite.route("/apikeylibrary", methods=["GET"]) +def apikeylibrary(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + keys = Key.get_all_keys() + except connector.ProgrammingError as e: + Database.create_tables() + keys = [] + + return render_template("apikeylibrary.html", keys=keys) + + +@asite.route("/apikeylibrary", methods=["POST"]) +def apikeylibrary_post(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + if request.method == "POST": + if "form-submit" in request.form: + if "keyname" not in request.form: + return redirect(url_for('asite.apikeylibrary')) + if "api_key" not in request.form: + return redirect(url_for('asite.apikeylibrary')) + Key.new_key(request.form["keyname"], request.form["api_key"]) + return redirect(url_for('asite.apikeylibrary')) + if "form2-submit" in request.form: + if "delete_id" not in request.form: + return redirect(url_for('asite.apikeylibrary')) + Key.delete_key(request.form["delete_id"]) + return redirect(url_for('asite.apikeylibrary')) + + return redirect(url_for('asite.apikeylibrary')) + + +@asite.route("/clientlibrary", methods=["GET"]) +def clientlibrary(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + clients = Client.get_all_clients() + except connector.ProgrammingError as e: + Database.create_tables() + clients = [] + + return render_template("clientlibrary.html", clients=clients) + + +@asite.route("/clientlibrary", methods=["POST"]) +def clientlibrary_post(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + if request.method == "POST": + if "form-submit" in request.form: + if "client_name" not in request.form: + return redirect(url_for('asite.clientlibrary')) + if "client_UUID" not in request.form: + return redirect(url_for('asite.clientlibrary')) + Client.new(request.form["client_name"], request.form["client_UUID"]) + return redirect(url_for('asite.clientlibrary')) + if "form2-submit" in request.form: + if "delete_id" not in request.form: + return redirect(url_for('asite.clientlibrary')) + Client.delete_client(request.form["delete_id"]) + return redirect(url_for('asite.clientlibrary')) + + return redirect(url_for('asite.clientlibrary')) + + +@asite.route("/userlibrary", methods=["GET"]) +def userlibrary(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + users = User.get_all_users() + except connector.ProgrammingError as e: + Database.create_tables() + users = [] + + return render_template("userlibrary.html", users=users) + + +@asite.route("/userlibrary", methods=["POST"]) +def userlibrary_post(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + if request.method == "POST": + if "form-submit" in request.form: + if "newemail" not in request.form: + return redirect(url_for('asite.userlibrary')) + if "newpassword" not in request.form: + return redirect(url_for('asite.userlibrary')) + if "newuser" not in request.form: + return redirect(url_for('asite.userlibrary')) + User.new(request.form["newuser"], request.form["newemail"], request.form["newpassword"], request.remote_addr, '1') + return redirect(url_for('asite.userlibrary')) + if "form2-submit" in request.form: + if "delete_id" not in request.form: + return redirect(url_for('asite.userlibrary')) + User.delete(request.form["delete_id"]) + return redirect(url_for('asite.userlibrary')) + if "changeuser_submit" in request.form: + if "changeuser_id" not in request.form: + return redirect(url_for('asite.userlibrary')) + if "changeuser_password" not in request.form: + return redirect(url_for('asite.userlibrary')) + User.change(request.form["changeuser_id"], request.form["changeuser_password"], request.remote_addr, '1') + return redirect(url_for('asite.userlibrary')) + + return redirect(url_for('asite.userlibrary')) + + +@asite.route("/modpackbuild/", methods=["GET", "POST"]) +def modpackbuild(id): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + listmod = Mod.get_all_pretty_names() + packbuild = Build.get_by_id(id) + listmodversions = Modversion.get_all() + buildlist = Build_modversion.get_modpack_build(id) + + packbuildname = Build.get_modpackname_by_id(id) + except connector.ProgrammingError as _: + raise _ + Database.create_tables() + mod_version_combo = [] + + if request.method == "POST": + if "form-submit" in request.form: + publish = "0" + private = "0" + if "min_java" in request.form: + min_java = request.form['min_java'] + if "NONE" in min_java: + min_java = None + if "publish" in request.form: + publish = request.form['publish'] + if "private" in request.form: + private = request.form['private'] + Build.update(id, request.form["version"], request.form["mcversion"], publish, private, min_java, request.form["memory"]) + return redirect(id) + if "optional_submit" in request.form: + Build_modversion.update_optional(request.form["optional_modid"], request.form["optional_check"], id) + return redirect(id) + if "selmodver_submit" in request.form: + Modversion.update_modversion_in_build(request.form["selmodver_oldver"], request.form["selmodver_ver"], id) + return redirect(id) + if "delete_submit" in request.form: + if "delete_id" not in request.form: + return redirect(id) + Build_modversion.delete_build_modversion(request.form["delete_id"]) + return redirect(id) + if "deletebuild_submit" in request.form: + Build.delete_build(id) + return redirect(url_for('asite.modpacklibrary')) + if "add_mod_submit" in request.form: + newoptional = "0" + if "newoptional" in request.form: + newoptional = request.form['newoptional'] + Modversion.add_modversion_to_selected_build(request.form["modversion"], request.form["modnames"], id, "0", newoptional) + return redirect(id) + + return render_template("modpackbuild.html", listmod=listmod, packbuild=packbuild, packbuildname=packbuildname, listmodversions=listmodversions, buildlist=buildlist) + + +@asite.route("/modlibrary", methods=["GET"]) +def modlibrary(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + mods = Mod.get_all() + except connector.ProgrammingError as e: + Database.create_tables() + mods = [] + + return render_template("modlibrary.html", mods=mods) + + +@asite.route("/modlibrary", methods=["POST", "PUT"]) +def modlibrary_post(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + if "form-submit" in request.form: + markedbuild = "0" + if "markedbuild" in request.form: + markedbuild = request.form['markedbuild'] + Modversion.new(request.form["modid"], request.form["mcversion"] + "-" + request.form["version"], request.form["mcversion"], request.form["md5"], request.form["filesize"], markedbuild, "0", request.form["jarmd5"]) + if 'file' not in request.files: + print('No file part') + return redirect(url_for('asite.modlibrary')) + filew = request.files['file'] + if filew.filename == '': + print('No selected file') + return redirect(url_for('asite.modlibrary')) + if filew and allowed_file(filew.filename): + filename = secure_filename(filew.filename) + print("saving") + createFolder(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/") + filew.save(os.path.join(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/", filename)) + if R2_BUCKET != None: + keyname = "mods/" + request.form["mod"] + "/" + filename + R2.upload_file(app.config["UPLOAD_FOLDER"] + request.form["mod"] + "/" + filename, R2_BUCKET, keyname, ExtraArgs={'ContentType': 'application/zip'}) + jarfilew = request.files['jarfile'] + if jarfilew and allowed_file(jarfilew.filename): + jarfilename = secure_filename(jarfilew.filename) + print("saving jar") + createFolder(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/") + jarfilew.save(os.path.join(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/", jarfilename)) + if R2_BUCKET != None: + jarkeyname = "mods/" + request.form["mod"] + "/" + jarfilename + R2.upload_file(app.config["UPLOAD_FOLDER"] + request.form["mod"] + "/" + jarfilename, R2_BUCKET, jarkeyname, ExtraArgs={'ContentType': 'application/zip'}) + return redirect(url_for('asite.modlibrary')) + + return redirect(url_for('asite.modlibrary')) + + +@asite.route("/modpacklibrary", methods=["GET"]) +def modpacklibrary(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + modpacklibrary = Modpack.get_all() + except connector.ProgrammingError as e: + Database.create_tables() + modpacklibrary = [] + + return render_template("modpacklibrary.html", modpacklibrary=modpacklibrary) + + +@asite.route("/modpacklibrary", methods=["POST"]) +def modpacklibrary_post(): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + if request.method == "POST": + if "form-submit" in request.form: + hidden = "0" + private = "0" + if "hidden" in request.form: + hidden = request.form['hidden'] + if "private" in request.form: + private = request.form['private'] + Modpack.new(request.form["pretty_name"], request.form["name"], hidden, private, "0") + return redirect(url_for('asite.modpacklibrary')) + if "hidden_submit" in request.form: + Modpack.update_checkbox(request.form["hidden_modid"], request.form["hidden_check"], "hidden", "modpacks") + if "private_submit" in request.form: + Modpack.update_checkbox(request.form["private_modid"], request.form["private_check"], "private", "modpacks") + if "pinned_submit" in request.form: + Modpack.update_checkbox(request.form["pinned_modid"], request.form["pinned_check"], "pinned", "modpacks") + + return redirect(url_for('alogin.modpacklibrary')) + + +@asite.route("/clients/", methods=["GET", "POST"]) +def clients(id): + if "token" not in session or not Session.verify_session(session["token"], request.remote_addr): + # New or invalid session, send to login + return redirect(url_for('alogin.login')) + + try: + packs = Client_modpack.get_all_client_modpacks(id) + except connector.ProgrammingError as e: + Database.create_tables() + packs = [] + + if request.method == "POST": + if "form-submit" in request.form: + if "modpack" not in request.form: + return redirect(id) + Client_modpack.new(id, request.form["modpack"]) + return redirect(id) + if "form2-submit" in request.form: + if "delete_id" not in request.form: + return redirect(id) + Client_modpack.delete_client_modpack(request.form["delete_id"]) + return redirect(id) + + try: + modpacklibrary = Modpack.get_all() + except connector.ProgrammingError as e: + Database.create_tables() + modpacklibrary = [] + + return render_template("clients.html", clients=packs, modpacklibrary=modpacklibrary) + diff --git a/models/globals.py b/models/globals.py new file mode 100644 index 0000000..f221c6b --- /dev/null +++ b/models/globals.py @@ -0,0 +1,34 @@ +import os +from dotenv import load_dotenv + +## Solderpy version +solderpy_version = "1.4.0" + +load_dotenv(".env") + +## Enviroment variables +new_user = False +migratetechnic = False +debug = False + +host = os.getenv("APP_URL") +port = os.getenv("APP_PORT") + +new_user = os.getenv("NEW_USER") +migratetechnic = os.getenv("TECHNIC_MIGRATION") + +debug = os.getenv("APP_DEBUG").lower() in ["true", "t", "1", "yes", "y"] + +mirror_url = os.getenv("SOLDER_MIRROR_URL") +repo_url = os.getenv("SOLDER_REPO_LOCATION") + +r2_url = os.getenv("R2_URL") +db_name = os.getenv("DB_DATABASE") + +## S3 bucket variables +R2_ENDPOINT = os.getenv("R2_ENDPOINT") +R2_URL = os.getenv("R2_URL") +R2_REGION = os.getenv("R2_REGION") +R2_ACCESS_KEY = os.getenv("R2_ACCESS_KEY") +R2_SECRET_KEY = os.getenv("R2_SECRET_KEY") +R2_BUCKET = os.getenv("R2_BUCKET") diff --git a/templates/layout.html b/templates/layout.html index d723add..7aa871a 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -30,34 +30,34 @@
-
From b70c647113169c7d223ac4593fbff083548a463f Mon Sep 17 00:00:00 2001 From: maggi373 <40539743+maggi373@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:20:26 +0200 Subject: [PATCH 5/6] add more github actions --- .github/workflows/deploy_docker_dev.yml | 27 +++++++++++++++++++ ...ker-image.yml => deploy_docker_latest.yml} | 3 ++- .github/workflows/deploy_docker_tag.yml | 27 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/deploy_docker_dev.yml rename .github/workflows/{docker-image.yml => deploy_docker_latest.yml} (95%) create mode 100644 .github/workflows/deploy_docker_tag.yml diff --git a/.github/workflows/deploy_docker_dev.yml b/.github/workflows/deploy_docker_dev.yml new file mode 100644 index 0000000..54b992d --- /dev/null +++ b/.github/workflows/deploy_docker_dev.yml @@ -0,0 +1,27 @@ +name: Docker Image CI + +on: + push: + branches: + - dev + +jobs: + push_to_registry: + name: push docker image to hub + runs-on: ubuntu-latest + steps: + - name: check repository + uses: actions/checkout@v4 + + - name: login to docker registry + uses: docker/login-action@v3 + with: + username: ${{secrets.DOCKERHUB_USERNAME}} + password: ${{secrets.DOCKERHUB_TOKEN}} + + - name: build and push docker image to registry + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: thorfusion/solderpy:dev diff --git a/.github/workflows/docker-image.yml b/.github/workflows/deploy_docker_latest.yml similarity index 95% rename from .github/workflows/docker-image.yml rename to .github/workflows/deploy_docker_latest.yml index 652e3d7..07a1c1b 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/deploy_docker_latest.yml @@ -2,7 +2,8 @@ name: Docker Image CI on: push: - branches: [ "main" ] + branches: + - main schedule: - cron: '0 12 * * 2' diff --git a/.github/workflows/deploy_docker_tag.yml b/.github/workflows/deploy_docker_tag.yml new file mode 100644 index 0000000..8be9182 --- /dev/null +++ b/.github/workflows/deploy_docker_tag.yml @@ -0,0 +1,27 @@ +name: Docker Image CI + +on: + push: + tags: + - 1.* + +jobs: + push_to_registry: + name: push docker image to hub + runs-on: ubuntu-latest + steps: + - name: check repository + uses: actions/checkout@v4 + + - name: login to docker registry + uses: docker/login-action@v3 + with: + username: ${{secrets.DOCKERHUB_USERNAME}} + password: ${{secrets.DOCKERHUB_TOKEN}} + + - name: build and push docker image to registry + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: thorfusion/solderpy:${{ github.ref_name }} From 493db8d92534592a6b75c83243390d4da2ee2be8 Mon Sep 17 00:00:00 2001 From: maggi373 <40539743+maggi373@users.noreply.github.com> Date: Sat, 10 Aug 2024 17:31:04 +0200 Subject: [PATCH 6/6] fix upload folder and lock its location --- app.py | 2 -- asite.py | 14 +++++++------- models/globals.py | 2 ++ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index e4a43e4..2291009 100644 --- a/app.py +++ b/app.py @@ -15,8 +15,6 @@ app.register_blueprint(asetup) app.register_blueprint(asite) -app.config["UPLOAD_FOLDER"] = "./mods/" - app.secret_key = secrets.token_hex() @app.errorhandler(404) diff --git a/asite.py b/asite.py index 24ecea5..8df66b0 100644 --- a/asite.py +++ b/asite.py @@ -17,7 +17,7 @@ from models.user import User from mysql import connector from werkzeug.utils import secure_filename -from models.globals import mirror_url, debug, host, port, repo_url, R2_URL, db_name, R2_BUCKET, new_user, migratetechnic, solderpy_version, R2_REGION, R2_ENDPOINT, R2_ACCESS_KEY, R2_SECRET_KEY +from models.globals import mirror_url, debug, host, port, repo_url, R2_URL, db_name, R2_BUCKET, new_user, migratetechnic, solderpy_version, R2_REGION, R2_ENDPOINT, R2_ACCESS_KEY, R2_SECRET_KEY, UPLOAD_FOLDER __version__ = solderpy_version @@ -445,20 +445,20 @@ def modlibrary_post(): if filew and allowed_file(filew.filename): filename = secure_filename(filew.filename) print("saving") - createFolder(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/") - filew.save(os.path.join(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/", filename)) + createFolder(UPLOAD_FOLDER + secure_filename(request.form["mod"]) + "/") + filew.save(os.path.join(UPLOAD_FOLDER + secure_filename(request.form["mod"]) + "/", filename)) if R2_BUCKET != None: keyname = "mods/" + request.form["mod"] + "/" + filename - R2.upload_file(app.config["UPLOAD_FOLDER"] + request.form["mod"] + "/" + filename, R2_BUCKET, keyname, ExtraArgs={'ContentType': 'application/zip'}) + R2.upload_file(UPLOAD_FOLDER + request.form["mod"] + "/" + filename, R2_BUCKET, keyname, ExtraArgs={'ContentType': 'application/zip'}) jarfilew = request.files['jarfile'] if jarfilew and allowed_file(jarfilew.filename): jarfilename = secure_filename(jarfilew.filename) print("saving jar") - createFolder(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/") - jarfilew.save(os.path.join(app.config["UPLOAD_FOLDER"] + secure_filename(request.form["mod"]) + "/", jarfilename)) + createFolder(UPLOAD_FOLDER + secure_filename(request.form["mod"]) + "/") + jarfilew.save(os.path.join(UPLOAD_FOLDER + secure_filename(request.form["mod"]) + "/", jarfilename)) if R2_BUCKET != None: jarkeyname = "mods/" + request.form["mod"] + "/" + jarfilename - R2.upload_file(app.config["UPLOAD_FOLDER"] + request.form["mod"] + "/" + jarfilename, R2_BUCKET, jarkeyname, ExtraArgs={'ContentType': 'application/zip'}) + R2.upload_file(UPLOAD_FOLDER + request.form["mod"] + "/" + jarfilename, R2_BUCKET, jarkeyname, ExtraArgs={'ContentType': 'application/zip'}) return redirect(url_for('asite.modlibrary')) return redirect(url_for('asite.modlibrary')) diff --git a/models/globals.py b/models/globals.py index f221c6b..5d13a2a 100644 --- a/models/globals.py +++ b/models/globals.py @@ -25,6 +25,8 @@ r2_url = os.getenv("R2_URL") db_name = os.getenv("DB_DATABASE") +UPLOAD_FOLDER = "./mods/" + ## S3 bucket variables R2_ENDPOINT = os.getenv("R2_ENDPOINT") R2_URL = os.getenv("R2_URL")