188 lines
7.5 KiB
Python
188 lines
7.5 KiB
Python
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/<id>')
|
||
@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/<id>', 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/<id>')
|
||
@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")
|