wstunnel 0.3.0.1 → 0.3.1.0
raw patch · 5 files changed
+69/−14 lines, 5 filesdep ~networkPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: network
API changes (from Hackage documentation)
- Types: instance GHC.Generics.Generic Network.Socket.Types.PortNumber
+ Types: [hostHeader] :: TunnelSettings -> ByteString
+ Types: [tlsSNI] :: TunnelSettings -> ByteString
+ Types: [upgradeCredentials] :: TunnelSettings -> ByteString
+ Types: [websocketPingFrequencySec] :: TunnelSettings -> Int
- Types: TunnelSettings :: Maybe ProxySettings -> HostName -> PortNumber -> HostName -> PortNumber -> HostName -> PortNumber -> Protocol -> Bool -> Bool -> String -> Int -> TunnelSettings
+ Types: TunnelSettings :: Maybe ProxySettings -> HostName -> PortNumber -> HostName -> PortNumber -> HostName -> PortNumber -> Protocol -> Bool -> Bool -> String -> ByteString -> ByteString -> ByteString -> Int -> Int -> TunnelSettings
Files
- app/Main.hs +33/−0
- src/Tunnel.hs +6/−3
- src/Types.hs +11/−4
- test/Spec.hs +12/−0
- wstunnel.cabal +7/−7
app/Main.hs view
@@ -31,6 +31,10 @@ , verbose :: Bool , quiet :: Bool , pathPrefix :: String+ , hostHeader :: String+ , tlsSNI :: String+ , websocketPingFrequencySec :: Int+ , wsTunnelCredentials :: String } deriving (Show, Data, Typeable) data WsServerInfo = WsServerInfo@@ -61,10 +65,20 @@ , pathPrefix = def &= explicit &= name "upgradePathPrefix" &= help "Use a specific prefix that will show up in the http path in the upgrade request. Useful if you need to route requests server side but don't have vhosts" &= typ "String" &= groupname "Client options"+ , wsTunnelCredentials+ = def &= explicit &= name "upgradeCredentials"+ &= help "Credentials for the Basic HTTP authorization type sent with the upgrade request."+ &= typ "USER[:PASS]" , proxy = def &= explicit &= name "p" &= name "httpProxy" &= help "If set, will use this proxy to connect to the server" &= typ "USER:PASS@HOST:PORT"+ , hostHeader = def &= explicit &= name "hostHeader" &= groupname "Client options"+ &= help "If set, add the custom string as host http header" &= typ "String" &= groupname "Client options"+ , tlsSNI = def &= explicit &= name "tlsSNI" &= groupname "Client options"+ &= help "If set, use custom string in the SNI during TLS handshake" &= typ "String" &= groupname "Client options" , soMark = def &= explicit &= name "soMark" &= help "(linux only) Mark network packet with SO_MARK sockoption with the specified value. You need to use {root, sudo, capabilities} to run wstunnel when using this option" &= typ "int"+ , websocketPingFrequencySec = def &= explicit &= name "websocketPingFrequencySec"+ &= help "do a hearthbeat ping every x seconds to maintain websocket connection" &= typ "int" , wsTunnelServer = def &= argPos 0 &= typ "ws[s]://wstunnelServer[:port]" , serverMode = def &= explicit &= name "server"@@ -168,6 +182,9 @@ , Main.udpTimeout = if Main.udpTimeout cfg' == 0 then 30 * 10^(6 :: Int) else if Main.udpTimeout cfg' == -1 then -1 else Main.udpTimeout cfg' * 10^(6:: Int)+ , Main.websocketPingFrequencySec = if Main.websocketPingFrequencySec cfg' == 0+ then 30+ else Main.websocketPingFrequencySec cfg' } let serverInfo = parseServerInfo (WsServerInfo False "" 0) (wsTunnelServer cfg)@@ -220,7 +237,11 @@ , proxySetting = parseProxyInfo (proxy cfg) , useSocks = False , upgradePrefix = pathPrefix cfg+ , upgradeCredentials = BC.pack $ wsTunnelCredentials cfg , udpTimeout = Main.udpTimeout cfg+ , tlsSNI = BC.pack $ Main.tlsSNI cfg+ , hostHeader = BC.pack $ Main.hostHeader cfg+ , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg } toTcpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort) =@@ -236,7 +257,11 @@ , proxySetting = parseProxyInfo (proxy cfg) , useSocks = False , upgradePrefix = pathPrefix cfg+ , upgradeCredentials = BC.pack $ wsTunnelCredentials cfg , udpTimeout = Main.udpTimeout cfg+ , tlsSNI = BC.pack $ Main.tlsSNI cfg+ , hostHeader = BC.pack $ Main.hostHeader cfg+ , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg } toUdpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort) =@@ -252,7 +277,11 @@ , proxySetting = parseProxyInfo (proxy cfg) , useSocks = False , upgradePrefix = pathPrefix cfg+ , upgradeCredentials = BC.pack $ wsTunnelCredentials cfg , udpTimeout = Main.udpTimeout cfg+ , tlsSNI = BC.pack $ Main.tlsSNI cfg+ , hostHeader = BC.pack $ Main.hostHeader cfg+ , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg } toDynamicTunnelSetting cfg serverInfo (TunnelInfo lHost lPort _ _) =@@ -268,5 +297,9 @@ , proxySetting = parseProxyInfo (proxy cfg) , useSocks = True , upgradePrefix = pathPrefix cfg+ , upgradeCredentials = BC.pack $ wsTunnelCredentials cfg , udpTimeout = Main.udpTimeout cfg+ , tlsSNI = BC.pack $ Main.tlsSNI cfg+ , hostHeader = BC.pack $ Main.hostHeader cfg+ , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg }
src/Tunnel.hs view
@@ -65,8 +65,11 @@ debug "Oppening Websocket stream" stream <- connectionToStream conn- ret <- WS.runClientWithStream stream serverHost (toPath cfg) WS.defaultConnectionOptions [] run+ let headers = if not (null upgradeCredentials) then [("Authorization", "Basic " <> B64.encode upgradeCredentials)] else []+ let hostname = if not (null hostHeader) then (BC.unpack hostHeader) else serverHost + ret <- WS.runClientWithStream stream hostname (toPath cfg) WS.defaultConnectionOptions headers run+ debug "Closing Websocket stream" return ret @@ -74,7 +77,7 @@ connectionToStream Connection{..} = WS.makeStream read (write . toStrict . fromJust) onError = flip catch (\(e :: SomeException) -> return . throwError . WebsocketError $ show e) run cnx = do- WS.forkPingThread cnx 30+ WS.forkPingThread cnx websocketPingFrequencySec app (toConnection cnx) @@ -98,7 +101,7 @@ , NC.settingDisableSession = False , NC.settingUseServerName = False }- connectionParams = NC.ConnectionParams { NC.connectionHostname = serverHost+ connectionParams = NC.ConnectionParams { NC.connectionHostname = if tlsSNI == mempty then serverHost else BC.unpack tlsSNI , NC.connectionPort = serverPort , NC.connectionUseSecure = Just tlsSettings , NC.connectionUseSocks = Nothing
src/Types.hs view
@@ -13,8 +13,7 @@ import qualified Data.Streaming.Network as N import qualified Network.Connection as NC-import Network.Socket (HostName, PortNumber(..))-import Network.Socket.Internal (PortNumber(..))+import Network.Socket (HostName, PortNumber) import qualified Network.Socket as N hiding (recv, recvFrom, send, sendTo) import qualified Network.Socket.ByteString as N@@ -22,11 +21,14 @@ import qualified Network.WebSockets.Connection as WS import System.IO.Unsafe (unsafeDupablePerformIO) -deriving instance Generic PortNumber-deriving instance Hashable PortNumber++instance Hashable PortNumber where+ hashWithSalt s p = hashWithSalt s (fromEnum p)+ deriving instance Generic N.SockAddr deriving instance Hashable N.SockAddr + {-# NOINLINE defaultRecvBufferSize #-} defaultRecvBufferSize :: Int defaultRecvBufferSize = unsafeDupablePerformIO $@@ -75,7 +77,12 @@ , useTls :: Bool , useSocks :: Bool , upgradePrefix :: String+ , upgradeCredentials+ :: ByteString+ , tlsSNI :: ByteString+ , hostHeader :: ByteString , udpTimeout :: Int+ , websocketPingFrequencySec :: Int } instance Show TunnelSettings where
test/Spec.hs view
@@ -47,6 +47,10 @@ , useSocks = False , upgradePrefix = "wstunnel" , udpTimeout = 0+ , upgradeCredentials = ""+ , hostHeader = "toto.com"+ , tlsSNI = "toto.com"+ , websocketPingFrequencySec = 30 } let client = runClient tunnelSetting @@ -104,6 +108,10 @@ , useSocks = False , upgradePrefix = "wstunnel" , udpTimeout = -1+ , upgradeCredentials = ""+ , hostHeader = "toto.com"+ , tlsSNI = "toto.com"+ , websocketPingFrequencySec = 30 } let client = runClient tunnelSetting @@ -160,6 +168,10 @@ , useSocks = False , upgradePrefix = "wstunnel" , udpTimeout = -1+ , upgradeCredentials = ""+ , hostHeader = "toto.com"+ , tlsSNI = "toto.com"+ , websocketPingFrequencySec = 30 } let client = runClient tunnelSetting
wstunnel.cabal view
@@ -1,13 +1,13 @@ name: wstunnel-version: 0.3.0.1-synopsis: Initial project template from stack+version: 0.3.1.0+synopsis: Tunneling program over websocket protocol description: For more information regarding wstunnel, please refer to README.md homepage: https://github.com/githubuser/wstunnel#readme license: BSD3 license-file: LICENSE-author: Author name here-maintainer: example@example.com-copyright: 2016 Author name here+author: Erèbe+maintainer: github@erebe.eu+copyright: 2021 Erèbe category: Web build-type: Simple -- extra-source-files:@@ -26,7 +26,7 @@ , connection , hslogger , mtl- , network < 3.0.0.0+ , network , network-conduit-tls , streaming-commons , text >= 1.2.2.1@@ -46,7 +46,7 @@ , text >= 1.2.2.1 , classy-prelude , bytestring- , network < 3.0.0.0+ , network , network-conduit-tls , streaming-commons , wstunnel