Implement user gender handling and enhance gender-based access validation

Added functionality to load user gender from user parameters, improving the accuracy of gender-based access control. Introduced a new `normalize_gender_value` function to standardize gender inputs and updated the `room_access_allowed` function to utilize configured gender IDs for logging and validation. Enhanced debug logging to include configured gender IDs for better troubleshooting. This update ensures more robust handling of user gender in the application.
This commit is contained in:
Torsten Schulz (local)
2026-03-04 23:54:49 +01:00
parent a09926f48a
commit 37767e59a0
2 changed files with 120 additions and 6 deletions

View File

@@ -1192,14 +1192,17 @@ async fn room_access_allowed(
if let Some(required_gender) = room.gender_restriction_id {
if required_gender > 0 && user_gender_id != Some(required_gender) {
if room_debug_enabled() {
let (male_id, female_id) = configured_gender_ids();
eprintln!(
"[yourchat2][room-debug][access] denied=room_gender_restricted room='{}' required_gender_id={} required_gender='{}' user_gender_id={:?} user_gender='{}' user_falukant_id={:?}",
"[yourchat2][room-debug][access] denied=room_gender_restricted room='{}' required_gender_id={} required_gender='{}' user_gender_id={:?} user_gender='{}' user_falukant_id={:?} configured_gender_ids={{male:{},female:{}}}",
room.name,
required_gender,
gender_label_from_id(Some(required_gender)),
user_gender_id,
gender_label_from_id(user_gender_id),
falukant_user_id
falukant_user_id,
male_id,
female_id
);
}
return Err("room_gender_restricted");
@@ -1639,9 +1642,10 @@ fn value_as_string(value: &Value) -> Option<String> {
}
fn parse_gender_mf(value: &str) -> Option<Option<i32>> {
let (male_id, female_id) = configured_gender_ids();
match value.trim().to_lowercase().as_str() {
"m" | "male" => Some(Some(1)),
"f" | "female" => Some(Some(2)),
"m" | "male" => Some(Some(male_id)),
"f" | "female" => Some(Some(female_id)),
"any" | "none" | "-" => Some(None),
_ => None,
}
@@ -1662,14 +1666,29 @@ fn room_debug_enabled() -> bool {
}
fn gender_label_from_id(gender_id: Option<i32>) -> &'static str {
let (male_id, female_id) = configured_gender_ids();
match gender_id {
Some(1) => "m",
Some(2) => "f",
Some(v) if v == male_id => "m",
Some(v) if v == female_id => "f",
Some(_) => "unknown",
None => "none",
}
}
fn configured_gender_ids() -> (i32, i32) {
let male_id = env::var("CHAT_GENDER_MALE_ID")
.ok()
.and_then(|v| v.trim().parse::<i32>().ok())
.filter(|v| *v > 0)
.unwrap_or(1);
let female_id = env::var("CHAT_GENDER_FEMALE_ID")
.ok()
.and_then(|v| v.trim().parse::<i32>().ok())
.filter(|v| *v > 0)
.unwrap_or(2);
(male_id, female_id)
}
fn command_from_chat_line(message: &str, token: Option<String>) -> Option<Command> {
let trimmed = message.trim();
if !trimmed.starts_with('/') {