diff --git a/CHANGELOG.md b/CHANGELOG.md index cd7daf70..fb3da326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## --- [4.0.20] - 2022/TBD ### New features - Add option to run command before backup. ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/536)) +- Make Config.json editable from panel. ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/532)) ### Bug fixes - Fix local java server imports. ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/529)) - Fix Schedule Restore | Add Backup Config Preservation. ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/533)) diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index 60194678..bf56c3e0 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -858,35 +858,6 @@ class PanelHandler(BaseHandler): page_data["roles"] = self.controller.roles.get_all_roles() page_data["auth-servers"][user.user_id] = super_auth_servers page_data["managed_users"] = [] - page_data["backgrounds"] = [] - cached_split = self.controller.cached_login.split("/") - - if len(cached_split) == 1: - page_data["backgrounds"].append( - self.controller.cached_login - ) - else: - page_data["backgrounds"].append(cached_split[1]) - if "login_1.jpg" not in page_data["backgrounds"]: - page_data["backgrounds"].append("login_1.jpg") - self.helper.ensure_dir_exists( - os.path.join( - self.controller.project_root, - "app/frontend/static/assets/images/auth/custom", - ) - ) - for item in os.listdir( - os.path.join( - self.controller.project_root, - "app/frontend/static/assets/images/auth/custom", - ) - ): - if item not in page_data["backgrounds"]: - page_data["backgrounds"].append(item) - page_data["background"] = self.controller.cached_login - page_data[ - "login_opacity" - ] = self.controller.management.get_login_opacity() else: page_data["managed_users"] = self.controller.users.get_managed_users( exec_user["user_id"] @@ -899,8 +870,65 @@ class PanelHandler(BaseHandler): exec_user["user_id"] ) + page_data["active_link"] = "panel_config" template = "panel/panel_config.html" + elif page == "config_json": + 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 + page_data["availables_languages"] = [] + page_data["all_languages"] = [] + + for file in sorted( + os.listdir( + os.path.join(self.helper.root_dir, "app", "translations") + ) + ): + if file.endswith(".json"): + if file.split(".")[0] not in self.helper.get_setting( + "disabled_language_files" + ): + page_data["availables_languages"].append(file.split(".")[0]) + page_data["all_languages"].append(file.split(".")[0]) + + page_data["active_link"] = "config_json" + template = "panel/config_json.html" + + elif page == "custom_login": + if exec_user["superuser"]: + page_data["backgrounds"] = [] + cached_split = self.controller.cached_login.split("/") + + if len(cached_split) == 1: + page_data["backgrounds"].append(self.controller.cached_login) + else: + page_data["backgrounds"].append(cached_split[1]) + if "login_1.jpg" not in page_data["backgrounds"]: + page_data["backgrounds"].append("login_1.jpg") + self.helper.ensure_dir_exists( + os.path.join( + self.controller.project_root, + "app/frontend/static/assets/images/auth/custom", + ) + ) + for item in os.listdir( + os.path.join( + self.controller.project_root, + "app/frontend/static/assets/images/auth/custom", + ) + ): + if item not in page_data["backgrounds"]: + page_data["backgrounds"].append(item) + page_data["background"] = self.controller.cached_login + page_data[ + "login_opacity" + ] = self.controller.management.get_login_opacity() + + page_data["active_link"] = "custom_login" + template = "panel/custom_login.html" + elif page == "add_user": page_data["new_user"] = True page_data["user"] = {} @@ -957,7 +985,9 @@ class PanelHandler(BaseHandler): os.listdir(os.path.join(self.helper.root_dir, "app", "translations")) ): if file.endswith(".json"): - if file not in self.helper.get_setting("disabled_language_files"): + if file.split(".")[0] not in self.helper.get_setting( + "disabled_language_files" + ): if file != str(page_data["languages"][0] + ".json"): page_data["languages"].append(file.split(".")[0]) @@ -1168,7 +1198,9 @@ class PanelHandler(BaseHandler): os.listdir(os.path.join(self.helper.root_dir, "app", "translations")) ): if file.endswith(".json"): - if file not in self.helper.get_setting("disabled_language_files"): + if file.split(".")[0] not in self.helper.get_setting( + "disabled_language_files" + ): if file != str(page_data["languages"][0] + ".json"): page_data["languages"].append(file.split(".")[0]) @@ -1720,6 +1752,38 @@ 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: + keys = json.load(f).keys() + this_uuid = self.get_argument("uuid") + for key in keys: + arg_data = self.get_argument(key) + if arg_data.startswith(this_uuid): + arg_data = arg_data.split(",") + arg_data.pop(0) + data[key] = arg_data + else: + try: + data[key] = int(arg_data) + except: + if arg_data == "True": + data[key] = True + elif arg_data == "False": + data[key] = False + else: + data[key] = arg_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( + "Config File Error: Unable to read " + f"{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/config/config.json b/app/config/config.json index ea2e1f0a..1c7237e5 100644 --- a/app/config/config.json +++ b/app/config/config.json @@ -1,27 +1,27 @@ { - "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 -} + "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 +} \ No newline at end of file diff --git a/app/frontend/templates/panel/config_json.html b/app/frontend/templates/panel/config_json.html new file mode 100644 index 00000000..9f7e78f7 --- /dev/null +++ b/app/frontend/templates/panel/config_json.html @@ -0,0 +1,318 @@ +{% extends ../base.html %} + +{% block meta %} +{% end %} + +{% block title %}Crafty Controller - {{ translate('panelConfig', 'pageTitle', data['lang']) }}{% end %} + +{% block content %} + + + +
+ +
+
+ +
+
+ + +
+
+
+
+ + {% if data['superuser'] %} + {% include "parts/crafty_config_list.html %} + {% end %} + + +
+
+ +
+ +
+ + +
+ {% raw xsrf_form_html() %} + + {% for item in data['config-json'].items() %} +
+
+ {% if item[0] == 'language' %} + + {% elif item[0] == 'disabled_language_files' %} +
+ + + +
+ {% elif isinstance(item[1], list) %} + + {% elif 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/custom_login.html b/app/frontend/templates/panel/custom_login.html new file mode 100644 index 00000000..018eb006 --- /dev/null +++ b/app/frontend/templates/panel/custom_login.html @@ -0,0 +1,391 @@ +{% extends ../base.html %} + +{% block meta %} +{% end %} + +{% block title %}Crafty Controller - {{ translate('customLogin', 'pageTitle', data['lang']) }}{% end %} + +{% block content %} + +
+ +
+
+ +
+
+ + +
+
+
+
+ + + {% if data['superuser'] %} + {% include "parts/crafty_config_list.html %} + {% end %} + + +
+
+ +
+ +
+ + +
+
+
+
+
+
+

{{ translate('customLogin', 'loginImage', data['lang']) }}

+
+
+ {% raw xsrf_form_html() %} + +
+ +
+
+ +
+
+
+
+
+
+
+
{{ translate('customLogin', 'preview', data['lang']) }}:
+
+
+ +
+ +
+
+ +
+ + +
+ +
+
+
+ Responsive image +
+ +
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+ + + + +{% 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 4bf13833..249daf70 100644 --- a/app/frontend/templates/panel/panel_config.html +++ b/app/frontend/templates/panel/panel_config.html @@ -8,16 +8,16 @@ {% block content %}
-
-
@@ -26,6 +26,23 @@
+ + {% if data['superuser'] %} + {% include "parts/crafty_config_list.html %} + {% end %} + + +
+
+ +
+ +
+ +
@@ -33,9 +50,7 @@

{{ translate('panelConfig', 'users', data['lang']) }}

{% if data['user_data']['hints'] %} - + {% end %}
-
-
-
-
-

{{ translate('panelConfig', 'customLoginPage', data['lang']) }}

-
-
-
-
-

{{ translate('panelConfig', 'loginImage', data['lang']) }}

-
-
- {% raw xsrf_form_html() %} - -
- -
-
- -
-
-
-
-
-
-
-
{{ translate('panelConfig', 'preview', data['lang']) }}:
-
-
- -
- -
-
- -
- - -
- -
-
-
- Responsive image -
- -
-
-
- - -
-
-
-
-
-
-
-
-
{% end %}
@@ -461,116 +295,5 @@ } }); - {% end %} \ No newline at end of file diff --git a/app/frontend/templates/panel/parts/crafty_config_list.html b/app/frontend/templates/panel/parts/crafty_config_list.html new file mode 100644 index 00000000..5ef6b922 --- /dev/null +++ b/app/frontend/templates/panel/parts/crafty_config_list.html @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/app/translations/en_EN.json b/app/translations/en_EN.json index 296f1b16..15a8ed27 100644 --- a/app/translations/en_EN.json +++ b/app/translations/en_EN.json @@ -213,6 +213,8 @@ "assignedRoles": "Assigned Roles", "cancel": "Cancel", "clearComms": "Clear Un-executed Commands", + "select": "Select", + "apply": "Apply", "delete": "Delete", "edit": "Edit", "enabled": "Enabled", @@ -228,6 +230,9 @@ "superConfirmTitle": "Enable superuser? Are you sure?", "user": "User", "users": "Users", + "title": "Crafty Configuration" + }, + "customLogin": { "customLoginPage": "Customise the Login Page", "loginImage": "Upload a background image for the login screen.", "backgroundUpload": "Background Upload", @@ -235,8 +240,10 @@ "loginOpacity": "Select the Login Window Opacity", "select": "Select", "apply": "Apply", + "delete": "Delete", "selectImage": "Select an image", - "preview": "Preview" + "preview": "Preview", + "pageTitle": "Custom Login Page" }, "rolesConfig": { "config": "Role Config",