storage.json_storage

class storage.json_storage.JsonStorage(file_path: str = '/etc/gonets/users.json')[source]

Bases: object

Хранилище пользователей в JSON-файле.

Назначение:

Обеспечивает простое файловое хранилище для учетных записей пользователей без полноценной СУБД. Подходит для встраиваемых окружений и сценариев, где важна минимальная зависимость от внешних сервисов.

Формат данных:

JSON‑структура вида: {

“users”: [

{“id”: int, “username”: str, “password_hash”: str, “is_admin”: bool}, …

], “next_id”: int

}

Безопасность:

Пароли никогда не сохраняются в открытом виде. Для хеширования используется passlib.context.CryptContext со схемой bcrypt. Файл создаётся с правами доступа 0o600 (только владелец).

Ограничения и замечания:
  • Отсутствует конкурентный доступ/блокировки файла — при использовании в многопроцессной среде может потребоваться внешняя синхронизация.

  • Имя файла и каталог по умолчанию /etc/gonets/users.json предполагают наличие прав на запись и предварительную подготовку окружения.

create_user(user: UserCreate) → UserResponse[source]

Создаёт нового пользователя с хешированием пароля.

Args:

user (UserCreate): Объект с данными нового пользователя (username, password, is_admin).

Returns:

UserResponse: Объект с данными созданного пользователя (id, username, is_admin).

Raises:

ValueError: Если пользователь с таким именем уже существует. Exception: Если произошла ошибка при записи данных.

get_user_by_username(username: str) → dict | None[source]

Получает данные пользователя по имени.

Args:

username (str): Имя пользователя для поиска.

Returns:

Optional[dict]: Словарь с данными пользователя или None, если пользователь не найден.

Raises:

Exception: Если произошла ошибка при чтении файла.

verify_password(plain_password: str, hashed_password: str) → bool[source]

Проверяет соответствие введённого пароля хэшированному.

Args:

plain_password (str): Введённый пользователем пароль. hashed_password (str): Хэшированный пароль из хранилища.

Returns:

bool: True, если пароль верен, False в противном случае.