|
|
|
@ -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() |
|
|
|
|