Browse Source

auto update script executed

Toby Chui 1 year ago
parent
commit
d3f3235c8d
6 changed files with 95 additions and 35 deletions
  1. 2 1
      .gitignore
  2. 20 28
      mod/ganserv/authkey.go
  3. 29 0
      mod/ganserv/authkeyLinux.go
  4. 26 4
      mod/ganserv/authkeyWin.go
  5. 11 2
      web/components/gan.html
  6. 7 0
      web/main.css

+ 2 - 1
.gitignore

@@ -33,4 +33,5 @@ certs/*
 rules/*
 build/github/*
 dist/*
-zoraxy_*_*
+zoraxy_*_*
+authtoken.secret

+ 20 - 28
mod/ganserv/authkey.go

@@ -4,8 +4,6 @@ import (
 	"errors"
 	"log"
 	"os"
-	"os/exec"
-	"os/user"
 	"runtime"
 	"strings"
 )
@@ -21,17 +19,30 @@ func TryLoadorAskUserForAuthkey() (string, error) {
 
 	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)
+		if isAdmin() {
+			//Read the secret file directly
+			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 {
-			log.Println("Unable to read authkey at C:\\ProgramData\\ZeroTier\\One\\authtoken.secret: ", err.Error())
+			//Elavate the permission to admin
+			ak, err := readAuthTokenAsAdmin()
+			if err == nil {
+				log.Println("Zerotier authkey loaded")
+				authKey = ak
+			} else {
+				log.Println("Unable to read authkey at C:\\ProgramData\\ZeroTier\\One\\authtoken.secret: ", err.Error())
+			}
 		}
+
 	} else if runtime.GOOS == "linux" {
-		if isRoot() {
+		if isAdmin() {
 			//Try to read from source using sudo
-			ak, err := readAuthTokenAsRoot()
+			ak, err := readAuthTokenAsAdmin()
 			if err == nil {
 				log.Println("Zerotier authkey loaded")
 				authKey = strings.TrimSpace(ak)
@@ -67,22 +78,3 @@ func TryLoadorAskUserForAuthkey() (string, error) {
 
 	return authKey, nil
 }
-
-//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
-	}
-	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"
-}

+ 29 - 0
mod/ganserv/authkeyLinux.go

@@ -0,0 +1,29 @@
+//go:build linux && ((linux && amd64) || (linux && arm64) || (linux && arm && armv6 && armv7))
+// +build linux
+// +build linux,amd64 linux,arm64 linux,arm,armv6,armv7
+
+package ganserv
+
+func readAuthTokenAsAdmin() (string, error) {
+	if utils.FileExists("./authtoken.secret") {
+		authKey, err := os.ReadFile("./authtoken.secret")
+		if err == nil {
+			return strings.TrimSpace(string(authKey)), nil
+		}
+	}
+
+	cmd := exec.Command("sudo", "cat", "/var/lib/zerotier-one/authtoken.secret")
+	output, err := cmd.Output()
+	if err != nil {
+		return "", err
+	}
+	return string(output), nil
+}
+
+func isAdmin() bool {
+	currentUser, err := user.Current()
+	if err != nil {
+		return false
+	}
+	return currentUser.Username == "root"
+}

+ 26 - 4
mod/ganserv/authkeyWin.go

@@ -5,20 +5,34 @@ package ganserv
 
 import (
 	"fmt"
+	"log"
 	"os"
+	"path/filepath"
+	"strings"
 	"syscall"
+	"time"
 
 	"golang.org/x/sys/windows"
+	"imuslab.com/zoraxy/mod/utils"
 )
 
 //Use admin permission to read auth token on Windows
 func readAuthTokenAsAdmin() (string, error) {
+	//Check if the previous startup already extracted the authkey
+	if utils.FileExists("./authtoken.secret") {
+		authKey, err := os.ReadFile("./authtoken.secret")
+		if err == nil {
+			return strings.TrimSpace(string(authKey)), nil
+		}
+	}
+
 	verb := "runas"
-	exe, _ := os.Executable()
+	exe := "cmd.exe"
 	cwd, _ := os.Getwd()
 
-	authTokenPath := "C:\\ProgramData\\ZeroTier\\One\\authtoken.secret"
-	args := fmt.Sprintf("cmd /C type %s", authTokenPath)
+	output, _ := filepath.Abs(filepath.Join("./", "authtoken.secret"))
+	os.WriteFile(output, []byte(""), 0775)
+	args := fmt.Sprintf("/C type \"C:\\ProgramData\\ZeroTier\\One\\authtoken.secret\" > \"" + output + "\"")
 
 	verbPtr, _ := syscall.UTF16PtrFromString(verb)
 	exePtr, _ := syscall.UTF16PtrFromString(exe)
@@ -32,7 +46,15 @@ func readAuthTokenAsAdmin() (string, error) {
 		return "", err
 	}
 
-	return "", nil
+	log.Println("Waiting for ZeroTier authtoken extraction...")
+	time.Sleep(3 * time.Second)
+
+	authKey, err := os.ReadFile("./authtoken.secret")
+	if err != nil {
+		return "", err
+	}
+
+	return strings.TrimSpace(string(authKey)), nil
 }
 
 //Check if admin on Windows

+ 11 - 2
web/components/gan.html

@@ -78,7 +78,9 @@
             if (data.error !== undefined){
                 msgbox(data.error, false, 5000)
             }else{
-                $(".ganControllerID").text(data);
+                if (data != ""){
+                    $(".ganControllerID").text(data);
+                }
             }
         })
     }
@@ -108,7 +110,14 @@
         $.get("/api/gan/network/list", function(data){
             $("#GANetList").empty();
             if (data.error != undefined){
-                msgbox(data.error, false, 5000);
+                console.log(data.error);
+                msgbox("Unable to load auth token for GANet", false, 5000);
+                //token error or no zerotier found
+                $(".gansnetworks").addClass("disabled");
+                $("#GANetList").append(`<tr>
+                    <td colspan="6"><i class="red times circle icon"></i> Auth token access error or not found</td>
+                </tr>`);
+                $(".ganControllerID").text('Access Denied');
             }else{
                 var nodeCount = 0;
                 data.forEach(function(gan){

+ 7 - 0
web/main.css

@@ -448,6 +448,13 @@ body{
     text-align: center;
 }
 
+
+.gansnetworks.disabled{
+    opacity: 0.5;
+    pointer-events: none;
+    user-select: none;
+}
+
 .GANetMember.authorized{
     border-left: 6px solid #3c9c63 !important;
 }