mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-03-01 01:20:49 +03:00
173 lines
4.2 KiB
Go
173 lines
4.2 KiB
Go
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 := fmt.Sprintf("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) SetWarpLicence(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
|
|
}
|