]> source.dussan.org Git - gitea.git/commitdiff
Use native go method to get current user rather than environment variable (#4930)
authorSagePtr <sageptr@gmail.com>
Thu, 18 Oct 2018 07:08:20 +0000 (09:08 +0200)
committerLunny Xiao <xiaolunwen@gmail.com>
Thu, 18 Oct 2018 07:08:20 +0000 (15:08 +0800)
* Use native go method to get current user rather than environment var

* Use t.Skip instead of return in test

modules/user/user.go
modules/user/user_test.go

index b9911e6f525631a1cabbba086a3f4029714f26cd..af49d7b06a4b9eb39bc4ffd56b9188df352a00c1 100644 (file)
@@ -4,10 +4,29 @@
 
 package user
 
-import "os"
+import (
+       "os"
+       "os/user"
+       "runtime"
+       "strings"
+)
 
 // CurrentUsername return current login OS user name
 func CurrentUsername() string {
+       userinfo, err := user.Current()
+       if err != nil {
+               return fallbackCurrentUsername()
+       }
+       username := userinfo.Username
+       if runtime.GOOS == "windows" {
+               parts := strings.Split(username, "\\")
+               username = parts[len(parts)-1]
+       }
+       return username
+}
+
+// Old method, used if new method doesn't work on your OS for some reason
+func fallbackCurrentUsername() string {
        curUserName := os.Getenv("USER")
        if len(curUserName) > 0 {
                return curUserName
index d7df15153166ae2416899aaddb5cccd0d3049697..51f10dbbd23edaa91e898bfb0a809841012b0219 100644 (file)
@@ -2,21 +2,40 @@ package user
 
 import (
        "os"
+       "os/exec"
+       "runtime"
+       "strings"
        "testing"
 )
 
-func TestCurrentUsername(t *testing.T) {
-       os.Setenv("USER", "")
-       os.Setenv("USERNAME", "foobar")
+func getWhoamiOutput() (string, error) {
+       output, err := exec.Command("whoami").Output()
+       if err != nil {
+               return "", err
+       }
+       return strings.TrimSpace(string(output[:])), nil
+}
 
+func TestCurrentUsername(t *testing.T) {
        user := CurrentUsername()
-       if user != "foobar" {
-               t.Errorf("expected foobar as user, got: %s", user)
+       if len(user) <= 0 {
+               t.Errorf("expected non-empty user, got: %s", user)
        }
-
-       os.Setenv("USER", "gitea")
+       // Windows whoami is weird, so just skip remaining tests
+       if runtime.GOOS == "windows" {
+               t.Skip("skipped test because of weird whoami on Windows")
+       }
+       whoami, err := getWhoamiOutput()
+       if err != nil {
+               t.Errorf("failed to run whoami to test current user: %f", err)
+       }
+       user = CurrentUsername()
+       if user != whoami {
+               t.Errorf("expected %s as user, got: %s", whoami, user)
+       }
+       os.Setenv("USER", "spoofed")
        user = CurrentUsername()
-       if user != "gitea" {
-               t.Errorf("expected gitea as user, got: %s", user)
+       if user != whoami {
+               t.Errorf("expected %s as user, got: %s", whoami, user)
        }
 }