diff --git a/src/endpoints/web.py b/src/endpoints/web.py index 6d91a32..c046460 100644 --- a/src/endpoints/web.py +++ b/src/endpoints/web.py @@ -193,6 +193,48 @@ def tick_circle(): logger.graylog_logger(level="error", handler="general-tick-circle-png", message=e) +@app.route("/admin/ban", methods=["POST", "GET"]) +def admin_ban(): + if request.method == "POST": + login_token = sanitize_input(request.form.get("login_token")) + if login_token is None: + return jsonify({"status": "error", "message": "No api token found"}), 401 + if login_token not in allowed_tokens: + ip = check_for_game_client("remote") + logger.graylog_logger(level="error", handler="web_admin_ban", message={"IP": ip, "message": "Invalid api token"}) + error_message = "Invalid api token" + return render_template('ban.html', error=error_message) + chosen_date = sanitize_input(request.form.get("datetime")) + ban_reason = sanitize_input(request.form.get("ban_reason")) + steam_id = sanitize_input(request.form.get("steam_id")) + if not chosen_date or not ban_reason or not steam_id: + error_message = "Please fill out all fields." + return render_template('ban.html', error=error_message) + try: + create_epoch, expire_epoch = create_ban_time(chosen_date) + except Exception as e: + logger.graylog_logger(level="error", handler="web_admin_ban", message=e) + error_message = "An Error occurred. Are you sure the date is correct?" + return render_template('ban.html', error=error_message) + ret = mongo.write_data_with_list(login=steam_id, + login_steam=True, + items_dict={"is_banned": True, + "ban_reason": ban_reason, + "ban_start": create_epoch, + "ban_expire": expire_epoch}) + if ret: + success_message = "User banned successfully." + return render_template('ban.html', success=success_message) + else: + error_message = "An Error occurred. Are you sure the SteamID is correct?" + return render_template('ban.html', error=error_message) + + elif request.method == "GET": + return render_template('ban.html') + else: + return abort(405) + + @app.route("/debug", methods=["Get"]) def debug_root(): check_for_game_client("soft") @@ -263,7 +305,8 @@ def debug_mirrors_write(): return jsonify({"status": "error", "message": "No Steamid found."}), 400 logger.graylog_logger(level="info", handler="logging_debug_mirror_write", - message={"IP": check_for_game_client("remote"), "steamid": steam_user_id, "data": data_b}) + message={"IP": check_for_game_client("remote"), "steamid": steam_user_id, + "data": data_b}) return_val = mongo.write_data_with_list(login=steam_user_id, login_steam=True, items_dict=data_b) @@ -373,7 +416,8 @@ def updater_files(): @app.route("/updater/files/pak/", methods=["GET"]) def updater_pak(): try: - return send_from_directory(os.path.join(app.root_path, 'files'), 'TheExitRebirthBackendAPI-WindowsNoEditor_P.pak') + return send_from_directory(os.path.join(app.root_path, 'files'), + 'TheExitRebirthBackendAPI-WindowsNoEditor_P.pak') except TimeoutError: return jsonify({"status": "error"}) except Exception as e: @@ -383,7 +427,8 @@ def updater_pak(): @app.route("/updater/files/sig/", methods=["GET"]) def updater_sig(): try: - return send_from_directory(os.path.join(app.root_path, 'files'), 'TheExitRebirthBackendAPI-WindowsNoEditor_P.sig') + return send_from_directory(os.path.join(app.root_path, 'files'), + 'TheExitRebirthBackendAPI-WindowsNoEditor_P.sig') except TimeoutError: return jsonify({"status": "error"}) except Exception as e: @@ -497,7 +542,7 @@ def download(file_id): #file = file_handler.get_file(file_id) file = None if file is None: - return jsonify({"status": "error", "message": "File not found."}), 404 + return jsonify({"status": "error", "message": "File not found."}), 404 return file except TimeoutError: return jsonify({"status": "error"}) @@ -532,4 +577,4 @@ def sha256(file_id): except TimeoutError: return jsonify({"status": "error"}) except Exception as e: - logger.graylog_logger(level="error", handler="web-sha256", message=e) \ No newline at end of file + logger.graylog_logger(level="error", handler="web-sha256", message=e) diff --git a/src/flask_definitions.py b/src/flask_definitions.py index 74c2126..5b99271 100644 --- a/src/flask_definitions.py +++ b/src/flask_definitions.py @@ -6,7 +6,7 @@ from logic.global_handlers import check_for_game_client from logic.global_handlers import sanitize_input from logic.mongodb_handler import mongo from logic.webhook_handler import discord_webhook -from logic.time_handler import get_lifetime +from logic.time_handler import get_lifetime, create_ban_time # from logic.challenge_handler import get_progression_batch, update_progression_batch, get_time_based_challenges from logic.hash_handler import hash_handler from logic.challenge_handler_new import new_challenge_handler, get_challenge_ids_from_inventory diff --git a/src/logic/time_handler.py b/src/logic/time_handler.py index 2193fb2..bb5189f 100644 --- a/src/logic/time_handler.py +++ b/src/logic/time_handler.py @@ -45,3 +45,12 @@ def get_lifetime(challenge_type): except Exception as e: logger.error("Error in time_handler -> " + str(e)) return None + + +def create_ban_time(date): + date_string = date.replace('%3A', ':') + date_object = datetime.datetime.strptime(date_string, "%Y-%m-%dT%H:%M") + epoch_time = int(date_object.timestamp()) + + current_epoch_time = int(datetime.datetime.now().timestamp()) + return current_epoch_time, epoch_time diff --git a/src/templates/ban.html b/src/templates/ban.html new file mode 100644 index 0000000..de059cd --- /dev/null +++ b/src/templates/ban.html @@ -0,0 +1,98 @@ + + + + Admin Ban Tool + + + + {% if success %} +
+ {{ success }} +
+ {% endif %} + + {% if error %} +
+ {{ error }} +
+ {% endif %} + +

Administration Tool: Ban User

+
+ +

+ + +

+ + +

+ + +

+ + +
+ +