| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | package confimport (	"encoding/json"	"v2ray.com/core/common/protocol"	"v2ray.com/core/common/serial"	"v2ray.com/core/proxy/socks")type SocksAccount struct {	Username string `json:"user"`	Password string `json:"pass"`}func (v *SocksAccount) Build() *socks.Account {	return &socks.Account{		Username: v.Username,		Password: v.Password,	}}const (	AuthMethodNoAuth   = "noauth"	AuthMethodUserPass = "password")type SocksServerConfig struct {	AuthMethod string          `json:"auth"`	Accounts   []*SocksAccount `json:"accounts"`	UDP        bool            `json:"udp"`	Host       *Address        `json:"ip"`	Timeout    uint32          `json:"timeout"`}func (v *SocksServerConfig) Build() (*serial.TypedMessage, error) {	config := new(socks.ServerConfig)	if v.AuthMethod == AuthMethodNoAuth {		config.AuthType = socks.AuthType_NO_AUTH	} else if v.AuthMethod == AuthMethodUserPass {		config.AuthType = socks.AuthType_PASSWORD	} else {		return nil, newError("unknown socks auth method: " + v.AuthMethod).AtError()	}	if len(v.Accounts) > 0 {		config.Accounts = make(map[string]string, len(v.Accounts))		for _, account := range v.Accounts {			config.Accounts[account.Username] = account.Password		}	}	config.UdpEnabled = v.UDP	if v.Host != nil {		config.Address = v.Host.Build()	}	config.Timeout = v.Timeout	return serial.ToTypedMessage(config), nil}type SocksRemoteConfig struct {	Address *Address          `json:"address"`	Port    uint16            `json:"port"`	Users   []json.RawMessage `json:"users"`}type SocksClientConfig struct {	Servers []*SocksRemoteConfig `json:"servers"`}func (v *SocksClientConfig) Build() (*serial.TypedMessage, error) {	config := new(socks.ClientConfig)	config.Server = make([]*protocol.ServerEndpoint, len(v.Servers))	for idx, serverConfig := range v.Servers {		server := &protocol.ServerEndpoint{			Address: serverConfig.Address.Build(),			Port:    uint32(serverConfig.Port),		}		for _, rawUser := range serverConfig.Users {			user := new(protocol.User)			if err := json.Unmarshal(rawUser, user); err != nil {				return nil, newError("failed to parse Socks user").Base(err).AtError()			}			account := new(SocksAccount)			if err := json.Unmarshal(rawUser, account); err != nil {				return nil, newError("failed to parse socks account").Base(err).AtError()			}			user.Account = serial.ToTypedMessage(account.Build())			server.User = append(server.User, user)		}		config.Server[idx] = server	}	return serial.ToTypedMessage(config), nil}
 |