diff --git a/io/jsonvconfigmarshaller.go b/io/jsonvconfigmarshaller.go index 1d80b9b6..4261845e 100644 --- a/io/jsonvconfigmarshaller.go +++ b/io/jsonvconfigmarshaller.go @@ -12,7 +12,6 @@ type JsonVUser struct { } type JsonVConfig struct { - RunAs string `json:"runas"` Port uint8 `json:"port"` Clients []JsonVUser `json:"users"` Protocol string `json:"protocol"` @@ -32,6 +31,5 @@ func (*JsonVConfigUnmarshaller) Unmarshall(data []byte) (*core.VConfig, error) { return nil, err } var vconfig = new(core.VConfig) - vconfig.RunAs = core.VUser{} return vconfig, nil } diff --git a/io/socks/socks.go b/io/socks/socks.go new file mode 100644 index 00000000..347b67ea --- /dev/null +++ b/io/socks/socks.go @@ -0,0 +1,66 @@ +// Package socks contains protocol definition and io lib for SOCKS5 protocol +package socks + +import ( + "fmt" + "io" +) + +const ( + socksVersion = uint8(5) +) + +// Authentication request header of Socks5 protocol +type Socks5AuthenticationRequest struct { + version byte + authMethods [256]byte +} + +func ReadAuthentication(reader io.Reader) (auth Socks5AuthenticationRequest, err error) { + buffer := make([]byte, 2) + nBytes, err := reader.Read(buffer) + if err != nil { + return + } + if nBytes < 2 { + err = fmt.Errorf("Expected 2 bytes read, but actaully %d bytes read", nBytes) + return + } + + auth.version = buffer[0] + if auth.version != socksVersion { + err = fmt.Errorf("Unknown SOCKS version %d", auth.version) + return + } + + nMethods := buffer[1] + if nMethods <= 0 { + err = fmt.Errorf("Zero length of authentication methods") + return + } + + buffer = make([]byte, nMethods) + nBytes, err = reader.Read(buffer) + copy(auth.authMethods[:nBytes], buffer) + return +} + +type Socks5AuthenticationResponse struct { + version byte + authMethod byte +} + +func (r *Socks5AuthenticationResponse) ToBytes() []byte { + buffer := make([]byte, 2 /* size of Socks5AuthenticationResponse */) + buffer[0] = r.version + buffer[1] = r.authMethod + return buffer +} + +func WriteAuthentication(writer io.Writer, response Socks5AuthenticationResponse) error { + _, err := writer.Write(response.ToBytes()) + if err != nil { + return err + } + return nil +} diff --git a/io/vmessreader.go b/io/vmess/vmess.go similarity index 90% rename from io/vmessreader.go rename to io/vmess/vmess.go index 957eeae9..622aed3c 100644 --- a/io/vmessreader.go +++ b/io/vmess/vmess.go @@ -1,4 +1,5 @@ -package io +// Package vmess contains protocol definition, io lib for VMess. +package vmess import ( "net"