|
@@ -9,6 +9,9 @@ import (
|
|
|
"os/user"
|
|
|
"runtime"
|
|
|
"strings"
|
|
|
+ "syscall"
|
|
|
+
|
|
|
+ "golang.org/x/sys/windows"
|
|
|
)
|
|
|
|
|
|
func TryLoadorAskUserForAuthkey() string {
|
|
@@ -32,7 +35,7 @@ func TryLoadorAskUserForAuthkey() string {
|
|
|
} else if runtime.GOOS == "linux" {
|
|
|
if isRoot() {
|
|
|
//Try to read from source using sudo
|
|
|
- ak, err := readAuthToken()
|
|
|
+ ak, err := readAuthTokenAsRoot()
|
|
|
if err == nil {
|
|
|
log.Println("Zerotier authkey loaded")
|
|
|
authKey = strings.TrimSpace(ak)
|
|
@@ -73,15 +76,18 @@ func TryLoadorAskUserForAuthkey() string {
|
|
|
return ""
|
|
|
}
|
|
|
|
|
|
-func readAuthToken() (string, error) {
|
|
|
+//Use sudo to read auth token on linux like systems
|
|
|
+func readAuthTokenAsRoot() (string, error) {
|
|
|
cmd := exec.Command("sudo", "cat", "/var/lib/zerotier-one/authtoken.secret")
|
|
|
output, err := cmd.Output()
|
|
|
if err != nil {
|
|
|
return "", err
|
|
|
}
|
|
|
+ fmt.Println("CMDOUTPUT", string(output))
|
|
|
return string(output), nil
|
|
|
}
|
|
|
|
|
|
+//Check if the user is root on linux
|
|
|
func isRoot() bool {
|
|
|
currentUser, err := user.Current()
|
|
|
if err != nil {
|
|
@@ -89,3 +95,36 @@ func isRoot() bool {
|
|
|
}
|
|
|
return currentUser.Username == "root"
|
|
|
}
|
|
|
+
|
|
|
+//Use admin permission to read auth token on Windows
|
|
|
+func readAuthTokenAsAdmin() (string, error) {
|
|
|
+ verb := "runas"
|
|
|
+ exe, _ := os.Executable()
|
|
|
+ cwd, _ := os.Getwd()
|
|
|
+
|
|
|
+ authTokenPath := "C:\\ProgramData\\ZeroTier\\One\\authtoken.secret"
|
|
|
+ args := fmt.Sprintf("cmd /C type %s", authTokenPath)
|
|
|
+
|
|
|
+ verbPtr, _ := syscall.UTF16PtrFromString(verb)
|
|
|
+ exePtr, _ := syscall.UTF16PtrFromString(exe)
|
|
|
+ cwdPtr, _ := syscall.UTF16PtrFromString(cwd)
|
|
|
+ argPtr, _ := syscall.UTF16PtrFromString(args)
|
|
|
+
|
|
|
+ var showCmd int32 = 1 //SW_NORMAL
|
|
|
+
|
|
|
+ err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ return "", nil
|
|
|
+}
|
|
|
+
|
|
|
+//Check if admin on Windows
|
|
|
+func isAdmin() bool {
|
|
|
+ _, err := os.Open("\\\\.\\PHYSICALDRIVE0")
|
|
|
+ if err != nil {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return true
|
|
|
+}
|