123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- package ganserv
- import (
- "bufio"
- "fmt"
- "log"
- "os"
- "os/exec"
- "os/user"
- "runtime"
- "strings"
- "syscall"
- "golang.org/x/sys/windows"
- )
- func TryLoadorAskUserForAuthkey() string {
- //Check for zt auth token
- value, exists := os.LookupEnv("ZT_AUTH")
- if !exists {
- log.Println("Environment variable ZT_AUTH not defined. Trying to load authtoken from file.")
- } else {
- return value
- }
- authKey := ""
- if runtime.GOOS == "windows" {
- b, err := os.ReadFile("C:\\ProgramData\\ZeroTier\\One\\authtoken.secret")
- if err == nil {
- log.Println("Zerotier authkey loaded")
- authKey = string(b)
- } else {
- log.Println("Unable to read authkey at C:\\ProgramData\\ZeroTier\\One\\authtoken.secret: ", err.Error())
- }
- } else if runtime.GOOS == "linux" {
- if isRoot() {
- //Try to read from source using sudo
- ak, err := readAuthTokenAsRoot()
- if err == nil {
- log.Println("Zerotier authkey loaded")
- authKey = strings.TrimSpace(ak)
- } else {
- log.Println("Unable to read authkey at /var/lib/zerotier-one/authtoken.secret: ", err.Error())
- }
- } else {
- //Try read from source
- b, err := os.ReadFile("/var/lib/zerotier-one/authtoken.secret")
- if err == nil {
- log.Println("Zerotier authkey loaded")
- authKey = string(b)
- } else {
- log.Println("Unable to read authkey at /var/lib/zerotier-one/authtoken.secret: ", err.Error())
- }
- }
- } else if runtime.GOOS == "darwin" {
- b, err := os.ReadFile("/Library/Application Support/ZeroTier/One/authtoken.secret")
- if err == nil {
- log.Println("Zerotier authkey loaded")
- authKey = string(b)
- } else {
- log.Println("Unable to read authkey at /Library/Application Support/ZeroTier/One/authtoken.secret ", err.Error())
- }
- }
- authKey = strings.TrimSpace(authKey)
- if authKey == "" {
- //Ask user for input
- reader := bufio.NewReader(os.Stdin)
- fmt.Println("Please enter the Zerotier authtoken manually: ")
- input, _ := reader.ReadString('\n')
- return strings.TrimSpace(input)
- }
- return ""
- }
- //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 {
- return false
- }
- 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
- }
|