func clientSocksAuth(conn net.Conn, username, password string) error { if err := gosocks5.NewUserPassRequest( gosocks5.UserPassVer, username, password).Write(conn); err != nil { return err } res, err := gosocks5.ReadUserPassResponse(conn) if err != nil { return err } if res.Status != gosocks5.Succeeded { return gosocks5.ErrAuthFailure } return nil }
func (selector *clientSelector) OnSelected(method uint8, conn net.Conn) (net.Conn, error) { switch method { case MethodTLS: conn = tls.Client(conn, &tls.Config{InsecureSkipVerify: true}) case gosocks5.MethodUserPass, MethodTLSAuth: if method == MethodTLSAuth { conn = tls.Client(conn, &tls.Config{InsecureSkipVerify: true}) } var username, password string if selector.arg.User != nil { username = selector.arg.User.Username() password, _ = selector.arg.User.Password() } req := gosocks5.NewUserPassRequest(gosocks5.UserPassVer, username, password) if err := req.Write(conn); err != nil { if glog.V(LWARNING) { glog.Warningln("socks5 auth:", err) } return nil, err } if glog.V(LDEBUG) { glog.Infoln(req) } res, err := gosocks5.ReadUserPassResponse(conn) if err != nil { if glog.V(LWARNING) { glog.Warningln("socks5 auth:", err) } return nil, err } if glog.V(LDEBUG) { glog.Infoln(res) } if res.Status != gosocks5.Succeeded { return nil, gosocks5.ErrAuthFailure } case gosocks5.MethodNoAcceptable: return nil, gosocks5.ErrBadMethod } return conn, nil }