| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- package option
- import (
- C "github.com/sagernet/sing-box/constant"
- E "github.com/sagernet/sing/common/exceptions"
- "github.com/sagernet/sing/common/json"
- "github.com/sagernet/sing/common/json/badjson"
- )
- type _RuleAction struct {
- Action string `json:"action,omitempty"`
- RouteOptions RouteActionOptions `json:"-"`
- RejectOptions RejectActionOptions `json:"-"`
- SniffOptions RouteActionSniff `json:"-"`
- ResolveOptions RouteActionResolve `json:"-"`
- }
- type RuleAction _RuleAction
- func (r RuleAction) MarshalJSON() ([]byte, error) {
- var v any
- switch r.Action {
- case C.RuleActionTypeRoute:
- r.Action = ""
- v = r.RouteOptions
- case C.RuleActionTypeReturn:
- v = nil
- case C.RuleActionTypeReject:
- v = r.RejectOptions
- case C.RuleActionTypeHijackDNS:
- v = nil
- case C.RuleActionTypeSniff:
- v = r.SniffOptions
- case C.RuleActionTypeResolve:
- v = r.ResolveOptions
- default:
- return nil, E.New("unknown rule action: " + r.Action)
- }
- if v == nil {
- return badjson.MarshallObjects((_RuleAction)(r))
- }
- return badjson.MarshallObjects((_RuleAction)(r), v)
- }
- func (r *RuleAction) UnmarshalJSON(data []byte) error {
- err := json.Unmarshal(data, (*_RuleAction)(r))
- if err != nil {
- return err
- }
- var v any
- switch r.Action {
- case "", C.RuleActionTypeRoute:
- r.Action = C.RuleActionTypeRoute
- v = &r.RouteOptions
- case C.RuleActionTypeReturn:
- v = nil
- case C.RuleActionTypeReject:
- v = &r.RejectOptions
- case C.RuleActionTypeHijackDNS:
- v = nil
- case C.RuleActionTypeSniff:
- v = &r.SniffOptions
- case C.RuleActionTypeResolve:
- v = &r.ResolveOptions
- default:
- return E.New("unknown rule action: " + r.Action)
- }
- if v == nil {
- // check unknown fields
- return json.UnmarshalDisallowUnknownFields(data, &_RuleAction{})
- }
- return badjson.UnmarshallExcluded(data, (*_RuleAction)(r), v)
- }
- type _DNSRuleAction struct {
- Action string `json:"action,omitempty"`
- RouteOptions DNSRouteActionOptions `json:"-"`
- RejectOptions RejectActionOptions `json:"-"`
- }
- type DNSRuleAction _DNSRuleAction
- func (r DNSRuleAction) MarshalJSON() ([]byte, error) {
- var v any
- switch r.Action {
- case C.RuleActionTypeRoute:
- r.Action = ""
- v = r.RouteOptions
- case C.RuleActionTypeReturn:
- v = nil
- case C.RuleActionTypeReject:
- v = r.RejectOptions
- default:
- return nil, E.New("unknown DNS rule action: " + r.Action)
- }
- if v == nil {
- return badjson.MarshallObjects((_DNSRuleAction)(r))
- }
- return badjson.MarshallObjects((_DNSRuleAction)(r), v)
- }
- func (r *DNSRuleAction) UnmarshalJSON(data []byte) error {
- err := json.Unmarshal(data, (*_DNSRuleAction)(r))
- if err != nil {
- return err
- }
- var v any
- switch r.Action {
- case "", C.RuleActionTypeRoute:
- r.Action = C.RuleActionTypeRoute
- v = &r.RouteOptions
- case C.RuleActionTypeReturn:
- v = nil
- case C.RuleActionTypeReject:
- v = &r.RejectOptions
- default:
- return E.New("unknown DNS rule action: " + r.Action)
- }
- if v == nil {
- // check unknown fields
- return json.UnmarshalDisallowUnknownFields(data, &_DNSRuleAction{})
- }
- return badjson.UnmarshallExcluded(data, (*_DNSRuleAction)(r), v)
- }
- type RouteActionOptions struct {
- Outbound string `json:"outbound"`
- UDPDisableDomainUnmapping bool `json:"udp_disable_domain_unmapping,omitempty"`
- }
- type DNSRouteActionOptions struct {
- Server string `json:"server"`
- DisableCache bool `json:"disable_cache,omitempty"`
- RewriteTTL *uint32 `json:"rewrite_ttl,omitempty"`
- ClientSubnet *AddrPrefix `json:"client_subnet,omitempty"`
- }
- type _RejectActionOptions struct {
- Method string `json:"method,omitempty"`
- NoDrop bool `json:"no_drop,omitempty"`
- }
- type RejectActionOptions _RejectActionOptions
- func (r *RejectActionOptions) UnmarshalJSON(bytes []byte) error {
- err := json.Unmarshal(bytes, (*_RejectActionOptions)(r))
- if err != nil {
- return err
- }
- switch r.Method {
- case "", C.RuleActionRejectMethodDefault:
- r.Method = C.RuleActionRejectMethodDefault
- case C.RuleActionRejectMethodDrop:
- default:
- return E.New("unknown reject method: " + r.Method)
- }
- if r.Method == C.RuleActionRejectMethodDrop && r.NoDrop {
- return E.New("no_drop is not allowed when method is drop")
- }
- return nil
- }
- type RouteActionSniff struct {
- Sniffer Listable[string] `json:"sniffer,omitempty"`
- Timeout Duration `json:"timeout,omitempty"`
- }
- type RouteActionResolve struct {
- Strategy DomainStrategy `json:"strategy,omitempty"`
- Server string `json:"server,omitempty"`
- }
|