|
|
@@ -86,6 +86,57 @@ func WriteAuthentication(writer io.Writer, response *Socks5AuthenticationRespons
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+type Socks5UserPassRequest struct {
|
|
|
+ version byte
|
|
|
+ username string
|
|
|
+ password string
|
|
|
+}
|
|
|
+
|
|
|
+func (request Socks5UserPassRequest) IsValid(username string, password string) bool {
|
|
|
+ return request.username == username && request.password == password
|
|
|
+}
|
|
|
+
|
|
|
+func ReadUserPassRequest(reader io.Reader) (request Socks5UserPassRequest, err error) {
|
|
|
+ buffer := make([]byte, 256)
|
|
|
+ _, err = reader.Read(buffer[0:2])
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ request.version = buffer[0]
|
|
|
+ nUsername := buffer[1]
|
|
|
+ nBytes, err := reader.Read(buffer[:nUsername])
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ request.username = string(buffer[:nBytes])
|
|
|
+
|
|
|
+ _, err = reader.Read(buffer[0:1])
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ nPassword := buffer[0]
|
|
|
+ nBytes, err = reader.Read(buffer[:nPassword])
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ request.password = string(buffer[:nBytes])
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+type Socks5UserPassResponse struct {
|
|
|
+ version byte
|
|
|
+ status byte
|
|
|
+}
|
|
|
+
|
|
|
+func NewSocks5UserPassResponse(status byte) Socks5UserPassResponse {
|
|
|
+ return Socks5UserPassResponse{socksVersion, status}
|
|
|
+}
|
|
|
+
|
|
|
+func WriteUserPassResponse(writer io.Writer, response Socks5UserPassResponse) error {
|
|
|
+ _, err := writer.Write([]byte{response.version, response.status})
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
const (
|
|
|
AddrTypeIPv4 = byte(0x01)
|
|
|
AddrTypeIPv6 = byte(0x04)
|