moesocks 0.1.0.16 → 0.1.0.17
raw patch · 12 files changed
+65/−52 lines, 12 files
Files
- CHANGELOG.md +4/−1
- README.md +4/−4
- moesocks.cabal +1/−1
- src/Network/MoeSocks/App.hs +10/−2
- src/Network/MoeSocks/Common.hs +0/−1
- src/Network/MoeSocks/Config.hs +2/−1
- src/Network/MoeSocks/Constant.hs +1/−0
- src/Network/MoeSocks/Helper.hs +10/−9
- src/Network/MoeSocks/Options.hs +12/−3
- src/Network/MoeSocks/TCP.hs +5/−20
- src/Network/MoeSocks/Type.hs +1/−0
- src/Network/MoeSocks/UDP.hs +15/−10
CHANGELOG.md view
@@ -1,6 +1,9 @@-0.1.0.16+0.1.0.17 --------+* Add `--no-socks5` flag to switch off the socks5 service on local +0.1.0.16+-------- * Add compatibility with shadowsocks for UDP port forwarding 0.1.0.15
README.md view
@@ -21,9 +21,9 @@ Not working ----------- * Remote is flaky -* Socks4 / Socks4a-* UDP over Socks5-* Four times slower then original Python's implementation+* UDP over Socks5 is not implemented+* 2.5 times slower then the original Python implementation (measured at 17.6M/s+ vs 43.6M/s on an Intel P8800, using the AES-256-CFB encryption) Planning features ------------------@@ -34,7 +34,7 @@ There's a bug that prevents remote from working correctly. -You should use the python implementation of [shadowsocks] on the remote+You should use the original Python implementation of [shadowsocks] on the remote server. There is an earlier implementation of [shadowsocks in Haskell] by rnons that
moesocks.cabal view
@@ -1,6 +1,6 @@ name: moesocks category: Network-version: 0.1.0.16+version: 0.1.0.17 license: Apache-2.0 synopsis: A functional firewall killer description: A socks5 proxy using the client / server architecture.
src/Network/MoeSocks/App.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ExistentialQuantification #-} module Network.MoeSocks.App where @@ -335,7 +334,16 @@ _forward_TCP_Apps _forward_UDP_Apps- _socks5App+ if (_options ^. disableSocks5) + then + if (_options ^. forwardTCP & isn't _Empty)+ || (_options ^. forwardUDP & isn't _Empty)+ then + forever - sleep 1000+ else+ pute "Nothing to run!"+ + else _socks5App debugRun :: IO () debugRun = do
src/Network/MoeSocks/Common.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ExistentialQuantification #-} module Network.MoeSocks.Common where
src/Network/MoeSocks/Config.hs view
@@ -16,7 +16,7 @@ , _password = "moesocks" , _method = _DefaultMethod , _timeout = 300- , _tcpBufferSizeInPacket = 128+ , _tcpBufferSizeInPacket = 256 , _throttle = False , _throttleSpeed = 8000 -- in Kilobytes }@@ -30,4 +30,5 @@ , _verbosity = DEBUG , _forwardTCP = [] , _forwardUDP = []+ , _disableSocks5 = False }
src/Network/MoeSocks/Constant.hs view
@@ -24,3 +24,4 @@ _ReceiveLength :: Int _ReceiveLength = 4096+
src/Network/MoeSocks/Helper.hs view
@@ -1,7 +1,5 @@-{-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE CPP #-}-{-# LANGUAGE RecursiveDo #-}+{-# LANGUAGE LambdaCase #-} module Network.MoeSocks.Helper where @@ -176,6 +174,11 @@ connectTunnel :: (Maybe String, IO ()) -> (Maybe String, IO ()) -> IO () connectTunnel = waitBothDebug +{-connectTunnel :: (Maybe String, IO ()) -> (Maybe String, IO ()) -> IO ()-}+{-connectTunnel x y = -}+ {-withAsync (logWaitIO x) - const - do-}+ {-logWaitIO y-}+ connectMarket :: (Maybe String, IO ()) -> (Maybe String, IO ()) -> IO () connectMarket = waitBothDebug @@ -273,8 +276,7 @@ {-puts - "rawBytes: " <> show _rawBytes-} _bytes <- _decrypt _rawBytes - let r = _parser - _partial <> _bytes- case r of+ case _parser - _partial <> _bytes of Done i _r -> pure (i, _r) Fail _ _ msg -> throwIO - ParseException - "Failed to parse " <> _id <> ": " <> msg@@ -284,8 +286,7 @@ timeoutFor :: String -> Timeout -> IO a -> IO a timeoutFor aID aTimeout aIO = do- _r <- timeout aTimeout aIO- case _r of+ timeout aTimeout aIO >>= \case Nothing -> throw - TimeoutException aID Just _r -> pure _r @@ -367,8 +368,7 @@ <> " miliseconds." threadDelay - floor - _sleepTime - _r <- atomically - readTBQueue aTBQueue - case _r of+ (atomically - readTBQueue aTBQueue) >>= \case Nothing -> () <$ _shutdown Just _data -> do timeoutFor aID aTimeout - sendAll aSocket _data@@ -390,3 +390,4 @@ tryIO :: String -> IO a -> IO (Either IOException a) tryIO _ = try -- . logException aID+
src/Network/MoeSocks/Options.hs view
@@ -30,6 +30,14 @@ | otherwise = DebugMode in + let _disableSocks5 :: O.Parser Bool+ _disableSocks5 = switch -+ long "disable-socks5"+ <> help ("Do not start a socks5 server on local. It can be "+ <> "useful to run moesocks only as a secure tunnel")+ + in+ let _config = ( strOption - short 'c'@@ -40,8 +48,8 @@ in - let __verbosity :: O.Parser Priority - __verbosity = flag INFO DEBUG -+ let _verbosity :: O.Parser Priority + _verbosity = flag INFO DEBUG - short 'v' <> long "verbose" <> help "Turn on logging"@@ -115,9 +123,10 @@ MoeOptions <$> fmap parseMode _mode <*> fmap (view packed) _config- <*> __verbosity+ <*> _verbosity <*> fmap parseForwarding _forwardTCP <*> fmap parseForwarding _forwardUDP+ <*> _disableSocks5 opts :: ParserInfo MoeOptions opts = info (helper <*> optionParser) -
src/Network/MoeSocks/TCP.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ExistentialQuantification #-} module Network.MoeSocks.TCP where @@ -16,9 +15,7 @@ import Network.MoeSocks.Type import Network.Socket hiding (send, recv, recvFrom, sendTo) import Prelude hiding ((-), take)-import qualified Data.List as L - local_Socks5_RequestHandler :: MoeConfig -> ByteString -> (Socket, SockAddr) -> IO () local_Socks5_RequestHandler aConfig _ (aSocket,_) = do@@ -65,7 +62,7 @@ _initSocket = getSocket (_c ^. remote) (_c ^. remotePort) Stream - puts - "L : " <> show _clientRequest+ puts - "L: " <> show _clientRequest logSA "L remote socket" _initSocket - \(_remoteSocket, _remoteAddress) -> do@@ -80,15 +77,9 @@ send_ aSocket - builder_To_ByteString _connectionReplyBuilder - let _msg = - concat - L.intersperse " -> " - [ - show _localPeerAddr- , showRequest _clientRequest- ]+ let _msg = show _localPeerAddr <> " -> " <> showRequest _clientRequest - _log - "L " -- <> showConnectionType (_clientRequest ^. connectionType)- <> ": " <> _msg+ _log - "L T: " <> _msg let handleLocal __remoteSocket = do (_encrypt, _decrypt) <- getCipher@@ -193,15 +184,9 @@ _remotePeerAddr <- getPeerName aSocket _targetPeerAddr <- getPeerName _targetSocket - let _msg = - concat - L.intersperse " -> " - - [ - show _remotePeerAddr- , showRequest _clientRequest- ]+ let _msg = show _remotePeerAddr <> " -> " <> showRequest _clientRequest - _log - "R " -- <> showConnectionType (_clientRequest ^. connectionType)- <> ": " <> _msg+ _log - "R T: " <> _msg let handleTarget __leftOverBytes __targetSocket = do
src/Network/MoeSocks/Type.hs view
@@ -90,6 +90,7 @@ , _verbosity :: Priority , _forwardTCP :: [Forward] , _forwardUDP :: [Forward]+ , _disableSocks5 :: Bool } deriving (Show, Eq)
src/Network/MoeSocks/UDP.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ExistentialQuantification #-} module Network.MoeSocks.UDP where @@ -45,7 +44,7 @@ forwardRemoteHost) (aForwarding ^. forwardRemotePort) - puts - "L UDP: " <> show _clientRequest+ {-puts - "L UDP: " <> show _clientRequest-} _sa <- getSocket (_c ^. remote) (_c ^. remotePort) Datagram @@ -59,15 +58,18 @@ {-let (_encrypt, _decrypt) = (pure, pure)-} - let _msg = buildShadowSocksRequest _clientRequest aMessage+ let _bytes = buildShadowSocksRequest _clientRequest aMessage - puts - "L UDP: " <> show _msg+ {-puts - "L UDP: " <> show _bytes-}++ let _msg = show aSockAddr <> " -> " <> showRequest _clientRequest+ _log - "L U: " <> _msg - send_ _remoteSocket =<< _encrypt _msg+ send_ _remoteSocket =<< _encrypt _bytes (_r, _) <- recv_ _remoteSocket >>= _decrypt >>= parseShadowSocksRequest - puts - "L UDP <--: " <> show _r+ {-puts - "L UDP <--: " <> show _r-} when (_r & isn't _Empty) - do sendAllTo aSocket _r aSockAddr @@ -86,13 +88,16 @@ (_decryptedMessage, _clientRequest) <- parseShadowSocksRequest _msg - puts - "R UDP: " <> show _clientRequest- puts - "R UDP: " <> show _decryptedMessage+ {-puts - "R UDP: " <> show _clientRequest-}+ {-puts - "R UDP: " <> show _decryptedMessage-} logSA "R UDP -->:" (initTarget _clientRequest) - \_r -> do let (_clientSocket, _clientAddr) = _r - puts - "R UDP clientSocket: " <> show _r+ {-puts - "R UDP clientSocket: " <> show _r-}+ + let _msg = show aSockAddr <> " -> " <> showRequest _clientRequest+ _log - "R U: " <> _msg connect _clientSocket _clientAddr @@ -100,7 +105,7 @@ _r <- buildShadowSocksRequest _clientRequest <$> recv_ _clientSocket - puts - "R UDP <--: " <> show _r+ {-puts - "R UDP <--: " <> show _r-} when (_r & isn't _Empty) - do _encryptedMessage <- _encrypt _r