diff --git a/CHANGELOG.md b/CHANGELOG.md index 663779dd..b0f823e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - Spelling mistake fixed in German lang file ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/370)) - Backup failure warning (Tab text goes red) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/373)) - Rework server list on dashboard display for use on small screens ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/372)) +- File handling enhancements ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/362))

## --- [4.0.3] - 2022/06/18 diff --git a/app/classes/shared/helpers.py b/app/classes/shared/helpers.py index 6d94854c..4273c38f 100644 --- a/app/classes/shared/helpers.py +++ b/app/classes/shared/helpers.py @@ -144,7 +144,8 @@ class Helpers: @staticmethod def check_file_perms(path): try: - open(path, "r", encoding="utf-8").close() + with open(path, "r", encoding="utf-8"): + pass logger.info(f"{path} is readable") return True except PermissionError: @@ -480,7 +481,8 @@ class Helpers: def check_writeable(path: str): filename = os.path.join(path, "tempfile.txt") try: - open(filename, "w", encoding="utf-8").close() + with open(filename, "w", encoding="utf-8"): + pass os.remove(filename) logger.info(f"{filename} is writable") @@ -518,7 +520,8 @@ class Helpers: # ensure the log file is there try: - open(log_file, "a", encoding="utf-8").close() + with open(log_file, "a", encoding="utf-8"): + pass except Exception as e: Console.critical(f"Unable to open log file! {e}") sys.exit(1) @@ -648,7 +651,7 @@ class Helpers: session_data = {"pid": pid, "started": now.strftime("%d-%m-%Y, %H:%M:%S")} with open(self.session_file, "w", encoding="utf-8") as f: - json.dump(session_data, f, indent=True) + json.dump(session_data, f, indent=4) # because this is a recursive function, we will return bytes, # and set human readable later @@ -782,13 +785,15 @@ class Helpers: cert.set_version(2) cert.sign(k, "sha256") - f = open(cert_file, "w", encoding="utf-8") - f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode()) - f.close() + with open(cert_file, "w", encoding="utf-8") as cert_file_handle: + cert_file_handle.write( + crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode() + ) - f = open(key_file, "w", encoding="utf-8") - f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k).decode()) - f.close() + with open(key_file, "w", encoding="utf-8") as key_file_handle: + key_file_handle.write( + crypto.dump_privatekey(crypto.FILETYPE_PEM, k).decode() + ) @staticmethod def random_string_generator(size=6, chars=string.ascii_uppercase + string.digits): @@ -1007,7 +1012,8 @@ class Helpers: return False try: - open(jar_path, "wb").write(response.content) + with open(jar_path, "wb") as jar_file: + jar_file.write(response.content) except Exception as e: logger.error("Unable to finish executable download. Error: %s", e) return False diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 74b4c63a..07317ff2 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -802,10 +802,9 @@ class ServerInstance: self.server_scheduler.remove_job("c_" + str(self.server_id)) def agree_eula(self, user_id): - file = os.path.join(self.server_path, "eula.txt") - f = open(file, "w", encoding="utf-8") - f.write("eula=true") - f.close() + eula_file = os.path.join(self.server_path, "eula.txt") + with open(eula_file, "w", encoding="utf-8") as f: + f.write("eula=true") self.run_threaded_server(user_id) def backup_server(self): diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index f8451522..8f44749f 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -1511,6 +1511,17 @@ class PanelHandler(BaseHandler): max_backups = bleach.clean(self.get_argument("max_backups", None)) server_obj = self.controller.servers.get_server_obj(server_id) + if ( + not backup_path + == self.helper.wtol_path( + os.path.join(self.helper.backup_path, server_obj.server_uuid) + ) + and self.helper.wtol_path(self.controller.project_root) in backup_path + ): + self.redirect( + "/panel/error?error=Nefarious activities detected." + " User attempted to make backup path within Crafty's root." + ) server_obj.backup_path = backup_path self.controller.servers.update_server(server_obj) self.controller.management.set_backup_config(