#!/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()