diff --git a/app.py b/app.py index 3319c0f..c917311 100644 --- a/app.py +++ b/app.py @@ -815,95 +815,60 @@ def admin_db_create_account( return RedirectResponse(url="/login", status_code=303) username = username.strip() - password = password.strip() role = (role or "operator").strip().lower() if not username: - return render_admin_db_index( - request, - account_output="Логин обязателен.", - account_success=False, - ) + return render_admin_db_index(request, account_output="Логин обязателен.", account_success=False) if not password: - return render_admin_db_index( - request, - account_output="Пароль обязателен.", - account_success=False, - ) + return render_admin_db_index(request, account_output="Пароль обязателен.", account_success=False) + + if len(password) < 6: + return render_admin_db_index(request, account_output="Пароль должен быть не короче 6 символов.", account_success=False) if role not in {"admin", "operator"}: - return render_admin_db_index( - request, - account_output="Роль должна быть admin или operator.", - account_success=False, - ) + return render_admin_db_index(request, account_output="Роль должна быть admin или operator.", account_success=False) password_hash = hash_password(password) conn = get_connection() - success = True - messages: list[str] = [] try: - with conn: - with conn.cursor() as cur: - try: - cur.execute( - """ - INSERT INTO admin_users (username, password_hash, role, is_active) - VALUES (%s, %s, %s, TRUE) - ON CONFLICT (username) DO NOTHING - RETURNING id; - """, - (username, password_hash, role), - ) - except Exception: - conn.rollback() - with conn: - with conn.cursor() as fallback_cur: - fallback_cur.execute( - """ - INSERT INTO admin_users (username, password_hash, is_active) - VALUES (%s, %s, TRUE) - ON CONFLICT (username) DO NOTHING - RETURNING id; - """, - (username, password_hash), - ) - row = fallback_cur.fetchone() - if row: - messages.append(f"Пользователь создан: {username} (id={row[0]})") - messages.append("Примечание: колонка role в БД не найдена, роль не сохранена.") - else: - success = False - messages.append(f"Пользователь '{username}' уже существует.") - return render_admin_db_index( - request, - account_output="\n".join(messages), - account_success=success, - ) + with conn.cursor() as cur: + cur.execute( + """ + INSERT INTO admin_users (username, password_hash, role, is_active) + VALUES (%s, %s, %s, TRUE) + ON CONFLICT (username) DO NOTHING + RETURNING id; + """, + (username, password_hash, role), + ) + row = cur.fetchone() + conn.commit() + + if row: + return render_admin_db_index( + request, + account_output=f"Пользователь создан: {username} (id={row[0]})\nРоль: {role}", + account_success=True, + ) + + return render_admin_db_index( + request, + account_output=f"Пользователь '{username}' уже существует.", + account_success=False, + ) - row = cur.fetchone() - if row: - messages.append(f"Пользователь создан: {username} (id={row[0]})") - messages.append(f"Роль: {role}") - else: - success = False - messages.append(f"Пользователь '{username}' уже существует.") except Exception: - success = False - messages.append("Ошибка при создании аккаунта:") - messages.append(traceback.format_exc()) + conn.rollback() + return render_admin_db_index( + request, + account_output="Ошибка при создании аккаунта:\n" + traceback.format_exc(), + account_success=False, + ) finally: conn.close() - return render_admin_db_index( - request, - account_output="\n".join(messages).strip(), - account_success=success, - ) - - @app.get("/admin/db/players", response_class=HTMLResponse) def admin_db_players(request: Request, q: str = Query(default="")): # denied = require_role(request, {"admin"})