go-socks5/handle_test.go

138 lines
3.0 KiB
Go
Raw Normal View History

2014-01-23 22:07:39 +00:00
package socks5
import (
"bytes"
"io"
"log"
2014-01-23 22:07:39 +00:00
"net"
"os"
2014-01-23 22:07:39 +00:00
"testing"
2020-08-05 09:32:37 +00:00
"github.com/stretchr/testify/require"
2022-10-17 01:36:23 +00:00
"git.tcp.direct/kayos/go-socks5/bufferpool"
"git.tcp.direct/kayos/go-socks5/statute"
2014-01-23 22:07:39 +00:00
)
type MockConn struct {
buf bytes.Buffer
}
func (m *MockConn) Write(b []byte) (int, error) {
return m.buf.Write(b)
}
func (m *MockConn) RemoteAddr() net.Addr {
return &net.TCPAddr{IP: []byte{127, 0, 0, 1}, Port: 65432}
}
func TestRequest_Connect(t *testing.T) {
// Create a local listener
l, err := net.Listen("tcp", "127.0.0.1:0")
2020-08-05 09:32:37 +00:00
require.NoError(t, err)
2014-01-23 22:07:39 +00:00
go func() {
conn, err := l.Accept()
2020-08-05 09:32:37 +00:00
require.NoError(t, err)
2020-08-30 03:15:05 +00:00
defer conn.Close()
2014-01-23 22:07:39 +00:00
buf := make([]byte, 4)
2020-08-05 09:32:37 +00:00
_, err = io.ReadAtLeast(conn, buf, 4)
require.NoError(t, err)
require.Equal(t, []byte("ping"), buf)
conn.Write([]byte("pong")) // nolint: errcheck
2014-01-23 22:07:39 +00:00
}()
lAddr := l.Addr().(*net.TCPAddr)
// Make proxy server
2020-08-05 09:32:37 +00:00
proxySrv := &Server{
2020-08-05 06:40:07 +00:00
rules: NewPermitAll(),
2020-04-20 13:17:38 +00:00
resolver: DNSResolver{},
logger: NewLogger(log.New(os.Stdout, "socks5: ", log.LstdFlags)),
bufferPool: bufferpool.NewPool(32 * 1024),
2020-04-20 01:50:49 +00:00
}
2014-01-23 22:07:39 +00:00
// Create the connect request
buf := bytes.NewBuffer([]byte{
statute.VersionSocks5, statute.CommandConnect, 0,
2020-08-06 01:20:43 +00:00
statute.ATYPIPv4, 127, 0, 0, 1, byte(lAddr.Port >> 8), byte(lAddr.Port),
})
2014-01-23 22:07:39 +00:00
// Send a ping
2020-08-30 03:15:05 +00:00
buf.Write([]byte("ping"))
2014-01-23 22:07:39 +00:00
// Handle the request
rsp := new(MockConn)
req, err := ParseRequest(buf)
2020-08-05 09:32:37 +00:00
require.NoError(t, err)
err = proxySrv.handleRequest(rsp, req)
2020-08-05 09:32:37 +00:00
require.NoError(t, err)
2014-01-23 22:07:39 +00:00
// Verify response
out := rsp.buf.Bytes()
2014-01-23 22:07:39 +00:00
expected := []byte{
statute.VersionSocks5, statute.RepSuccess, 0,
statute.ATYPIPv4, 127, 0, 0, 1, 0, 0,
2014-01-23 22:07:39 +00:00
'p', 'o', 'n', 'g',
}
2014-01-24 22:31:58 +00:00
// Ignore the port for both
out[8] = 0
out[9] = 0
2020-08-05 09:32:37 +00:00
require.Equal(t, expected, out)
2014-01-23 22:07:39 +00:00
}
2014-02-13 18:49:35 +00:00
func TestRequest_Connect_RuleFail(t *testing.T) {
// Create a local listener
l, err := net.Listen("tcp", "127.0.0.1:0")
2020-08-05 09:32:37 +00:00
require.NoError(t, err)
2014-02-13 18:49:35 +00:00
go func() {
conn, err := l.Accept()
2020-08-05 09:32:37 +00:00
require.NoError(t, err)
2014-02-13 18:49:35 +00:00
defer conn.Close()
buf := make([]byte, 4)
2020-08-05 09:32:37 +00:00
_, err = io.ReadAtLeast(conn, buf, 4)
require.NoError(t, err)
require.Equal(t, []byte("ping"), buf)
2020-08-05 09:32:37 +00:00
conn.Write([]byte("pong")) // nolint: errcheck
2014-02-13 18:49:35 +00:00
}()
lAddr := l.Addr().(*net.TCPAddr)
// Make server
2020-04-20 01:50:49 +00:00
s := &Server{
2020-08-05 06:40:07 +00:00
rules: NewPermitNone(),
2020-04-20 13:17:38 +00:00
resolver: DNSResolver{},
logger: NewLogger(log.New(os.Stdout, "socks5: ", log.LstdFlags)),
bufferPool: bufferpool.NewPool(32 * 1024),
2020-04-20 01:50:49 +00:00
}
2014-02-13 18:49:35 +00:00
// Create the connect request
buf := bytes.NewBuffer([]byte{
statute.VersionSocks5, statute.CommandConnect, 0,
2020-08-06 01:20:43 +00:00
statute.ATYPIPv4, 127, 0, 0, 1, byte(lAddr.Port >> 8), byte(lAddr.Port),
})
2014-02-13 18:49:35 +00:00
// Send a ping
buf.Write([]byte("ping"))
2014-02-13 18:49:35 +00:00
// Handle the request
rsp := new(MockConn)
req, err := ParseRequest(buf)
2020-08-05 09:32:37 +00:00
require.NoError(t, err)
err = s.handleRequest(rsp, req)
2020-08-05 09:32:37 +00:00
require.Contains(t, err.Error(), "blocked by rules")
2014-02-13 18:49:35 +00:00
// Verify response
out := rsp.buf.Bytes()
2014-02-13 18:49:35 +00:00
expected := []byte{
statute.VersionSocks5, statute.RepRuleFailure, 0,
statute.ATYPIPv4, 0, 0, 0, 0, 0, 0,
2014-02-13 18:49:35 +00:00
}
2020-08-05 09:32:37 +00:00
require.Equal(t, expected, out)
2014-02-13 18:49:35 +00:00
}