From 252d0fd9775e40b641e5edc6facb147741c3b217 Mon Sep 17 00:00:00 2001 From: bibo38 Date: Wed, 19 Aug 2020 15:17:16 +0200 Subject: [PATCH] osutil: use system API to get the username when env vars are empty (#6246) As Golang supports getting usernames via the standard library, this function is now used to get the username if the environment variables are empty. Using the standard library as a fallback is intended to keep compability to existing implementations that rely on the environment variables dictating the current username. --- internal/osutil/osutil.go | 13 +++++++++++-- internal/osutil/osutil_test.go | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/internal/osutil/osutil.go b/internal/osutil/osutil.go index b2205a46b..4f8715870 100644 --- a/internal/osutil/osutil.go +++ b/internal/osutil/osutil.go @@ -6,6 +6,7 @@ package osutil import ( "os" + "os/user" ) // IsFile returns true if given path exists as a file (i.e. not a directory). @@ -33,12 +34,20 @@ func IsExist(path string) bool { return err == nil || os.IsExist(err) } -// CurrentUsername returns the current system user via environment variables. +// CurrentUsername returns the current system user func CurrentUsername() string { username := os.Getenv("USER") if len(username) > 0 { return username } - return os.Getenv("USERNAME") + username = os.Getenv("USERNAME") + if len(username) > 0 { + return username + } + + if user, err := user.Current(); err == nil { + username = user.Username + } + return username } diff --git a/internal/osutil/osutil_test.go b/internal/osutil/osutil_test.go index ca2c75bf3..73a45836e 100644 --- a/internal/osutil/osutil_test.go +++ b/internal/osutil/osutil_test.go @@ -5,6 +5,7 @@ package osutil import ( + "os" "testing" "github.com/stretchr/testify/assert" @@ -83,3 +84,17 @@ func TestCurrentUsername(t *testing.T) { // Make sure it does not blow up CurrentUsername() } + +func TestCurrentUsernamePrefersEnvironmentVariable(t *testing.T) { + // Some users/scripts expect that they can change the current username via environment variables + if userBak, ok := os.LookupEnv("USER"); ok { + defer os.Setenv("USER", userBak) + } else { + defer os.Unsetenv("USER") + } + + if err := os.Setenv("USER", "__TESTING::USERNAME"); err != nil { + t.Skip("Could not set the USER environment variable:", err) + } + assert.Equal(t, "__TESTING::USERNAME", CurrentUsername()) +}