2025-09-02 14:00:54 +03:00
|
|
|
|
use actix_web::HttpRequest;
|
|
|
|
|
|
use log::warn;
|
2025-09-02 11:40:43 +03:00
|
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
use std::sync::Arc;
|
2025-09-02 14:00:54 +03:00
|
|
|
|
use std::time::{SystemTime, UNIX_EPOCH};
|
|
|
|
|
|
use tokio::sync::RwLock;
|
2025-09-02 11:40:43 +03:00
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
/// Простая защита от злоупотреблений для upload endpoint
|
2025-09-02 11:40:43 +03:00
|
|
|
|
#[derive(Debug, Clone)]
|
2025-09-02 14:00:54 +03:00
|
|
|
|
pub struct UploadProtection {
|
|
|
|
|
|
/// Максимальное количество загрузок в минуту с одного IP
|
|
|
|
|
|
pub max_uploads_per_minute: u32,
|
|
|
|
|
|
/// Локальный кэш для подсчета загрузок
|
|
|
|
|
|
pub upload_counts: Arc<RwLock<HashMap<String, (u32, u64)>>>,
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
/// Конфигурация безопасности для простого storage proxy
|
2025-09-02 11:40:43 +03:00
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
|
pub struct SecurityConfig {
|
|
|
|
|
|
/// Максимальный размер тела запроса (байты)
|
|
|
|
|
|
pub max_payload_size: usize,
|
|
|
|
|
|
/// Таймаут запроса (секунды)
|
|
|
|
|
|
pub request_timeout_seconds: u64,
|
|
|
|
|
|
/// Максимальная длина пути
|
|
|
|
|
|
pub max_path_length: usize,
|
|
|
|
|
|
/// Максимальное количество заголовков
|
|
|
|
|
|
pub max_headers_count: usize,
|
|
|
|
|
|
/// Максимальная длина значения заголовка
|
|
|
|
|
|
pub max_header_value_length: usize,
|
2025-09-02 14:00:54 +03:00
|
|
|
|
/// Защита от злоупотреблений upload
|
|
|
|
|
|
pub upload_protection: UploadProtection,
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Default for SecurityConfig {
|
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
|
Self {
|
2025-09-02 14:00:54 +03:00
|
|
|
|
max_payload_size: 500 * 1024 * 1024, // 500MB
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
request_timeout_seconds: 300, // 5 минут
|
2025-09-02 11:40:43 +03:00
|
|
|
|
max_path_length: 1000,
|
|
|
|
|
|
max_headers_count: 50,
|
|
|
|
|
|
max_header_value_length: 8192,
|
2025-09-02 14:00:54 +03:00
|
|
|
|
upload_protection: UploadProtection {
|
|
|
|
|
|
max_uploads_per_minute: 10, // 10 загрузок в минуту
|
|
|
|
|
|
upload_counts: Arc::new(RwLock::new(HashMap::new())),
|
|
|
|
|
|
},
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
impl SecurityConfig {
|
|
|
|
|
|
/// Валидирует запрос на базовые параметры безопасности
|
|
|
|
|
|
pub fn validate_request(&self, req: &HttpRequest) -> Result<(), actix_web::Error> {
|
|
|
|
|
|
let path = req.path();
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
|
2025-09-02 11:40:43 +03:00
|
|
|
|
// Проверка длины пути
|
2025-09-02 14:00:54 +03:00
|
|
|
|
if path.len() > self.max_path_length {
|
|
|
|
|
|
warn!("Path too long: {} chars", path.len());
|
|
|
|
|
|
return Err(actix_web::error::ErrorBadRequest("Path too long"));
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Проверка количества заголовков
|
2025-09-02 14:00:54 +03:00
|
|
|
|
if req.headers().len() > self.max_headers_count {
|
2025-09-02 11:40:43 +03:00
|
|
|
|
warn!("Too many headers: {}", req.headers().len());
|
|
|
|
|
|
return Err(actix_web::error::ErrorBadRequest("Too many headers"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Проверка длины значений заголовков
|
2025-09-02 14:00:54 +03:00
|
|
|
|
for (name, value) in req.headers() {
|
2025-09-02 11:40:43 +03:00
|
|
|
|
if let Ok(value_str) = value.to_str() {
|
2025-09-02 14:00:54 +03:00
|
|
|
|
if value_str.len() > self.max_header_value_length {
|
|
|
|
|
|
warn!(
|
|
|
|
|
|
"Header value too long: {} = {} chars",
|
|
|
|
|
|
name,
|
|
|
|
|
|
value_str.len()
|
|
|
|
|
|
);
|
2025-09-02 11:40:43 +03:00
|
|
|
|
return Err(actix_web::error::ErrorBadRequest("Header value too long"));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Проверка на подозрительные символы в пути
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
if path.contains("..") || path.contains('\0') || path.contains('\r') || path.contains('\n')
|
|
|
|
|
|
{
|
2025-09-02 11:40:43 +03:00
|
|
|
|
warn!("Suspicious characters in path: {}", path);
|
2025-09-02 14:00:54 +03:00
|
|
|
|
return Err(actix_web::error::ErrorBadRequest(
|
|
|
|
|
|
"Invalid characters in path",
|
|
|
|
|
|
));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Проверка на подозрительные паттерны
|
|
|
|
|
|
if self.check_suspicious_patterns(path) {
|
|
|
|
|
|
return Err(actix_web::error::ErrorBadRequest("Suspicious path pattern"));
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-03 14:19:12 +03:00
|
|
|
|
/// Проверяет путь на подозрительные паттерны (молча отклоняет сканы)
|
2025-09-02 11:40:43 +03:00
|
|
|
|
pub fn check_suspicious_patterns(&self, path: &str) -> bool {
|
|
|
|
|
|
let suspicious_patterns = [
|
2025-10-03 14:19:12 +03:00
|
|
|
|
// WordPress scanning patterns
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
"/wp-admin",
|
2025-10-03 14:19:12 +03:00
|
|
|
|
"/wp-includes/",
|
|
|
|
|
|
"/wp-content/",
|
|
|
|
|
|
"/wp-login.php",
|
|
|
|
|
|
"/wp-config.php",
|
|
|
|
|
|
"/xmlrpc.php",
|
|
|
|
|
|
"/wlwmanifest.xml",
|
|
|
|
|
|
"/wp-json/",
|
|
|
|
|
|
"/wordpress/",
|
2025-10-03 19:58:43 +03:00
|
|
|
|
"wp-includes", // Добавлено для любых подпапок
|
|
|
|
|
|
"wlwmanifest", // Добавлено без слеша
|
2025-10-03 14:19:12 +03:00
|
|
|
|
// Admin panels
|
|
|
|
|
|
"/admin",
|
2025-09-02 14:00:54 +03:00
|
|
|
|
"/phpmyadmin",
|
2025-10-03 14:19:12 +03:00
|
|
|
|
"/cpanel",
|
|
|
|
|
|
"/plesk",
|
|
|
|
|
|
// Config & sensitive files
|
2025-09-02 14:00:54 +03:00
|
|
|
|
"/.env",
|
|
|
|
|
|
"/config",
|
|
|
|
|
|
"/.git",
|
|
|
|
|
|
"/backup",
|
|
|
|
|
|
"/db",
|
|
|
|
|
|
"/sql",
|
2025-10-03 14:19:12 +03:00
|
|
|
|
"/.htaccess",
|
|
|
|
|
|
"/web.config",
|
|
|
|
|
|
// XSS & injection patterns
|
2025-09-02 14:00:54 +03:00
|
|
|
|
"script>",
|
|
|
|
|
|
"<iframe",
|
|
|
|
|
|
"javascript:",
|
|
|
|
|
|
"data:",
|
2025-10-03 14:19:12 +03:00
|
|
|
|
"eval(",
|
2025-10-03 19:58:43 +03:00
|
|
|
|
// Common CMS paths
|
|
|
|
|
|
"/joomla",
|
|
|
|
|
|
"/drupal",
|
|
|
|
|
|
"/magento",
|
|
|
|
|
|
"/.well-known/security.txt",
|
2025-09-02 11:40:43 +03:00
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
let path_lower = path.to_lowercase();
|
|
|
|
|
|
for pattern in &suspicious_patterns {
|
|
|
|
|
|
if path_lower.contains(pattern) {
|
2025-10-03 14:19:12 +03:00
|
|
|
|
// Silent reject - no logging for scan attempts
|
2025-09-02 11:40:43 +03:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
/// Проверяет лимит загрузок для IP (только для upload endpoint)
|
|
|
|
|
|
pub async fn check_upload_limit(&self, ip: &str) -> Result<(), actix_web::Error> {
|
2025-09-02 11:40:43 +03:00
|
|
|
|
let current_time = SystemTime::now()
|
|
|
|
|
|
.duration_since(UNIX_EPOCH)
|
|
|
|
|
|
.unwrap()
|
|
|
|
|
|
.as_secs();
|
|
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
let mut counts = self.upload_protection.upload_counts.write().await;
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
// Очищаем старые записи (старше минуты)
|
|
|
|
|
|
counts.retain(|_, (_, timestamp)| current_time - *timestamp < 60);
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
// Проверяем текущий IP
|
|
|
|
|
|
let current_count = counts.get(ip).map(|(count, _)| *count).unwrap_or(0);
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
let first_upload_time = counts
|
|
|
|
|
|
.get(ip)
|
|
|
|
|
|
.map(|(_, time)| *time)
|
|
|
|
|
|
.unwrap_or(current_time);
|
|
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
if current_time - first_upload_time < 60 {
|
|
|
|
|
|
// В пределах минуты
|
|
|
|
|
|
if current_count >= self.upload_protection.max_uploads_per_minute {
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
warn!(
|
|
|
|
|
|
"Upload limit exceeded for IP {}: {} uploads in minute",
|
|
|
|
|
|
ip, current_count
|
|
|
|
|
|
);
|
|
|
|
|
|
return Err(actix_web::error::ErrorTooManyRequests(
|
|
|
|
|
|
"Upload limit exceeded",
|
|
|
|
|
|
));
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
2025-09-02 14:00:54 +03:00
|
|
|
|
counts.insert(ip.to_string(), (current_count + 1, first_upload_time));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Новая минута, сбрасываем счетчик
|
|
|
|
|
|
counts.insert(ip.to_string(), (1, current_time));
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
Ok(())
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
/// Извлекает IP адрес клиента
|
|
|
|
|
|
pub fn extract_client_ip(req: &HttpRequest) -> String {
|
|
|
|
|
|
// Проверяем X-Forwarded-For (для прокси)
|
|
|
|
|
|
if let Some(forwarded) = req.headers().get("x-forwarded-for") {
|
|
|
|
|
|
if let Ok(forwarded_str) = forwarded.to_str() {
|
|
|
|
|
|
if let Some(first_ip) = forwarded_str.split(',').next() {
|
|
|
|
|
|
return first_ip.trim().to_string();
|
|
|
|
|
|
}
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
// Проверяем X-Real-IP
|
|
|
|
|
|
if let Some(real_ip) = req.headers().get("x-real-ip") {
|
|
|
|
|
|
if let Ok(real_ip_str) = real_ip.to_str() {
|
|
|
|
|
|
return real_ip_str.to_string();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
|
2025-09-02 14:00:54 +03:00
|
|
|
|
// Fallback на connection info
|
[0.6.1] - 2025-09-02
### 🚀 Изменено - Упрощение архитектуры
- **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API
- **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность
- **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY
- **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры
- **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist
- **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций
- **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload
- **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками
- **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники
- **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки
- **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide
### 📝 Обновлено
- Консолидирована документация в практическую структуру:
- Основной 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
💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
2025-09-02 14:39:54 +03:00
|
|
|
|
req.connection_info()
|
|
|
|
|
|
.peer_addr()
|
|
|
|
|
|
.unwrap_or("unknown")
|
|
|
|
|
|
.to_string()
|
2025-09-02 11:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|