Refactor user ID filtering in WebSocket server: Enhanced the logic to only filter messages based on user_id if the target user ID is numerically valid. Updated comments for clarity on the filtering behavior and historical context regarding user ID handling.

This commit is contained in:
Torsten Schulz (local)
2025-12-01 13:31:12 +01:00
parent b8fa644c97
commit 02bd0de75d

View File

@@ -489,30 +489,37 @@ async fn handle_connection<S>(
Err(_) => break,
};
// Filter nach user_id, falls gesetzt
// Filter nach user_id, falls gesetzt und numerisch interpretierbar.
// Historisch wurde hier der Falukant-User (numerisch) verwendet.
// Wenn die gesetzte User-ID kein Integer ist (z.B. Benutzername),
// wird *nicht* gefiltert und alle Nachrichten durchgelassen
// das Frontend muss dann selbst selektieren.
let target_user = {
let guard = user_id_for_broker.lock().await;
guard.clone()
};
if let Some(uid) = target_user.clone() {
if let Ok(json) = serde_json::from_str::<Json>(&msg) {
let matches_user = json
.get("user_id")
.and_then(|v| {
if let Some(s) = v.as_str() {
Some(s.to_string())
} else if let Some(n) = v.as_i64() {
Some(n.to_string())
} else {
None
}
})
.map(|v| v == uid)
.unwrap_or(false);
// Nur filtern, wenn uid numerisch ist
if uid.parse::<i64>().is_ok() {
if let Ok(json) = serde_json::from_str::<Json>(&msg) {
let matches_user = json
.get("user_id")
.and_then(|v| {
if let Some(s) = v.as_str() {
s.parse::<i64>().ok()
} else if let Some(n) = v.as_i64() {
Some(n)
} else {
None
}
})
.map(|v| v.to_string() == uid)
.unwrap_or(false);
if !matches_user {
continue;
if !matches_user {
continue;
}
}
}
}