From 4029763123971717c3cf09202998311c5850b69a Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 11 Jul 2022 23:22:20 +0100 Subject: [PATCH] Refactor client transport modules --- internal/client/connector.go | 2 + internal/client/state.go | 37 +++++++------------ internal/client/transport.go | 10 ----- internal/client/{ => transports}/TLS.go | 4 +- internal/client/{ => transports}/auth.go | 2 +- internal/client/{ => transports}/auth_test.go | 2 +- internal/client/transports/transport.go | 23 ++++++++++++ internal/client/{ => transports}/websocket.go | 14 +++---- 8 files changed, 49 insertions(+), 45 deletions(-) delete mode 100644 internal/client/transport.go rename internal/client/{ => transports}/TLS.go (98%) rename internal/client/{ => transports}/auth.go (99%) rename internal/client/{ => transports}/auth_test.go (99%) create mode 100644 internal/client/transports/transport.go rename internal/client/{ => transports}/websocket.go (93%) diff --git a/internal/client/connector.go b/internal/client/connector.go index 69a9fc3..439eafe 100644 --- a/internal/client/connector.go +++ b/internal/client/connector.go @@ -20,6 +20,8 @@ type CloakClient struct { session *mux.Session } +const appDataMaxLength = 16401 + // On different invocations to NewCloakClient, authInfo.SessionId MUST be different func NewCloakClient(connConfig RemoteConnConfig, authInfo AuthInfo, dialer common.Dialer) *CloakClient { log.Info("Attempting to start a new session") diff --git a/internal/client/state.go b/internal/client/state.go index c3d1ded..a663b56 100644 --- a/internal/client/state.go +++ b/internal/client/state.go @@ -37,7 +37,6 @@ type RawConfig struct { BrowserSig string // nullable Transport string // nullable CDNOriginHost string // nullable - CDNWsUrlPath string // nullable StreamTimeout int // nullable KeepAlive int // nullable } @@ -47,7 +46,7 @@ type RemoteConnConfig struct { NumConn int KeepAlive time.Duration RemoteAddr string - TransportMaker func() Transport + TransportMaker func() transports.Transport } type LocalConnConfig struct { @@ -56,16 +55,7 @@ type LocalConnConfig struct { MockDomainList []string } -type AuthInfo struct { - UID []byte - SessionId uint32 - ProxyMethod string - EncryptionMethod byte - Unordered bool - ServerPubKey crypto.PublicKey - MockDomain string - WorldState common.WorldState -} +type AuthInfo = transports.AuthInfo // semi-colon separated value. This is for Android plugin options func ssvToJson(ssv string) (ret []byte) { @@ -220,19 +210,18 @@ func (raw *RawConfig) ProcessRawConfig(worldState common.WorldState) (local Loca // Transport and (if TLS mode), browser switch strings.ToLower(raw.Transport) { case "cdn": - var cdnDomainPort string + cdnPort := raw.RemotePort + var cdnHost string if raw.CDNOriginHost == "" { - cdnDomainPort = net.JoinHostPort(raw.RemoteHost, raw.RemotePort) + cdnHost = raw.RemoteHost } else { - cdnDomainPort = net.JoinHostPort(raw.CDNOriginHost, raw.RemotePort) - } - if raw.CDNWsUrlPath == "" { - raw.CDNWsUrlPath = "/" + cdnHost = raw.CDNOriginHost } - remote.TransportMaker = func() Transport { - return &WSOverTLS{ - wsUrl: "ws://" + cdnDomainPort + raw.CDNWsUrlPath, + remote.TransportMaker = func() transports.Transport { + return &transports.WSOverTLS{ + CDNHost: cdnHost, + CDNPort: cdnPort, } } case "direct": @@ -249,9 +238,9 @@ func (raw *RawConfig) ProcessRawConfig(worldState common.WorldState) (local Loca default: browser = chrome } - remote.TransportMaker = func() Transport { - return &DirectTLS{ - browser: browser, + remote.TransportMaker = func() transports.Transport { + return &transports.DirectTLS{ + Browser: browser, } } } diff --git a/internal/client/transport.go b/internal/client/transport.go deleted file mode 100644 index e86ffd5..0000000 --- a/internal/client/transport.go +++ /dev/null @@ -1,10 +0,0 @@ -package client - -import ( - "net" -) - -type Transport interface { - Handshake(rawConn net.Conn, authInfo AuthInfo) (sessionKey [32]byte, err error) - net.Conn -} diff --git a/internal/client/TLS.go b/internal/client/transports/TLS.go similarity index 98% rename from internal/client/TLS.go rename to internal/client/transports/TLS.go index 6c97ab9..e81cf6a 100644 --- a/internal/client/TLS.go +++ b/internal/client/transports/TLS.go @@ -1,4 +1,4 @@ -package client +package transports import ( utls "github.com/refraction-networking/utls" @@ -27,6 +27,7 @@ const ( type DirectTLS struct { *common.TLSConn + Browser browsers.Browser browser browser } @@ -88,7 +89,6 @@ func (tls *DirectTLS) Handshake(rawConn net.Conn, authInfo AuthInfo) (sessionKey x25519KeyShare: payload.ciphertextWithTag[32:64], serverName: authInfo.MockDomain, } - var ch []byte ch, err = buildClientHello(tls.browser, fields) if err != nil { diff --git a/internal/client/auth.go b/internal/client/transports/auth.go similarity index 99% rename from internal/client/auth.go rename to internal/client/transports/auth.go index 9053c14..1716192 100644 --- a/internal/client/auth.go +++ b/internal/client/transports/auth.go @@ -1,4 +1,4 @@ -package client +package transports import ( "encoding/binary" diff --git a/internal/client/auth_test.go b/internal/client/transports/auth_test.go similarity index 99% rename from internal/client/auth_test.go rename to internal/client/transports/auth_test.go index a7a14f5..636c282 100644 --- a/internal/client/auth_test.go +++ b/internal/client/transports/auth_test.go @@ -1,4 +1,4 @@ -package client +package transports import ( "bytes" diff --git a/internal/client/transports/transport.go b/internal/client/transports/transport.go new file mode 100644 index 0000000..cc02013 --- /dev/null +++ b/internal/client/transports/transport.go @@ -0,0 +1,23 @@ +package transports + +import ( + "crypto" + "github.com/cbeuw/Cloak/internal/common" + "net" +) + +type Transport interface { + Handshake(rawConn net.Conn, authInfo AuthInfo) (sessionKey [32]byte, err error) + net.Conn +} + +type AuthInfo struct { + UID []byte + SessionId uint32 + ProxyMethod string + EncryptionMethod byte + Unordered bool + ServerPubKey crypto.PublicKey + MockDomain string + WorldState common.WorldState +} diff --git a/internal/client/websocket.go b/internal/client/transports/websocket.go similarity index 93% rename from internal/client/websocket.go rename to internal/client/transports/websocket.go index 10f9e46..885529b 100644 --- a/internal/client/websocket.go +++ b/internal/client/transports/websocket.go @@ -1,21 +1,21 @@ -package client +package transports import ( "encoding/base64" "errors" "fmt" - "net" - "net/http" - "net/url" - "github.com/cbeuw/Cloak/internal/common" "github.com/gorilla/websocket" utls "github.com/refraction-networking/utls" + "net" + "net/http" + "net/url" ) type WSOverTLS struct { *common.WebSocketConn - wsUrl string + CDNHost string + CDNPort string } func (ws *WSOverTLS) Handshake(rawConn net.Conn, authInfo AuthInfo) (sessionKey [32]byte, err error) { @@ -41,7 +41,7 @@ func (ws *WSOverTLS) Handshake(rawConn net.Conn, authInfo AuthInfo) (sessionKey return } - u, err := url.Parse(ws.wsUrl) + u, err := url.Parse("ws://" + net.JoinHostPort(ws.CDNHost, ws.CDNPort)) if err != nil { return sessionKey, fmt.Errorf("failed to parse ws url: %v", err) }