1
0

authkeyWin.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //go:build windows
  2. // +build windows
  3. package ganserv
  4. import (
  5. "fmt"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. "syscall"
  11. "time"
  12. "golang.org/x/sys/windows"
  13. "imuslab.com/zoraxy/mod/utils"
  14. )
  15. // Use admin permission to read auth token on Windows
  16. func readAuthTokenAsAdmin() (string, error) {
  17. //Check if the previous startup already extracted the authkey
  18. if utils.FileExists("./conf/authtoken.secret") {
  19. authKey, err := os.ReadFile("./conf/authtoken.secret")
  20. if err == nil {
  21. return strings.TrimSpace(string(authKey)), nil
  22. }
  23. }
  24. verb := "runas"
  25. exe := "cmd.exe"
  26. cwd, _ := os.Getwd()
  27. output, _ := filepath.Abs(filepath.Join("./conf/", "authtoken.secret"))
  28. os.WriteFile(output, []byte(""), 0775)
  29. args := fmt.Sprintf("/C type \"C:\\ProgramData\\ZeroTier\\One\\authtoken.secret\" > \"" + output + "\"")
  30. verbPtr, _ := syscall.UTF16PtrFromString(verb)
  31. exePtr, _ := syscall.UTF16PtrFromString(exe)
  32. cwdPtr, _ := syscall.UTF16PtrFromString(cwd)
  33. argPtr, _ := syscall.UTF16PtrFromString(args)
  34. var showCmd int32 = 1 //SW_NORMAL
  35. err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd)
  36. if err != nil {
  37. return "", err
  38. }
  39. log.Println("Please click agree to allow access to ZeroTier authtoken from ProgramData")
  40. retry := 0
  41. time.Sleep(3 * time.Second)
  42. for !utils.FileExists("./conf/authtoken.secret") && retry < 10 {
  43. time.Sleep(3 * time.Second)
  44. log.Println("Waiting for ZeroTier authtoken extraction...")
  45. retry++
  46. }
  47. authKey, err := os.ReadFile("./conf/authtoken.secret")
  48. if err != nil {
  49. return "", err
  50. }
  51. return strings.TrimSpace(string(authKey)), nil
  52. }
  53. // Check if admin on Windows
  54. func isAdmin() bool {
  55. _, err := os.Open("\\\\.\\PHYSICALDRIVE0")
  56. if err != nil {
  57. return false
  58. }
  59. return true
  60. }