packages feed

moesocks 0.1.0.15 → 0.1.0.16

raw patch · 8 files changed

+106/−110 lines, 8 files

Files

CHANGELOG.md view
@@ -1,3 +1,8 @@+0.1.0.16+--------++* Add compatibility with shadowsocks for UDP port forwarding+ 0.1.0.15 -------- * Add UDP port forwarding
moesocks.cabal view
@@ -1,6 +1,6 @@ name:               moesocks category:           Network-version:            0.1.0.15+version:            0.1.0.16 license:            Apache-2.0 synopsis:           A functional firewall killer description:        A socks5 proxy using the client / server architecture.
src/Network/MoeSocks/App.hs view
@@ -4,7 +4,6 @@ module Network.MoeSocks.App where  import Control.Concurrent-import Control.Exception import Control.Lens import Control.Monad import Control.Monad.Except@@ -16,7 +15,6 @@ import Data.Text (Text) import Data.Text.Lens import Data.Text.Strict.Lens (utf8)-import Network.MoeSocks.BuilderAndParser import Network.MoeSocks.Config import Network.MoeSocks.Constant import Network.MoeSocks.Helper@@ -37,39 +35,7 @@ import qualified System.IO as IO import qualified System.Log.Handler as LogHandler -processLocalSocks5Request :: Socket -> IO (ClientRequest, ByteString)-processLocalSocks5Request aSocket = do-  (_partialBytesAfterGreeting, r) <- -      parseSocket "clientGreeting" mempty pure greetingParser aSocket -  when (not - _No_authentication `elem` (r ^. authenticationMethods)) - -    throwIO - ParseException-               "Client does not support no authentication method"--  send_ aSocket - builder_To_ByteString greetingReplyBuilder --  (_partialBytesAfterClientRequest, _clientRequest) <- parseSocket -                                "clientRequest" -                                _partialBytesAfterGreeting-                                pure-                                connectionParser-                                aSocket---  pure - (_clientRequest, _partialBytesAfterClientRequest)--localSocks5RequestHandler :: MoeConfig -> ByteString -> (Socket, SockAddr) -                                                                    -> IO ()-localSocks5RequestHandler aConfig _ (aSocket,_) = do-  _r <- processLocalSocks5Request aSocket -  localTCPRequestHandler aConfig _r True aSocket------- parseConfig :: Text -> MoeMonadT MoeConfig parseConfig aFilePath = do   _configFile <- io - TIO.readFile - aFilePath ^. _Text@@ -187,7 +153,7 @@   updateGlobalLogger "moe" - addHandler formattedHandler   updateGlobalLogger "moe" - setLevel aLevel -data AppType = TCPApp | UDPApp +data AppType = TCP_App | UDP_App    deriving (Show, Eq)  moeApp:: MoeMonadT ()@@ -219,12 +185,11 @@         logSA "L loop" (pure s) - \(_localSocket, _localAddr) -> do           _say - "L " <> aID <> ": nyaa!"             -+          setSocketOption _localSocket ReuseAddr 1+          bindSocket _localSocket _localAddr+                     case aAppType of-            TCPApp -> do-              setSocketOption _localSocket ReuseAddr 1-              bindSocket _localSocket _localAddr-              +            TCP_App -> do               listen _localSocket maxListenQueue                let handleLocal _socket = do@@ -239,10 +204,7 @@                forever - handleLocal _localSocket -            UDPApp -> do-              setSocketOption _localSocket ReuseAddr 1-              bindSocket _localSocket _localAddr-+            UDP_App -> do               let handleLocal = do                     (_msg, _sockAddr) <-                          recvFrom _localSocket _ReceiveLength@@ -254,15 +216,12 @@                     forkIO - catchExceptAsyncLog "L UDP thread" -                                  aHandler _msg _s ---               forever handleLocal                   let localSocks5App :: (Socket, SockAddr) -> IO ()-      localSocks5App = localAppBuilder TCPApp "socks5" - -                            localSocks5RequestHandler _config+      localSocks5App = localAppBuilder TCP_App "socks5" - +                            local_Socks5_RequestHandler _config        showForwarding :: Forward -> String       showForwarding (Forward _localPort _remoteHost _remotePort) =@@ -274,21 +233,23 @@                       <> show _remotePort                       <> "]" -      forwardTCPApp :: Forward -> (Socket, SockAddr) +      forward_TCP_App :: Forward -> (Socket, SockAddr)                                  -> IO ()-      forwardTCPApp _f _s = do+      forward_TCP_App _f _s = do         let _m = showForwarding _f-        localAppBuilder TCPApp  ("TCP forwarding " <> _m)-                                (forwardTCPRequestHandler _config _f) _s+        localAppBuilder TCP_App  ("TCP forwarding " <> _m)+                                (local_TCP_ForwardRequestHandler _config _f) +                                _s -      forwardUDPApp :: Forward -> (Socket, SockAddr) -> IO ()-      forwardUDPApp _f _s = do+      forward_UDP_App :: Forward -> (Socket, SockAddr) -> IO ()+      forward_UDP_App _f _s = do         let _m = showForwarding _f -        localAppBuilder UDPApp  ("UDP forwarding " <> _m)-                                (forwardUDPRequestHandler _config _f) _s+        localAppBuilder UDP_App  ("UDP forwarding " <> _m)+                                (local_UDP_ForwardRequestHandler _config _f) +                                _s       -  let remoteTCPApp :: (Socket, SockAddr) -> IO ()-      remoteTCPApp s = logSA "R loop" (pure s) -+  let remote_TCP_App :: (Socket, SockAddr) -> IO ()+      remote_TCP_App s = logSA "R loop" (pure s) -         \(_remoteSocket, _remoteAddr) -> do           _say "R TCP: nyaa!" @@ -307,12 +268,12 @@                                  forkIO - catchExceptAsyncLog "R thread" -                              logSocket "R remote socket" (pure _newSocket) --                              remoteTCPRequestHandler _config +                              remote_TCP_RequestHandler _config             forever - handleRemote _remoteSocket -  let remoteUDPApp :: (Socket, SockAddr) -> IO ()-      remoteUDPApp s = logSA "R loop" (pure s) -+  let remote_UDP_App :: (Socket, SockAddr) -> IO ()+      remote_UDP_App s = logSA "R loop" (pure s) -         \(_remoteSocket, _remoteAddr) -> do           _say "R UDP: nyaa!" @@ -328,7 +289,7 @@                   forkIO - catchExceptAsyncLog "R thread" - -                            remoteUDPRequestHandler _config _msg _s+                            remote_UDP_RequestHandler _config _msg _s                   @@ -338,42 +299,42 @@   let        remoteRun :: IO ()       remoteRun = do-        let _TCPApp = foreverRun - catchExceptAsyncLog "R TCP app" - do+        let __TCP_App = foreverRun - catchExceptAsyncLog "R TCP app" - do               getSocket (_c ^. remote) (_c ^. remotePort) Stream-                >>= remoteTCPApp +                >>= remote_TCP_App  -        let _UDPApp = foreverRun - catchExceptAsyncLog "R UDP app" - do+        let __UDP_App = foreverRun - catchExceptAsyncLog "R UDP app" - do               getSocket (_c ^. remote) (_c ^. remotePort) Datagram-                >>= remoteUDPApp +                >>= remote_UDP_App  -        waitBoth _TCPApp _UDPApp+        waitBoth __TCP_App __UDP_App                            localRun :: IO ()       localRun = do-        let _forwardTCPApps = do+        let _forward_TCP_Apps = do               forM_ (_options ^. forwardTCP) - \forwarding -> forkIO - do                   foreverRun - catchExceptAsyncLog "L TCPForwarding app" - do                     getSocket (_c ^. local)                        (forwarding ^. forwardLocalPort)                        Stream-                    >>= forwardTCPApp forwarding+                    >>= forward_TCP_App forwarding           -        let _forwardUDPApps = do+        let _forward_UDP_Apps = do               forM_ (_options ^. forwardUDP) - \forwarding -> forkIO - do                   foreverRun - catchExceptAsyncLog "L UDPForwarding app" - do                     getSocket (_c ^. local)                        (forwarding ^. forwardLocalPort)                        Datagram-                    >>= forwardUDPApp forwarding+                    >>= forward_UDP_App forwarding                  let _socks5App = foreverRun - catchExceptAsyncLog "L socks5 app" - do               getSocket (_c ^. local) (_c ^. localPort) Stream                 >>= localSocks5App  -        _forwardTCPApps-        _forwardUDPApps+        _forward_TCP_Apps+        _forward_UDP_Apps         _socks5App        debugRun :: IO ()
src/Network/MoeSocks/Config.hs view
@@ -29,5 +29,5 @@   , _configFile = ""   , _verbosity = DEBUG   , _forwardTCP = []-  , _forwardUDP = pure (Forward 5301 "localhost" 53)+  , _forwardUDP = []   } 
src/Network/MoeSocks/Helper.hs view
@@ -20,6 +20,7 @@ import Data.Monoid import Data.Text (Text) import Data.Text.Lens+import Data.Time.Clock import Network.Socket hiding (send, recv) import Network.Socket.ByteString import Prelude hiding (take, (-)) @@ -30,8 +31,6 @@ import qualified Data.ByteString as S import qualified Data.ByteString.Builder as B import qualified Data.ByteString.Lazy as LB--import Data.Time.Clock  -- BEGIN backports 
src/Network/MoeSocks/Options.hs view
@@ -50,7 +50,8 @@    let _forwardTCP :: O.Parser String       _forwardTCP = ( strOption --                          short 'L'+                          short 'T'+                      <>  long "tcp"                       <>  metavar "port:host:hostport"                       <>  help (""                                 <> "Specify that the given TCP port on the "@@ -66,7 +67,7 @@       _forwardUDP :: O.Parser String       _forwardUDP = ( strOption -                           short 'U'-                      <>  long "LUDP"+                      <>  long "udp"                       <>  metavar "port:host:hostport"                       <>  help (""                                 <> "Specify that the given UDP port on the "@@ -122,6 +123,6 @@ opts = info (helper <*> optionParser) -          fullDesc     <>  progDesc "A socks5 proxy using the client / server architecture"-    <>  header "moesocks - moe for all"+    <>  header "A functional firewall killer"  
src/Network/MoeSocks/TCP.hs view
@@ -10,31 +10,56 @@ import Control.Monad.Writer hiding (listen) import Data.ByteString (ByteString) import Network.MoeSocks.BuilderAndParser-import Network.MoeSocks.Helper import Network.MoeSocks.Common+import Network.MoeSocks.Constant+import Network.MoeSocks.Helper import Network.MoeSocks.Type import Network.Socket hiding (send, recv, recvFrom, sendTo) import Prelude hiding ((-), take) import qualified Data.List as L  -forwardTCPRequestHandler :: MoeConfig -> Forward -> +local_Socks5_RequestHandler :: MoeConfig -> ByteString -> (Socket, SockAddr) +                                                                    -> IO ()+local_Socks5_RequestHandler aConfig _ (aSocket,_) = do+  (_partialBytesAfterGreeting, _r) <- +      parseSocket "clientGreeting" mempty pure greetingParser aSocket++  when (not - _No_authentication `elem` (_r ^. authenticationMethods)) - +    throwIO - ParseException+               "Client does not support no authentication method"++  send_ aSocket - builder_To_ByteString greetingReplyBuilder ++  _parsedRequest <- parseSocket +                                "clientRequest" +                                _partialBytesAfterGreeting+                                pure+                                connectionParser+                                aSocket++  local_TCP_RequestHandler aConfig _parsedRequest True aSocket++++local_TCP_ForwardRequestHandler :: MoeConfig -> Forward ->                                    ByteString -> (Socket, SockAddr) -> IO ()-forwardTCPRequestHandler aConfig aForwarding _ (aSocket,_) = do+local_TCP_ForwardRequestHandler aConfig aForwarding _ (aSocket,_) = do   let _clientRequest = ClientRequest                           TCP_IP_stream_connection                           (Domain_name - aForwarding ^.                              forwardRemoteHost)                           (aForwarding ^. forwardRemotePort)               -  localTCPRequestHandler aConfig (_clientRequest, mempty) False aSocket+  local_TCP_RequestHandler aConfig (mempty, _clientRequest) False aSocket   -localTCPRequestHandler :: MoeConfig -> (ClientRequest, ByteString) -> +local_TCP_RequestHandler :: MoeConfig -> (ByteString, ClientRequest) ->                          Bool -> Socket -> IO ()-localTCPRequestHandler aConfig (_clientRequest, _partialBytesAfterClientRequest) -                    shouldReplyClient aSocket = do+local_TCP_RequestHandler aConfig +                        (_partialBytesAfterClientRequest, _clientRequest) +                        shouldReplyClient aSocket = do   let        _c = aConfig        _initSocket = @@ -110,7 +135,7 @@                 finally                   (                     connectMarket (Just - _logId "L --> +", _produce)-                                      (Just - _logId "L --> -", _consume)+                                  (Just - _logId "L --> -", _consume)                   ) -                   pure () @@ -131,7 +156,7 @@                 finally                    (                     connectMarket (Just - _logId "L <-- +", _produce)-                                      (Just - _logId "L <-- -", _consume)+                                  (Just - _logId "L <-- -", _consume)                   ) -                   pure () @@ -143,8 +168,8 @@     handleLocal _remoteSocket  -remoteTCPRequestHandler:: MoeConfig -> Socket -> IO ()-remoteTCPRequestHandler aConfig aSocket = do+remote_TCP_RequestHandler:: MoeConfig -> Socket -> IO ()+remote_TCP_RequestHandler aConfig aSocket = do   (_encrypt, _decrypt) <- getCipher                             (aConfig ^. method)                             (aConfig ^. password)@@ -212,7 +237,7 @@                 finally                   (                     connectMarket (Just - _logId "R --> +", _produce)-                                      (Just - _logId "R --> -", _consume)+                                  (Just - _logId "R --> -", _consume)                   ) -                   pure () @@ -236,7 +261,7 @@                 finally                    (                     connectMarket (Just - _logId "R <-- +", _produce)-                                      (Just - _logId "R <-- -", _consume)+                                  (Just - _logId "R <-- -", _consume)                   ) -                   pure () 
src/Network/MoeSocks/UDP.hs view
@@ -18,11 +18,23 @@ import Prelude hiding ((-), take)  +buildShadowSocksRequest :: ClientRequest -> ByteString -> ByteString+buildShadowSocksRequest aClientRequest aMessage =+  let _header = shadowSocksRequestBuilder aClientRequest+  in  +  builder_To_ByteString _header <> aMessage +parseShadowSocksRequest :: ByteString -> IO (ByteString, ClientRequest)+parseShadowSocksRequest aMessage =+  case parse (shadowSocksRequestParser UDP_port) aMessage of+    Done _i _r -> pure (_i, _r)+    _ -> throwIO - ParseException -+            "R Failed to parse UDP request" -forwardUDPRequestHandler :: MoeConfig -> Forward -> ++local_UDP_ForwardRequestHandler :: MoeConfig -> Forward ->                                    ByteString -> (Socket,SockAddr) -> IO ()-forwardUDPRequestHandler aConfig aForwarding aMessage +local_UDP_ForwardRequestHandler aConfig aForwarding aMessage                                                      (aSocket, aSockAddr) = do    let _c = aConfig@@ -47,25 +59,22 @@        {-let (_encrypt, _decrypt) = (pure, pure)-} -      let -          _header = shadowSocksRequestBuilder _clientRequest-      -      -      let _msg = builder_To_ByteString _header <> aMessage+      let _msg = buildShadowSocksRequest _clientRequest aMessage        puts - "L UDP: " <> show _msg              send_ _remoteSocket =<< _encrypt _msg -      _r <- recv_ _remoteSocket >>= _decrypt+      (_r, _) <- recv_ _remoteSocket >>= _decrypt >>= parseShadowSocksRequest        puts - "L UDP <--: " <> show _r       when (_r & isn't _Empty) - do         sendAllTo aSocket _r aSockAddr -remoteUDPRequestHandler:: MoeConfig -> ByteString -> (Socket, SockAddr) ++remote_UDP_RequestHandler:: MoeConfig -> ByteString -> (Socket, SockAddr)                                                                        -> IO ()-remoteUDPRequestHandler aConfig aMessage (aSocket, aSockAddr) = do+remote_UDP_RequestHandler aConfig aMessage (aSocket, aSockAddr) = do   (_encrypt, _decrypt) <- getCipher                             (aConfig ^. method)                             (aConfig ^. password)@@ -75,11 +84,7 @@      _msg <- _decrypt aMessage -  (_decryptedMessage, _clientRequest) <--    case parse (shadowSocksRequestParser UDP_port) _msg of-      Done _i _r -> pure (_i, _r)-      _ -> throwIO - ParseException --            "R Failed to parse UDP request"+  (_decryptedMessage, _clientRequest) <- parseShadowSocksRequest _msg      puts - "R UDP: " <> show _clientRequest   puts - "R UDP: " <> show _decryptedMessage@@ -93,7 +98,7 @@          send_ _clientSocket _decryptedMessage -    _r <- recv_ _clientSocket+    _r <- buildShadowSocksRequest _clientRequest <$> recv_ _clientSocket      puts - "R UDP <--: " <> show _r