| 
					
				 | 
			
			
				@@ -3,7 +3,9 @@ package socks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"errors" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"io" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "log" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"net" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "strconv" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/v2ray/v2ray-core" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	socksio "github.com/v2ray/v2ray-core/io/socks" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -26,8 +28,8 @@ func NewSocksServer(vp *core.VPoint) *SocksServer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return server 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (server *SocksServer) Listen(port uint8) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	listener, err := net.Listen("tcp", ":"+string(port)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (server *SocksServer) Listen(port uint16) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	listener, err := net.Listen("tcp", ":"+strconv.Itoa(int(port))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -40,6 +42,7 @@ func (server *SocksServer) AcceptConnections(listener net.Listener) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for server.accepting { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		connection, err := listener.Accept() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      log.Print(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		go server.HandleConnection(connection) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -52,10 +55,14 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	auth, err := socksio.ReadAuthentication(connection) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log.Print(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  log.Print(auth) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if auth.HasAuthMethod(socksio.AuthNotRequired) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !auth.HasAuthMethod(socksio.AuthNotRequired) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // TODO send response with FF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log.Print(ErrorAuthenticationFailed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return ErrorAuthenticationFailed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -64,15 +71,33 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	request, err := socksio.ReadRequest(connection) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log.Print(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  response := socksio.NewSocks5Response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if request.Command == socksio.CmdBind || request.Command == socksio.CmdUdpAssociate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		response := socksio.NewSocks5Response() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		response.Error = socksio.ErrorCommandNotSupported 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		socksio.WriteResponse(connection, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log.Print(ErrorCommandNotSupported) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return ErrorCommandNotSupported 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  response.Error = socksio.ErrorSuccess 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  response.Port = request.Port 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  response.AddrType = request.AddrType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  switch response.AddrType { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    case socksio.AddrTypeIPv4: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    copy(response.IPv4[:], request.IPv4[:]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    case socksio.AddrTypeIPv6: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    copy(response.IPv6[:], request.IPv6[:]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    case socksio.AddrTypeDomain: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response.Domain = request.Domain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  socksio.WriteResponse(connection, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	ray := server.vPoint.NewInboundConnectionAccepted(request.Destination()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	input := ray.InboundInput() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -90,7 +115,9 @@ func (server *SocksServer) dumpInput(conn net.Conn, input chan<- []byte, finish 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		buffer := make([]byte, 256) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		nBytes, err := conn.Read(buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log.Printf("Reading %d bytes, with error %v", nBytes, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err == io.EOF { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      close(input) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			finish <- true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -105,7 +132,8 @@ func (server *SocksServer) dumpOutput(conn net.Conn, output <-chan []byte, finis 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			finish <- true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		conn.Write(buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		nBytes, _ := conn.Write(buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log.Printf("Writing %d bytes", nBytes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |