moesocks 1.0.0.42 → 1.0.0.43
raw patch · 17 files changed
+232/−183 lines, 17 files
Files
- moesocks.cabal +2/−2
- src/Network/MoeSocks/App.hs +9/−9
- src/Network/MoeSocks/Bootstrap.hs +14/−13
- src/Network/MoeSocks/BuilderAndParser.hs +15/−12
- src/Network/MoeSocks/Common.hs +8/−4
- src/Network/MoeSocks/Default.hs +9/−8
- src/Network/MoeSocks/Encrypt.hs +15/−14
- src/Network/MoeSocks/Handler.hs +17/−12
- src/Network/MoeSocks/Helper.hs +38/−27
- src/Network/MoeSocks/Internal/Socket.hs +8/−8
- src/Network/MoeSocks/Options.hs +18/−16
- src/Network/MoeSocks/Runtime.hs +18/−17
- src/Network/MoeSocks/TCP.hs +27/−14
- src/Network/MoeSocks/Type/Bootstrap/Config.hs +1/−1
- src/Network/MoeSocks/Type/Bootstrap/Option.hs +3/−3
- src/Network/MoeSocks/Type/Runtime.hs +9/−9
- src/Network/MoeSocks/UDP.hs +21/−14
moesocks.cabal view
@@ -1,6 +1,6 @@ name: moesocks category: Network-version: 1.0.0.42+version: 1.0.0.43 license: Apache-2.0 synopsis: A functional firewall killer description: A SOCKS5 proxy using the client / server architecture.@@ -9,7 +9,7 @@ author: Jinjing Wang maintainer: Jinjing Wang <nfjinjing@gmail.com> build-type: Simple-cabal-version: >=1.10+cabal-version: >=1.18 copyright: Copyright (C) 2015 Jinjing Wang tested-with: GHC == 8.0.2
src/Network/MoeSocks/App.hs view
@@ -3,16 +3,16 @@ module Network.MoeSocks.App where -import Control.Concurrent.Async hiding (waitBoth)-import Control.Lens-import Control.Monad-import Network.MoeSocks.Bootstrap (loadConfig)-import Network.MoeSocks.Handler (runRemoteRelay, runLocalService)-import Network.MoeSocks.Helper-import Network.MoeSocks.Runtime (initRuntime)-import Network.MoeSocks.Type-import Prelude hiding ((-), take)+import Control.Concurrent.Async hiding (waitBoth)+import Control.Lens++import Network.MoeSocks.Bootstrap (loadConfig)+import Network.MoeSocks.Handler (runRemoteRelay, runLocalService)+import Network.MoeSocks.Helper ((-), io, error_, foreverRun)+import Network.MoeSocks.Runtime (initRuntime)+import Network.MoeSocks.Type (Env, Job(..), MoeMonad, env, jobs) import qualified Network.MoeSocks.Type.Bootstrap.Option as O+import Prelude hiding ((-), take) runJob :: Env -> Job -> IO ()
src/Network/MoeSocks/Bootstrap.hs view
@@ -3,25 +3,26 @@ module Network.MoeSocks.Bootstrap where -import Control.Lens-import Control.Monad-import Control.Monad.Except-import Control.Monad.Writer hiding (listen)-import Data.Aeson hiding (Result)-import Data.Aeson.Lens-import Data.Maybe (fromMaybe)-import Data.Text (Text)-import Data.Text.Lens-import Network.MoeSocks.Default-import Network.MoeSocks.Encrypt (safeMethods, unsafeMethods)-import Network.MoeSocks.Helper-import Prelude hiding ((-), take)+import Control.Lens+import Control.Monad.Except (ExceptT, throwError)+import Control.Monad.Writer hiding (listen)+import Data.Aeson hiding (Result)+import Data.Aeson.Lens (_Object, _JSON)+import Data.Maybe (fromMaybe)+import Data.Text (Text)+import Data.Text.Lens (_Text) import qualified Data.HashMap.Strict as H import qualified Data.Map as Map import qualified Data.Text as T import qualified Data.Text.IO as TIO+ import qualified Network.MoeSocks.Type.Bootstrap.Config as C import qualified Network.MoeSocks.Type.Bootstrap.Option as O+import Network.MoeSocks.Default (defaultConfig)+import Network.MoeSocks.Encrypt (safeMethods, unsafeMethods)++import Network.MoeSocks.Helper ((-), debug_, io, toHaskellNamingConvention)+import Prelude hiding ((-), take) asList :: ([(Text, Value)] -> [(Text, Value)]) -> Value -> Value
src/Network/MoeSocks/BuilderAndParser.hs view
@@ -2,21 +2,24 @@ module Network.MoeSocks.BuilderAndParser where -import Control.Lens-import Data.Attoparsec.ByteString-import Data.Binary-import Data.Binary.Put-import Data.Maybe-import Data.Monoid-import Data.Text.Lens-import Data.Text.Strict.Lens (utf8)-import Network.MoeSocks.Helper-import Network.MoeSocks.Type-import Network.Socket-import Prelude hiding ((-), take)+import Control.Lens+import Data.Attoparsec.ByteString (Parser, anyWord8, word8, take, count)+import Data.Attoparsec.ByteString (satisfy, choice)+import Data.Binary (Word16, Word8, decode, put)+import Data.Binary.Put (runPut)+import Data.Maybe (fromMaybe)+import Data.Monoid ((<>))+import Data.Text.Lens+import Data.Text.Strict.Lens (utf8)+import Network.Socket (SockAddr(..)) import qualified Data.ByteString as S import qualified Data.ByteString.Builder as B import qualified Prelude as P++import Network.MoeSocks.Type++import Network.MoeSocks.Helper ((-), flip4, portPairToInt)+import Prelude hiding ((-), take) _No_authentication :: Word8
src/Network/MoeSocks/Common.hs view
@@ -5,12 +5,16 @@ import Control.Lens import Control.Monad.Writer hiding (listen)-import Data.IP-import Data.Maybe+import Data.IP (IPRange, isMatchedTo)+import Data.Maybe (isJust) import Data.Text.Lens-import Network.MoeSocks.Helper+import Network.Socket (SockAddr(..), Socket(..), SocketType(..), Family(..))+import Network.Socket (setSocketOption, SocketOption(..))+ import Network.MoeSocks.Type-import Network.Socket hiding (send, recv, recvFrom, sendTo)++import Network.MoeSocks.Helper ((-), tryIO, error_)+import Network.MoeSocks.Helper (setSocket_TCP_NOTSENT_LOWAT, getSocketWithHint) import Prelude hiding ((-), take)
src/Network/MoeSocks/Default.hs view
@@ -2,15 +2,16 @@ module Network.MoeSocks.Default where -import Control.Lens-import Control.Monad.Writer-import Data.IP-import Data.Text (Text)-import Data.Text.Lens-import Network.MoeSocks.Encrypt (constCipherBox)-import Network.MoeSocks.Type-import System.Log.Logger+import Control.Lens+import Control.Monad.Writer (execWriter, tell)+import Data.IP (IPRange)+import Data.Text (Text)+import Data.Text.Lens+import System.Log.Logger (Priority(DEBUG)) import qualified Data.Text as T++import Network.MoeSocks.Encrypt (constCipherBox)+import Network.MoeSocks.Type import qualified Network.MoeSocks.Type.Bootstrap.Config as C import qualified Network.MoeSocks.Type.Bootstrap.Option as O
src/Network/MoeSocks/Encrypt.hs view
@@ -16,23 +16,24 @@ ) where -import Control.Lens-import Control.Monad.Except-import Crypto.Hash.MD5 (hash)-import Data.ByteString (ByteString)-import Data.Map-import Data.Monoid ((<>))-import Data.Text (Text)-import Data.Text.Lens-import Data.Text.Strict.Lens (utf8)-import OpenSSL (withOpenSSL)-import OpenSSL.EVP.Cipher (getCipherByName, CryptoMode(..))-import OpenSSL.EVP.Internal (cipherIvLength)-import OpenSSL.Random (randBytes)-import Prelude hiding ((-))+import Control.Lens+import Control.Monad.Except (ExceptT, runExceptT, liftIO, throwError)+import Crypto.Hash.MD5 (hash)+import Data.ByteString (ByteString) import qualified Data.ByteString as S+import Data.Map (Map,fromList)+import Data.Monoid ((<>)) import qualified Data.Strict as S+import Data.Text (Text)+import Data.Text.Lens+import Data.Text.Strict.Lens (utf8)+import OpenSSL (withOpenSSL)+import OpenSSL.EVP.Cipher (getCipherByName, CryptoMode(..))+import OpenSSL.EVP.Internal (cipherIvLength) import qualified OpenSSL.EVP.Internal as E+import OpenSSL.Random (randBytes)++import Prelude hiding ((-)) -- BEGIN backports
src/Network/MoeSocks/Handler.hs view
@@ -3,20 +3,25 @@ module Network.MoeSocks.Handler where -import Control.Concurrent+import Control.Concurrent (forkIO) import Control.Lens-import Control.Monad-import Control.Monad.Writer hiding (listen)+import Control.Monad.Writer (forever, when)+import Data.Monoid ((<>)) import Data.ByteString (ByteString) import Data.Text (Text) import Data.Text.Lens-import Network.MoeSocks.Common-import Network.MoeSocks.Helper-import Network.MoeSocks.TCP+import Network.Socket (Socket, SockAddr, SocketType(Stream, Datagram), bind)+import Network.Socket (SocketOption(ReuseAddr), setSocketOption, accept, maxListenQueue)+import Network.Socket (listen)+import Network.Socket.ByteString (recvFrom)++import Network.MoeSocks.Common (setSocketConfig)+import Network.MoeSocks.TCP (local_SOCKS5_RequestHandler, local_TCP_ForwardRequestHandler)+import Network.MoeSocks.TCP (remote_TCP_RequestHandler) import Network.MoeSocks.Type-import Network.MoeSocks.UDP-import Network.Socket hiding (send, recv, recvFrom, sendTo)-import Network.Socket.ByteString+import Network.MoeSocks.UDP (local_UDP_ForwardRequestHandler, remote_UDP_RequestHandler)++import Network.MoeSocks.Helper import Prelude hiding ((-), take) _PacketLength :: Int@@ -35,7 +40,7 @@ logSA "L loop" (pure s) - \(_localSocket, _localAddr) -> do setSocketOption _localSocket ReuseAddr 1- bindSocket _localSocket _localAddr+ bind _localSocket _localAddr case aServiceType of TCP_Service -> do@@ -125,7 +130,7 @@ info_ - "RT: TCP relay " <> showWrapped _remoteAddr <> " nyaa!" setSocketOption _remoteSocket ReuseAddr 1- bindSocket _remoteSocket _remoteAddr+ bind _remoteSocket _remoteAddr when (_env ^. fastOpen) - setSocket_TCP_FAST_OPEN _remoteSocket@@ -149,7 +154,7 @@ info_ - "RU: UDP relay " <> showWrapped _remoteAddr <> " nyaa!" setSocketOption _remoteSocket ReuseAddr 1- bindSocket _remoteSocket _remoteAddr+ bind _remoteSocket _remoteAddr let handleRemote = do (_msg, _sockAddr) <- recvFrom _remoteSocket _PacketLength
src/Network/MoeSocks/Helper.hs view
@@ -3,38 +3,49 @@ module Network.MoeSocks.Helper where -import Control.Concurrent-import Control.Concurrent.Async-import Control.Concurrent.STM-import Control.Exception-import Control.Lens-import Control.Monad-import Control.Monad.IO.Class-import Data.Attoparsec.ByteString hiding (try)-import Data.Binary-import Data.Binary.Put-import Data.ByteString (ByteString)-import Data.Char (isUpper)-import Data.Foldable (for_)-import Data.List (sortOn)-import Data.Maybe-import Data.Monoid-import Data.Text (Text)-import Data.Text.Lens-import Data.Time.Clock-import Debug.Trace (trace)-import Network.MoeSocks.Internal.Socket (sendAllToFastOpen)-import Network.Socket hiding (send, recv)-import Network.Socket.ByteString-import Prelude hiding (take, (-))-import System.Log.Logger-import System.Random-import System.Timeout (timeout)+import Control.Concurrent (threadDelay, yield)+import Control.Concurrent.Async (concurrently, race_)+import Control.Concurrent.STM (TBQueue, readTBQueue, writeTBQueue, atomically)+import Control.Exception (Exception, SomeException, IOException, AsyncException)+import Control.Exception (catches, bracket, Handler(Handler))+import Control.Exception (try, onException, throw, throwIO, catch)+import Control.Lens+import Control.Monad (forever, when)+import Control.Monad.IO.Class (MonadIO, liftIO)+import Data.Attoparsec.ByteString (IResult(Partial, Fail, Done), Result)+import Data.Attoparsec.ByteString (Parser, parse)+import Data.Binary (Word8, Word16, put, decode)+import Data.Binary.Put (runPut)+import Data.ByteString (ByteString) import qualified Data.ByteString as S import qualified Data.ByteString.Builder as B import qualified Data.ByteString.Lazy as LB+import Data.Char (isUpper)+import Data.Foldable (for_)+import Data.List (sortOn)+import Data.Maybe (fromMaybe)+import Data.Monoid ((<>)) import qualified Data.Strict as S+import Data.Text (Text) import qualified Data.Text as T+import Data.Text.Lens+import Data.Time.Clock (getCurrentTime, diffUTCTime)+import Debug.Trace (trace)+import Network.Socket (AddrInfoFlag(AI_NUMERICSERV, AI_ADDRCONFIG))+import Network.Socket (ShutdownCmd(ShutdownSend, ShutdownReceive))+import Network.Socket (Socket, SockAddr, SocketType(Stream))+import Network.Socket (SocketOption(CustomSockOpt, NoDelay), setSocketOption)+import Network.Socket (addrFamily, addrFlags, addrSocketType, shutdown, close)+import Network.Socket (defaultHints, socket, addrAddress, addrProtocol)+import Network.Socket (getAddrInfo, Family(AF_UNSPEC))+import Network.Socket.ByteString (recv, sendAll)+import System.Log.Logger (noticeM, debugM, errorM, warningM, infoM)+import System.Random (randomRIO)+import System.Timeout (timeout)++import Network.MoeSocks.Internal.Socket (sendAllToFastOpen)++import Prelude hiding (take, (-)) -- BEGIN backports
src/Network/MoeSocks/Internal/Socket.hs view
@@ -2,15 +2,15 @@ module Network.MoeSocks.Internal.Socket where -import Control.Monad-import Data.ByteString (ByteString)-import Data.ByteString.Unsafe (unsafeUseAsCStringLen)-import Foreign.C.Types-import Foreign.Ptr (Ptr)-import Network.Socket-import Network.Socket.ByteString-import Network.Socket.Internal (withSockAddr)+import Control.Monad (liftM, when)+import Data.ByteString (ByteString) import qualified Data.ByteString as S+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)+import Foreign.C.Types (CSize(..), CInt(..))+import Foreign.Ptr (Ptr)+import Network.Socket (Socket(MkSocket), SockAddr, )+import Network.Socket.ByteString (sendAll)+import Network.Socket.Internal (withSockAddr) foreign import ccall unsafe "sendto" c_sendto :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> CInt -> IO CInt
src/Network/MoeSocks/Options.hs view
@@ -2,24 +2,26 @@ module Network.MoeSocks.Options where -import Control.Lens-import Data.Aeson-import Data.Maybe-import Data.Text (Text)-import Data.Text.Lens-import Network.MoeSocks.Default-import Network.MoeSocks.Helper-import Network.MoeSocks.Type.Bootstrap.Option-import Network.MoeSocks.Type.Common-import Options.Applicative hiding (Parser)-import Prelude hiding ((-), takeWhile)-import System.Log.Logger+import Control.Lens+import Data.Aeson (Value, toJSON)+import Data.Attoparsec.Text (Parser, takeWhile, char, decimal)+import Data.Attoparsec.Text (skipSpace, parseOnly, many', choice)+import Data.Maybe (catMaybes)+import Data.Monoid ((<>))+import Data.Text (Text) import qualified Data.Text as T-import qualified Network.MoeSocks.Type.Bootstrap.Config as C+import Data.Text.Lens import qualified Options.Applicative as O-import Data.Attoparsec.Text (Parser, takeWhile, char, decimal, skipSpace,- parseOnly, many', choice)-import Data.Monoid ((<>))+import Options.Applicative hiding (Parser)+import System.Log.Logger (Priority(DEBUG, INFO))++import Network.MoeSocks.Default (defaultConfig)+import qualified Network.MoeSocks.Type.Bootstrap.Config as C+import Network.MoeSocks.Type.Bootstrap.Option (Options(..), RunningMode(..))+import Network.MoeSocks.Type.Common (Forward(Forward))++import Network.MoeSocks.Helper ((-))+import Prelude hiding ((-), takeWhile) textOption :: O.Mod O.OptionFields String -> O.Parser Text textOption x = strOption x <&> review _Text
src/Network/MoeSocks/Runtime.hs view
@@ -3,28 +3,29 @@ module Network.MoeSocks.Runtime where -import Control.Lens-import Control.Monad.Except-import Control.Monad.Writer hiding (listen)-import Data.IP-{-import Data.List (intercalate)-}-{-import Data.Text (Text)-}-import Data.Text.IO as T-import Data.Text.Lens-import Network.MoeSocks.Bootstrap-import Network.MoeSocks.Default-import Network.MoeSocks.Encrypt-import Network.MoeSocks.Helper-import Network.MoeSocks.Type-import Prelude hiding ((-), take)-import System.Log.Formatter-import System.Log.Handler.Simple-import System.Log.Logger+import Control.Lens+import Control.Monad.Except (ExceptT, throwError)+import Data.IP (IPRange)+import Data.Monoid ((<>)) import qualified Data.Text as T+import Data.Text.IO as T+import Data.Text.Lens (_Text) import qualified Network.MoeSocks.Type.Bootstrap.Config as C import qualified Network.MoeSocks.Type.Bootstrap.Option as O import qualified System.IO as IO+import System.Log.Formatter (simpleLogFormatter) import qualified System.Log.Handler as LogHandler+import System.Log.Handler.Simple (streamHandler)+import System.Log.Logger (Priority(DEBUG), removeHandler, addHandler, setLevel)+import System.Log.Logger (updateGlobalLogger, rootLoggerName)++import Network.MoeSocks.Bootstrap (loadConfig)+import Network.MoeSocks.Default (defaultRuntime, parseIPRangeList, defaultEnv)+import Network.MoeSocks.Encrypt (initCipherBox)+import Network.MoeSocks.Type++import Prelude hiding ((-), take)+import Network.MoeSocks.Helper ((-), debug_, io, is) initLogger :: Priority -> IO () initLogger aLevel = do
src/Network/MoeSocks/TCP.hs view
@@ -2,22 +2,35 @@ module Network.MoeSocks.TCP where -import Control.Concurrent.STM-import Control.Exception-import Control.Lens-import Control.Monad.Writer hiding (listen)-import Data.ByteString (ByteString)-import Data.Text (Text)-import Network.MoeSocks.BuilderAndParser-import Network.MoeSocks.Common-import Network.MoeSocks.Encrypt (identityCipher)-import Network.MoeSocks.Helper-import Network.MoeSocks.Type-import Network.Socket hiding (send, recv, recvFrom, sendTo)-import Network.Socket.ByteString (recv)-import Prelude hiding ((-), take)+import Control.Concurrent.STM (newTBQueueIO)+import Control.Exception (throwIO, finally)+import Control.Lens+import Control.Monad (when)+import Data.ByteString (ByteString) import qualified Data.ByteString as S+import Data.Monoid ((<>)) import qualified Data.Strict as S+import Data.Text (Text)+import Network.Socket (Socket, SockAddr, SocketType(Stream))+import Network.Socket (connect, getPeerName, getSocketName)+import Network.Socket.ByteString (recv)++import Network.MoeSocks.BuilderAndParser (greetingParser, greetingReplyBuilder)+import Network.MoeSocks.BuilderAndParser (shadowSocksRequestParser)+import Network.MoeSocks.BuilderAndParser (shadowSocksRequestBuilder)+import Network.MoeSocks.BuilderAndParser (connectionParser, connectionReplyBuilder)+import Network.MoeSocks.BuilderAndParser (sockAddr_To_Pair, _No_authentication)+import Network.MoeSocks.Common (showRelay, getIPLists, initTarget)+import Network.MoeSocks.Common (withChecked_IP_List, setSocketConfig)+import Network.MoeSocks.Encrypt (identityCipher)+import Network.MoeSocks.Type++import Network.MoeSocks.Helper ((-), connectMarket, consumeLoop, produceLoop)+import Network.MoeSocks.Helper (sendBytes, connectTunnel, send_, sendFast)+import Network.MoeSocks.Helper (info_, debug_, logSA, parseSocket)+import Network.MoeSocks.Helper (builder_To_ByteString, getSocket)+import Network.MoeSocks.Helper (ParseException(ParseException))+import Prelude hiding ((-), take) _NoThrottle :: Maybe a _NoThrottle = Nothing
src/Network/MoeSocks/Type/Bootstrap/Config.hs view
@@ -4,7 +4,7 @@ module Network.MoeSocks.Type.Bootstrap.Config where import Control.Lens-import Data.Aeson+import Data.Aeson (FromJSON, ToJSON) import Data.Text (Text) import GHC.Generics (Generic)
src/Network/MoeSocks/Type/Bootstrap/Option.hs view
@@ -4,10 +4,10 @@ module Network.MoeSocks.Type.Bootstrap.Option where import Control.Lens-import Data.Aeson+import Data.Aeson (Value) import Data.Text (Text)-import Network.MoeSocks.Type.Common-import System.Log.Logger+import Network.MoeSocks.Type.Common (Forward)+import System.Log.Logger (Priority) data RunningMode = RemoteMode | LocalMode | DebugMode deriving (Show, Eq)
src/Network/MoeSocks/Type/Runtime.hs view
@@ -3,17 +3,17 @@ module Network.MoeSocks.Type.Runtime where -import Control.Lens-import Control.Monad.Except-import Data.ByteString (ByteString)-import Data.Text (Text)-import Data.Text.Lens-import Data.Word-import Data.IP-import Network.MoeSocks.Type.Common-import Numeric (showHex)+import Control.Lens+import Control.Monad.Except+import Data.ByteString (ByteString)+import Data.IP import qualified Data.List as L import qualified Data.Strict as S+import Data.Text (Text)+import Data.Text.Lens+import Data.Word (Word8, Word16)+import Network.MoeSocks.Type.Common+import Numeric (showHex) data ClientGreeting = ClientGreeting {
src/Network/MoeSocks/UDP.hs view
@@ -2,22 +2,29 @@ module Network.MoeSocks.UDP where -import Control.Exception-import Control.Lens-import Control.Monad-import Control.Monad.Writer hiding (listen)-import Data.Attoparsec.ByteString-import Data.ByteString (ByteString)-import Data.Text (Text)-import Network.MoeSocks.BuilderAndParser-import Network.MoeSocks.Common-import Network.MoeSocks.Helper-import Network.MoeSocks.Type-import Network.Socket hiding (send, recv, recvFrom, sendTo)-import Network.Socket.ByteString-import Prelude hiding ((-), take)+import Control.Exception (throwIO)+import Control.Lens+import Control.Monad (when)+import Data.Monoid ((<>))+import Data.Attoparsec.ByteString (IResult(Done), parse)+import Data.ByteString (ByteString) import qualified Data.ByteString as S import qualified Data.Strict as S+import Data.Text (Text)+import Network.Socket (Socket, SockAddr)+import Network.Socket (connect, SocketType(Datagram))+import Network.Socket.ByteString (sendAllTo)++import Network.MoeSocks.BuilderAndParser (shadowSocksRequestParser)+import Network.MoeSocks.BuilderAndParser (shadowSocksRequestBuilder)+import Network.MoeSocks.BuilderAndParser (sockAddr_To_Pair)+import Network.MoeSocks.Common (withChecked_IP_List, showRelay, initTarget, getIPLists)+import Network.MoeSocks.Type++import Network.MoeSocks.Helper ((-), recv_UDP, info_, debug_, send_)+import Network.MoeSocks.Helper (logSA, getSocket, ParseException(ParseException))+import Network.MoeSocks.Helper (builder_To_ByteString)+import Prelude hiding ((-), take) buildShadowSocksRequest :: ClientRequest -> ByteString -> ByteString