package service import ( "bytes" _ "embed" "encoding/json" "fmt" "net/http" "os" "time" "x-ui/util/common" "x-ui/xray" ) type XraySettingService struct { SettingService } func (s *XraySettingService) SaveXraySetting(newXraySettings string) error { if err := s.CheckXrayConfig(newXraySettings); err != nil { return err } return s.SettingService.saveSetting("xrayTemplateConfig", newXraySettings) } func (s *XraySettingService) CheckXrayConfig(XrayTemplateConfig string) error { xrayConfig := &xray.Config{} err := json.Unmarshal([]byte(XrayTemplateConfig), xrayConfig) if err != nil { return common.NewError("xray template config invalid:", err) } 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 }