Add license_key support for masque and warp Cloudflare profiles

This commit is contained in:
Shtorm
2026-08-11 23:36:15 +03:00
parent 6126cc2158
commit e8f6936480
7 changed files with 44 additions and 1 deletions

View File

@@ -92,6 +92,32 @@ func (api *CloudflareApi) EnrollKey(ctx context.Context, authToken string, id st
return profile, json.NewDecoder(response.Body).Decode(profile)
}
func (api *CloudflareApi) UpdateAccount(ctx context.Context, authToken string, id string, license string) (*Account, error) {
data := UpdateAccountRequest{License: license}
jsonData, err := json.Marshal(data)
if err != nil {
return nil, fmt.Errorf("failed to marshal json: %v", err)
}
request, err := http.NewRequest("PUT", ApiUrl+"/"+ApiVersion+"/reg/"+id+"/account", bytes.NewBuffer(jsonData))
if err != nil {
return nil, err
}
for k, v := range Headers {
request.Header.Set(k, v)
}
request.Header.Set("Authorization", "Bearer "+authToken)
response, err := api.client.Do(request.WithContext(ctx))
if err != nil {
return nil, err
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to update account: %v", response.StatusCode)
}
account := new(Account)
return account, json.NewDecoder(response.Body).Decode(account)
}
func (api *CloudflareApi) GetProfile(ctx context.Context, authToken string, id string) (*CloudflareProfile, error) {
request, err := http.NewRequest("GET", ApiUrl+"/"+ApiVersion+"/reg/"+id, nil)
if err != nil {

View File

@@ -111,6 +111,10 @@ type DeviceUpdate struct {
Name string `json:"name,omitempty"`
}
type UpdateAccountRequest struct {
License string `json:"license"`
}
type APIError struct {
Result interface{} `json:"result"`
Success bool `json:"success"`

View File

@@ -33,7 +33,8 @@
"detour": "direct",
// For getting existing MASQUE device profile, else sing-box will create new profile
"id": "",
"auth_token": ""
"auth_token": "",
"license_key": ""
},
"udp_timeout": "5m0s",
"udp_keepalive_period": "30s",

View File

@@ -44,6 +44,7 @@
"id": "",
"private_key": "",
"auth_token": "",
"license_key": "",
"recreate": false
}
// Dial Fields

View File

@@ -4,6 +4,7 @@ type CloudflareProfile struct {
ID string `json:"id,omitempty"`
AuthToken string `json:"auth_token,omitempty"`
PrivateKey string `json:"private_key,omitempty"`
LicenseKey string `json:"license_key,omitempty"`
Recreate bool `json:"recreate,omitempty"`
Detour string `json:"detour,omitempty"`
}

View File

@@ -302,6 +302,11 @@ func (w *Outbound) createConfig() (*Config, error) {
return nil, err
}
}
if w.options.Profile.LicenseKey != "" && profile.Account.License != w.options.Profile.LicenseKey {
if _, err = api.UpdateAccount(w.ctx, profile.Token, profile.ID, w.options.Profile.LicenseKey); err != nil {
return nil, E.New("failed to apply license key: ", err)
}
}
privateKey, publicKey, err := masque.GenerateEcKeyPair()
if err != nil {
return nil, E.New("failed to generate key pair: ", err)

View File

@@ -237,6 +237,11 @@ func (w *Endpoint) createConfig() (*Config, error) {
return nil, err
}
}
if w.options.Profile.LicenseKey != "" && profile.Account.License != w.options.Profile.LicenseKey {
if _, err = api.UpdateAccount(w.ctx, profile.Token, profile.ID, w.options.Profile.LicenseKey); err != nil {
return nil, E.New("failed to apply license key: ", err)
}
}
return &Config{
PrivateKey: privateKey.String(),
Interface: profile.Config.Interface,