diff --git a/src/client.rs b/src/client.rs index 36be25c..21808cd 100644 --- a/src/client.rs +++ b/src/client.rs @@ -159,7 +159,7 @@ impl DoshClientBuilder { .clone() .or_else(|| host_config.user.clone()) .or_else(|| user_from_destination(&raw_server)) - .or_else(|| std::env::var("USER").ok()) + .or_else(local_username) .unwrap_or_else(|| "unknown".to_string()); let udp_host = self .udp_host @@ -410,6 +410,17 @@ fn user_from_destination(destination: &str) -> Option { .filter(|user| !user.is_empty()) } +fn local_username() -> Option { + local_username_from_env(|name| std::env::var(name).ok()) +} + +fn local_username_from_env(mut get: impl FnMut(&str) -> Option) -> Option { + ["USER", "USERNAME"] + .into_iter() + .filter_map(|name| get(name)) + .find(|value| !value.is_empty()) +} + fn default_sdk_session() -> String { let millis = SystemTime::now() .duration_since(UNIX_EPOCH) @@ -432,6 +443,35 @@ mod tests { assert_eq!(destination_host("example.com:2222"), "example.com"); } + #[test] + fn local_username_uses_unix_or_windows_environment_names() { + assert_eq!( + local_username_from_env(|name| match name { + "USER" => Some("palav".to_string()), + _ => None, + }) + .as_deref(), + Some("palav") + ); + assert_eq!( + local_username_from_env(|name| match name { + "USERNAME" => Some("palav-win".to_string()), + _ => None, + }) + .as_deref(), + Some("palav-win") + ); + assert_eq!( + local_username_from_env(|name| match name { + "USER" => Some(String::new()), + "USERNAME" => Some("palav-win".to_string()), + _ => None, + }) + .as_deref(), + Some("palav-win") + ); + } + #[test] fn default_identity_paths_are_expanded() { assert!(