Skip to content

TopNik073/NetVault

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NetVault

Асинхронное файловое хранилище на основе TCP протокола с авторизацией пользователей.


Описание

Проект представляет собой клиент-серверное приложение для хранения и управления файлами пользователей. Сервер обрабатывает множественные подключения асинхронно, каждый пользователь имеет изолированное хранилище файлов.

Возможности

  • 🔐 Авторизация пользователей с хешированием паролей (bcrypt)
  • 📁 Управление файлами: загрузка, скачивание, удаление, просмотр списка
  • 📂 Поддержка подпапок
  • 🔄 Асинхронная обработка множественных клиентов
  • 📊 Прогресс-бар для больших файлов
  • 🛡️ Валидация путей и защита от path traversal
  • 📝 Логирование операций

Установка

Требования

  • Python >= 3.13
  • uv (рекомендуется) или pip

Установка зависимостей

# С использованием uv
uv sync

# Или с использованием pip
pip install -e .

Использование

Запуск сервера

python -m src.main server

Сервер запустится на localhost:8000 (по умолчанию).

Использование CLI клиента

Обычные команды

# Регистрация нового пользователя
python -m src.main register --login username --password password

# Авторизация
python -m src.main login --login username --password password

# Список файлов (можно передать --login и --password для автоматической авторизации)
python -m src.main list [path] [--login username] [--password password]

# Загрузка файла на сервер (можно передать --login и --password для автоматической авторизации)
python -m src.main put local_file.txt remote_file.txt [--login username] [--password password]

# Скачивание файла с сервера (можно передать --login и --password для автоматической авторизации)
python -m src.main get remote_file.txt local_file.txt [--login username] [--password password]

# Удаление файла или папки (можно передать --login и --password для автоматической авторизации)
python -m src.main delete path/to/file [--login username] [--password password]

Интерактивный режим

Для работы с сохранением соединения между командами:

python -m src.main interactive

В интерактивном режиме доступны команды:

  • login <логин> <пароль> - авторизация
  • register <логин> <пароль> - регистрация
  • list [path] - список файлов
  • get <remote> <local> - скачать файл
  • put <local> <remote> - загрузить файл
  • delete <path> - удалить файл/папку
  • help - справка
  • exit - выход

Архитектура

Структура проекта

src/
├── client/             # Клиентская часть
│   ├── cli.py          # CLI интерфейс (click)
│   ├── client.py       # TCP клиент
│   └── protocol.py     # Протокол обмена данными
├── server/             # Серверная часть
│   ├── __init__.py     # Асинхронный TCP сервер
│   ├── server.py       # TCP сервер
│   ├── auth.py         # Авторизация пользователей
│   ├── storage.py      # Файловое хранилище
│   └── protocol.py     # Протокол обмена данными
└── utils/              # Утилиты
    ├── config.py       # Конфигурация
    ├── constants.py    # Константы
    ├── exceptions.py   # Кастомные исключения
    ├── logger.py       # Логирование
    ├── security.py     # Безопасность (хеширование)
    └── types.py        # Типы данных

Протокол обмена данными

  • JSON команды: Команды отправляются в формате JSON с полем command
  • Бинарные данные: Файлы передаются бинарно после JSON метаданных
  • Формат: Длина сообщения (4 байта) + данные

Хранилище

  • Пользователи хранятся в users.json (UUID, логин, хеш пароля)
  • Файлы пользователей в storage/{user_uuid}/
  • Каждый пользователь имеет изолированное хранилище

Конфигурация

Настройки можно изменить через переменные окружения или в src/utils/config.py:

  • HOST - адрес сервера (по умолчанию: localhost)
  • PORT - порт сервера (по умолчанию: 8000)
  • CHUNK_SIZE - размер чанка для передачи файлов (по умолчанию: 65536 байт)
  • MAX_FILE_SIZE - максимальный размер файла (по умолчанию: 1 GB)
  • MIN_PASSWORD_LENGTH - минимальная длина пароля (по умолчанию: 6)
  • MAX_LOGIN_LENGTH - максимальная длина логина (по умолчанию: 50)
  • MAX_PATH_LENGTH - максимальная длина пути (по умолчанию: 4096)

Примеры использования

Авторизация и работа с файлами

# 1. Запустить сервер
python -m src.main server

# 2. В другом терминале - зарегистрироваться
python -m src.main register --login user1 --password pass123

# 3. Загрузить файл с авторизацией в команде
python -m src.main put ~/Documents/file.txt documents/file.txt --login user1 --password pass123

# 4. Посмотреть список файлов с авторизацией
python -m src.main list --login user1 --password pass123

# 5. Скачать файл с авторизацией
python -m src.main get documents/file.txt ~/Downloads/file.txt --login user1 --password pass123

# 6. Удалить файл с авторизацией
python -m src.main delete documents/file.txt --login user1 --password pass123

Интерактивный режим

python -m src.main interactive

> login user1 pass123
Авторизация успешна
> list
📄 file.txt (1024 байт)
📁 documents
> put ~/test.txt test.txt
Загрузка файла (512 байт)...
Файл загружен: test.txt
> list
📄 file.txt (1024 байт)
📄 test.txt (512 байт)
📁 documents
> exit

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

  • Пароли хранятся в виде bcrypt хешей
  • Защита от path traversal атак
  • Валидация входных данных
  • Ограничение размера файлов
  • Изоляция файлов пользователей

Логирование

Логи сохраняются в:

  • Консоль
  • Файл logs/app.log (при log_to_file в настройках)

Разработка

Запуск в режиме разработки

# Установить зависимости
uv sync

# Запустить сервер
python -m src.main server

# В другом терминале запустить клиент
python -m src.main interactive

Если имеется установленный Just

# Запуск сервера
just run-server

# Запуск клиента в другом терминале (сразу в интерактивном режиме)
just run-cli

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published