From 2ccb49a33cfd288904fd6bfb85f021e56a12dcde Mon Sep 17 00:00:00 2001 From: drel Date: Sat, 18 Oct 2025 10:56:20 +0300 Subject: [PATCH] adding admin manager script since admin dashboard in server itself cannot do same shit that manager does --- admin_manager.py | 278 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 admin_manager.py diff --git a/admin_manager.py b/admin_manager.py new file mode 100644 index 0000000..461ec08 --- /dev/null +++ b/admin_manager.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python3 +""" +Скрипт для управления административными учетными записями OldMarket +""" + +import sys +import os +import sqlite3 +from getpass import getpass +import hashlib +from datetime import datetime + +# Добавляем путь к текущей директории для импорта моделей +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +def hash_password(password: str) -> str: + """Хеширование пароля""" + return hashlib.sha256(password.encode()).hexdigest() + +def get_db_connection(): + """Подключение к базе данных""" + db_path = "oldmarket.db" + if not os.path.exists(db_path): + print(f"❌ База данных {db_path} не найдена!") + sys.exit(1) + + return sqlite3.connect(db_path) + +def list_admins(): + """Показать список всех администраторов""" + conn = get_db_connection() + cursor = conn.cursor() + + cursor.execute("SELECT id, username, created_at FROM admin_users ORDER BY id") + admins = cursor.fetchall() + + if not admins: + print("📭 В системе нет администраторов") + return + + print("\n📋 Список администраторов:") + print("-" * 50) + print(f"{'ID':<3} {'Имя пользователя':<20} {'Дата создания'}") + print("-" * 50) + + for admin in admins: + admin_id, username, created_at = admin + print(f"{admin_id:<3} {username:<20} {created_at}") + +def create_admin(): + """Создать нового администратора""" + print("\n👤 Создание нового администратора") + + username = input("Введите имя пользователя: ").strip() + if not username: + print("❌ Имя пользователя не может быть пустым!") + return + + password = getpass("Введите пароль: ") + if not password: + print("❌ Пароль не может быть пустым!") + return + + confirm_password = getpass("Подтвердите пароль: ") + if password != confirm_password: + print("❌ Пароли не совпадают!") + return + + conn = get_db_connection() + cursor = conn.cursor() + + # Проверяем, существует ли пользователь + cursor.execute("SELECT id FROM admin_users WHERE username = ?", (username,)) + if cursor.fetchone(): + print(f"❌ Пользователь '{username}' уже существует!") + conn.close() + return + + # Создаем нового администратора + password_hash = hash_password(password) + created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + cursor.execute( + "INSERT INTO admin_users (username, password_hash, created_at) VALUES (?, ?, ?)", + (username, password_hash, created_at) + ) + + conn.commit() + conn.close() + + print(f"✅ Администратор '{username}' успешно создан!") + +def delete_admin(): + """Удалить администратора""" + list_admins() + + admin_id = input("\nВведите ID администратора для удаления: ").strip() + if not admin_id.isdigit(): + print("❌ ID должен быть числом!") + return + + conn = get_db_connection() + cursor = conn.cursor() + + # Получаем информацию об администраторе + cursor.execute("SELECT username FROM admin_users WHERE id = ?", (admin_id,)) + admin = cursor.fetchone() + + if not admin: + print(f"❌ Администратор с ID {admin_id} не найден!") + conn.close() + return + + username = admin[0] + + # Проверяем, не пытаемся ли удалить последнего администратора + cursor.execute("SELECT COUNT(*) FROM admin_users") + admin_count = cursor.fetchone()[0] + + if admin_count <= 1: + print("❌ Нельзя удалить последнего администратора!") + conn.close() + return + + # Подтверждение удаления + confirm = input(f"⚠️ Вы уверены, что хотите удалить администратора '{username}' (ID: {admin_id})? (y/N): ") + if confirm.lower() != 'y': + print("❌ Удаление отменено") + conn.close() + return + + # Удаляем администратора + cursor.execute("DELETE FROM admin_users WHERE id = ?", (admin_id,)) + conn.commit() + conn.close() + + print(f"✅ Администратор '{username}' успешно удален!") + +def change_password(): + """Изменить пароль администратора""" + list_admins() + + admin_id = input("\nВведите ID администратора для смены пароля: ").strip() + if not admin_id.isdigit(): + print("❌ ID должен быть числом!") + return + + conn = get_db_connection() + cursor = conn.cursor() + + # Проверяем существование администратора + cursor.execute("SELECT username FROM admin_users WHERE id = ?", (admin_id,)) + admin = cursor.fetchone() + + if not admin: + print(f"❌ Администратор с ID {admin_id} не найден!") + conn.close() + return + + username = admin[0] + + # Запрашиваем новый пароль + new_password = getpass(f"Введите новый пароль для '{username}': ") + if not new_password: + print("❌ Пароль не может быть пустым!") + conn.close() + return + + confirm_password = getpass("Подтвердите новый пароль: ") + if new_password != confirm_password: + print("❌ Пароли не совпадают!") + conn.close() + return + + # Обновляем пароль + new_password_hash = hash_password(new_password) + cursor.execute( + "UPDATE admin_users SET password_hash = ? WHERE id = ?", + (new_password_hash, admin_id) + ) + + conn.commit() + conn.close() + + print(f"✅ Пароль для администратора '{username}' успешно изменен!") + +def reset_default_admin(): + """Сбросить пароль дефолтного администратора""" + print("\n🔄 Сброс пароля дефолтного администратора") + + conn = get_db_connection() + cursor = conn.cursor() + + # Проверяем существование администратора 'admin' + cursor.execute("SELECT id FROM admin_users WHERE username = 'admin'") + admin = cursor.fetchone() + + if not admin: + # Создаем дефолтного администратора + password_hash = hash_password("admin123") + created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + cursor.execute( + "INSERT INTO admin_users (username, password_hash, created_at) VALUES (?, ?, ?)", + ("admin", password_hash, created_at) + ) + + conn.commit() + conn.close() + + print("✅ Дефолтный администратор 'admin' создан!") + print("🔑 Логин: admin") + print("🔑 Пароль: admin123") + print("⚠️ Смените пароль после первого входа!") + return + + # Сбрасываем пароль + new_password = "admin123" + new_password_hash = hash_password(new_password) + + cursor.execute( + "UPDATE admin_users SET password_hash = ? WHERE username = 'admin'", + (new_password_hash,) + ) + + conn.commit() + conn.close() + + print("✅ Пароль дефолтного администратора сброшен!") + print("🔑 Логин: admin") + print("🔑 Пароль: admin123") + print("⚠️ Смените пароль после входа!") + +def show_menu(): + """Показать меню управления""" + print("\n" + "="*50) + print("👑 УПРАВЛЕНИЕ АДМИНИСТРАТОРАМИ OLDMARKET") + print("="*50) + print("1. 📋 Список администраторов") + print("2. 👤 Создать администратора") + print("3. 🗑️ Удалить администратора") + print("4. 🔑 Изменить пароль") + print("5. 🔄 Сбросить дефолтного администратора") + print("6. ❌ Выход") + print("="*50) + +def main(): + """Главная функция""" + try: + while True: + show_menu() + choice = input("\nВыберите действие (1-6): ").strip() + + if choice == '1': + list_admins() + elif choice == '2': + create_admin() + elif choice == '3': + delete_admin() + elif choice == '4': + change_password() + elif choice == '5': + reset_default_admin() + elif choice == '6': + print("\n👋 До свидания!") + break + else: + print("❌ Неверный выбор! Попробуйте снова.") + + input("\nНажмите Enter для продолжения...") + + except KeyboardInterrupt: + print("\n\n👋 Программа прервана пользователем!") + except Exception as e: + print(f"\n❌ Произошла ошибка: {e}") + +if __name__ == "__main__": + main() \ No newline at end of file