| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 | package confimport (	"encoding/json"	"errors"	"strings"	"v2ray.com/core/common/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 (this StringList) Len() int {	return len(this)}func (this *StringList) UnmarshalJSON(data []byte) error {	var strarray []string	if err := json.Unmarshal(data, &strarray); err == nil {		*this = *NewStringList(strarray)		return nil	}	var rawstr string	if err := json.Unmarshal(data, &rawstr); err == nil {		strlist := strings.Split(rawstr, ",")		*this = *NewStringList(strlist)		return nil	}	return errors.New("Unknown format of a string list: " + string(data))}type Address struct {	v2net.Address}func (this *Address) UnmarshalJSON(data []byte) error {	var rawStr string	if err := json.Unmarshal(data, &rawStr); err != nil {		return err	}	this.Address = v2net.ParseAddress(rawStr)	return nil}func (this *Address) Build() *v2net.IPOrDomain {	if this.Family().IsDomain() {		return &v2net.IPOrDomain{			Address: &v2net.IPOrDomain_Domain{				Domain: this.Domain(),			},		}	}	return &v2net.IPOrDomain{		Address: &v2net.IPOrDomain_Ip{			Ip: []byte(this.IP()),		},	}}type Network stringfunc (this Network) Build() v2net.Network {	return v2net.ParseNetwork(string(this))}type NetworkList []Networkfunc (this *NetworkList) UnmarshalJSON(data []byte) error {	var strarray []Network	if err := json.Unmarshal(data, &strarray); err == nil {		nl := NetworkList(strarray)		*this = 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)		}		*this = nl		return nil	}	return errors.New("Unknown format of a string list: " + string(data))}func (this *NetworkList) Build() *v2net.NetworkList {	list := new(v2net.NetworkList)	for _, network := range *this {		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 (this *PortRange) Build() *v2net.PortRange {	return &v2net.PortRange{		From: this.From,		To:   this.To,	}}// UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSONfunc (this *PortRange) UnmarshalJSON(data []byte) error {	port, err := parseIntPort(data)	if err == nil {		this.From = uint32(port)		this.To = uint32(port)		return nil	}	from, to, err := parseStringPort(data)	if err == nil {		this.From = uint32(from)		this.To = uint32(to)		if this.From > this.To {			log.Error("Invalid port range ", this.From, " -> ", this.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 (this *User) Build() *protocol.User {	return &protocol.User{		Email: this.EmailString,		Level: uint32(this.LevelByte),	}}
 |