diff options
author | Mick Hohmann <gh@m69.im.net> | 2024-03-20 22:47:32 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-20 22:47:32 +0100 |
commit | b8a812b93207da992ff8ae9f8b955bfa1252072b (patch) | |
tree | b68f0a8251be571c173eb2f6fd8f8ea9d672927b /src/modules | |
parent | aef1a3f275e7ec9095c4718ecf6a268abfe7794a (diff) |
feat(username): add detect_env_vars as option (#5833)
* Added the option "detect_env_vars" to the `username` module
with the same functionality as in the `hostname` module.
* Fixed logic error and added test to catch it
* build(deps): update dependency vitepress to ^1.0.0-rc.45
* build(deps): update rust crate shadow-rs to 0.27.1
* Added the option "detect_env_vars" to the `username` module
with the same functionality as in the `hostname` module.
* Fixed logic error and added test to catch it
* Removed unused gix import
* Removed unused gix import, again
* Removed unused gix import. Next try
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/username.rs | 88 |
1 files changed, 85 insertions, 3 deletions
diff --git a/src/modules/username.rs b/src/modules/username.rs index af3fa6e56..038bbd757 100644 --- a/src/modules/username.rs +++ b/src/modules/username.rs @@ -15,23 +15,29 @@ const USERNAME_ENV_VAR: &str = "USERNAME"; /// - The current user is root (UID = 0) [1] /// - The current user isn't the same as the one that is logged in (`$LOGNAME` != `$USER`) [2] /// - The user is currently connected as an SSH session (`$SSH_CONNECTION`) [3] +/// - The option `username.detect_env_vars` is set with a not negated environment variable [4] +/// Does not display the username: +/// - If the option `username.detect_env_vars` is set with a negated environment variable [A] pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { let mut username = context.get_env(USERNAME_ENV_VAR)?; let mut module = context.new_module("username"); let config: UsernameConfig = UsernameConfig::try_load(module.config); + let has_detected_env_var = context.detect_env_vars(&config.detect_env_vars); let is_root = is_root_user(); if cfg!(target_os = "windows") && is_root { username = "Administrator".to_string(); } + let show_username = config.show_always || is_root // [1] || !is_login_user(context, &username) // [2] - || is_ssh_session(context); // [3] + || is_ssh_session(context) // [3] + || ( !config.detect_env_vars.is_empty() && has_detected_env_var ); // [4] - if !show_username { - return None; + if !show_username || !has_detected_env_var { + return None; // [A] } let parsed = StringFormatter::new(config.format).and_then(|formatter| { @@ -109,12 +115,70 @@ fn is_ssh_session(context: &Context) -> bool { #[cfg(test)] mod tests { + use gix::config::key; + use crate::test::ModuleRenderer; // TODO: Add tests for if root user (UID == 0) // Requires mocking #[test] + fn ssh_with_empty_detect_env_vars() { + let actual = ModuleRenderer::new("username") + .env(super::USERNAME_ENV_VAR, "astronaut") + .env("SSH_CONNECTION", "192.168.223.17 36673 192.168.223.229 22") + // Test output should not change when run by root/non-root user + .config(toml::toml! { + [username] + style_root = "" + style_user = "" + detect_env_vars = [] + }) + .collect(); + + let expected = Some("astronaut in "); + assert_eq!(expected, actual.as_deref()); + } + + #[test] + fn ssh_with_matching_detect_env_vars() { + let actual = ModuleRenderer::new("username") + .env(super::USERNAME_ENV_VAR, "astronaut") + .env("SSH_CONNECTION", "192.168.223.17 36673 192.168.223.229 22") + .env("FORCE_USERNAME", "true") + // Test output should not change when run by root/non-root user + .config(toml::toml! { + [username] + style_root = "" + style_user = "" + detect_env_vars = ["FORCE_USERNAME"] + }) + .collect(); + + let expected = Some("astronaut in "); + assert_eq!(expected, actual.as_deref()); + } + + #[test] + fn ssh_with_matching_negated_detect_env_vars() { + let actual = ModuleRenderer::new("username") + .env(super::USERNAME_ENV_VAR, "astronaut") + .env("SSH_CONNECTION", "192.168.223.17 36673 192.168.223.229 22") + .env("NEGATED", "true") + // Test output should not change when run by root/non-root user + .config(toml::toml! { + [username] + style_root = "" + style_user = "" + detect_env_vars = ["!NEGATED"] + }) + .collect(); + + let expected = None; + assert_eq!(expected, actual.as_deref()); + } + + #[test] fn no_env_variables() { let actual = ModuleRenderer::new("username").collect(); let expected = None; @@ -241,4 +305,22 @@ mod tests { assert_eq!(expected, actual.as_deref()); } + + #[test] + fn show_always_false() { + let actual = ModuleRenderer::new("username") + .env(super::USERNAME_ENV_VAR, "astronaut") + // Test output should not change when run by root/non-root user + .config(toml::toml! { + [username] + show_always = false + + style_root = "" + style_user = "" + }) + .collect(); + let expected = None; + + assert_eq!(expected, actual.as_deref()); + } } |