| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 | package confimport (	"encoding/json"	"strings"	"v2ray.com/core/common/errors"	"v2ray.com/core/app/log"	v2net "v2ray.com/core/common/net"	"v2ray.com/core/common/protocol")type StringList []stringfunc NewStringList(raw []string) *StringList {	list := StringList(raw)	return &list}func (v StringList) Len() int {	return len(v)}func (v *StringList) UnmarshalJSON(data []byte) error {	var strarray []string	if err := json.Unmarshal(data, &strarray); err == nil {		*v = *NewStringList(strarray)		return nil	}	var rawstr string	if err := json.Unmarshal(data, &rawstr); err == nil {		strlist := strings.Split(rawstr, ",")		*v = *NewStringList(strlist)		return nil	}	return errors.New("Unknown format of a string list: " + string(data))}type Address struct {	v2net.Address}func (v *Address) UnmarshalJSON(data []byte) error {	var rawStr string	if err := json.Unmarshal(data, &rawStr); err != nil {		return err	}	v.Address = v2net.ParseAddress(rawStr)	return nil}func (v *Address) Build() *v2net.IPOrDomain {	return v2net.NewIPOrDomain(v.Address)}type Network stringfunc (v Network) Build() v2net.Network {	return v2net.ParseNetwork(string(v))}type NetworkList []Networkfunc (v *NetworkList) UnmarshalJSON(data []byte) error {	var strarray []Network	if err := json.Unmarshal(data, &strarray); err == nil {		nl := NetworkList(strarray)		*v = nl		return nil	}	var rawstr Network	if err := json.Unmarshal(data, &rawstr); err == nil {		strlist := strings.Split(string(rawstr), ",")		nl := make([]Network, len(strlist))		for idx, network := range strlist {			nl[idx] = Network(network)		}		*v = nl		return nil	}	return errors.New("Unknown format of a string list: " + string(data))}func (v *NetworkList) Build() *v2net.NetworkList {	if v == nil {		return &v2net.NetworkList{			Network: []v2net.Network{v2net.Network_TCP},		}	}	list := new(v2net.NetworkList)	for _, network := range *v {		list.Network = append(list.Network, network.Build())	}	return list}func parseIntPort(data []byte) (v2net.Port, error) {	var intPort uint32	err := json.Unmarshal(data, &intPort)	if err != nil {		return v2net.Port(0), err	}	return v2net.PortFromInt(intPort)}func parseStringPort(data []byte) (v2net.Port, v2net.Port, error) {	var s string	err := json.Unmarshal(data, &s)	if err != nil {		return v2net.Port(0), v2net.Port(0), err	}	pair := strings.SplitN(s, "-", 2)	if len(pair) == 0 {		return v2net.Port(0), v2net.Port(0), v2net.ErrInvalidPortRange	}	if len(pair) == 1 {		port, err := v2net.PortFromString(pair[0])		return port, port, err	}	fromPort, err := v2net.PortFromString(pair[0])	if err != nil {		return v2net.Port(0), v2net.Port(0), err	}	toPort, err := v2net.PortFromString(pair[1])	if err != nil {		return v2net.Port(0), v2net.Port(0), err	}	return fromPort, toPort, nil}type PortRange struct {	From uint32	To   uint32}func (v *PortRange) Build() *v2net.PortRange {	return &v2net.PortRange{		From: v.From,		To:   v.To,	}}// UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSONfunc (v *PortRange) UnmarshalJSON(data []byte) error {	port, err := parseIntPort(data)	if err == nil {		v.From = uint32(port)		v.To = uint32(port)		return nil	}	from, to, err := parseStringPort(data)	if err == nil {		v.From = uint32(from)		v.To = uint32(to)		if v.From > v.To {			log.Error("Invalid port range ", v.From, " -> ", v.To)			return v2net.ErrInvalidPortRange		}		return nil	}	log.Error("Invalid port range: ", string(data))	return v2net.ErrInvalidPortRange}type User struct {	EmailString string `json:"email"`	LevelByte   byte   `json:"level"`}func (v *User) Build() *protocol.User {	return &protocol.User{		Email: v.EmailString,		Level: uint32(v.LevelByte),	}}
 |