from . import m_admin import json from datetime import datetime from flask import render_template from flask import Response from flask import redirect from flask import request from flask import session from app._tools.decorators import auth_required from app._tools.decorators import admin_required from app._tools.database import DataManager from app._tools.database import SessionManager from app._tools.database import ConfigManager from app.config import _SUPER_ADMINS as SUPER from app.config import _SALT as SALT from app._tools import passhash @m_admin.app_template_filter("format_timestamp") def format_timestamp(value): try: dt = datetime.fromtimestamp(value) return dt.strftime("%d.%m.%Y %H:%M") except: return "Invalid timestamp" @m_admin.route('/') @auth_required @admin_required def panel(): user = DataManager.get_user(SessionManager.get_session(session["token"]).user_id) users = DataManager.get_all_users() return render_template('admin/admin_main.html', user = user, users = users, settings = ConfigManager.get_config()) @m_admin.route('/create') @auth_required @admin_required def create(): return render_template("admin/user_create.html") @m_admin.route('/create_many') @auth_required @admin_required def create_manu(): return render_template("admin/user_create_many.html") @m_admin.route('/account_created_many', methods=['POST']) @auth_required @admin_required def create_many_proc(): data = dict(request.form) usernames = str(data['username']).split(';') passwords = str(data['password']).split(';') teams = str(data['team_name']).split(';') locations = str(data['location']).split(';') for i in range(len(usernames)): if (DataManager.get_user_by_name(usernames[i]) != None): return render_template("error.html", error = "Пользователь с таким логином существует!") if len(passwords[i]) < 4: return render_template("error.html", error = "Длина пароля должна превышать 3 символа!") user = DataManager.get_user(SessionManager.get_session(session["token"]).user_id) if teams[i] == "$root$" and user.username not in SUPER: return render_template("error.html", error = "У вас нет прав на работу с группой $root$!") DataManager.add_user( usernames[i], teams[i], locations[i], passhash.hashPassword(passwords[i], SALT) ) cuser = DataManager.get_user_by_name(data['username']) return "Done" @m_admin.route('/account_created', methods=['POST']) @auth_required @admin_required def create_proc(): data = dict(request.form) if (DataManager.get_user_by_name(data['username']) != None): return render_template("error.html", error = "Пользователь с таким логином существует!") if len(data['password']) < 4: return render_template("error.html", error = "Длина пароля должна превышать 3 символа!") user = DataManager.get_user(SessionManager.get_session(session["token"]).user_id) if data['team_name'] == "$root$" and user.username not in SUPER: return render_template("error.html", error = "У вас нет прав на работу с группой $root$!") DataManager.add_user( data['username'], data['team_name'], data['location'], passhash.hashPassword(data['password'], SALT) ) cuser = DataManager.get_user_by_name(data['username']) return render_template("admin/user_created.html", cuser = cuser, password_onetime = data['password']) @m_admin.route('/edit/') @auth_required @admin_required def edit_team(id : int): euser = DataManager.get_user(id) return render_template('admin/user_edit.html', edituser = euser) @m_admin.route('/edit/settings', methods=['POST']) @auth_required @admin_required def edit_settings(): data = dict(request.form) cur_config = ConfigManager.get_config() cur_config['print']['watermark'] = data['watermark'] data['pages-per-request'] = int(data['pages-per-request']) data['seconds-per-request'] = int(data['seconds-per-request']) if data['pages-per-request'] in range(1, 51): cur_config['print']['limits']['pages-per-request'] = data['pages-per-request'] else: return render_template("error.html", error = "Лимит страниц должен быть в рамках от 1 до 50 страниц!") if data['seconds-per-request'] in range(5, 61): cur_config['print']['limits']['seconds-per-request'] = data['seconds-per-request'] else: return render_template("error.html", error = "Задержка между запросами должна быть от 5 до 60 секунд!") ConfigManager.set_config(cur_config) return redirect("/admin/") @m_admin.route('/edit/server-rx', methods=['POST']) @auth_required @admin_required def edit_server_rx(): data = dict(request.form) cur_config = ConfigManager.get_config() if int(data['server-port']) not in range(1, 65536): return render_template("error.html", error = "Порт в диапазоне от 1 до 65535!") cur_config['server']['port'] = int(data['server-port']) cur_config['server']['ip'] = str(data['server-ip']) cur_config['server']['secret'] = str(data['server-secret']) ConfigManager.set_config(cur_config) gen_json = dict() gen_json = cur_config['server'] gen_json = json.dumps( gen_json, indent = 4 ) response = Response(gen_json, mimetype='application/json') response.headers['Content-Disposition'] = 'attachment; filename=server-rx.json' response.headers['Content-Type'] = 'application/json' response.headers['Refresh'] = '1; url=' + "/admin" return response @m_admin.route('/edit/proc/', methods=['POST']) @auth_required @admin_required def edit_proc(id : int): data = dict(request.form) e_user = DataManager.get_user(id) user = DataManager.get_user(SessionManager.get_session(session["token"]).user_id) if data['team_name'] == "$root$" and user.username not in SUPER: return render_template("error.html", error = "У вас нет прав на работу с группой $root$!") if e_user.team == "$root$" and user.username not in SUPER: return render_template("error.html", error = "Вы не можете редактировать других Администраторов!") if (len(data['new_password']) > 3): DataManager.edit_user( id, 'passkey', passhash.hashPassword(data['new_password'], SALT) ) if e_user.team != data['team_name']: DataManager.edit_user( id, 'team', data['team_name'] ) if e_user.loc != data['location']: DataManager.edit_user( id, 'loc', data['location'] ) return redirect("/admin") @m_admin.route('/remove/') @auth_required @admin_required def remove_team(id : int): user = DataManager.get_user(SessionManager.get_session(session["token"]).user_id) if user.username not in SUPER: return render_template("error.html", error = "Обратитесь к Супер-администратору. У вас нет прав на удаление пользователей!") SessionManager.remove_session_by_user(id) DataManager.del_user(id) return redirect("/admin")