| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | 
							- package socks
 
- import (
 
- 	"errors"
 
- 	"net"
 
- 	socksio "github.com/v2ray/v2ray-core/io/socks"
 
- )
 
- var (
 
- 	ErrorAuthenticationFailed = errors.New("None of the authentication methods is allowed.")
 
- 	ErrorCommandNotSupported  = errors.New("Client requested an unsupported command.")
 
- )
 
- // SocksServer is a SOCKS 5 proxy server
 
- type SocksServer struct {
 
- 	accepting bool
 
- }
 
- func (server *SocksServer) Listen(port uint8) error {
 
- 	listener, err := net.Listen("tcp", ":"+string(port))
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	server.accepting = true
 
- 	go server.AcceptConnections(listener)
 
- 	return nil
 
- }
 
- func (server *SocksServer) AcceptConnections(listener net.Listener) error {
 
- 	for server.accepting {
 
- 		connection, err := listener.Accept()
 
- 		if err != nil {
 
- 			return err
 
- 		}
 
- 		go server.HandleConnection(connection)
 
- 	}
 
- 	return nil
 
- }
 
- func (server *SocksServer) HandleConnection(connection net.Conn) error {
 
- 	defer connection.Close()
 
- 	auth, err := socksio.ReadAuthentication(connection)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	if auth.HasAuthMethod(socksio.AuthNotRequired) {
 
- 		return ErrorAuthenticationFailed
 
- 	}
 
- 	authResponse := socksio.NewAuthenticationResponse(socksio.AuthNotRequired)
 
- 	socksio.WriteAuthentication(connection, authResponse)
 
- 	request, err := socksio.ReadRequest(connection)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	if request.Command == socksio.CmdBind || request.Command == socksio.CmdUdpAssociate {
 
- 		response := socksio.NewSocks5Response()
 
- 		response.Error = socksio.ErrorCommandNotSupported
 
- 		socksio.WriteResponse(connection, response)
 
- 		return ErrorCommandNotSupported
 
- 	}
 
- 	// TODO: establish connection with VNext
 
- 	return nil
 
- }
 
 
  |