tls_acme.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package option
  2. import (
  3. C "github.com/sagernet/sing-box/constant"
  4. E "github.com/sagernet/sing/common/exceptions"
  5. "github.com/sagernet/sing/common/json"
  6. "github.com/sagernet/sing/common/json/badjson"
  7. )
  8. type InboundACMEOptions struct {
  9. Domain Listable[string] `json:"domain,omitempty"`
  10. DataDirectory string `json:"data_directory,omitempty"`
  11. DefaultServerName string `json:"default_server_name,omitempty"`
  12. Email string `json:"email,omitempty"`
  13. Provider string `json:"provider,omitempty"`
  14. DisableHTTPChallenge bool `json:"disable_http_challenge,omitempty"`
  15. DisableTLSALPNChallenge bool `json:"disable_tls_alpn_challenge,omitempty"`
  16. AlternativeHTTPPort uint16 `json:"alternative_http_port,omitempty"`
  17. AlternativeTLSPort uint16 `json:"alternative_tls_port,omitempty"`
  18. ExternalAccount *ACMEExternalAccountOptions `json:"external_account,omitempty"`
  19. DNS01Challenge *ACMEDNS01ChallengeOptions `json:"dns01_challenge,omitempty"`
  20. }
  21. type ACMEExternalAccountOptions struct {
  22. KeyID string `json:"key_id,omitempty"`
  23. MACKey string `json:"mac_key,omitempty"`
  24. }
  25. type _ACMEDNS01ChallengeOptions struct {
  26. Provider string `json:"provider,omitempty"`
  27. AliDNSOptions ACMEDNS01AliDNSOptions `json:"-"`
  28. CloudflareOptions ACMEDNS01CloudflareOptions `json:"-"`
  29. }
  30. type ACMEDNS01ChallengeOptions _ACMEDNS01ChallengeOptions
  31. func (o ACMEDNS01ChallengeOptions) MarshalJSON() ([]byte, error) {
  32. var v any
  33. switch o.Provider {
  34. case C.DNSProviderAliDNS:
  35. v = o.AliDNSOptions
  36. case C.DNSProviderCloudflare:
  37. v = o.CloudflareOptions
  38. case "":
  39. return nil, E.New("missing provider type")
  40. default:
  41. return nil, E.New("unknown provider type: " + o.Provider)
  42. }
  43. return badjson.MarshallObjects((_ACMEDNS01ChallengeOptions)(o), v)
  44. }
  45. func (o *ACMEDNS01ChallengeOptions) UnmarshalJSON(bytes []byte) error {
  46. err := json.Unmarshal(bytes, (*_ACMEDNS01ChallengeOptions)(o))
  47. if err != nil {
  48. return err
  49. }
  50. var v any
  51. switch o.Provider {
  52. case C.DNSProviderAliDNS:
  53. v = &o.AliDNSOptions
  54. case C.DNSProviderCloudflare:
  55. v = &o.CloudflareOptions
  56. default:
  57. return E.New("unknown provider type: " + o.Provider)
  58. }
  59. err = badjson.UnmarshallExcluded(bytes, (*_ACMEDNS01ChallengeOptions)(o), v)
  60. if err != nil {
  61. return err
  62. }
  63. return nil
  64. }
  65. type ACMEDNS01AliDNSOptions struct {
  66. AccessKeyID string `json:"access_key_id,omitempty"`
  67. AccessKeySecret string `json:"access_key_secret,omitempty"`
  68. RegionID string `json:"region_id,omitempty"`
  69. }
  70. type ACMEDNS01CloudflareOptions struct {
  71. APIToken string `json:"api_token,omitempty"`
  72. }