[tor-commits] [goptlib/master] Parse SOCKS userid parameters as SocksRequest.Args.

dcf at torproject.org dcf at torproject.org
Mon Dec 9 02:49:51 UTC 2013


commit a7d271a44bef29942d8a0c2489d61a5ddd2098a1
Author: David Fifield <david at bamsoftware.com>
Date:   Sat Dec 7 22:26:46 2013 -0800

    Parse SOCKS userid parameters as SocksRequest.Args.
---
 socks.go      |    7 +++++++
 socks_test.go |   28 ++++++++++++++++++----------
 2 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/socks.go b/socks.go
index 2ae1c5e..a3c5ede 100644
--- a/socks.go
+++ b/socks.go
@@ -22,6 +22,8 @@ type SocksRequest struct {
 	Username string
 	// The endpoint requested by the client as a "host:port" string.
 	Target string
+	// The parsed contents of Username as a key–value mapping.
+	Args Args
 }
 
 // SocksConn encapsulates a net.Conn and information associated with a SOCKS request.
@@ -145,6 +147,11 @@ func readSocks4aConnect(s io.Reader) (req SocksRequest, err error) {
 	}
 	req.Username = string(usernameBytes[:len(usernameBytes)-1])
 
+	req.Args, err = parseClientParameters(req.Username)
+	if err != nil {
+		return
+	}
+
 	var port int
 	var host string
 
diff --git a/socks_test.go b/socks_test.go
index 2fb8a8c..bcd4433 100644
--- a/socks_test.go
+++ b/socks_test.go
@@ -12,13 +12,15 @@ func TestReadSocks4aConnect(t *testing.T) {
 		// missing userid
 		[]byte("\x04\x01\x12\x34\x01\x02\x03\x04"),
 		// missing \x00 after userid
-		[]byte("\x04\x01\x12\x34\x01\x02\x03\x04userid"),
+		[]byte("\x04\x01\x12\x34\x01\x02\x03\x04key=value"),
 		// missing hostname
-		[]byte("\x04\x01\x12\x34\x00\x00\x00\x01userid\x00"),
+		[]byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00"),
 		// missing \x00 after hostname
-		[]byte("\x04\x01\x12\x34\x00\x00\x00\x01userid\x00hostname"),
+		[]byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00hostname"),
+		// bad name–value mapping
+		[]byte("\x04\x01\x12\x34\x00\x00\x00\x01userid\x00hostname\x00"),
 		// BIND request
-		[]byte("\x04\x02\x12\x34\x01\x02\x03\x04userid\x00"),
+		[]byte("\x04\x02\x12\x34\x01\x02\x03\x04\x00"),
 		// SOCKS5
 		[]byte("\x05\x01\x00"),
 	}
@@ -28,8 +30,8 @@ func TestReadSocks4aConnect(t *testing.T) {
 		addr   net.TCPAddr
 	}{
 		{
-			[]byte("\x04\x01\x12\x34\x01\x02\x03\x04userid\x00"),
-			"userid", net.TCPAddr{IP: net.ParseIP("1.2.3.4"), Port: 0x1234},
+			[]byte("\x04\x01\x12\x34\x01\x02\x03\x04key=value\x00"),
+			"key=value", net.TCPAddr{IP: net.ParseIP("1.2.3.4"), Port: 0x1234},
 		},
 		{
 			[]byte("\x04\x01\x12\x34\x01\x02\x03\x04\x00"),
@@ -42,16 +44,16 @@ func TestReadSocks4aConnect(t *testing.T) {
 		target string
 	}{
 		{
-			[]byte("\x04\x01\x12\x34\x00\x00\x00\x01userid\x00hostname\x00"),
-			"userid", "hostname:4660",
+			[]byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00hostname\x00"),
+			"key=value", "hostname:4660",
 		},
 		{
 			[]byte("\x04\x01\x12\x34\x00\x00\x00\x01\x00hostname\x00"),
 			"", "hostname:4660",
 		},
 		{
-			[]byte("\x04\x01\x12\x34\x00\x00\x00\x01userid\x00\x00"),
-			"userid", ":4660",
+			[]byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00\x00"),
+			"key=value", ":4660",
 		},
 		{
 			[]byte("\x04\x01\x12\x34\x00\x00\x00\x01\x00\x00"),
@@ -88,6 +90,9 @@ func TestReadSocks4aConnect(t *testing.T) {
 			t.Errorf("%q → address %s (expected %s)", test.input,
 				req.Target, test.addr.String())
 		}
+		if req.Args == nil {
+			t.Errorf("%q → unexpected nil Args from username %q", test.input, req.Username)
+		}
 	}
 
 	for _, test := range hostnameTests {
@@ -105,6 +110,9 @@ func TestReadSocks4aConnect(t *testing.T) {
 			t.Errorf("%q → target %q (expected %q)", test.input,
 				req.Target, test.target)
 		}
+		if req.Args == nil {
+			t.Errorf("%q → unexpected nil Args from username %q", test.input, req.Username)
+		}
 	}
 }
 





More information about the tor-commits mailing list