From 5495b8bea565dab5f1a2e89c54f38d111d1c0695 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 16 Sep 2015 23:07:05 +0800 Subject: [PATCH 1/2] Add more error check and declare the field name in composite literal. --- id.go | 6 +++++- io/socks/socks.go | 5 ++++- net/address.go | 18 ++++++++++-------- net/socks/socks.go | 37 ++++++++++++++++++++++++++----------- net/vmess/config.go | 10 +++++++--- ray.go | 5 ++++- 6 files changed, 56 insertions(+), 25 deletions(-) diff --git a/id.go b/id.go index d00b3395..04cf0b4b 100644 --- a/id.go +++ b/id.go @@ -32,7 +32,11 @@ func NewID(id string) (ID, error) { md5hash.Write([]byte("c48619fe-8f02-49e0-b9e9-edf763e17e21")) cmdKey := md5.Sum(nil) - return ID{id, idBytes, cmdKey[:]}, nil + return ID{ + String: id, + Bytes: idBytes, + cmdKey: cmdKey[:], + }, nil } func (v ID) TimeRangeHash(rangeSec int) ([]byte, int64) { diff --git a/io/socks/socks.go b/io/socks/socks.go index bfbdfb9d..d124800d 100644 --- a/io/socks/socks.go +++ b/io/socks/socks.go @@ -129,7 +129,10 @@ type Socks5UserPassResponse struct { } func NewSocks5UserPassResponse(status byte) Socks5UserPassResponse { - return Socks5UserPassResponse{socksVersion, status} + return Socks5UserPassResponse{ + version: socksVersion, + status: status, + } } func WriteUserPassResponse(writer io.Writer, response Socks5UserPassResponse) error { diff --git a/net/address.go b/net/address.go index 5d6f62a9..a5518c9d 100644 --- a/net/address.go +++ b/net/address.go @@ -20,18 +20,20 @@ type Address struct { func IPAddress(ip []byte, port uint16) Address { // TODO: check IP length return Address{ - AddrTypeIP, - net.IP(ip), - "", - port} + Type: AddrTypeIP, + IP: net.IP(ip), + Domain: "", + Port: port, + } } func DomainAddress(domain string, port uint16) Address { return Address{ - AddrTypeDomain, - nil, - domain, - port} + Type: AddrTypeDomain, + IP: nil, + Domain: domain, + Port: port, + } } func (addr Address) IsIPv4() bool { diff --git a/net/socks/socks.go b/net/socks/socks.go index bd1dea33..bd7c45b0 100644 --- a/net/socks/socks.go +++ b/net/socks/socks.go @@ -49,16 +49,14 @@ func (server *SocksServer) Listen(port uint16) error { return nil } -func (server *SocksServer) AcceptConnections(listener net.Listener) error { +func (server *SocksServer) AcceptConnections(listener net.Listener) { for server.accepting { connection, err := listener.Accept() if err != nil { log.Error("Error on accepting socks connection: %v", err) - return err } go server.HandleConnection(connection) } - return nil } func (server *SocksServer) HandleConnection(connection net.Conn) error { @@ -79,15 +77,21 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error { if !auth.HasAuthMethod(expectedAuthMethod) { authResponse := socksio.NewAuthenticationResponse(socksio.AuthNoMatchingMethod) - socksio.WriteAuthentication(connection, authResponse) - + err = socksio.WriteAuthentication(connection, authResponse) + if err != nil { + log.Error("Error on socksio write authentication: %v", err) + return err + } log.Warning("Client doesn't support allowed any auth methods.") return ErrorAuthenticationFailed } authResponse := socksio.NewAuthenticationResponse(expectedAuthMethod) - socksio.WriteAuthentication(connection, authResponse) - + err = socksio.WriteAuthentication(connection, authResponse) + if err != nil { + log.Error("Error on socksio write authentication: %v", err) + return err + } if server.config.AuthMethod == JsonAuthMethodUserPass { upRequest, err := socksio.ReadUserPassRequest(reader) if err != nil { @@ -99,7 +103,11 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error { status = byte(0xFF) } upResponse := socksio.NewSocks5UserPassResponse(status) - socksio.WriteUserPassResponse(connection, upResponse) + err = socksio.WriteUserPassResponse(connection, upResponse) + if err != nil { + log.Error("Error on socksio write user pass response: %v", err) + return err + } if status != byte(0) { return ErrorInvalidUser } @@ -116,7 +124,11 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error { if request.Command == socksio.CmdBind || request.Command == socksio.CmdUdpAssociate { response := socksio.NewSocks5Response() response.Error = socksio.ErrorCommandNotSupported - socksio.WriteResponse(connection, response) + err = socksio.WriteResponse(connection, response) + if err != nil { + log.Error("Error on socksio write response: %v", err) + return err + } log.Warning("Unsupported socks command %d", request.Command) return ErrorCommandNotSupported } @@ -132,8 +144,11 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error { case socksio.AddrTypeDomain: response.Domain = request.Domain } - socksio.WriteResponse(connection, response) - + err = socksio.WriteResponse(connection, response) + if err != nil { + log.Error("Error on socksio write response: %v", err) + return err + } ray := server.vPoint.NewInboundConnectionAccepted(request.Destination()) input := ray.InboundInput() output := ray.InboundOutput() diff --git a/net/vmess/config.go b/net/vmess/config.go index bfd50834..4599e527 100644 --- a/net/vmess/config.go +++ b/net/vmess/config.go @@ -16,7 +16,10 @@ type VMessUser struct { func (u *VMessUser) ToUser() (core.User, error) { id, err := core.NewID(u.Id) - return core.User{id}, err + return core.User{ + Id: id, + Email: "", + }, err } type VMessInboundConfig struct { @@ -49,8 +52,9 @@ func (config VNextConfig) ToVNextServer() VNextServer { panic(log.Error("Unable to parse VNext IP: %s", config.Address)) } return VNextServer{ - v2net.IPAddress(ip, config.Port), - users} + Address: v2net.IPAddress(ip, config.Port), + Users: users, + } } type VMessOutboundConfig struct { diff --git a/ray.go b/ray.go index 313bdbc9..b0f7d41d 100644 --- a/ray.go +++ b/ray.go @@ -10,7 +10,10 @@ type Ray struct { } func NewRay() Ray { - return Ray{make(chan []byte, bufferSize), make(chan []byte, bufferSize)} + return Ray{ + Input: make(chan []byte, bufferSize), + Output: make(chan []byte, bufferSize), + } } type OutboundRay interface { From a41960c83b9eff1d24af2c5f455dc220f91e4855 Mon Sep 17 00:00:00 2001 From: V2 Ray Date: Wed, 16 Sep 2015 19:53:54 +0200 Subject: [PATCH 2/2] core.User doesn't have Id field. --- net/vmess/config.go | 1 - 1 file changed, 1 deletion(-) diff --git a/net/vmess/config.go b/net/vmess/config.go index 4599e527..2cf5d149 100644 --- a/net/vmess/config.go +++ b/net/vmess/config.go @@ -18,7 +18,6 @@ func (u *VMessUser) ToUser() (core.User, error) { id, err := core.NewID(u.Id) return core.User{ Id: id, - Email: "", }, err }