diff --git a/powerline.go b/powerline.go index 3a2b367b..d7ac703c 100644 --- a/powerline.go +++ b/powerline.go @@ -32,6 +32,7 @@ type powerline struct { args args cwd string userInfo user.User + userIsAdmin bool hostname string username string pathAliases map[string]string @@ -76,6 +77,7 @@ func newPowerline(args args, cwd string, priorities map[string]int, align alignm p.username = usernameWithAd[1] } } + p.userIsAdmin = userIsAdmin() p.theme = themes[*args.Theme] p.shellInfo = shellInfos[*args.Shell] diff --git a/segment-username.go b/segment-username.go index 176dbb68..ca1f5e20 100644 --- a/segment-username.go +++ b/segment-username.go @@ -2,7 +2,6 @@ package main import ( pwl "github.com/justjanne/powerline-go/powerline" - "os" ) func segmentUser(p *powerline) []pwl.Segment { @@ -16,7 +15,7 @@ func segmentUser(p *powerline) []pwl.Segment { } var background uint8 - if os.Getuid() == 0 { + if p.userIsAdmin { background = p.theme.UsernameRootBg } else { background = p.theme.UsernameBg diff --git a/user-is-admin.go b/user-is-admin.go new file mode 100644 index 00000000..4e5520e6 --- /dev/null +++ b/user-is-admin.go @@ -0,0 +1,11 @@ +// +build !windows + +package main + +import ( + "os" +) + +func userIsAdmin() bool { + return os.Getuid() == 0 +} diff --git a/user-is-admin_windows.go b/user-is-admin_windows.go new file mode 100644 index 00000000..6a131356 --- /dev/null +++ b/user-is-admin_windows.go @@ -0,0 +1,33 @@ +// +build windows + +package main + +import ( + "golang.org/x/sys/windows" +) + +func userIsAdmin() bool { + var sid *windows.SID + + err := windows.AllocateAndInitializeSid( + &windows.SECURITY_NT_AUTHORITY, + 2, + windows.SECURITY_BUILTIN_DOMAIN_RID, + windows.DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &sid, + ) + if err != nil { + return false + } + defer windows.FreeSid(sid) + + t := windows.Token(0) + + member, err := t.IsMember(sid) + if err != nil { + return false + } + + return member +}