moesocks 0.1.0.15 → 0.1.0.16
raw patch · 8 files changed
+106/−110 lines, 8 files
Files
- CHANGELOG.md +5/−0
- moesocks.cabal +1/−1
- src/Network/MoeSocks/App.hs +35/−74
- src/Network/MoeSocks/Config.hs +1/−1
- src/Network/MoeSocks/Helper.hs +1/−2
- src/Network/MoeSocks/Options.hs +4/−3
- src/Network/MoeSocks/TCP.hs +38/−13
- src/Network/MoeSocks/UDP.hs +21/−16
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