Files
oldmarketcustomserver/admin_manager.py
2025-10-18 10:58:20 +03:00

269 lines
9.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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]
# Подтверждение удаления
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()