diff --git a/app/classes/shared/helpers.py b/app/classes/shared/helpers.py
index 93b1fb0d..da882b10 100644
--- a/app/classes/shared/helpers.py
+++ b/app/classes/shared/helpers.py
@@ -18,6 +18,7 @@ from requests import get
from contextlib import suppress
import ctypes
import telnetlib
+from app.classes.web.websocket_helper import websocket_helper
from datetime import datetime
from socket import gethostname
@@ -730,6 +731,68 @@ class Helpers:
output += '\n'
return output
+ @staticmethod
+ def generate_zip_tree(folder, output=""):
+ file_list = os.listdir(folder)
+ file_list = sorted(file_list, key=str.casefold)
+ output += \
+ """
"""\
+ .format(folder)
+ for raw_filename in file_list:
+ filename = html.escape(raw_filename)
+ rel = os.path.join(folder, raw_filename)
+ if os.path.isdir(rel):
+ output += \
+ """-
+ \n
+
+
+
+
+ {}
+
+
-
+ \n"""\
+ .format(os.path.join(folder, filename), os.path.join(folder, filename), os.path.join(folder, filename), filename, os.path.join(folder, filename), os.path.join(folder, filename), os.path.join(folder, filename), filename, filename)
+ return output
+
+ @staticmethod
+ def generate_zip_dir(folder, output=""):
+ file_list = os.listdir(folder)
+ file_list = sorted(file_list, key=str.casefold)
+ output += \
+ """
"""\
+ .format(folder)
+ for raw_filename in file_list:
+ filename = html.escape(raw_filename)
+ rel = os.path.join(folder, raw_filename)
+ if os.path.isdir(rel):
+ output += \
+ """-
+ \n
+
+
+
+
+ {}
+
+
- """\
+ .format(os.path.join(folder, filename), os.path.join(folder, filename), os.path.join(folder, filename), filename, os.path.join(folder, filename), os.path.join(folder, filename), os.path.join(folder, filename), filename, filename)
+ return output
+
+ @staticmethod
+ def unzipServer(zip_path, user_id):
+ if helper.check_file_perms(zip_path):
+ tempDir = tempfile.mkdtemp()
+ with zipfile.ZipFile(zip_path, 'r') as zip_ref:
+ #extracts archive to temp directory
+ zip_ref.extractall(tempDir)
+ if user_id:
+ websocket_helper.broadcast_user(user_id, 'send_temp_path',{
+ 'path': tempDir
+ })
+ return
+
@staticmethod
def in_path(parent_path, child_path):
# Smooth out relative path names, note: if you are concerned about symbolic links, you should use os.path.realpath too
diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py
index 84b2b0d9..109af258 100644
--- a/app/classes/shared/main_controller.py
+++ b/app/classes/shared/main_controller.py
@@ -295,66 +295,23 @@ class Controller:
server_id = helper.create_uuid()
new_server_dir = os.path.join(helper.servers_dir, server_id)
backup_path = os.path.join(helper.backup_path, server_id)
- zip_path = helper.get_os_understandable_path(zip_path)
-
- if helper.check_file_perms(zip_path):
- helper.ensure_dir_exists(new_server_dir)
- helper.ensure_dir_exists(backup_path)
- tempDir = tempfile.mkdtemp()
- has_properties = False
- with zipfile.ZipFile(zip_path, 'r') as zip_ref:
- #extracts archive to temp directory
- zip_ref.extractall(tempDir)
- if len(zip_ref.filelist) > 1:
- for item in os.listdir(tempDir):
- if str(item) == 'server.properties':
- has_properties = True
- try:
- shutil.move(os.path.join(tempDir, item), os.path.join(new_server_dir, item))
- except Exception as ex:
- logger.error('ERROR IN ZIP IMPORT: {}'.format(ex))
- if not has_properties:
- logger.info("No server.properties found on zip file import. Creating one with port selection of {}".format(str(port)))
- with open(os.path.join(new_server_dir, "server.properties"), "w") as f:
- f.write("server-port={}".format(port))
- f.close()
- zip_ref.close()
- else:
-
- #iterates list of files
- for i in range(len(zip_ref.filelist)):
- #checks if the list of files inside of a dir is greater than 1 or if it's not a directory.
- if len(zip_ref.filelist) > 1 or not zip_ref.filelist[i].is_dir():
- #sets local variable to be that filename and we break out of the loop since we found our root dir.
- test = zip_ref.filelist[i-1].filename
- break
- path_list = test.split('/')
- root_path = path_list[0]
- if len(path_list) > 1:
- for i in range(len(path_list)-1):
- try:
- root_path = os.path.join(root_path, path_list[i+1])
- except:
- root_path = root_path
-
- full_root_path = os.path.join(tempDir, root_path)
-
-
- for item in os.listdir(full_root_path):
- if str(item) == 'server.properties':
- has_properties = True
- try:
- shutil.move(os.path.join(full_root_path, item), os.path.join(new_server_dir, item))
- except Exception as ex:
- logger.error('ERROR IN ZIP IMPORT: {}'.format(ex))
- if not has_properties:
- logger.info("No server.properties found on zip file import. Creating one with port selection of {}".format(str(port)))
- with open(os.path.join(new_server_dir, "server.properties"), "w") as f:
- f.write("server-port={}".format(port))
- f.close()
- zip_ref.close()
- else:
- return "false"
+ tempDir = helper.get_os_understandable_path(zip_path)
+ helper.ensure_dir_exists(new_server_dir)
+ helper.ensure_dir_exists(backup_path)
+ has_properties = False
+ #extracts archive to temp directory
+ for item in os.listdir(tempDir):
+ if str(item) == 'server.properties':
+ has_properties = True
+ try:
+ shutil.move(os.path.join(tempDir, item), os.path.join(new_server_dir, item))
+ except Exception as ex:
+ logger.error('ERROR IN ZIP IMPORT: {}'.format(ex))
+ if not has_properties:
+ logger.info("No server.properties found on zip file import. Creating one with port selection of {}".format(str(port)))
+ with open(os.path.join(new_server_dir, "server.properties"), "w") as f:
+ f.write("server-port={}".format(port))
+ f.close()
full_jar_path = os.path.join(new_server_dir, server_jar)
server_command = 'java -Xms{}M -Xmx{}M -jar {} nogui'.format(helper.float_to_string(min_mem),
diff --git a/app/classes/web/ajax_handler.py b/app/classes/web/ajax_handler.py
index d2c6de83..b22722fe 100644
--- a/app/classes/web/ajax_handler.py
+++ b/app/classes/web/ajax_handler.py
@@ -134,6 +134,22 @@ class AjaxHandler(BaseHandler):
helper.generate_tree(path))
self.finish()
+ elif page == "get_zip_tree":
+ server_id = self.get_argument('id', None)
+ path = self.get_argument('path', None)
+
+ self.write(helper.get_os_understandable_path(path) + '\n' +
+ helper.generate_zip_tree(path))
+ self.finish()
+
+ elif page == "get_zip_dir":
+ server_id = self.get_argument('id', None)
+ path = self.get_argument('path', None)
+
+ self.write(helper.get_os_understandable_path(path) + '\n' +
+ helper.generate_zip_dir(path))
+ self.finish()
+
elif page == "get_dir":
server_id = self.get_argument('id', None)
path = self.get_argument('path', None)
@@ -275,6 +291,11 @@ class AjaxHandler(BaseHandler):
self.controller.rename_backup_dir(server_id, new_server_id, new_server['server_uuid'])
self.controller.remove_server(server_id, True)
self.redirect('/panel/dashboard')
+
+ elif page == "unzip_server":
+ path = self.get_argument('path', None)
+ helper.unzipServer(path, exec_user_id)
+ return
@tornado.web.authenticated
diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py
index 4d037281..baf6b506 100644
--- a/app/classes/web/panel_handler.py
+++ b/app/classes/web/panel_handler.py
@@ -16,8 +16,8 @@ from app.classes.shared.main_models import Users, installer
from app.classes.web.base_handler import BaseHandler
from app.classes.models.servers import Servers
-from app.classes.models.server_permissions import Enum_Permissions_Server
-from app.classes.models.crafty_permissions import Enum_Permissions_Crafty
+from app.classes.models.server_permissions import Enum_Permissions_Server, Permissions_Servers
+from app.classes.models.crafty_permissions import Enum_Permissions_Crafty, Permissions_Crafty
from app.classes.models.management import management_helper
from app.classes.shared.helpers import helper
@@ -402,19 +402,22 @@ class PanelHandler(BaseHandler):
page_data['role-servers'] = auth_role_servers
page_data['user-roles'] = user_roles
- if exec_user['superuser'] == 1:
- super_auth_servers = []
- super_auth_servers.append("Access To All Servers")
- page_data['users'] = self.controller.users.get_all_users()
- page_data['roles'] = self.controller.roles.get_all_roles()
- page_data['auth-servers'][exec_user['user_id']] = super_auth_servers
- else:
- page_data['users'] = self.controller.users.user_query(exec_user['user_id'])
- page_data['roles'] = self.controller.users.user_role_query(exec_user['user_id'])
+ page_data['users'] = self.controller.users.user_query(exec_user['user_id'])
+ page_data['roles'] = self.controller.users.user_role_query(exec_user['user_id'])
+
for user in page_data['users']:
if user.user_id != exec_user['user_id']:
user.api_token = "********"
+ if exec_user['superuser']:
+ for user in self.controller.users.get_all_users():
+ if user.superuser == 1:
+ super_auth_servers = []
+ super_auth_servers.append("Super User Access To All Servers")
+ page_data['users'] = self.controller.users.get_all_users()
+ page_data['roles'] = self.controller.roles.get_all_roles()
+ page_data['auth-servers'][user.user_id] = super_auth_servers
+
template = "panel/panel_config.html"
elif page == "add_user":
@@ -445,6 +448,10 @@ class PanelHandler(BaseHandler):
page_data['quantity_server'] = self.controller.crafty_perms.list_all_crafty_permissions_quantity_limits()
page_data['languages'] = []
page_data['languages'].append(self.controller.users.get_user_lang_by_id(exec_user_id))
+ if exec_user['superuser']:
+ page_data['super-disabled'] = ''
+ else:
+ page_data['super-disabled'] = 'disabled'
for file in os.listdir(os.path.join(helper.root_dir, 'app', 'translations')):
if file.endswith('.json'):
if file != str(page_data['languages'][0] + '.json'):
@@ -470,6 +477,12 @@ class PanelHandler(BaseHandler):
page_data['quantity_server'] = self.controller.crafty_perms.list_crafty_permissions_quantity_limits(user_id)
page_data['languages'] = []
page_data['languages'].append(self.controller.users.get_user_lang_by_id(user_id))
+ #checks if super user. If not we disable the button.
+ if exec_user['superuser'] and str(exec_user['user_id']) != str(user_id):
+ page_data['super-disabled'] = ''
+ else:
+ page_data['super-disabled'] = 'disabled'
+
for file in sorted(os.listdir(os.path.join(helper.root_dir, 'app', 'translations'))):
if file.endswith('.json'):
if file != str(page_data['languages'][0] + '.json'):
@@ -497,10 +510,14 @@ class PanelHandler(BaseHandler):
elif page == "remove_user":
user_id = bleach.clean(self.get_argument('id', None))
-
- if not exec_user['superuser']:
+
+ if not exec_user['superuser'] and Enum_Permissions_Crafty.User_Config not in exec_user_crafty_permissions:
self.redirect("/panel/error?error=Unauthorized access: not superuser")
return
+
+ elif str(exec_user_id) == str(user_id):
+ self.redirect("/panel/error?error=Unauthorized access: you cannot delete yourself")
+ return
elif user_id is None:
self.redirect("/panel/error?error=Invalid User ID")
return
@@ -832,6 +849,18 @@ class PanelHandler(BaseHandler):
enabled = int(float(self.get_argument('enabled', '0')))
regen_api = int(float(self.get_argument('regen_api', '0')))
lang = bleach.clean(self.get_argument('language'), 'en_EN')
+ if exec_user['superuser']:
+ #Checks if user is trying to change super user status of self. We don't want that. Automatically make them stay super user since we know they are.
+ if str(exec_user['user_id']) != str(user_id):
+ superuser = bleach.clean(self.get_argument('superuser', '0'))
+ else:
+ superuser = '1'
+ else:
+ superuser = '0'
+ if superuser == '1':
+ superuser = True
+ else:
+ superuser = False
if Enum_Permissions_Crafty.User_Config not in exec_user_crafty_permissions:
if str(user_id) != str(exec_user_id):
@@ -910,6 +939,7 @@ class PanelHandler(BaseHandler):
"regen_api": regen_api,
"roles": roles,
"lang": lang,
+ "superuser": superuser,
}
user_crafty_data = {
"permissions_mask": permissions_mask,
@@ -934,6 +964,14 @@ class PanelHandler(BaseHandler):
email = bleach.clean(self.get_argument('email', "default@example.com"))
enabled = int(float(self.get_argument('enabled', '0'))),
lang = bleach.clean(self.get_argument('lang', 'en_EN'))
+ if exec_user['superuser']:
+ superuser = bleach.clean(self.get_argument('superuser', '0'))
+ else:
+ superuser = '0'
+ if superuser == '1':
+ superuser = True
+ else:
+ superuser = False
if Enum_Permissions_Crafty.User_Config not in exec_user_crafty_permissions:
self.redirect("/panel/error?error=Unauthorized access: not a user editor")
@@ -982,7 +1020,7 @@ class PanelHandler(BaseHandler):
else:
server_quantity[permission.name] = 0
- user_id = self.controller.users.add_user(username, password=password0, email=email, enabled=enabled)
+ user_id = self.controller.users.add_user(username, password=password0, email=email, enabled=enabled, superuser=superuser)
user_data = {
"roles": roles,
'lang': lang
diff --git a/app/classes/web/server_handler.py b/app/classes/web/server_handler.py
index bff818f1..5ab73993 100644
--- a/app/classes/web/server_handler.py
+++ b/app/classes/web/server_handler.py
@@ -191,12 +191,13 @@ class ServerHandler(BaseHandler):
self.get_remote_ip())
elif import_type == 'import_zip':
# here import_server_path means the zip path
- good_path = self.controller.verify_zip_server(import_server_path)
+ zip_path = bleach.clean(self.get_argument('root_path'))
+ good_path = helper.check_path_exists(zip_path)
if not good_path:
- self.redirect("/panel/error?error=Zip file not found!")
+ self.redirect("/panel/error?error=Temp path not found!")
return
- new_server_id = self.controller.import_zip_server(server_name, import_server_path,import_server_jar, min_mem, max_mem, port)
+ new_server_id = self.controller.import_zip_server(server_name, zip_path, import_server_jar, min_mem, max_mem, port)
if new_server_id == "false":
self.redirect("/panel/error?error=Zip file not accessible! You can fix this permissions issue with sudo chown -R crafty:crafty {} And sudo chmod 2775 -R {}".format(import_server_path, import_server_path))
return
@@ -204,6 +205,8 @@ class ServerHandler(BaseHandler):
"imported a zip server named \"{}\"".format(server_name), # Example: Admin imported a server named "old creative"
new_server_id,
self.get_remote_ip())
+ #deletes temp dir
+ shutil.rmtree(zip_path)
else:
if len(server_parts) != 2:
self.redirect("/panel/error?error=Invalid server data")
diff --git a/app/frontend/templates/panel/panel_edit_user.html b/app/frontend/templates/panel/panel_edit_user.html
index 3bab1825..6206458f 100644
--- a/app/frontend/templates/panel/panel_edit_user.html
+++ b/app/frontend/templates/panel/panel_edit_user.html
@@ -187,9 +187,9 @@
@@ -229,7 +229,7 @@
Delete User
You cannot delete a superuser
{% else %}
- Delete User
+