- 公网反代:Nginx 状态卡片(版本 / 运行状态 / 配置校验 / 端口监听) - 部署设置第一、二梯队(HTTPS 开关、安全头、限流、连接数、仅中国大陆 IP) - 隧道检测兼容 frps v0.68 / v0.71(V2 与旧版端点) - 恢复被清空的 internal/frp/store.go、internal/api/ddns_handler.go、web/src/views/DdnsView.vue
97 lines
2.6 KiB
Go
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
|
|
}
|