Files
havline-native/app-src/internal/ddns/credentials.go
T

97 lines
2.6 KiB
Go

package ddns
import (
"encoding/json"
"fmt"
"strings"
)
type Credentials struct {
Provider string `json:"provider,omitempty"`
Token string `json:"token,omitempty"`
TokenID string `json:"token_id,omitempty"`
Secret string `json:"secret,omitempty"`
}
func CredentialsFromSave(in SaveInput) Credentials {
provider := strings.TrimSpace(in.Provider)
if provider == "" {
provider = "cloudflare"
}
switch provider {
case "dnspod":
return Credentials{Provider: "dnspod", TokenID: strings.TrimSpace(in.APITokenID), Token: strings.TrimSpace(in.APIToken)}
case "alidns":
return Credentials{Provider: "alidns", Token: strings.TrimSpace(in.APIToken), Secret: strings.TrimSpace(in.APISecret)}
case "tencentcloud":
return Credentials{Provider: "tencentcloud", Token: strings.TrimSpace(in.APIToken), Secret: strings.TrimSpace(in.APISecret)}
case "volcengine":
return Credentials{Provider: "volcengine", Token: strings.TrimSpace(in.APIToken), Secret: strings.TrimSpace(in.APISecret)}
default:
return Credentials{Provider: "cloudflare", Token: strings.TrimSpace(in.APIToken)}
}
}
func (c Credentials) HasValues() bool {
switch c.Provider {
case "dnspod":
return c.TokenID != "" && c.Token != ""
case "alidns", "tencentcloud", "volcengine":
return c.Token != "" && c.Secret != ""
default:
return c.Token != ""
}
}
func (c Credentials) Validate(provider string) error {
switch provider {
case "dnspod":
if c.TokenID == "" || c.Token == "" {
return fmt.Errorf("请填写 DNSPod ID 和 Token")
}
case "alidns":
if c.Token == "" || c.Secret == "" {
return fmt.Errorf("请填写阿里云 AccessKey ID 和 Secret")
}
case "tencentcloud":
if c.Token == "" || c.Secret == "" {
return fmt.Errorf("请填写腾讯云 SecretId 和 SecretKey")
}
case "volcengine":
if c.Token == "" || c.Secret == "" {
return fmt.Errorf("请填写火山引擎 AccessKey ID 和 Secret Access Key")
}
default:
if c.Token == "" {
return fmt.Errorf("请填写 API Token")
}
}
return nil
}
func (c Credentials) LoginToken() string {
return c.TokenID + "," + c.Token
}
func (c Credentials) Marshal() ([]byte, error) {
return json.Marshal(c)
}
func ParseCredentials(raw string) (Credentials, error) {
raw = strings.TrimSpace(raw)
if raw == "" {
return Credentials{}, fmt.Errorf("凭证未配置")
}
if strings.HasPrefix(raw, "{") {
var cred Credentials
if err := json.Unmarshal([]byte(raw), &cred); err != nil {
return Credentials{}, err
}
if cred.Provider == "" {
cred.Provider = "cloudflare"
}
return cred, nil
}
return Credentials{Provider: "cloudflare", Token: raw}, nil
}