acme.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package option
  2. import (
  3. "strings"
  4. C "github.com/sagernet/sing-box/constant"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. "github.com/sagernet/sing/common/json"
  7. "github.com/sagernet/sing/common/json/badjson"
  8. "github.com/sagernet/sing/common/json/badoption"
  9. )
  10. type ACMECertificateProviderOptions struct {
  11. Domain badoption.Listable[string] `json:"domain,omitempty"`
  12. DataDirectory string `json:"data_directory,omitempty"`
  13. DefaultServerName string `json:"default_server_name,omitempty"`
  14. Email string `json:"email,omitempty"`
  15. Provider string `json:"provider,omitempty"`
  16. AccountKey string `json:"account_key,omitempty"`
  17. DisableHTTPChallenge bool `json:"disable_http_challenge,omitempty"`
  18. DisableTLSALPNChallenge bool `json:"disable_tls_alpn_challenge,omitempty"`
  19. AlternativeHTTPPort uint16 `json:"alternative_http_port,omitempty"`
  20. AlternativeTLSPort uint16 `json:"alternative_tls_port,omitempty"`
  21. ExternalAccount *ACMEExternalAccountOptions `json:"external_account,omitempty"`
  22. DNS01Challenge *ACMEProviderDNS01ChallengeOptions `json:"dns01_challenge,omitempty"`
  23. KeyType ACMEKeyType `json:"key_type,omitempty"`
  24. HTTPClient *HTTPClientOptions `json:"http_client,omitempty"`
  25. }
  26. type _ACMEProviderDNS01ChallengeOptions struct {
  27. TTL badoption.Duration `json:"ttl,omitempty"`
  28. PropagationDelay badoption.Duration `json:"propagation_delay,omitempty"`
  29. PropagationTimeout badoption.Duration `json:"propagation_timeout,omitempty"`
  30. Resolvers badoption.Listable[string] `json:"resolvers,omitempty"`
  31. OverrideDomain string `json:"override_domain,omitempty"`
  32. Provider string `json:"provider,omitempty"`
  33. AliDNSOptions ACMEDNS01AliDNSOptions `json:"-"`
  34. CloudflareOptions ACMEDNS01CloudflareOptions `json:"-"`
  35. ACMEDNSOptions ACMEDNS01ACMEDNSOptions `json:"-"`
  36. }
  37. type ACMEProviderDNS01ChallengeOptions _ACMEProviderDNS01ChallengeOptions
  38. func (o ACMEProviderDNS01ChallengeOptions) MarshalJSON() ([]byte, error) {
  39. var v any
  40. switch o.Provider {
  41. case C.DNSProviderAliDNS:
  42. v = o.AliDNSOptions
  43. case C.DNSProviderCloudflare:
  44. v = o.CloudflareOptions
  45. case C.DNSProviderACMEDNS:
  46. v = o.ACMEDNSOptions
  47. case "":
  48. return nil, E.New("missing provider type")
  49. default:
  50. return nil, E.New("unknown provider type: ", o.Provider)
  51. }
  52. return badjson.MarshallObjects((_ACMEProviderDNS01ChallengeOptions)(o), v)
  53. }
  54. func (o *ACMEProviderDNS01ChallengeOptions) UnmarshalJSON(bytes []byte) error {
  55. err := json.Unmarshal(bytes, (*_ACMEProviderDNS01ChallengeOptions)(o))
  56. if err != nil {
  57. return err
  58. }
  59. var v any
  60. switch o.Provider {
  61. case C.DNSProviderAliDNS:
  62. v = &o.AliDNSOptions
  63. case C.DNSProviderCloudflare:
  64. v = &o.CloudflareOptions
  65. case C.DNSProviderACMEDNS:
  66. v = &o.ACMEDNSOptions
  67. case "":
  68. return E.New("missing provider type")
  69. default:
  70. return E.New("unknown provider type: ", o.Provider)
  71. }
  72. return badjson.UnmarshallExcluded(bytes, (*_ACMEProviderDNS01ChallengeOptions)(o), v)
  73. }
  74. type ACMEKeyType string
  75. const (
  76. ACMEKeyTypeED25519 = ACMEKeyType("ed25519")
  77. ACMEKeyTypeP256 = ACMEKeyType("p256")
  78. ACMEKeyTypeP384 = ACMEKeyType("p384")
  79. ACMEKeyTypeRSA2048 = ACMEKeyType("rsa2048")
  80. ACMEKeyTypeRSA4096 = ACMEKeyType("rsa4096")
  81. )
  82. func (t *ACMEKeyType) UnmarshalJSON(data []byte) error {
  83. var value string
  84. err := json.Unmarshal(data, &value)
  85. if err != nil {
  86. return err
  87. }
  88. value = strings.ToLower(value)
  89. switch ACMEKeyType(value) {
  90. case "", ACMEKeyTypeED25519, ACMEKeyTypeP256, ACMEKeyTypeP384, ACMEKeyTypeRSA2048, ACMEKeyTypeRSA4096:
  91. *t = ACMEKeyType(value)
  92. default:
  93. return E.New("unknown ACME key type: ", value)
  94. }
  95. return nil
  96. }