This commit is contained in:
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,5 +1,14 @@
|
|||||||
## [0.6.10] - 2025-10-04
|
## [0.6.10] - 2025-10-04
|
||||||
|
|
||||||
|
### 🧹 Code Quality: Clippy Fixes
|
||||||
|
- **✅ Подавлены collapsible_if warnings**: `#[allow(clippy::collapsible_if)]`
|
||||||
|
- `auth.rs`: extract_token_from_request (3 уровня вложенности)
|
||||||
|
- `handlers/common.rs`: is_vercel_request (2 функции)
|
||||||
|
- `security.rs`: header validation, extract_client_ip (3 функции)
|
||||||
|
- `thumbnail.rs`: cleanup_cache (1 цикл)
|
||||||
|
- Сохранена читаемость: явные guard clauses вместо let chains
|
||||||
|
- Let chains нестабильны в Rust 1.90 (требуется nightly)
|
||||||
|
|
||||||
### 🚀 CI/CD: Optimization (YAGNI + DRY)
|
### 🚀 CI/CD: Optimization (YAGNI + DRY)
|
||||||
- **🪓 Упрощён CI pipeline**: 265 строк → 56 строк (-80%)
|
- **🪓 Упрощён CI pipeline**: 265 строк → 56 строк (-80%)
|
||||||
- Удалены избыточные проверки (`continue-on-error`, условные блоки памяти)
|
- Удалены избыточные проверки (`continue-on-error`, условные блоки памяти)
|
||||||
@@ -11,7 +20,7 @@
|
|||||||
- Прямой `cargo test --all` вместо раздельных unit/integration
|
- Прямой `cargo test --all` вместо раздельных unit/integration
|
||||||
- Убраны проверки rustfmt/clippy availability (fail fast)
|
- Убраны проверки rustfmt/clippy availability (fail fast)
|
||||||
- Удалены get_repo_name/get_branch_name (не используются)
|
- Удалены get_repo_name/get_branch_name (не используются)
|
||||||
- **✅ Использование существующего Rust**: Не переустанавливаем, используем уже установленный
|
- **✅ Использование Rust**: Не переустанавливаем, используем уже установленный
|
||||||
- Быстрее: нет скачивания и установки toolchain
|
- Быстрее: нет скачивания и установки toolchain
|
||||||
- Решает cross-device link errors при обновлении
|
- Решает cross-device link errors при обновлении
|
||||||
- **✅ Исправлена загрузка SSH ключа**: `printf '%s'` без лишнего `\n`
|
- **✅ Исправлена загрузка SSH ключа**: `printf '%s'` без лишнего `\n`
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ fn decode_jwt_token(token: &str) -> Result<TokenClaims, Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Извлекает токен из HTTP запроса (поддерживает Bearer, X-Session-Token, Cookie)
|
/// Извлекает токен из HTTP запроса (поддерживает Bearer, X-Session-Token, Cookie)
|
||||||
|
#[allow(clippy::collapsible_if)]
|
||||||
pub fn extract_token_from_request(req: &actix_web::HttpRequest) -> Option<String> {
|
pub fn extract_token_from_request(req: &actix_web::HttpRequest) -> Option<String> {
|
||||||
// 1. Bearer токен в Authorization header
|
// 1. Bearer токен в Authorization header
|
||||||
if let Some(auth_header) = req.headers().get("authorization") {
|
if let Some(auth_header) = req.headers().get("authorization") {
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ pub fn create_file_response_with_analytics(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Проверяет, является ли запрос от Vercel Edge API
|
/// Проверяет, является ли запрос от Vercel Edge API
|
||||||
|
#[allow(clippy::collapsible_if)]
|
||||||
pub fn is_vercel_request(req: &HttpRequest) -> bool {
|
pub fn is_vercel_request(req: &HttpRequest) -> bool {
|
||||||
// Проверяем User-Agent на Vercel
|
// Проверяем User-Agent на Vercel
|
||||||
if let Some(user_agent) = req.headers().get("user-agent") {
|
if let Some(user_agent) = req.headers().get("user-agent") {
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ impl SecurityConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Проверка длины значений заголовков
|
// Проверка длины значений заголовков
|
||||||
|
#[allow(clippy::collapsible_if)]
|
||||||
for (name, value) in req.headers() {
|
for (name, value) in req.headers() {
|
||||||
if let Ok(value_str) = value.to_str() {
|
if let Ok(value_str) = value.to_str() {
|
||||||
if value_str.len() > self.max_header_value_length {
|
if value_str.len() > self.max_header_value_length {
|
||||||
@@ -187,6 +188,7 @@ impl SecurityConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Извлекает IP адрес клиента
|
/// Извлекает IP адрес клиента
|
||||||
|
#[allow(clippy::collapsible_if)]
|
||||||
pub fn extract_client_ip(req: &HttpRequest) -> String {
|
pub fn extract_client_ip(req: &HttpRequest) -> String {
|
||||||
// Проверяем X-Forwarded-For (для прокси)
|
// Проверяем X-Forwarded-For (для прокси)
|
||||||
if let Some(forwarded) = req.headers().get("x-forwarded-for") {
|
if let Some(forwarded) = req.headers().get("x-forwarded-for") {
|
||||||
|
|||||||
@@ -313,6 +313,7 @@ pub fn cleanup_cache(cache_dir: &str, max_age_days: u64) -> Result<(), Box<dyn s
|
|||||||
let cutoff_time =
|
let cutoff_time =
|
||||||
std::time::SystemTime::now() - std::time::Duration::from_secs(max_age_days * 24 * 60 * 60);
|
std::time::SystemTime::now() - std::time::Duration::from_secs(max_age_days * 24 * 60 * 60);
|
||||||
|
|
||||||
|
#[allow(clippy::collapsible_if)]
|
||||||
for entry in fs::read_dir(cache_path)? {
|
for entry in fs::read_dir(cache_path)? {
|
||||||
let entry = entry?;
|
let entry = entry?;
|
||||||
let metadata = entry.metadata()?;
|
let metadata = entry.metadata()?;
|
||||||
|
|||||||
Reference in New Issue
Block a user