Загрузка данных


import sqlite3
import bcrypt

DB_NAME = "users_system.db"


def init_database():
    """Создает файл базы данных и таблицу пользователей, если они еще не созданы."""
    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()

    # Поле username имеет атрибут UNIQUE, чтобы логины не повторялись
    cursor.execute(
        """
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT UNIQUE NOT NULL,
            password_hash TEXT NOT NULL
        )
    """
    )

    conn.commit()
    conn.close()


def register_user(username, password):
    """Шеширует пароль и сохраняет нового пользователя в базу данных."""
    # 1. Хешируем пароль (превращаем в безопасный набор символов)
    salt = bcrypt.gensalt()
    hashed_bytes = bcrypt.hashpw(password.encode("utf-8"), salt)

    # Переводим байты в текст для удобного хранения в SQLite
    hashed_text = hashed_bytes.decode("utf-8")

    # 2. Записываем в базу данных
    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()

    try:
        cursor.execute(
            "INSERT INTO users (username, password_hash) VALUES (?, ?)",
            (username, hashed_text),
        )
        conn.commit()
        print(f"[УСПЕХ] Пользователь '{username}' успешно зарегистрирован!")
        return True
    except sqlite3.IntegrityError:
        print(f"[ОШИБКА] Логин '{username}' уже занят. Выберите другой.")
        return False
    finally:
        conn.close()


def login_user(username, password):
    """Проверяет введенный пароль по хешу из базы данных."""
    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()

    # Ищем пользователя в базе по его логину
    cursor.execute(
        "SELECT password_hash FROM users WHERE username = ?", (username,)
    )
    result = cursor.fetchone()
    conn.close()

    # Если пользователь не найден
    if not result:
        print("[ОШИБКА] Пользователь с таким логином не найден.")
        return False

    # Извлекаем сохраненный текстовый хеш
    db_hashed_text = result[0]

    # Переводим текст обратно в байты для библиотеки bcrypt
    db_hashed_bytes = db_hashed_text.encode("utf-8")

    # Сравниваем введенный пароль с хешем из базы
    if bcrypt.checkpw(password.encode("utf-8"), db_hashed_bytes):
        print(f"[ДОСТУП РАЗРЕШЕН] Добро пожаловать, {username}!")
        return True
    else:
        print("[ОШИБКА] Неверный пароль. Доступ заблокирован.")
        return False


# --- ДЕМОНСТРАЦИЯ РАБОТЫ СКРИПТА ---
if __name__ == "__main__":
    # Шаг 1: Инициализируем базу данных
    init_database()

    print("--- ТЕСТ 1: Регистрация нового пользователя ---")
    # Пробуем создать аккаунт
    register_user("user777", "MySecurePass123")

    print("\n--- ТЕСТ 2: Повторная регистрация того же логина ---")
    # База данных не должна пропустить дубликат
    register_user("user777", "AnotherPassword")

    print("\n--- ТЕСТ 3: Проверка входа с НЕВЕРНЫМ паролем ---")
    # Система должна отклонить запрос
    login_user("user777", "WrongPassword")

    print("\n--- ТЕСТ 4: Проверка входа с ПРАВИЛЬНЫМ паролем ---")
    # Система должна успешно авторизовать пользователя
    login_user("user777", "MySecurePass123")