Enhance room access validation with detailed debug logging

Added comprehensive debug logging for room access checks in the `room_access_allowed` function, providing insights into access denial reasons such as missing owner IDs, gender restrictions, and password requirements. This enhancement improves troubleshooting capabilities when debugging is enabled, ensuring clearer feedback on access control decisions.
This commit is contained in:
Torsten Schulz (local)
2026-03-04 23:47:02 +01:00
parent 4cf5f2f713
commit a09926f48a

View File

@@ -1177,6 +1177,9 @@ async fn room_access_allowed(
config: &ServerConfig, config: &ServerConfig,
) -> Result<(), &'static str> { ) -> Result<(), &'static str> {
let Some(room) = room_meta else { let Some(room) = room_meta else {
if room_debug_enabled() {
eprintln!("[yourchat2][room-debug][access] denied=room_not_found");
}
return Err("room_not_found"); return Err("room_not_found");
}; };
let is_admin = user_rights.contains("admin"); let is_admin = user_rights.contains("admin");
@@ -1188,19 +1191,48 @@ async fn room_access_allowed(
if let Some(required_gender) = room.gender_restriction_id { if let Some(required_gender) = room.gender_restriction_id {
if required_gender > 0 && user_gender_id != Some(required_gender) { if required_gender > 0 && user_gender_id != Some(required_gender) {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_gender_restricted room='{}' required_gender_id={} required_gender='{}' user_gender_id={:?} user_gender='{}' user_falukant_id={:?}",
room.name,
required_gender,
gender_label_from_id(Some(required_gender)),
user_gender_id,
gender_label_from_id(user_gender_id),
falukant_user_id
);
}
return Err("room_gender_restricted"); return Err("room_gender_restricted");
} }
} }
if !room.is_public { if !room.is_public {
let Some(owner_id) = room.owner_id else { let Some(owner_id) = room.owner_id else {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_private room='{}' reason='missing_owner_id'",
room.name
);
}
return Err("room_private"); return Err("room_private");
}; };
let Some(fid) = falukant_user_id else { let Some(fid) = falukant_user_id else {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_private room='{}' owner_id={} reason='missing_user_id'",
room.name, owner_id
);
}
return Err("room_private"); return Err("room_private");
}; };
let is_owner = db::user_is_room_owner(config, owner_id, fid).await; let is_owner = db::user_is_room_owner(config, owner_id, fid).await;
if !is_owner && !is_admin && !has_required_right { if !is_owner && !is_admin && !has_required_right {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_private room='{}' owner_id={} user_falukant_id={} is_owner={} is_admin={} has_required_right={}",
room.name, owner_id, fid, is_owner, is_admin, has_required_right
);
}
return Err("room_private"); return Err("room_private");
} }
} }
@@ -1208,9 +1240,22 @@ async fn room_access_allowed(
if let Some(room_password) = &room.password { if let Some(room_password) = &room.password {
if !room_password.is_empty() { if !room_password.is_empty() {
if provided_password.trim().is_empty() { if provided_password.trim().is_empty() {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_password_required room='{}' provided_password_len=0",
room.name
);
}
return Err("room_password_required"); return Err("room_password_required");
} }
if !password_matches(room_password, provided_password) { if !password_matches(room_password, provided_password) {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_password_invalid room='{}' provided_password_len={}",
room.name,
provided_password.len()
);
}
return Err("room_password_invalid"); return Err("room_password_invalid");
} }
} }
@@ -1219,15 +1264,39 @@ async fn room_access_allowed(
if let Some(min_age) = room.min_age { if let Some(min_age) = room.min_age {
if min_age > 0 { if min_age > 0 {
let Some(fid) = falukant_user_id else { let Some(fid) = falukant_user_id else {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_age_data_missing room='{}' min_age={} reason='missing_user_id'",
room.name, min_age
);
}
return Err("room_age_data_missing"); return Err("room_age_data_missing");
}; };
if fid <= 0 { if fid <= 0 {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_age_data_missing room='{}' min_age={} user_falukant_id={}",
room.name, min_age, fid
);
}
return Err("room_age_data_missing"); return Err("room_age_data_missing");
} }
let Some(user_age) = age else { let Some(user_age) = age else {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_age_data_missing room='{}' min_age={} user_falukant_id={} reason='missing_user_age'",
room.name, min_age, fid
);
}
return Err("room_age_data_missing"); return Err("room_age_data_missing");
}; };
if user_age < min_age { if user_age < min_age {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_min_age_not_met room='{}' min_age={} user_age={}",
room.name, min_age, user_age
);
}
return Err("room_min_age_not_met"); return Err("room_min_age_not_met");
} }
} }
@@ -1235,26 +1304,62 @@ async fn room_access_allowed(
if let Some(max_age) = room.max_age { if let Some(max_age) = room.max_age {
if max_age > 0 { if max_age > 0 {
let Some(user_age) = age else { let Some(user_age) = age else {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_age_data_missing room='{}' max_age={} reason='missing_user_age'",
room.name, max_age
);
}
return Err("room_age_data_missing"); return Err("room_age_data_missing");
}; };
if user_age > max_age { if user_age > max_age {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_max_age_exceeded room='{}' max_age={} user_age={}",
room.name, max_age, user_age
);
}
return Err("room_max_age_exceeded"); return Err("room_max_age_exceeded");
} }
} }
} }
if let Some(required_right) = room.required_user_right_id { if let Some(required_right) = room.required_user_right_id {
if required_right > 0 && !user_right_type_ids.contains(&required_right) { if required_right > 0 && !user_right_type_ids.contains(&required_right) {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_required_right_missing room='{}' required_right_id={} user_right_ids={:?}",
room.name, required_right, user_right_type_ids
);
}
return Err("room_required_right_missing"); return Err("room_required_right_missing");
} }
} }
if room.friends_of_owner_only { if room.friends_of_owner_only {
let Some(owner_id) = room.owner_id else { let Some(owner_id) = room.owner_id else {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_friends_only room='{}' reason='missing_owner_id'",
room.name
);
}
return Err("room_friends_only"); return Err("room_friends_only");
}; };
let Some(fid) = falukant_user_id else { let Some(fid) = falukant_user_id else {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_friends_only room='{}' owner_id={} reason='missing_user_id'",
room.name, owner_id
);
}
return Err("room_friends_only"); return Err("room_friends_only");
}; };
if !db::is_friend_of_room_owner(config, owner_id, fid).await && !is_admin { if !db::is_friend_of_room_owner(config, owner_id, fid).await && !is_admin {
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][access] denied=room_friends_only room='{}' owner_id={} user_falukant_id={} is_admin={}",
room.name, owner_id, fid, is_admin
);
}
return Err("room_friends_only"); return Err("room_friends_only");
} }
} }
@@ -1556,6 +1661,15 @@ fn room_debug_enabled() -> bool {
) )
} }
fn gender_label_from_id(gender_id: Option<i32>) -> &'static str {
match gender_id {
Some(1) => "m",
Some(2) => "f",
Some(_) => "unknown",
None => "none",
}
}
fn command_from_chat_line(message: &str, token: Option<String>) -> Option<Command> { fn command_from_chat_line(message: &str, token: Option<String>) -> Option<Command> {
let trimmed = message.trim(); let trimmed = message.trim();
if !trimmed.starts_with('/') { if !trimmed.starts_with('/') {