IP Check
This commit is contained in:
+19
-6
@@ -1,6 +1,6 @@
|
|||||||
use axum::{
|
use axum::{
|
||||||
body::Body,
|
body::Body,
|
||||||
extract::{Path, State},
|
extract::{ConnectInfo, Path, State},
|
||||||
http::{header, HeaderMap, StatusCode},
|
http::{header, HeaderMap, StatusCode},
|
||||||
middleware::{self, Next},
|
middleware::{self, Next},
|
||||||
response::{Html, IntoResponse, Response},
|
response::{Html, IntoResponse, Response},
|
||||||
@@ -293,6 +293,7 @@ async fn list_files(State(state): State<AppState>) -> Html<String> {
|
|||||||
|
|
||||||
async fn download_file(
|
async fn download_file(
|
||||||
State(state): State<AppState>,
|
State(state): State<AppState>,
|
||||||
|
ConnectInfo(addr): ConnectInfo<SocketAddr>,
|
||||||
Path(file_id): Path<String>,
|
Path(file_id): Path<String>,
|
||||||
headers: HeaderMap,
|
headers: HeaderMap,
|
||||||
) -> Result<Response, StatusCode> {
|
) -> Result<Response, StatusCode> {
|
||||||
@@ -329,12 +330,21 @@ async fn download_file(
|
|||||||
|
|
||||||
let file_size = metadata.len();
|
let file_size = metadata.len();
|
||||||
|
|
||||||
|
// Get client IP (trust X-Forwarded-For if behind proxy, else socket addr)
|
||||||
|
let client_ip = headers
|
||||||
|
.get("X-Forwarded-For")
|
||||||
|
.or_else(|| headers.get("X-Real-IP"))
|
||||||
|
.and_then(|v| v.to_str().ok())
|
||||||
|
.map(|s| s.split(',').next().unwrap_or(s).trim())
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
.unwrap_or_else(|| addr.ip().to_string());
|
||||||
|
|
||||||
// Check for Range header to support resume
|
// Check for Range header to support resume
|
||||||
let range_header = headers.get(header::RANGE);
|
let range_header = headers.get(header::RANGE);
|
||||||
|
|
||||||
if let Some(range) = range_header {
|
if let Some(range) = range_header {
|
||||||
// Handle range requests for resume support
|
// Handle range requests for resume support
|
||||||
return handle_range_request(&canonical_path, file_size, range, file_info).await;
|
return handle_range_request(&canonical_path, file_size, range, file_info, &client_ip).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open file for streaming
|
// Open file for streaming
|
||||||
@@ -363,10 +373,11 @@ async fn download_file(
|
|||||||
.unwrap_or("application/octet-stream");
|
.unwrap_or("application/octet-stream");
|
||||||
|
|
||||||
tracing::info!(
|
tracing::info!(
|
||||||
"File download started: {} ({}) - {} bytes",
|
"File download started: {} ({}) - {} bytes - IP: {}",
|
||||||
file_id,
|
file_id,
|
||||||
safe_filename,
|
safe_filename,
|
||||||
file_size
|
file_size,
|
||||||
|
client_ip
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(Response::builder()
|
Ok(Response::builder()
|
||||||
@@ -389,6 +400,7 @@ async fn handle_range_request(
|
|||||||
file_size: u64,
|
file_size: u64,
|
||||||
range_header: &header::HeaderValue,
|
range_header: &header::HeaderValue,
|
||||||
file_info: &MediaFile,
|
file_info: &MediaFile,
|
||||||
|
client_ip: &str,
|
||||||
) -> Result<Response, StatusCode> {
|
) -> Result<Response, StatusCode> {
|
||||||
let range_str = range_header.to_str().map_err(|_| StatusCode::BAD_REQUEST)?;
|
let range_str = range_header.to_str().map_err(|_| StatusCode::BAD_REQUEST)?;
|
||||||
|
|
||||||
@@ -449,12 +461,13 @@ async fn handle_range_request(
|
|||||||
.unwrap_or("application/octet-stream");
|
.unwrap_or("application/octet-stream");
|
||||||
|
|
||||||
tracing::info!(
|
tracing::info!(
|
||||||
"Range request: {} bytes {}-{}/{} ({})",
|
"Range request: {} bytes {}-{}/{} ({}) - IP: {}",
|
||||||
safe_filename,
|
safe_filename,
|
||||||
start,
|
start,
|
||||||
end,
|
end,
|
||||||
file_size,
|
file_size,
|
||||||
content_length
|
content_length,
|
||||||
|
client_ip
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(Response::builder()
|
Ok(Response::builder()
|
||||||
|
|||||||
Reference in New Issue
Block a user