[Pkg-privacy-commits] [obfs4proxy] 66/151: Move the SOCKS4 code off into it's own little getto.

Ximin Luo infinity0 at moszumanska.debian.org
Sat Aug 22 12:59:39 UTC 2015


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository obfs4proxy.

commit f0d8923a9a864f70b658dd86e67feb373d8f879f
Author: Yawning Angel <yawning at schwanenlied.me>
Date:   Sun May 25 11:00:25 2014 +0000

    Move the SOCKS4 code off into it's own little getto.
    
    Part of issue #7.
---
 obfs4proxy/proxy_extras.go                      | 107 ------------------------
 obfs4proxy/{proxy_extras.go => proxy_socks4.go} |  52 +++++++-----
 2 files changed, 29 insertions(+), 130 deletions(-)

diff --git a/obfs4proxy/proxy_extras.go b/obfs4proxy/proxy_extras.go
index 080e6b0..27b638b 100644
--- a/obfs4proxy/proxy_extras.go
+++ b/obfs4proxy/proxy_extras.go
@@ -28,11 +28,7 @@
 package main
 
 import (
-	"errors"
-	"io"
-	"net"
 	"net/url"
-	"strconv"
 
 	"code.google.com/p/go.net/proxy"
 
@@ -53,106 +49,3 @@ func getProxyDialer(uri *url.URL) (obfs4.DialFn, error) {
 
 	return dialer.Dial, nil
 }
-
-// socks4 is a SOCKSv4 proxy.
-type socks4 struct {
-	hostPort string
-	username string
-	forward  proxy.Dialer
-}
-
-const (
-	socks4Version        = 0x04
-	socks4CommandConnect = 0x01
-	socks4Null           = 0x00
-	socks4ReplyVersion   = 0x00
-
-	socks4Granted = 0x5a
-)
-
-func newSOCKS4(uri *url.URL, forward proxy.Dialer) (proxy.Dialer, error) {
-	s := new(socks4)
-	s.hostPort = uri.Host
-	s.forward = forward
-	if uri.User != nil {
-		s.username = uri.User.Username()
-	}
-	return s, nil
-}
-
-func (s *socks4) Dial(network, addr string) (net.Conn, error) {
-	if network != "tcp" && network != "tcp4" {
-		return nil, errors.New("invalid network type")
-	}
-
-	// Deal with the destination address/string.
-	ipStr, portStr, err := net.SplitHostPort(addr)
-	if err != nil {
-		return nil, err
-	}
-	ip := net.ParseIP(ipStr)
-	if ip == nil {
-		return nil, errors.New("failed to parse destination IP")
-	}
-	ip4 := ip.To4()
-	if ip4 == nil {
-		return nil, errors.New("destination address is not IPv4")
-	}
-	port, err := strconv.ParseUint(portStr, 10, 16)
-	if err != nil {
-		return nil, err
-	}
-
-	// Connect to the proxy.
-	c, err := s.forward.Dial("tcp", s.hostPort)
-	if err != nil {
-		return nil, err
-	}
-
-	// Make/write the request:
-	//  +----+----+----+----+----+----+----+----+----+----+....+----+
-	//  | VN | CD | DSTPORT |      DSTIP        | USERID       |NULL|
-	//  +----+----+----+----+----+----+----+----+----+----+....+----+
-
-	req := make([]byte, 0, 9+len(s.username))
-	req = append(req, socks4Version)
-	req = append(req, socks4CommandConnect)
-	req = append(req, byte(port>>8), byte(port))
-	req = append(req, ip4...)
-	if s.username != "" {
-		req = append(req, s.username...)
-	}
-	req = append(req, socks4Null)
-	_, err = c.Write(req)
-	if err != nil {
-		c.Close()
-		return nil, err
-	}
-
-	// Read the response:
-	// +----+----+----+----+----+----+----+----+
-	// | VN | CD | DSTPORT |      DSTIP        |
-	// +----+----+----+----+----+----+----+----+
-
-	var resp [8]byte
-	_, err = io.ReadFull(c, resp[:])
-	if err != nil {
-		c.Close()
-		return nil, err
-	}
-	if resp[0] != socks4ReplyVersion {
-		c.Close()
-		return nil, errors.New("proxy returned invalid SOCKS4 version")
-	}
-	if resp[1] != socks4Granted {
-		c.Close()
-		return nil, errors.New("proxy rejected the connect request")
-	}
-
-	return c, nil
-}
-
-func init() {
-	// Despite the scheme name, this really is SOCKS4.
-	proxy.RegisterDialerType("socks4a", newSOCKS4)
-}
diff --git a/obfs4proxy/proxy_extras.go b/obfs4proxy/proxy_socks4.go
similarity index 78%
copy from obfs4proxy/proxy_extras.go
copy to obfs4proxy/proxy_socks4.go
index 080e6b0..9d6bd4d 100644
--- a/obfs4proxy/proxy_extras.go
+++ b/obfs4proxy/proxy_socks4.go
@@ -23,39 +23,29 @@
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This is inspired by go.net/proxy/socks5.go:
+ *
+ * Copyright 2011 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
  */
 
 package main
 
 import (
 	"errors"
+	"fmt"
 	"io"
 	"net"
 	"net/url"
 	"strconv"
 
 	"code.google.com/p/go.net/proxy"
-
-	"github.com/yawning/obfs4"
 )
 
-// getProxyDialer is a trival wrapper around the go.net/proxy package to avoid
-// having it as a dependency for anything else.
-func getProxyDialer(uri *url.URL) (obfs4.DialFn, error) {
-	if uri == nil {
-		return proxy.Direct.Dial, nil
-	}
-
-	dialer, err := proxy.FromURL(uri, proxy.Direct)
-	if err != nil {
-		return nil, err
-	}
-
-	return dialer.Dial, nil
-}
-
-// socks4 is a SOCKSv4 proxy.
-type socks4 struct {
+// socks4Proxy is a SOCKS4 proxy.
+type socks4Proxy struct {
 	hostPort string
 	username string
 	forward  proxy.Dialer
@@ -67,11 +57,14 @@ const (
 	socks4Null           = 0x00
 	socks4ReplyVersion   = 0x00
 
-	socks4Granted = 0x5a
+	socks4Granted                = 0x5a
+	socks4Rejected               = 0x5b
+	socks4RejectedIdentdFailed   = 0x5c
+	socks4RejectedIdentdMismatch = 0x5d
 )
 
 func newSOCKS4(uri *url.URL, forward proxy.Dialer) (proxy.Dialer, error) {
-	s := new(socks4)
+	s := new(socks4Proxy)
 	s.hostPort = uri.Host
 	s.forward = forward
 	if uri.User != nil {
@@ -80,7 +73,7 @@ func newSOCKS4(uri *url.URL, forward proxy.Dialer) (proxy.Dialer, error) {
 	return s, nil
 }
 
-func (s *socks4) Dial(network, addr string) (net.Conn, error) {
+func (s *socks4Proxy) Dial(network, addr string) (net.Conn, error) {
 	if network != "tcp" && network != "tcp4" {
 		return nil, errors.New("invalid network type")
 	}
@@ -146,12 +139,25 @@ func (s *socks4) Dial(network, addr string) (net.Conn, error) {
 	}
 	if resp[1] != socks4Granted {
 		c.Close()
-		return nil, errors.New("proxy rejected the connect request")
+		return nil, fmt.Errorf("proxy error: %s", socks4ErrorToString(resp[1]))
 	}
 
 	return c, nil
 }
 
+func socks4ErrorToString(code byte) string {
+	switch code {
+	case socks4Rejected:
+		return "request rejected or failed"
+	case socks4RejectedIdentdFailed:
+		return "request rejected becasue SOCKS server cannot connect to identd on the client"
+	case socks4RejectedIdentdMismatch:
+		return "request rejected because the client program and identd report different user-ids"
+	default:
+		return fmt.Sprintf("unknown failure code %x", code)
+	}
+}
+
 func init() {
 	// Despite the scheme name, this really is SOCKS4.
 	proxy.RegisterDialerType("socks4a", newSOCKS4)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/obfs4proxy.git



More information about the Pkg-privacy-commits mailing list