aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorbibo38 <bibo38@users.noreply.github.com>2020-08-19 15:17:16 +0200
committerGitHub <noreply@github.com>2020-08-19 21:17:16 +0800
commit252d0fd9775e40b641e5edc6facb147741c3b217 (patch)
tree26e87a39a0ed4ba6a3bcadb2395f6cc5dc3751b0 /internal
parentd1caae3f79e137c3ca1d59dc827fcca519f5eede (diff)
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.
Diffstat (limited to 'internal')
2 files changed, 26 insertions, 2 deletions
diff --git a/internal/osutil/osutil.go b/internal/osutil/osutil.go
index b2205a46..4f871587 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 ca2c75bf..73a45836 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())
+}