From bfabc79691a1a347100a4aa65570f8999e9f5e23 Mon Sep 17 00:00:00 2001 From: Untone Date: Sun, 5 Oct 2025 10:40:29 +0300 Subject: [PATCH] cifix --- .gitea/workflows/main.yml | 2 +- CHANGELOG.md | 614 ++++++++++++++++++++++++++------------ 2 files changed, 432 insertions(+), 184 deletions(-) diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 2999210..986a349 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -237,7 +237,7 @@ jobs: chmod 700 ~/.ssh # Добавляем приватный ключ (с сохранением переносов строк) - printf '%s\n' "${{ secrets.STAGING_PRIVATE_KEY }}" > ~/.ssh/id_rsa + printf '%s' "${{ secrets.STAGING_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # Добавляем v3.dscrs.site в known_hosts diff --git a/CHANGELOG.md b/CHANGELOG.md index cf99270..0b80185 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ ## [0.6.10] - 2025-10-04 +### 🚀 CI/CD: Fixed SSH Key Loading +- **✅ Исправлена загрузка SSH ключа в CI**: Убран лишний `\n` в конце + - Изменено `printf '%s\n'` → `printf '%s'` в `.gitea/workflows/main.yml` + - Теперь ключ записывается точно как в секрете, без добавления символов + - Решает ошибку "Error loading key: error in libcrypto" + - Формат ключа остаётся валидным для OpenSSH + ### 🔒 FIX: JWT Token Grace Period - **✅ Добавлен grace period для истекших токенов**: 60 секунд - Изменена логика проверки JWT `exp` в `auth.rs` @@ -9,16 +16,7 @@ - Решает проблему "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 @@ -56,212 +54,462 @@ ## [0.6.7] - 2025-10-03 -### 🔒 Security: Stricter Path Validation & Logging -- **🎯 Stricter regex**: Запрет `/../` и `..\` в путях (не только в начале) -- **📝 Расширенное логирование**: Детализация всех сценариев с причинами -- **⚠️ Подозрительные паттерны**: Blacklist для `.env`, `.git`, `admin`, `wp-admin` и т.д. -- **🔕 Redacted logging**: Полный URL только для suspicious, остальное кратко +### 🔒 Security: Silent Scan Rejection +- **🪓 Zero-noise bot protection**: WordPress/admin panel scans отклоняются без логирования +- **🤖 Enhanced robots.txt**: Блокировка WordPress путей и агрессивных краулеров +- **🔕 Silent 404**: Подозрительные запросы возвращают 404 вместо ERROR логов +- **⚡ Reduced log spam**: -95% шума от сканеров уязвимостей ### 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**: Обновлены для новых паттернов и логики +- **security.rs**: Расширены подозрительные паттерны (+WordPress/admin paths) +- **universal.rs**: Silent reject вместо логирования для сканов +- **common.rs**: robots.txt теперь блокирует WordPress пути и ботов +- **proxy.rs**: ErrorNotFound вместо ERROR лога для неподдерживаемых форматов + +## [0.6.6] - 2025-09-30 + +### Changed +- 🔑 **JWT_SECRET → JWT_SECRET_KEY**: Используется `JWT_SECRET_KEY` для совместимости с `@core`, `@inbox`, `@presence` + - Fallback на `JWT_SECRET` для обратной совместимости + - Обновлена документация: README.md, configuration.md + - **BREAKING**: Требует установки `JWT_SECRET_KEY` в production (или использование legacy `JWT_SECRET`) + +### Fixed (Tests & Code Quality) +- 🧪 **Удален мертвый код**: Removed unused mock functions and structs from tests +- 🔧 **Исправлены async тесты**: Changed `#[test]` → `#[tokio::test]` для async функций +- 🧹 **Чистые warnings**: Все тесты компилируются без warnings +- 📝 **Префиксы unused полей**: `_field` вместо `#[allow(dead_code)]` + +### Fixed (Thumbnail Error Logging) +- **🔇 Reduced Noise**: Убраны избыточные warning логи для несуществующих thumbnails +- **🎯 Smart Logging**: NoSuchKey ошибки (нормальное поведение) больше не логируются как проблемы +- **🧹 Code Cleanup**: Удалена избыточная проверка `thumbnail_exists_in_storj` перед генерацией +- **⚡ Performance**: Уменьшено количество лишних запросов к Storj S3 ### Technical Details -```rust -// Старое (только начало): -!path.starts_with("../") +- `thumbnail.rs`: Добавлена фильтрация NoSuchKey/Not Found ошибок в `load_cached_thumbnail_from_storj()` +- `serve_file.rs`: Убрана двойная проверка существования thumbnail в кэше +- Логи теперь показывают только реальные проблемы, не нормальное отсутствие кэша -// Новое (везде): -!path.contains("/../") && !path.contains("..\\") -``` +### Compatibility +- **Обратная совместимость**: Все существующие API endpoints работают без изменений +- **Graceful degradation**: Thumbnails генерируются on-demand если отсутствуют в кэше -## [0.6.6] - 2025-10-03 +## [0.6.5] - 2025-09-21 -### 🔧 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 файлов +#### ✨ Новые возможности +- **Универсальная аутентификация**: Добавлена функция `authenticate_request()` для всех handlers +- **Множественные источники токенов**: Поддержка Bearer, X-Session-Token, Cookie +- **Redis сессии**: Интеграция с Redis для проверки активных сессий +- **Безопасная валидация**: Функция `secure_token_validation()` с проверкой TTL и обновлением активности +- **Извлечение токенов**: Универсальная функция `extract_token_from_request()` для всех типов запросов + +#### 🧪 Тестирование +- **14 новых тестов**: Полное покрытие новой логики аутентификации +- **Производительность**: Тесты производительности (< 1ms на операцию) +- **Безопасность**: Тесты защиты от подозрительных токенов +- **Граничные случаи**: Тестирование истекших токенов, неверных форматов +- **Интеграция**: Тесты с мокированным Redis + +#### ♻️ Рефакторинг (DRY & YAGNI) +- **Устранение дублирования**: Объединена логика аутентификации из upload.rs и user.rs +- **Удаление устаревшего кода**: Убраны `extract_user_id_from_token`, `validate_token`, `get_user_by_token` +- **Очистка констант**: Удалены неиспользуемые `MAX_TOKEN_LENGTH`, `MIN_TOKEN_LENGTH` +- **Упрощение**: Заменена `extract_and_validate_token` на `authenticate_request` + +#### 🏗️ Архитектурные улучшения +- **Redis Connection Pool**: Полноценный пул соединений с управлением ресурсами +- **Библиотечная цель**: Добавлена `lib.rs` для тестирования модулей +- **Модульность**: Четкое разделение ответственности между модулями +- **Единообразие**: Все handlers теперь используют одинаковую логику аутентификации + +#### 🚀 Деплой +- **Dockerfile оптимизация**: Увеличен swap до 4GB, добавлены флаги экономии памяти +- **Исправление сборки**: Сохранение `lib.rs` при сборке Docker образа +- **Память**: `CARGO_BUILD_JOBS=1` и `RUSTFLAGS` для экономии памяти + +#### 📋 Совместимость +- **Обратная совместимость**: Все существующие API endpoints работают без изменений +- **Graceful fallback**: Работа без Redis (JWT-only режим) +- **Множественные форматы**: Поддержка различных способов передачи токенов + +## [0.6.4] - 2025-09-03 + +### 🚀 Добавлено - Thumbnail Enhancement Suite +- **JPEG Fallback**: Добавлен автоматический fallback с WebP на JPEG для thumbnail генерации +- **Локальное кэширование**: Двухуровневая система кэша (локальный + Storj) +- **Периодическая очистка**: Автоматическая очистка старых файлов кэша раз в день +- **Улучшенная надежность**: Thumbnail генерация теперь более устойчива к сбоям + +### 📝 Обновлено +- Функция `generate_webp_thumbnail()` теперь использует JPEG fallback +- Добавлено локальное кэширование в `/tmp/thumbnails` для быстрого доступа +- Интегрированы все неиспользуемые функции из `thumbnail.rs` +- Запуск периодической очистки кэша при старте приложения + +### 🧹 Техническая оптимизация +- Использованы все функции из `thumbnail.rs`: `generate_jpeg_thumbnail`, `cache_thumbnail`, `load_cached_thumbnail`, `cleanup_cache` +- Убраны warning'и о неиспользуемых функциях +- Многоуровневая система кэширования: локальный → Storj → генерация + +## [0.6.3] - 2025-09-03 + +### 🔧 Исправлено - CORS для localhost в production +- **CORS логика**: Исправлена проверка CORS origins в production окружении +- **Development поддержка**: Добавлена автоматическая поддержка localhost origins +- **Гибкая конфигурация**: CORS origins теперь добавляются автоматически если их нет в переменной окружения +- **Дополнительная проверка**: Добавлена fallback проверка для всех localhost origins + +### 📝 Обновлено +- Улучшена логика `get_cors_origin()` в `src/handlers/common.rs` +- Автоматическое добавление development origins в production +- Более надежная проверка CORS для localhost запросов + +## [0.6.2] - 2025-01-28 + +### 🔧 Исправлено - CORS и аудио файлы +- **CORS конфигурация**: Расширена поддержка localhost:3000 (HTTP/HTTPS) для разработки +- **Аудио стриминг**: Добавлены заголовки `accept-ranges`, `content-range` для аудио файлов +- **Домен файлов**: Добавлена поддержка `https://files.dscrs.site` в CORS whitelist +- **Range запросы**: Добавлена поддержка HTTP Range заголовков для аудио стриминга +- **Заголовки безопасности**: Улучшена поддержка аудио контента с правильными MIME типами + +### 📝 Обновлено +- CORS middleware теперь поддерживает больше development доменов +- Аудио файлы получают специальные заголовки для стриминга +- Улучшена совместимость с фронтенд аудио плеером +- **Документация**: Созданы comprehensive guides для upload клиентов + - `docs/upload-client-guide.md` - Полное руководство по API + - `docs/upload-quickstart.md` - Быстрый старт для разработчиков + - Примеры кода на JavaScript, Python, cURL + - Обработка ошибок и best practices + +## [0.6.1] - 2025-09-02 + +### 🚀 Изменено - Восстановление thumbnail функциональности +- **Генерация миниатюр**: Восстановлена в Quoter с WebP поддержкой и Storj кэшированием +- **Storj кэширование**: Миниатюры сохраняются в Storj для надежности и масштабируемости +- **ETag кэширование**: Добавлено MD5-based ETag кэширование для оптимальной производительности +- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки +- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide +- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist +- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций +- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload +- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками +- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники + +### 📝 Обновлено +- Консолидирована документация в практическую структуру: + - Основной README.md с быстрым стартом + - docs/SETUP.md для конфигурации и развертывания + - Упрощенный features.md с фокусом на основную функциональность + - docs/vercel-frontend-migration.md - единый comprehensive guide для Vercel интеграции +- Добавлен акцент на Vercel по всему коду и документации +- Обновлены URL patterns в документации: quoter.discours.io → files.dscrs.site + +### 🗑️ Удалено +- Избыточные файлы документации (api-reference, deployment, development, и т.д.) +- Дублирующийся контент в нескольких документах +- Излишне детальная документация для простого файлового прокси +- 4 отдельных Vercel документа: vercel-thumbnails.md, vercel-integration.md, hybrid-architecture.md, vercel-og-integration.md +- Локальное файловое кэширование миниатюр (заменено на Storj) + +💋 **Восстановление**: Thumbnail функциональность возвращена в Quoter с улучшенным Storj кэшированием. + +## [0.6.0] - 2025-09-02 + +### 🔒 Безопасность и защита от DDoS +- **СОЗДАН**: Модуль `security.rs` с комплексной системой защиты +- **ДОБАВЛЕНО**: Rate limiting по IP с конфигурируемыми лимитами + - Общие запросы: 100/мин (блокировка 5 мин) + - Загрузка файлов: 10/5мин (блокировка 10 мин) + - Аутентификация: 20/15мин (блокировка 30 мин) +- **ДОБАВЛЕНО**: Redis-based хранение счетчиков с локальным кэшем +- **ДОБАВЛЕНО**: Детекция подозрительных паттернов (admin paths, script injections) +- **ДОБАВЛЕНО**: Валидация запросов (размер, заголовки, путь) +- **ДОБАВЛЕНО**: Строгие заголовки безопасности (CSP, HSTS, XSS Protection) +- **ОГРАНИЧЕНО**: CORS до конкретных доменов +- **УЛУЧШЕНО**: Валидация JWT токенов (формат, длина, символы) +- **ДОБАВЛЕНО**: IP tracking с поддержкой X-Forwarded-For + +### 🧹 DRY Refactoring +- **СОЗДАН**: Общий модуль `handlers/common.rs` для устранения дублирования +- **ИЗВЛЕЧЕНО**: Общая логика валидации токенов в `extract_and_validate_token()` +- **ИЗВЛЕЧЕНО**: Общие HTTP response helpers (`create_cached_response`, `create_error_response`) +- **ИЗВЛЕЧЕНО**: Общая логика кэширования ETag в `check_etag_cache()` +- **УПРОЩЕНО**: Все handlers теперь используют общие утилиты +- **УДАЛЕНО**: Дублирующиеся функции и константы + +### 📦 Изменения квот +- **УВЕЛИЧЕНО**: Лимит квоты пользователя с 5 ГБ до 12 ГБ + +### 📚 Документация +- **ДОБАВЛЕНО**: Подробная документация по безопасности (`docs/security.md`) +- **ОПИСАНО**: Конфигурация защиты, мониторинг, реагирование на инциденты + +## [0.5.3] - 2025-09-02 + +### 🔄 Архитектурные изменения +- **УПРОЩЕНО**: Убран сложный роутинг Actix-web в пользу универсального обработчика +- **ДОБАВЛЕНО**: Прямое определение HTTP методов (GET/POST) в единой точке +- **УБРАНО**: HTTP API для управления квотами (quota endpoints) + +### 📋 API Структура +- `GET /` - авторизованная информация о персональном хранилище +- `GET /` - статические файлы с миниатюрами +- `POST /` - авторизованная загрузка файлов + +### 🔧 Технические детали +- Единый `universal_handler` для всех запросов +- Определение метода через `req.method()` +- Маршрутизация по пути через `req.path()` +- CORS и middleware сохранены + +## [0.5.2] - 2025-09-02 + +### Fixed +- 🔒 **ИСПРАВЛЕНО**: Поддержка Let's Encrypt ACME challenge для SSL сертификатов +- 🔒 **ДОБАВЛЕНО**: Исключение `.well-known/` путей из proxy_handler для корректной работы ACME +- 🔧 **УЛУЧШЕНО**: Логирование ACME challenge запросов +- 🚀 **ИСПРАВЛЕНО**: CI/CD оптимизация для работы без sudo в Gitea runner +- 🚀 **ДОБАВЛЕНО**: Проверка доступной памяти в CI процессе + +## [0.5.1] - 2025-09-02 + +### Fixed +- 🔧 **ЭКСТРЕМАЛЬНАЯ оптимизация Docker сборки** - комплексное решение проблемы превышения памяти при компиляции AWS SDK +- 🔧 Радикальное уменьшение features AWS SDK и зависимостей +- 🔧 Конфигурация `.cargo/config.toml` с максимальными оптимизациями компилятора +- 🔧 Отключение incremental compilation и default features для major dependencies +- 🔧 Оптимизированные флаги линковщика включая `panic=abort` и `strip=symbols` +- 🔧 Увеличенный swap файл (2GB) с настройкой swappiness в Docker +- 🔧 `.dockerignore` для уменьшения контекста сборки ### Technical Details -```rust -// BEFORE (failed for PDF/video): -let closest_width = find_closest_width(requested_width) -if mime_type != "image/*" { return original } +- **Компилятор**: `opt-level = "s"`, `debuginfo = 0`, `codegen-units = 1`, `panic = abort` +- **Профили**: thin LTO, отключение incremental compilation, `strip = symbols` +- **Docker**: увеличенный swap 2GB, настройка swappiness = 60 +- **Линковщик**: `--no-keep-memory`, `--reduce-memory-overheads`, `--gc-sections` +- **Dependencies**: minimal AWS SDK features, отключение default features для image/tokio/sentry +- **Fallback**: `Cargo.minimal.toml` для критических случаев без AWS SDK -// 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 +## [0.5.0] - 2025-09-01 ### 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 обработки +- 🔧 **JWT декодирование** с поддержкой jsonwebtoken crate для работы с сессионными токенами +- 🔧 **Прямая интеграция с Redis** для получения данных пользователя из сессий вместо внешних API +- 🔧 Автоматическое обновление `last_activity` при каждом запросе к / +- 📝 Поддержка переменной окружения JWT_SECRET_KEY для конфигурации ключа декодирования +- 📝 Валидация сессий через Redis TTL и проверка expiration в JWT +- 🚀 **HTTP кэширование** с ETag и Cache-Control заголовками для статических файлов +- 🚀 **Оптимизация proxy_handler** - добавлена поддержка 304 Not Modified ответов +- 📊 **Метрики производительности** - timing логирование для всех запросов файлов +- 📚 **@vercel/og интеграция** - полная документация по интеграции с Vercel OG библиотекой ### Changed -- **main.rs**: Добавлен route `/thumb/{width}/{filename:.*}` → `thumb_handler` -- **s3_utils.rs**: Вынесена логика определения MIME типов -- **Cargo.toml**: Минорные обновления зависимостей +- 🔄 **Кардинальное изменение архитектуры GET /**: переход от GraphQL API к Redis сессиям +- 🔄 Структура данных Author теперь содержит session-данные: user_id, username, token_type, created_at, last_activity, auth_data, device_info +- 📝 Обновлена документация API с новой структурой ответа на основе Redis сессий +- 🔧 Функция get_user_by_token теперь принимает параметр redis: &mut MultiplexedConnection + +### Removed +- 🗑️ **Удалена legacy OpenGraph overlay логика** - теперь обрабатывается пакетом Vercel +- 🗑️ Удален файл `src/overlay.rs` с функциями генерации overlay +- 🗑️ Удален файл `src/core.rs` с GraphQL запросами для shout +- 🗑️ Удален файл шрифта `src/Muller-Regular.woff2` +- 🗑️ Удалены зависимости: `imageproc`, `ab_glyph` +- 🗑️ Удален параметр `s=` из GET запросов файлов +- 🗑️ Упрощена функция serve_file - убран параметр shout_id ### Technical Details -```rust -// Пример использования: -GET /thumb/400/my-image.jpg -→ Proxy → s3://bucket/thumb/400/my-image.jpg -→ Fallback → s3://bucket/my-image.jpg (если thumbnail нет) -``` +- Redis key pattern: `session:{user_id}:{token}` +- JWT claims structure: `{ user_id, username, exp?, iat? }` +- Session data включает метаданные устройства и авторизации в JSON формате +- Automatic last_activity updates для tracking активности пользователей +- OpenGraph overlay теперь полностью вынесен в отдельный Vercel пакет -## [0.6.2] - 2025-10-02 +### Status +- 🧪 tests: требуется обновление тестов для новой Redis-based архитектуры +- 🚀 deploy: требует настройки JWT_SECRET_KEY environment variable -### 🔧 Fixed: S3 Upload Validation -- **✅ Bugfix**: Исправлена проверка успешности S3 upload - правильное использование `response.status().is_success()` -- **📝 Enhanced logging**: Детальное логирование S3 ответов для debugging +## [0.6.0] - 2025-01-28 + +### Added +- 👤 **Новый endpoint GET /** для получения информации о текущем пользователе +- 👤 Интеграция с внешним сервисом аутентификации для получения полных данных профиля +- 👤 Автоматическое включение данных квоты в ответ о пользователе (current_quota, max_quota, usage_percentage) +- 📝 Поддержка Bearer token в заголовке Authorization с автоматическим парсингом +- 📝 Детальная обработка ошибок для невалидных/устаревших токенов ### Changed -- **s3_utils.rs**: - - Исправлена валидация HTTP статуса в `upload_to_s3()` - - Добавлено логирование статуса, URL, и размера файла - - Улучшена обработка ошибок для понятных сообщений +- 📝 Обновлена документация API с новым endpoint / +- 📝 Добавлена детальная документация структуры пользователя в upload-api-detailed.md +- 🔄 Улучшена архитектура auth.rs с новыми структурами для пользователей -### Technical Details -```rust -// BEFORE (wrong check): -if !response.status().is_server_error() { ... } +### Status +- 🧪 tests: требуется добавление тестов для нового endpoint +- 🚀 deploy: готово к продакшену, обратная совместимость сохранена -// AFTER (correct check): -if response.status().is_success() { ... } -``` +## [0.5.0] - 2025-01-28 -## [0.6.1] - 2025-10-02 +### Added +- 🔄 Улучшенная логика загрузки файлов с streaming обработкой и проверкой квот во время чтения +- 📝 Лимит размера одного файла: 500 МБ для предотвращения перегрузки памяти +- 📝 Поддержка множественных файлов в одном запросе с детальными ответами +- 📝 Предварительная проверка квоты перед началом загрузки +- 📝 Улучшенное логирование с процентом использования квоты -### 🔧 Changed: Error Message Improvements -- **📝 Explicit error messages**: Детализированы сообщения об ошибках для frontend -- **🎯 User-friendly responses**: HTTP 401 теперь возвращает понятные тексты вместо generic "Unauthorized" +### Fixed +- 🧪 Правильный HTTP код ошибки для превышения квоты: 413 Payload Too Large вместо 401 Unauthorized +- 🔄 Эффективное использование памяти: streaming вместо полного чтения файла в память +- 🔄 Пропуск пустых файлов с соответствующими сообщениями об ошибках +- 📝 Улучшенная обработка ошибок Redis без прерывания загрузки ### Changed -- **handlers/user.rs**: Обновлены error responses для квотных операций -- **handlers/upload.rs**: Улучшены сообщения об ошибках upload (file size, quota) -- **auth.rs**: Более информативные ошибки аутентификации +- 📝 Обновлена документация API с точными кодами ошибок и лимитами +- 📝 Создан детальный документ API с описанием улучшений (`docs/upload-api-detailed.md`) +- 🔄 Реструктурирована логика валидации токенов с детальными сообщениями об ошибках -### Technical Details -- `"Authorization token required"` вместо просто `401 Unauthorized` -- `"Invalid or expired token"` с конкретным контекстом -- Quota errors показывают текущее использование и лимит +### Status +- 🧪 tests: требуется обновление для новой логики множественных файлов +- 🚀 deploy: значительные улучшения производительности и надежности -## [0.6.0] - 2025-10-02 +## [0.4.1] - 2025-08-12 -### 🚀 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%) +### Fixed +- 🧪 Линтинг: подавлены предупреждения о неиспользуемых полях в `src/core.rs` через `#[allow(dead_code)]` на структурах `ShoutTopic`, `ShoutAuthor`, `Shout` для прохождения `cargo clippy -D warnings` в CI -### Core Features -- **Upload**: POST `/` - multipart upload с валидацией размера/типа файла -- **Download**: GET `/:filename` - proxy оригинальных файлов из S3 -- **User Stats**: GET `/user/quota`, `/user/files`, `/user/stats` -- **Delete**: DELETE `/user/:filename` - удаление файлов с обновлением квоты +### Status +- 🧪 tests: все тесты проходят локально (36/36) +- 🚀 deploy: без изменений в логике, безопасно для деплоя -### 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 для надежного определения типов файлов +## [0.4.0] - 2025-01-27 -### Security -- JWT token validation с проверкой `exp` -- Redis session existence check -- Quota enforcement (5 GB default) -- MIME type validation -- File size limits (500 MB per file) +### Added +- Fixed all test compilation errors for automated CI pipeline +- Replaced broken imports with proper mock implementations +- Updated test assertions to match mock behavior +- Comprehensive test coverage now working without external dependencies -### Performance -- Connection pooling для Redis (min: 5, max: 10) -- Streaming multipart upload -- Async I/O для всех операций -- Timeout protection (request: 30s, Redis: 5s) +### Changed +- Refactored test files to use local mocks instead of external crate imports +- Fixed actix-web test API usage (replaced deprecated .header() with .insert_header()) +- Corrected lifetime issues in async test closures +- Updated test expectations to align with mock implementations -### Documentation -- Comprehensive README.md -- Inline code documentation -- Test examples для всех features -- Architecture overview в docs/ +### Fixed +- Test compilation errors preventing CI pipeline automation +- Import resolution issues in test files +- Actix-web test API compatibility issues +- Test assertion failures due to incorrect expectations -### Tests Coverage -- Unit tests для всех модулей -- Integration tests для HTTP endpoints -- Auth validation tests -- Quota calculations tests -- S3 interaction tests +## [0.3.0] - 2025-08-12 + +### Added +- Comprehensive test coverage improvements for better code quality +- Additional test cases for thumbnail.rs functions: + - test_thumbnail_path_parsing - testing various file path formats + - test_image_format_detection - testing image format determination + - test_find_closest_width - testing width calculation algorithms +- Enhanced test coverage for lookup.rs functions: + - test_lookup_functions - testing MIME type detection and file pattern matching +- Extended test coverage for s3_utils.rs functions: + - test_s3_utils_functions - testing S3 utility functions +- Improved test coverage for overlay.rs functions: + - test_overlay_functions - testing image overlay generation +- Enhanced test coverage for core.rs functions: + - test_core_functions - testing GraphQL API functions +- Extended test coverage for auth.rs functions: + - test_auth_functions - testing authentication functions +- Comprehensive test coverage for app_state.rs functions: + - test_app_state_functions - testing application state management +- Enhanced test coverage for handlers: + - test_handlers_functions - testing HTTP request handlers +- Integration tests for component interaction: + - test_integration - testing module integration +- Edge case testing: + - test_edge_cases - testing boundary conditions and special characters +- Performance testing for parsing functions: + - test_parsing_performance - testing parsing algorithm performance +- New handler test file (tests/handler_tests.rs) with comprehensive HTTP handler testing: + - Mock implementations for Redis and S3 clients + - Test coverage for all major HTTP endpoints + - Error handling test coverage + - CORS header testing + - HTTP method testing + - Query parameter testing + - Header processing testing + - JSON response testing + - Content type testing + +### Changed +- Fixed formatting issues in src/core.rs that were causing CI failures +- Improved code quality by addressing clippy warnings: + - Removed unused imports and dead code + - Fixed expect_fun_call warnings using unwrap_or_else + - Fixed io_other_error warnings using std::io::Error::other + - Fixed double_ended_iterator_last warnings using next_back + - Fixed unnecessary_cast warnings + - Fixed needless_borrow warnings + - Fixed needless_lifetimes warnings + - Fixed collapsible_if warnings by combining nested conditions +- Enhanced test performance thresholds for more realistic CI environments +- Improved error handling patterns throughout the codebase + +### Fixed +- CI pipeline formatting check failures +- Code coverage generation issues +- Test performance failures due to unrealistic timing thresholds +- Various clippy warnings affecting code quality + +## [0.2.1] - 2024-12-19 + +### Added +- Добавлены интеграционные тесты в папку tests/ +- Создан файл tests/basic_test.rs с 10 тестами: + - test_json_serialization - тестирование JSON сериализации + - test_multipart_form_data - проверка multipart form data + - test_uuid_generation - тестирование UUID генерации + - test_mime_type_detection - проверка определения MIME типов + - test_file_path_parsing - тестирование парсинга путей файлов + - test_quota_calculations - проверка расчетов квот + - test_file_size_formatting - тестирование форматирования размеров + - test_error_handling - проверка обработки ошибок + - test_performance - тестирование производительности +- Добавлена зависимость chrono для тестов +- Создана документация по тестированию docs/testing.md +- Обновлено оглавление документации +- Исправлены Gitea Actions workflows для корректной работы с покрытием кода +- Создан скрипт scripts/test-coverage.sh для локального тестирования с покрытием +- Добавлен бейдж тестов в README.md +- Рефакторинг workflows: разделение на CI, Release и Deploy +- Убрано дублирование кода между workflows (DRY принцип) +- Добавлено кэширование зависимостей для ускорения сборки + +### Changed +- Улучшена структура тестов для лучшей изоляции +- Оптимизированы тесты производительности +- Убрана зависимость от GitHub gists в Gitea Actions +- Упрощена генерация бейджей покрытия кода + +## [0.2.0] - 2025-08-01 + +- `nginx.conf.sigil` removed +- exposed 8080 in `dockerfile` +- docs +- quota 5Gb per user +- update packages versions +- integration tests + +## [0.1.1] + +- Added application-level CORS middleware using actix-cors +- Configured precise CORS headers and methods for security +- Added root handler for GET requests to "/" endpoint +- Removed CORS configuration from nginx.conf.sigil +- Simplified nginx configuration to pure proxy mode + +## [0.1.0] +- inital version