Compare commits

..

3 Commits

Author SHA1 Message Date
spinline
13424fceeb Demote 'Torrent status changed' log from INFO to DEBUG to reduce console noise
All checks were successful
Build MIPS Binary / build (push) Successful in 4m6s
2026-02-07 15:33:16 +03:00
spinline
e3eb5fbca9 Add detailed logging to login handler and use full page reload for auth navigation
All checks were successful
Build MIPS Binary / build (push) Successful in 4m7s
2026-02-07 15:28:44 +03:00
spinline
08f2f540fe Fix unused import and dead code warnings
All checks were successful
Build MIPS Binary / build (push) Successful in 4m6s
2026-02-07 15:20:23 +03:00
4 changed files with 36 additions and 15 deletions

View File

@@ -85,7 +85,7 @@ pub fn diff_torrents(old: &[Torrent], new: &[Torrent]) -> DiffResult {
has_changes = true; has_changes = true;
// Log status changes for debugging // Log status changes for debugging
tracing::info!( tracing::debug!(
"Torrent status changed: {} ({}) {:?} -> {:?}", "Torrent status changed: {} ({}) {:?} -> {:?}",
new_t.name, new_t.hash, old_t.status, new_t.status new_t.name, new_t.hash, old_t.status, new_t.status
); );

View File

@@ -1,4 +1,4 @@
use crate::{db::Db, AppState}; use crate::AppState;
use axum::{ use axum::{
extract::{State, Json}, extract::{State, Json},
http::StatusCode, http::StatusCode,
@@ -15,6 +15,7 @@ pub struct LoginRequest {
password: String, password: String,
} }
#[allow(dead_code)]
#[derive(Serialize, ToSchema)] #[derive(Serialize, ToSchema)]
pub struct UserResponse { pub struct UserResponse {
username: String, username: String,
@@ -35,11 +36,16 @@ pub async fn login_handler(
jar: CookieJar, jar: CookieJar,
Json(payload): Json<LoginRequest>, Json(payload): Json<LoginRequest>,
) -> impl IntoResponse { ) -> impl IntoResponse {
tracing::info!("Login attempt for user: {}", payload.username);
let user = match state.db.get_user_by_username(&payload.username).await { let user = match state.db.get_user_by_username(&payload.username).await {
Ok(Some(u)) => u, Ok(Some(u)) => u,
Ok(None) => return (StatusCode::UNAUTHORIZED, "Invalid credentials").into_response(), Ok(None) => {
tracing::warn!("Login failed: User not found for {}", payload.username);
return (StatusCode::UNAUTHORIZED, "Invalid credentials").into_response();
}
Err(e) => { Err(e) => {
tracing::error!("DB error during login: {}", e); tracing::error!("DB error during login for {}: {}", payload.username, e);
return (StatusCode::INTERNAL_SERVER_ERROR, "Database error").into_response(); return (StatusCode::INTERNAL_SERVER_ERROR, "Database error").into_response();
} }
}; };
@@ -48,6 +54,8 @@ pub async fn login_handler(
match bcrypt::verify(&payload.password, &password_hash) { match bcrypt::verify(&payload.password, &password_hash) {
Ok(true) => { Ok(true) => {
tracing::info!("Password verified for user: {}", payload.username);
// Create session // Create session
let token: String = (0..32).map(|_| { let token: String = (0..32).map(|_| {
use rand::{distributions::Alphanumeric, Rng}; use rand::{distributions::Alphanumeric, Rng};
@@ -59,7 +67,7 @@ pub async fn login_handler(
let expires_at = time::OffsetDateTime::now_utc().unix_timestamp() + expires_in; let expires_at = time::OffsetDateTime::now_utc().unix_timestamp() + expires_in;
if let Err(e) = state.db.create_session(user_id, &token, expires_at).await { if let Err(e) = state.db.create_session(user_id, &token, expires_at).await {
tracing::error!("Failed to create session: {}", e); tracing::error!("Failed to create session for {}: {}", payload.username, e);
return (StatusCode::INTERNAL_SERVER_ERROR, "Failed to create session").into_response(); return (StatusCode::INTERNAL_SERVER_ERROR, "Failed to create session").into_response();
} }
@@ -70,9 +78,17 @@ pub async fn login_handler(
.max_age(Duration::seconds(expires_in)) .max_age(Duration::seconds(expires_in))
.build(); .build();
tracing::info!("Session created and cookie set for user: {}", payload.username);
(StatusCode::OK, jar.add(cookie), "Login successful").into_response() (StatusCode::OK, jar.add(cookie), "Login successful").into_response()
} }
_ => (StatusCode::UNAUTHORIZED, "Invalid credentials").into_response(), Ok(false) => {
tracing::warn!("Login failed: Invalid password for {}", payload.username);
(StatusCode::UNAUTHORIZED, "Invalid credentials").into_response()
}
Err(e) => {
tracing::error!("Bcrypt error for {}: {}", payload.username, e);
(StatusCode::INTERNAL_SERVER_ERROR, "Auth error").into_response()
}
} }
} }

View File

@@ -1,6 +1,6 @@
use leptos::*; use leptos::*;
use leptos_router::*; use leptos_router::*;
use serde::{Deserialize, Serialize}; use serde::Serialize;
#[derive(Serialize)] #[derive(Serialize)]
struct LoginRequest { struct LoginRequest {
@@ -20,6 +20,8 @@ pub fn Login() -> impl IntoView {
set_loading.set(true); set_loading.set(true);
set_error.set(None); set_error.set(None);
logging::log!("Attempting login for user: {}", username.get());
spawn_local(async move { spawn_local(async move {
let req = LoginRequest { let req = LoginRequest {
username: username.get(), username: username.get(),
@@ -32,15 +34,19 @@ pub fn Login() -> impl IntoView {
match client.send().await { match client.send().await {
Ok(resp) => { Ok(resp) => {
logging::log!("Login response status: {}", resp.status());
if resp.ok() { if resp.ok() {
// Redirect to home on success logging::log!("Login successful, redirecting...");
let navigate = use_navigate(); // Force a full reload to re-run auth checks in App.rs
navigate("/", Default::default()); let _ = window().location().set_href("/");
} else { } else {
let text = resp.text().await.unwrap_or_default();
logging::error!("Login failed: {}", text);
set_error.set(Some("Kullanıcı adı veya şifre hatalı".to_string())); set_error.set(Some("Kullanıcı adı veya şifre hatalı".to_string()));
} }
} }
Err(_) => { Err(e) => {
logging::error!("Network error: {}", e);
set_error.set(Some("Bağlantı hatası".to_string())); set_error.set(Some("Bağlantı hatası".to_string()));
} }
} }

View File

@@ -1,6 +1,6 @@
use leptos::*; use leptos::*;
use leptos_router::*; use leptos_router::*;
use serde::{Deserialize, Serialize}; use serde::Serialize;
#[derive(Serialize)] #[derive(Serialize)]
struct SetupRequest { struct SetupRequest {
@@ -49,9 +49,8 @@ pub fn Setup() -> impl IntoView {
match client.send().await { match client.send().await {
Ok(resp) => { Ok(resp) => {
if resp.ok() { if resp.ok() {
// Redirect to login after setup // Redirect to login after setup (full reload to be safe)
let navigate = use_navigate(); let _ = window().location().set_href("/login");
navigate("/login", Default::default());
} else { } else {
let text = resp.text().await.unwrap_or_default(); let text = resp.text().await.unwrap_or_default();
set_error.set(Some(format!("Hata: {}", text))); set_error.set(Some(format!("Hata: {}", text)));