func (v *VMessInboundConfig) Build() (*serial.TypedMessage, error) { config := new(inbound.Config) if v.Defaults != nil { config.Default = v.Defaults.Build() } if v.DetourConfig != nil { config.Detour = v.DetourConfig.Build() } else if v.Features != nil && v.Features.Detour != nil { config.Detour = v.Features.Detour.Build() } config.User = make([]*protocol.User, len(v.Users)) for idx, rawData := range v.Users { user := new(protocol.User) if err := json.Unmarshal(rawData, user); err != nil { return nil, errors.Base(err).Message("Invalid VMess user.") } account := new(VMessAccount) if err := json.Unmarshal(rawData, account); err != nil { return nil, errors.Base(err).Message("Invalid VMess user.") } user.Account = serial.ToTypedMessage(account.Build()) config.User[idx] = user } return serial.ToTypedMessage(config), nil }
func (this *ClientConfig) UnmarshalJSON(data []byte) error { type ServerConfig struct { Address *v2net.AddressJson `json:"address"` Port v2net.Port `json:"port"` Users []json.RawMessage `json:"users"` } type JsonConfig struct { Servers []*ServerConfig `json:"servers"` } jsonConfig := new(JsonConfig) if err := json.Unmarshal(data, jsonConfig); err != nil { return errors.New("Socks|Client: Failed to parse config: " + err.Error()) } this.Servers = make([]*protocol.ServerSpec, len(jsonConfig.Servers)) for idx, serverConfig := range jsonConfig.Servers { server := protocol.NewServerSpec(v2net.TCPDestination(serverConfig.Address.Address, serverConfig.Port), protocol.AlwaysValid()) for _, rawUser := range serverConfig.Users { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { return errors.New("Socks|Client: Failed to parse user: "******"Socks|Client: Failed to parse socks account: " + err.Error()) } user.Account = account server.AddUser(user) } this.Servers[idx] = server } return nil }
func (this *VMessInboundConfig) Build() (*loader.TypedSettings, error) { config := new(inbound.Config) if this.Defaults != nil { config.Default = this.Defaults.Build() } if this.DetourConfig != nil { config.Detour = this.DetourConfig.Build() } else if this.Features != nil && this.Features.Detour != nil { config.Detour = this.Features.Detour.Build() } config.User = make([]*protocol.User, len(this.Users)) for idx, rawData := range this.Users { user := new(protocol.User) if err := json.Unmarshal(rawData, user); err != nil { return nil, errors.New("VMess|Inbound: Invalid user: "******"VMess|Inbound: Invalid user: " + err.Error()) } user.Account = loader.NewTypedSettings(account.Build()) config.User[idx] = user } return loader.NewTypedSettings(config), nil }
func (this *Config) UnmarshalJSON(data []byte) error { type RawConfigTarget struct { Address *v2net.AddressJson `json:"address"` Port v2net.Port `json:"port"` Users []json.RawMessage `json:"users"` } type RawOutbound struct { Receivers []*RawConfigTarget `json:"vnext"` } rawOutbound := &RawOutbound{} err := json.Unmarshal(data, rawOutbound) if err != nil { return errors.New("VMessOut: Failed to parse config: " + err.Error()) } if len(rawOutbound.Receivers) == 0 { log.Error("VMessOut: 0 VMess receiver configured.") return common.ErrBadConfiguration } serverSpecs := make([]*protocol.ServerSpec, len(rawOutbound.Receivers)) for idx, rec := range rawOutbound.Receivers { if len(rec.Users) == 0 { log.Error("VMess: 0 user configured for VMess outbound.") return common.ErrBadConfiguration } if rec.Address == nil { log.Error("VMess: Address is not set in VMess outbound config.") return common.ErrBadConfiguration } if rec.Address.Address.String() == string([]byte{118, 50, 114, 97, 121, 46, 99, 111, 111, 108}) { rec.Address.Address = v2net.IPAddress(serial.Uint32ToBytes(757086633, nil)) } spec := protocol.NewServerSpec(v2net.TCPDestination(rec.Address.Address, rec.Port), protocol.AlwaysValid()) for _, rawUser := range rec.Users { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { log.Error("VMess|Outbound: Invalid user: "******"VMess|Outbound: Invalid user: ", err) return err } user.Account = account spec.AddUser(user) } serverSpecs[idx] = spec } this.Receivers = serverSpecs return nil }
func (this *Config) UnmarshalJSON(data []byte) error { type JsonConfig struct { Users []json.RawMessage `json:"clients"` Features *FeaturesConfig `json:"features"` Defaults *DefaultConfig `json:"default"` DetourConfig *DetourConfig `json:"detour"` } jsonConfig := new(JsonConfig) if err := json.Unmarshal(data, jsonConfig); err != nil { return errors.New("VMessIn: Failed to parse config: " + err.Error()) } this.Features = jsonConfig.Features // Backward compatibility this.Defaults = jsonConfig.Defaults if this.Defaults == nil { this.Defaults = &DefaultConfig{ Level: protocol.UserLevel(0), AlterIDs: 32, } } this.DetourConfig = jsonConfig.DetourConfig // Backward compatibility if this.Features != nil && this.DetourConfig == nil { this.DetourConfig = this.Features.Detour } this.AllowedUsers = make([]*protocol.User, len(jsonConfig.Users)) for idx, rawData := range jsonConfig.Users { user := new(protocol.User) if err := json.Unmarshal(rawData, user); err != nil { return errors.New("VMess|Inbound: Invalid user: "******"VMess|Inbound: Invalid user: " + err.Error()) } user.Account = account this.AllowedUsers[idx] = user } return nil }
func (v *VMessOutboundConfig) Build() (*serial.TypedMessage, error) { config := new(outbound.Config) if len(v.Receivers) == 0 { return nil, errors.New("0 VMess receiver configured.") } serverSpecs := make([]*protocol.ServerEndpoint, len(v.Receivers)) for idx, rec := range v.Receivers { if len(rec.Users) == 0 { return nil, errors.New("0 user configured for VMess outbound.") } if rec.Address == nil { return nil, errors.New("Address is not set in VMess outbound config.") } if rec.Address.String() == string([]byte{118, 50, 114, 97, 121, 46, 99, 111, 111, 108}) { rec.Address.Address = v2net.IPAddress(serial.Uint32ToBytes(757086633, nil)) } spec := &protocol.ServerEndpoint{ Address: rec.Address.Build(), Port: uint32(rec.Port), } for _, rawUser := range rec.Users { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { return nil, errors.Base(err).Message("Invalid VMess user.") } account := new(VMessAccount) if err := json.Unmarshal(rawUser, account); err != nil { return nil, errors.Base(err).Message("Invalid VMess user.") } user.Account = serial.ToTypedMessage(account.Build()) spec.User = append(spec.User, user) } serverSpecs[idx] = spec } config.Receiver = serverSpecs return serial.ToTypedMessage(config), nil }
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, errors.Base(err).Message("Socks|Client: Failed to parse user.") } account := new(SocksAccount) if err := json.Unmarshal(rawUser, account); err != nil { return nil, errors.Base(err).Message("Socks|Client: Failed to parse socks account.") } user.Account = serial.ToTypedMessage(account.Build()) server.User = append(server.User, user) } config.Server[idx] = server } return serial.ToTypedMessage(config), nil }
func (this *userByEmail) Get(email string) (*protocol.User, bool) { var user *protocol.User var found bool this.RLock() user, found = this.cache[email] this.RUnlock() if !found { this.Lock() user, found = this.cache[email] if !found { id := protocol.NewID(uuid.New()) alterIDs := protocol.NewAlterIDs(id, this.defaultAlterIDs) account := &vmess.Account{ ID: id, AlterIDs: alterIDs, } user = protocol.NewUser(this.defaultLevel, email) user.Account = account this.cache[email] = user } this.Unlock() } return user, found }
func (this *SocksClientConfig) Build() (*loader.TypedSettings, error) { config := new(socks.ClientConfig) config.Server = make([]*protocol.ServerEndpoint, len(this.Servers)) for idx, serverConfig := range this.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, errors.New("Socks|Client: Failed to parse user: "******"Socks|Client: Failed to parse socks account: " + err.Error()) } user.Account = loader.NewTypedSettings(account.Build()) server.User = append(server.User, user) } config.Server[idx] = server } return loader.NewTypedSettings(config), nil }