Browse Source

Add zerotier route (#1098)

raller1028 2 years ago
parent
commit
eaca399ef9
3 changed files with 75 additions and 1 deletions
  1. 1 0
      main.go
  2. 1 1
      route/v1.go
  3. 73 0
      route/v1/zerotier.go

+ 1 - 0
main.go

@@ -150,6 +150,7 @@ func main() {
 		"/v1/cloud",
 		"/v1/recover",
 		"/v1/other",
+		"/v1/zt",
 		route.V2APIPath,
 		route.V2DocPath,
 		route.V3FilePath,

+ 1 - 1
route/v1.go

@@ -40,7 +40,7 @@ func InitV1Router() *gin.Engine {
 	})
 	r.GET("/v1/recover/:type", v1.GetRecoverStorage)
 	v1Group := r.Group("/v1")
-
+	r.GET("/v1/zt/*url", v1.AddZerotierToken)
 	v1Group.Use(jwt.ExceptLocalhost(func() (*ecdsa.PublicKey, error) { return external.GetPublicKey(config.CommonInfo.RuntimePath) }))
 	{
 

+ 73 - 0
route/v1/zerotier.go

@@ -0,0 +1,73 @@
+package v1
+
+import (
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+
+	"github.com/gin-gonic/gin"
+)
+
+func AddZerotierToken(c *gin.Context) {
+	// Read the port number from the file
+	w := c.Writer
+	r := c.Request
+	port, err := ioutil.ReadFile("/var/lib/zerotier-one/zerotier-one.port")
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	// Get the request path and remove "/zt"
+	path := strings.TrimPrefix(r.URL.Path, "/v1/zt")
+	fmt.Println(path)
+
+	// Build the target URL
+	targetURL := fmt.Sprintf("http://localhost:%s%s", strings.TrimSpace(string(port)), path)
+
+	// Create a new request
+	req, err := http.NewRequest(r.Method, targetURL, r.Body)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	// Add the X-ZT1-AUTH header
+	authToken, err := ioutil.ReadFile("/var/lib/zerotier-one/authtoken.secret")
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	req.Header.Set("X-ZT1-AUTH", strings.TrimSpace(string(authToken)))
+
+	copyHeaders(req.Header, r.Header)
+
+	client := http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	defer resp.Body.Close()
+
+	copyHeaders(w.Header(), resp.Header)
+
+	respBody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	// Return the response to the client
+	w.WriteHeader(resp.StatusCode)
+	w.Write(respBody)
+}
+
+func copyHeaders(destination, source http.Header) {
+	for key, values := range source {
+		for _, value := range values {
+			destination.Add(key, value)
+		}
+	}
+}