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 *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 internal.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 internal.ErrBadConfiguration } if rec.Address == nil { log.Error("VMess: Address is not set in VMess outbound config.") return internal.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(2891346854, 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 *VMessOutboundHandler) handleSwitchAccount(cmd *protocol.CommandSwitchAccount) { primary := protocol.NewID(cmd.ID) alters := protocol.NewAlterIDs(primary, cmd.AlterIds) account := &vmess.Account{ ID: primary, AlterIDs: alters, } user := protocol.NewUser(cmd.Level, "") user.Account = account dest := v2net.TCPDestination(cmd.Host, cmd.Port) until := time.Now().Add(time.Duration(cmd.ValidMin) * time.Minute) this.serverList.AddServer(protocol.NewServerSpec(dest, protocol.BeforeTime(until), user)) }