## [0.6.10] - 2025-10-04 ### 🔒 FIX: JWT Token Grace Period - **✅ Добавлен grace period для истекших токенов**: 60 секунд - Изменена логика проверки JWT `exp` в `auth.rs` - Токены принимаются в течение 60 секунд после истечения - Это даёт клиенту время автоматически обновить токен через `refreshToken()` - Логирование разделено: `info` для grace period, `warn` для полного истечения - Решает проблему "Invalid or expired token" при параллельных запросах - Формула: `if exp + 60 < current_time` → reject, иначе accept - Предотвращает race condition: upload начался до истечения, закончился после ### 🧪 Tests: Clippy Fixes - Исправлены предупреждения clippy в тестах: - `needless_borrows_for_generic_args`: Убраны лишние `&` в `redis_connection_test.rs` - `iter_nth_zero`: Заменён `.nth(0)` на `.next()` для итераторов - `identity_op`: Упрощены операции типа `1 * MB` → `MB` в `basic_test.rs` - `useless_vec`: Заменён `vec!` на array literal где возможно - `assertions_on_constants`: Удалены `assert!(true)` в `redis_pool_test.rs` - `field_reassign_with_default`: Используется `Header { alg: ..., ..Default::default() }` ## [0.6.9] - 2025-10-04 ### 🔒 Fixed: ERR_BLOCKED_BY_ORB & CI SSH Key - **🔧 CI/CD**: Исправлена загрузка SSH ключа в CI - используем `printf` вместо `echo` для сохранения переносов строк - **❌ Убран CSP**: Удален `Content-Security-Policy` заголовок, который блокировал кросс-ориджин загрузку изображений - **❌ Убран X-Frame-Options**: DENY был излишне строгим для файлового CDN - **❌ Убран X-XSS-Protection**: Устаревший заголовок, не нужный для статики - **✅ Минимальные security headers**: Оставлены только `X-Content-Type-Options: nosniff`, `Referrer-Policy`, `HSTS` - **✅ CORS работает**: Теперь изображения корректно загружаются из браузера без ORB блокировки ### Technical Details - `src/main.rs`: Упрощены security headers для файлового CDN - CSP конфликтовал с CORS и вызывал ERR_BLOCKED_BY_ORB в Chrome/Edge - Файловый сервер не нуждается в защите от XSS/Clickjacking (нет HTML контента) ## [0.6.8] - 2025-10-03 ### 🔒 Security: Early Scan Rejection - **⚡ Ранний reject**: Проверка suspicious patterns ДО вызова proxy_handler (минимум логов) - **🎯 Расширенные паттерны**: Добавлены `wp-includes`, `wlwmanifest` (без слешей для любых подпапок) - **📦 CMS защита**: Joomla, Drupal, Magento paths в blacklist - **🔕 Zero-log policy**: Silent 404 для всех сканов - нулевое логирование ### Changed - **security.rs**: +4 новых suspicious patterns (wp-includes, wlwmanifest, CMS paths) - **universal.rs**: Двойная проверка - ранний reject в handle_get ДО proxy - **auth.rs**: - Added `Clone` derive для `TokenClaims` (требование jsonwebtoken v10) - **Tests**: ✅ Все тесты проходят (3/3 passed) ### Technical Details - Все suspicious patterns проверяются БЕЗ логирования - Любое совпадение → silent 404 (no warnings, no info) - CMS patterns: Joomla (`/administrator/`), Drupal (`/user/login`), Magento (`/admin_`) ## [0.6.7] - 2025-10-03 ### 🔒 Security: Stricter Path Validation & Logging - **🎯 Stricter regex**: Запрет `/../` и `..\` в путях (не только в начале) - **📝 Расширенное логирование**: Детализация всех сценариев с причинами - **⚠️ Подозрительные паттерны**: Blacklist для `.env`, `.git`, `admin`, `wp-admin` и т.д. - **🔕 Redacted logging**: Полный URL только для suspicious, остальное кратко ### Changed - **security.rs**: - `is_valid_path()`: regex `\.\.[/\\]` для любых позиций - `is_suspicious_path()`: 15 новых паттернов (CMS, config, admin, git, env, etc.) - Централизованная логика валидации - **handlers/universal.rs**: Используется централизованная валидация из security.rs - **handlers/thumb.rs**: Аналогичная интеграция с логированием - **Tests**: Обновлены для новых паттернов и логики ### Technical Details ```rust // Старое (только начало): !path.starts_with("../") // Новое (везде): !path.contains("/../") && !path.contains("..\\") ``` ## [0.6.6] - 2025-10-03 ### 🔧 Fixed: Thumbnail Width Validation - **✅ Пропуск width-validation для non-image файлов**: Исправлена ошибка где thumbnail handler пытался обработать PDF/видео как изображения - **🎯 Focused validation**: Проверка ширины только для `image/*` MIME типов - **📝 Enhanced logging**: Четкое логирование причин пропуска или обработки ### Changed - **thumb.rs**: - Ранний return для non-image файлов ПЕРЕД `find_closest_width()` - Логирование MIME type и решения о пропуске обработки - Комментарии: "We only resize images - other formats pass through" - **Tests**: Добавлена проверка корректности обработки non-image файлов ### Technical Details ```rust // BEFORE (failed for PDF/video): let closest_width = find_closest_width(requested_width) if mime_type != "image/*" { return original } // AFTER (skip early): if !mime_type.starts_with("image/") { return proxy_original_file(path).await } let closest_width = find_closest_width(requested_width) ``` ## [0.6.5] - 2025-10-03 ### 🔒 Security: Directory Traversal Prevention - **🚨 Path validation**: Блокировка `../` и символических ссылок для предотвращения directory traversal - **🔐 Improved sanitization**: Строгие проверки входных путей во всех handlers - **📝 Detailed logging**: Расширенное логирование попыток доступа к запрещенным путям ### Changed - **handlers/common.rs**: Добавлена функция `validate_path()` с проверками: - Запрет на `../` в любой позиции пути - Проверка на символические ссылки - Логирование подозрительных попыток доступа - **handlers/universal.rs**: Интегрирована валидация пути ПЕРЕД прокси - **handlers/thumb.rs**: Аналогичная интеграция для thumbnail запросов - **Tests**: Добавлены тесты для проверки directory traversal prevention ### Security Context - Предотвращает атаки типа `../../etc/passwd` - Блокирует доступ к файлам вне разрешенного bucket - Логирует suspicious patterns для мониторинга ## [0.6.4] - 2025-10-03 ### 🔧 Fixed: Image Passthrough - **✅ Bugfix**: Исправлено зависание при обработке изображений без thumbnail - **🎯 Correct passthrough**: Изображения корректно проксируются в оригинальном размере при отсутствии подходящей ширины - **📝 Enhanced logging**: Добавлено детальное логирование решений о thumbnail/passthrough ### Changed - **thumb.rs**: - Исправлен вызов `proxy_original_file()`: используем исходный `path` вместо пересчитанного `adjusted_path` - Добавлено логирование выбора между thumbnail и passthrough - Улучшена обработка граничных случаев (ширина < 100 или > 800) ### Technical Details ```rust // BEFORE (incorrect): proxy_original_file(&adjusted_path, &s3_client, bucket).await // AFTER (correct): proxy_original_file(&path, &s3_client, bucket).await ``` ## [0.6.3] - 2025-10-03 ### 🎨 Added: Thumbnail Support - **✅ Feature**: Поддержка thumbnail-генерации для изображений через S3-compatible сервис (Storj) - **🔧 Optimized delivery**: Автоматический выбор ближайшей доступной ширины (100, 150, 200, 300, 400, 500, 600, 800) - **📦 Efficient caching**: Thumbnail кешируются на CDN уровне, минимальная нагрузка на origin ### Added - **thumbnail.rs**: Модуль для обработки thumbnail запросов - `find_closest_width()`: Выбор оптимальной ширины из доступных - `get_thumbnail_key()`: Генерация S3 ключа для thumbnail - `get_image_mime_type()`: Определение MIME типа по расширению - **handlers/thumb.rs**: HTTP handler для `/thumb/:width/:filename` - Валидация ширины (100-800px) - Проксирование thumbnail из S3 - Fallback на оригинальное изображение при отсутствии thumbnail - **Tests**: Покрытие для всех сценариев thumbnail обработки ### Changed - **main.rs**: Добавлен route `/thumb/{width}/{filename:.*}` → `thumb_handler` - **s3_utils.rs**: Вынесена логика определения MIME типов - **Cargo.toml**: Минорные обновления зависимостей ### Technical Details ```rust // Пример использования: GET /thumb/400/my-image.jpg → Proxy → s3://bucket/thumb/400/my-image.jpg → Fallback → s3://bucket/my-image.jpg (если thumbnail нет) ``` ## [0.6.2] - 2025-10-02 ### 🔧 Fixed: S3 Upload Validation - **✅ Bugfix**: Исправлена проверка успешности S3 upload - правильное использование `response.status().is_success()` - **📝 Enhanced logging**: Детальное логирование S3 ответов для debugging ### Changed - **s3_utils.rs**: - Исправлена валидация HTTP статуса в `upload_to_s3()` - Добавлено логирование статуса, URL, и размера файла - Улучшена обработка ошибок для понятных сообщений ### Technical Details ```rust // BEFORE (wrong check): if !response.status().is_server_error() { ... } // AFTER (correct check): if response.status().is_success() { ... } ``` ## [0.6.1] - 2025-10-02 ### 🔧 Changed: Error Message Improvements - **📝 Explicit error messages**: Детализированы сообщения об ошибках для frontend - **🎯 User-friendly responses**: HTTP 401 теперь возвращает понятные тексты вместо generic "Unauthorized" ### Changed - **handlers/user.rs**: Обновлены error responses для квотных операций - **handlers/upload.rs**: Улучшены сообщения об ошибках upload (file size, quota) - **auth.rs**: Более информативные ошибки аутентификации ### Technical Details - `"Authorization token required"` вместо просто `401 Unauthorized` - `"Invalid or expired token"` с конкретным контекстом - Quota errors показывают текущее использование и лимит ## [0.6.0] - 2025-10-02 ### 🚀 Major Release: Quoter MVP - **✅ Feature-complete MVP**: Полностью функциональный file upload/download сервис - **🔒 Security**: JWT authentication с проверкой Redis сессий - **📦 S3 Storage**: Интеграция с Storj через S3-compatible API - **💾 User Quotas**: Система квот пользователей (5 ГБ default) - **🧪 Tests**: Comprehensive test coverage (>85%) ### Core Features - **Upload**: POST `/` - multipart upload с валидацией размера/типа файла - **Download**: GET `/:filename` - proxy оригинальных файлов из S3 - **User Stats**: GET `/user/quota`, `/user/files`, `/user/stats` - **Delete**: DELETE `/user/:filename` - удаление файлов с обновлением квоты ### Technical Stack - **Runtime**: Actix-Web 4.9 + Tokio async - **Storage**: AWS SDK S3 (Storj backend) - **Database**: Redis (сессии, квоты, метаданные) - **Auth**: JWT + Redis session validation - **MIME Detection**: infer crate для надежного определения типов файлов ### Security - JWT token validation с проверкой `exp` - Redis session existence check - Quota enforcement (5 GB default) - MIME type validation - File size limits (500 MB per file) ### Performance - Connection pooling для Redis (min: 5, max: 10) - Streaming multipart upload - Async I/O для всех операций - Timeout protection (request: 30s, Redis: 5s) ### Documentation - Comprehensive README.md - Inline code documentation - Test examples для всех features - Architecture overview в docs/ ### Tests Coverage - Unit tests для всех модулей - Integration tests для HTTP endpoints - Auth validation tests - Quota calculations tests - S3 interaction tests