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:
@@ -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('/') {
|
||||
|
||||
Reference in New Issue
Block a user