From 6affec09d31cec2e9558660f411b5bdaaacd3d29 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Sun, 14 Jul 2024 18:19:23 +0200 Subject: [PATCH] [warp] enhanced + delete option #1055 --- web/controller/xray_setting.go | 11 +- web/html/xui/warp_modal.html | 234 +++++++++++++++++++-------------- web/service/warp.go | 162 +++++++++++++++++++++++ web/service/xray_setting.go | 144 -------------------- 4 files changed, 306 insertions(+), 245 deletions(-) create mode 100644 web/service/warp.go diff --git a/web/controller/xray_setting.go b/web/controller/xray_setting.go index 299f797e..4ce1d3ab 100644 --- a/web/controller/xray_setting.go +++ b/web/controller/xray_setting.go @@ -11,6 +11,7 @@ type XraySettingController struct { SettingService service.SettingService InboundService service.InboundService XrayService service.XrayService + WarpService service.WarpService } func NewXraySettingController(g *gin.RouterGroup) *XraySettingController { @@ -69,16 +70,18 @@ func (a *XraySettingController) warp(c *gin.Context) { var err error switch action { case "data": - resp, err = a.XraySettingService.GetWarp() + resp, err = a.WarpService.GetWarpData() + case "del": + err = a.WarpService.DelWarpData() case "config": - resp, err = a.XraySettingService.GetWarpConfig() + resp, err = a.WarpService.GetWarpConfig() case "reg": skey := c.PostForm("privateKey") pkey := c.PostForm("publicKey") - resp, err = a.XraySettingService.RegWarp(skey, pkey) + resp, err = a.WarpService.RegWarp(skey, pkey) case "license": license := c.PostForm("license") - resp, err = a.XraySettingService.SetWarpLicense(license) + resp, err = a.WarpService.SetWarpLicense(license) } jsonObj(c, resp, err) diff --git a/web/html/xui/warp_modal.html b/web/html/xui/warp_modal.html index 6d514d89..7db58386 100644 --- a/web/html/xui/warp_modal.html +++ b/web/html/xui/warp_modal.html @@ -24,6 +24,7 @@ [[ warpModal.warpData.private_key ]] + {{ i18n "delete" }} {{ i18n "pages.xray.outbound.settings" }} @@ -91,114 +92,153 @@ {{end}} diff --git a/web/service/warp.go b/web/service/warp.go new file mode 100644 index 00000000..a691d3c1 --- /dev/null +++ b/web/service/warp.go @@ -0,0 +1,162 @@ +package service + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "os" + "time" + "x-ui/logger" +) + +type WarpService struct { + SettingService +} + +func (s *WarpService) GetWarpData() (string, error) { + warp, err := s.SettingService.GetWarp() + if err != nil { + return "", err + } + return warp, nil +} + +func (s *WarpService) DelWarpData() error { + err := s.SettingService.SetWarp("") + if err != nil { + return err + } + return nil +} + +func (s *WarpService) GetWarpConfig() (string, error) { + var warpData map[string]string + warp, err := s.SettingService.GetWarp() + if err != nil { + return "", err + } + err = json.Unmarshal([]byte(warp), &warpData) + if err != nil { + return "", err + } + + url := fmt.Sprintf("https://api.cloudflareclient.com/v0a2158/reg/%s", warpData["device_id"]) + + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return "", err + } + req.Header.Set("Authorization", "Bearer "+warpData["access_token"]) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + buffer := bytes.NewBuffer(make([]byte, 8192)) + buffer.Reset() + _, err = buffer.ReadFrom(resp.Body) + if err != nil { + return "", err + } + + return buffer.String(), nil +} + +func (s *WarpService) RegWarp(secretKey string, publicKey string) (string, error) { + tos := time.Now().UTC().Format("2006-01-02T15:04:05.000Z") + hostName, _ := os.Hostname() + data := fmt.Sprintf(`{"key":"%s","tos":"%s","type": "PC","model": "x-ui", "name": "%s"}`, publicKey, tos, hostName) + + url := "https://api.cloudflareclient.com/v0a2158/reg" + + req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(data))) + if err != nil { + return "", err + } + + req.Header.Add("CF-Client-Version", "a-7.21-0721") + req.Header.Add("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + buffer := bytes.NewBuffer(make([]byte, 8192)) + buffer.Reset() + _, err = buffer.ReadFrom(resp.Body) + if err != nil { + return "", err + } + + var rspData map[string]interface{} + err = json.Unmarshal(buffer.Bytes(), &rspData) + if err != nil { + return "", err + } + + deviceId := rspData["id"].(string) + token := rspData["token"].(string) + license, ok := rspData["account"].(map[string]interface{})["license"].(string) + if !ok { + logger.Debug("Error accessing license value.") + return "", err + } + + warpData := fmt.Sprintf("{\n \"access_token\": \"%s\",\n \"device_id\": \"%s\",", token, deviceId) + warpData += fmt.Sprintf("\n \"license_key\": \"%s\",\n \"private_key\": \"%s\"\n}", license, secretKey) + + s.SettingService.SetWarp(warpData) + + result := fmt.Sprintf("{\n \"data\": %s,\n \"config\": %s\n}", warpData, buffer.String()) + + return result, nil +} + +func (s *WarpService) SetWarpLicense(license string) (string, error) { + var warpData map[string]string + warp, err := s.SettingService.GetWarp() + if err != nil { + return "", err + } + err = json.Unmarshal([]byte(warp), &warpData) + if err != nil { + return "", err + } + + url := fmt.Sprintf("https://api.cloudflareclient.com/v0a2158/reg/%s/account", warpData["device_id"]) + data := fmt.Sprintf(`{"license": "%s"}`, license) + + req, err := http.NewRequest("PUT", url, bytes.NewBuffer([]byte(data))) + if err != nil { + return "", err + } + req.Header.Set("Authorization", "Bearer "+warpData["access_token"]) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + buffer := bytes.NewBuffer(make([]byte, 8192)) + buffer.Reset() + _, err = buffer.ReadFrom(resp.Body) + if err != nil { + return "", err + } + + warpData["license_key"] = license + newWarpData, err := json.MarshalIndent(warpData, "", " ") + if err != nil { + return "", err + } + s.SettingService.SetWarp(string(newWarpData)) + println(string(newWarpData)) + + return string(newWarpData), nil +} diff --git a/web/service/xray_setting.go b/web/service/xray_setting.go index 43d143db..f497bf84 100644 --- a/web/service/xray_setting.go +++ b/web/service/xray_setting.go @@ -1,13 +1,8 @@ package service import ( - "bytes" _ "embed" "encoding/json" - "fmt" - "net/http" - "os" - "time" "x-ui/util/common" "x-ui/xray" @@ -32,142 +27,3 @@ func (s *XraySettingService) CheckXrayConfig(XrayTemplateConfig string) error { } return nil } - -func (s *XraySettingService) GetWarpData() (string, error) { - warp, err := s.SettingService.GetWarp() - if err != nil { - return "", err - } - return warp, nil -} - -func (s *XraySettingService) GetWarpConfig() (string, error) { - var warpData map[string]string - warp, err := s.SettingService.GetWarp() - if err != nil { - return "", err - } - err = json.Unmarshal([]byte(warp), &warpData) - if err != nil { - return "", err - } - - url := fmt.Sprintf("https://api.cloudflareclient.com/v0a2158/reg/%s", warpData["device_id"]) - - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return "", err - } - req.Header.Set("Authorization", "Bearer "+warpData["access_token"]) - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return "", err - } - defer resp.Body.Close() - buffer := bytes.NewBuffer(make([]byte, 8192)) - buffer.Reset() - _, err = buffer.ReadFrom(resp.Body) - if err != nil { - return "", err - } - - return buffer.String(), nil -} - -func (s *XraySettingService) RegWarp(secretKey string, publicKey string) (string, error) { - tos := time.Now().UTC().Format("2006-01-02T15:04:05.000Z") - hostName, _ := os.Hostname() - data := fmt.Sprintf(`{"key":"%s","tos":"%s","type": "PC","model": "x-ui", "name": "%s"}`, publicKey, tos, hostName) - - url := "https://api.cloudflareclient.com/v0a2158/reg" - - req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(data))) - if err != nil { - return "", err - } - - req.Header.Add("CF-Client-Version", "a-7.21-0721") - req.Header.Add("Content-Type", "application/json") - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return "", err - } - defer resp.Body.Close() - buffer := bytes.NewBuffer(make([]byte, 8192)) - buffer.Reset() - _, err = buffer.ReadFrom(resp.Body) - if err != nil { - return "", err - } - - var rspData map[string]interface{} - err = json.Unmarshal(buffer.Bytes(), &rspData) - if err != nil { - return "", err - } - - deviceId := rspData["id"].(string) - token := rspData["token"].(string) - license, ok := rspData["account"].(map[string]interface{})["license"].(string) - if !ok { - fmt.Println("Error accessing license value.") - return "", err - } - - warpData := fmt.Sprintf("{\n \"access_token\": \"%s\",\n \"device_id\": \"%s\",", token, deviceId) - warpData += fmt.Sprintf("\n \"license_key\": \"%s\",\n \"private_key\": \"%s\"\n}", license, secretKey) - - s.SettingService.SetWarp(warpData) - - result := fmt.Sprintf("{\n \"data\": %s,\n \"config\": %s\n}", warpData, buffer.String()) - - return result, nil -} - -func (s *XraySettingService) SetWarpLicense(license string) (string, error) { - var warpData map[string]string - warp, err := s.SettingService.GetWarp() - if err != nil { - return "", err - } - err = json.Unmarshal([]byte(warp), &warpData) - if err != nil { - return "", err - } - - url := fmt.Sprintf("https://api.cloudflareclient.com/v0a2158/reg/%s/account", warpData["device_id"]) - data := fmt.Sprintf(`{"license": "%s"}`, license) - - req, err := http.NewRequest("PUT", url, bytes.NewBuffer([]byte(data))) - if err != nil { - return "", err - } - req.Header.Set("Authorization", "Bearer "+warpData["access_token"]) - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return "", err - } - defer resp.Body.Close() - buffer := bytes.NewBuffer(make([]byte, 8192)) - buffer.Reset() - _, err = buffer.ReadFrom(resp.Body) - if err != nil { - return "", err - } - - warpData["license_key"] = license - newWarpData, err := json.MarshalIndent(warpData, "", " ") - if err != nil { - return "", err - } - s.SettingService.SetWarp(string(newWarpData)) - println(string(newWarpData)) - - return string(newWarpData), nil -}