From 3f2e50a5ddc2a912ddd053166b756b5dfeee60c1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 13 Oct 2022 12:17:31 -0700 Subject: [PATCH 01/40] Add config compare to not overwrite user changes --- app/classes/shared/helpers.py | 32 +++++++++++++++++++ app/classes/shared/main_controller.py | 46 +++++++++++++++++++++++++++ main.py | 1 + 3 files changed, 79 insertions(+) diff --git a/app/classes/shared/helpers.py b/app/classes/shared/helpers.py index c4d9ad10..7202caa6 100644 --- a/app/classes/shared/helpers.py +++ b/app/classes/shared/helpers.py @@ -376,6 +376,38 @@ class Helpers: return default_return + def set_settings(self, data): + try: + with open(self.settings_file, "w", encoding="utf-8") as f: + json.dump(data, f, indent=4) + + except Exception as e: + logger.critical( + f"Config File Error: Unable to read {self.settings_file} due to {e}" + ) + Console.critical( + f"Config File Error: Unable to read {self.settings_file} due to {e}" + ) + return False + + return True + + def get_all_settings(self): + try: + with open(self.settings_file, "r", encoding="utf-8") as f: + data = json.load(f) + + except Exception as e: + data = {} + logger.critical( + f"Config File Error: Unable to read {self.settings_file} due to {e}" + ) + Console.critical( + f"Config File Error: Unable to read {self.settings_file} due to {e}" + ) + + return data + def set_setting(self, key, new_value): try: with open(self.settings_file, "r", encoding="utf-8") as f: diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index f61941ca..7ed949bc 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -243,6 +243,52 @@ class Controller: exec_user["user_id"], "support_status_update", results ) + def get_config_diff(self): + master_config = { + "config_ver": 1, + "http_port": 8000, + "https_port": 8443, + "language": "en_EN", + "cookie_expire": 30, + "cookie_secret": "random", + "apikey_secret": "random", + "show_errors": True, + "history_max_age": 7, + "stats_update_frequency": 30, + "delete_default_json": False, + "show_contribute_link": True, + "virtual_terminal_lines": 70, + "max_log_lines": 700, + "max_audit_entries": 300, + "disabled_language_files": ["lol_EN.json", ""], + "stream_size_GB": 1, + "keywords": ["help", "chunk"], + "allow_nsfw_profile_pictures": False, + "enable_user_self_delete": False, + } + user_config = self.helper.get_all_settings() + try: + if user_config["config_ver"] == master_config["config_ver"]: + return user_config + else: + user_config["config_ver"] = master_config["config_ver"] + except: + logger.debug("No config version found") + items_to_del = [] + + for key in user_config: + if key not in master_config.keys(): + items_to_del.append(key) + + for item in items_to_del[:]: + del user_config[item] + + for key, value in master_config.items(): + if key not in user_config.keys(): + user_config[key] = value + + self.helper.set_settings(user_config) + def send_log_status(self): try: return self.log_stats diff --git a/main.py b/main.py index b6fdd89f..60ad4409 100644 --- a/main.py +++ b/main.py @@ -159,6 +159,7 @@ if __name__ == "__main__": logger.info("Initializing all servers defined") Console.info("Initializing all servers defined") controller.servers.init_all_servers() + controller.get_config_diff() def tasks_starter(): # start stats logging From 51f507c4f87c2566c740a16be8b9ec57be085dfa Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 13 Oct 2022 12:25:29 -0700 Subject: [PATCH 02/40] Add comments --- app/classes/shared/main_controller.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index 7ed949bc..de112f80 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -267,7 +267,9 @@ class Controller: "enable_user_self_delete": False, } user_config = self.helper.get_all_settings() + # Check user's config version try: + # If they are on the same version there is no need to remove this. if user_config["config_ver"] == master_config["config_ver"]: return user_config else: @@ -276,17 +278,22 @@ class Controller: logger.debug("No config version found") items_to_del = [] + # Iterate through user's config.json and check for + # Keys/values that need to be removed for key in user_config: if key not in master_config.keys(): items_to_del.append(key) + # Remove key/values from user config that were staged for item in items_to_del[:]: del user_config[item] + # Add new keys to user config. for key, value in master_config.items(): if key not in user_config.keys(): user_config[key] = value + # Call helper to set updated config. self.helper.set_settings(user_config) def send_log_status(self): From fbc506f2fd60c7a5da2b4d2857a308544762f4f9 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Mon, 19 Dec 2022 17:15:26 -0500 Subject: [PATCH 03/40] Fix issues after merge conflicts --- app/classes/shared/helpers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/classes/shared/helpers.py b/app/classes/shared/helpers.py index 78ce47c5..e583e597 100644 --- a/app/classes/shared/helpers.py +++ b/app/classes/shared/helpers.py @@ -376,7 +376,6 @@ class Helpers: return default_return - def set_settings(self, data): try: with open(self.settings_file, "w", encoding="utf-8") as f: @@ -420,7 +419,6 @@ class Helpers: return False return True ->>>>>>> app/classes/shared/helpers.py def set_setting(self, key, new_value): try: with open(self.settings_file, "r", encoding="utf-8") as f: From 4031b74e00a350db7c1c71f64736631b881af7b0 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 9 Jan 2023 16:34:12 -0500 Subject: [PATCH 04/40] Hide server stats db from users --- app/classes/shared/helpers.py | 42 +++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/app/classes/shared/helpers.py b/app/classes/shared/helpers.py index c5238ae8..01712fbb 100644 --- a/app/classes/shared/helpers.py +++ b/app/classes/shared/helpers.py @@ -960,22 +960,24 @@ class Helpers: file_list = sorted(dir_list, key=str.casefold) + sorted( unsorted_files, key=str.casefold ) + ignored_names = ["crafty_managed.txt", "db_stats"] for raw_filename in file_list: filename = html.escape(raw_filename) rel = os.path.join(folder, raw_filename) dpath = os.path.join(folder, filename) if os.path.isdir(rel): - output += f"""
  • - \n
    - - - - {filename} - -
  • - \n""" + if filename not in ignored_names: + output += f"""
  • + \n
    + + + + {filename} + +
  • + \n""" else: - if filename != "crafty_managed.txt": + if filename not in ignored_names: output += f"""
  • """ for raw_filename in file_list: filename = html.escape(raw_filename) dpath = os.path.join(folder, filename) rel = os.path.join(folder, raw_filename) if os.path.isdir(rel): - output += f"""
  • - \n
    - - - - {filename} - -
  • """ + if filename not in ignored_names: + output += f"""
  • + \n
    + + + + {filename} + +
  • """ else: - if filename != "crafty_managed.txt": + if filename not in ignored_names: output += f"""
  • Date: Mon, 9 Jan 2023 18:52:45 -0500 Subject: [PATCH 05/40] Make config editable from Crafty --- app/classes/web/panel_handler.py | 7 + app/frontend/templates/panel/config_json.html | 229 ++++++++++++++++++ .../templates/panel/panel_config.html | 12 + 3 files changed, 248 insertions(+) create mode 100644 app/frontend/templates/panel/config_json.html diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index 582517db..3e7699c8 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -897,6 +897,13 @@ class PanelHandler(BaseHandler): template = "panel/panel_config.html" + elif page == "config_json": + with open(self.helper.settings_file, "r", encoding="utf-8") as f: + data = json.load(f) + page_data["config-json"] = data + + template = "panel/config_json.html" + elif page == "add_user": page_data["new_user"] = True page_data["user"] = {} diff --git a/app/frontend/templates/panel/config_json.html b/app/frontend/templates/panel/config_json.html new file mode 100644 index 00000000..68f42b7b --- /dev/null +++ b/app/frontend/templates/panel/config_json.html @@ -0,0 +1,229 @@ +{% extends ../base.html %} + +{% block meta %} +{% end %} + +{% block title %}Crafty Controller - {{ translate('panelConfig', 'pageTitle', data['lang']) }}{% end %} + +{% block content %} + +
    + {% if data['superuser'] %} + + {% end %} + + +
    +
    + +
    + +
    + + +
    +
    +
    +
    +
    + {% for item in data['config-json'].items() %} + + {% if isinstance(item[1], bool) %} + + {% if item[1] == True %} +
    + +  
    + +  
    +
    + {% else %} +
    + +  
    + +  
    +
    + {% end %} + {% elif isinstance(item[1], int) %} + + {% else %} + + {% end %} + {% end %} +
    +
    +
    +
    +
    + + +
    + + + + +{% end %} + +{% block js %} + + + +{% end %} \ No newline at end of file diff --git a/app/frontend/templates/panel/panel_config.html b/app/frontend/templates/panel/panel_config.html index a4ee9f66..15f0a269 100644 --- a/app/frontend/templates/panel/panel_config.html +++ b/app/frontend/templates/panel/panel_config.html @@ -8,6 +8,18 @@ {% block content %}
    + {% if data['superuser'] %} + + {% end %}
    From 5d3dbc6f9c51cbf8704127c6ea878d6b8b2359b9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 9 Jan 2023 19:01:05 -0500 Subject: [PATCH 06/40] Fix security --- app/classes/web/panel_handler.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index 3e7699c8..90ba2aef 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -898,11 +898,12 @@ class PanelHandler(BaseHandler): template = "panel/panel_config.html" elif page == "config_json": - with open(self.helper.settings_file, "r", encoding="utf-8") as f: - data = json.load(f) - page_data["config-json"] = data + if exec_user["superuser"]: + with open(self.helper.settings_file, "r", encoding="utf-8") as f: + data = json.load(f) + page_data["config-json"] = data - template = "panel/config_json.html" + template = "panel/config_json.html" elif page == "add_user": page_data["new_user"] = True From bea48d9059d8a43fe01928c4871405c7e894de74 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 10 Jan 2023 14:12:33 -0500 Subject: [PATCH 07/40] Add better formatting for lists. --- app/classes/web/panel_handler.py | 21 +++++++++++++++++++ app/frontend/templates/panel/config_json.html | 21 ++++++++++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index 90ba2aef..38b9fd71 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -1720,6 +1720,27 @@ class PanelHandler(BaseHandler): self.tasks_manager.reload_schedule_from_db() self.redirect(f"/panel/server_detail?id={server_id}&subpage=backup") + elif page == "config_json": + try: + data = {} + with open(self.helper.settings_file, "r", encoding="utf-8") as f: + print("open") + keys = json.load(f).keys() + for key in keys: + print(self.get_argument(key)) + data[key] = self.get_argument(key) + print("data:", data) + """ + with open(self.helper.settings_file, "w", encoding="utf-8") as f: + json.dump(data, f, indent=4) +""" + except Exception as e: + logger.critical( + f"Config File Error: Unable to read {self.helper.settings_file} due to {e}" + ) + + self.redirect("/panel/config_json") + if page == "new_schedule": server_id = self.check_server_id() if not server_id: diff --git a/app/frontend/templates/panel/config_json.html b/app/frontend/templates/panel/config_json.html index 68f42b7b..c2afaa93 100644 --- a/app/frontend/templates/panel/config_json.html +++ b/app/frontend/templates/panel/config_json.html @@ -37,36 +37,47 @@
    -
    + + {% raw xsrf_form_html() %} {% for item in data['config-json'].items() %} +
    +
    - {% if isinstance(item[1], bool) %} + {% if isinstance(item[1], list) %} +
      + {% for li in item[1] %} +
      + {% end %} +
    + {% elif isinstance(item[1], bool) %} {% if item[1] == True %}
     
    -  
    +  
    {% else %}
     
    -  
    +  
    {% end %} {% elif isinstance(item[1], int) %} + step="1" min="0" required> {% else %} {% end %} {% end %} +
    From f9064eb15f19210df2733829cbd391f720caad98 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Sat, 14 Jan 2023 22:22:37 -0500 Subject: [PATCH 08/40] Turn it into a list for a fresh start at this --- app/frontend/templates/panel/config_json.html | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/frontend/templates/panel/config_json.html b/app/frontend/templates/panel/config_json.html index c2afaa93..c5f3e5ad 100644 --- a/app/frontend/templates/panel/config_json.html +++ b/app/frontend/templates/panel/config_json.html @@ -46,10 +46,10 @@ {% if isinstance(item[1], list) %} -
      +
        {% for li in item[1] %} -
        +
      • {{li}}
      • +
        {% end %}
      {% elif isinstance(item[1], bool) %} @@ -107,6 +107,15 @@ {% block js %} - + {% end %} \ No newline at end of file From 2e810b1544af34b1f80892ec4b6579b512c1bd5b Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Thu, 19 Jan 2023 16:20:23 -0500 Subject: [PATCH 18/40] Fix button covers --- app/frontend/templates/panel/config_json.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/frontend/templates/panel/config_json.html b/app/frontend/templates/panel/config_json.html index faf1f5d0..2364e05a 100644 --- a/app/frontend/templates/panel/config_json.html +++ b/app/frontend/templates/panel/config_json.html @@ -60,7 +60,7 @@ {% elif item[0] == 'disabled_language_files' %} {% elif item[0] == 'disabled_language_files' %} - - - - + + +
    {% elif isinstance(item[1], list) %} + class="form-control list">{{','.join(item[1])}} {% elif isinstance(item[1], bool) %} {% if item[1] == True %}
    @@ -97,10 +98,10 @@ {% end %} {% elif isinstance(item[1], int) %} + step="1" min="0" required> {% else %} + step="2" min="0" required> {% end %}
    {% end %} @@ -115,6 +116,10 @@