packages feed

moesocks-1.0.0.41: src/Network/MoeSocks/Default.hs

{-# LANGUAGE OverloadedStrings #-}

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 qualified Data.Text as T
import qualified Network.MoeSocks.Type.Bootstrap.Config as C
import qualified Network.MoeSocks.Type.Bootstrap.Option as O

defaultConfig :: C.Config
defaultConfig = C.Config
  {
    C._remoteHost = "0.0.0.0"
  , C._remotePort = 8388
  , C._localHost = "127.0.0.1"
  , C._localPort = 1080
  , C._password = "moesocks"
  , C._method = "aes-256-cfb"
  , C._timeout = 300
  , C._tcpBufferSize = 1 -- should be handeled by CoDel and ecn in the kernel
  , C._throttle = False
  , C._throttleSpeed = 8000 -- in Kilobytes
  , C._obfuscationFlushBound = 4096
  , C._fastOpen = False
  , C._socketOption_TCP_NOTSENT_LOWAT = True
  , C._forbidden_IPs = _reserved_IP_Addresses
  }

  where
    _reserved_IP_Addresses :: [Text]
    _reserved_IP_Addresses = execWriter $ do
      let ip = tell . pure

      -- https://en.wikipedia.org/wiki/Reserved_IP_addresses
      ip "0.0.0.0/8"
      ip "10.0.0.0/8"
      ip "100.64.0.0/10"
      ip "127.0.0.0/8"
      ip "169.254.0.0/16"
      ip "172.16.0.0/12"
      ip "192.0.0.0/24"
      ip "192.0.2.0/24"
      ip "192.88.99.0/24"
      ip "192.168.0.0/16"
      ip "198.18.0.0/15"
      ip "198.51.100.0/24"
      ip "203.0.113.0/24"
      ip "224.0.0.0/4"
      ip "240.0.0.0/4"
      ip "255.255.255.255/32"

      ip "::/128"
      ip "::1/128"
      ip "::ffff:0:0/96"
      ip "100::/64"
      ip "64:ff9b::/96"
      ip "2001::/32"
      ip "2001:10::/28"
      ip "2001:20::/28"
      ip "2001:db8::/32"
      ip "2002::/16"
      ip "fc00::/7"
      ip "fe80::/10"
      ip "ff00::/8"


defaultOptions :: O.Options
defaultOptions = O.Options
  {
    O._runningMode = O.DebugMode
  , O._configFile = mempty
  , O._verbosity = DEBUG
  , O._forward_TCPs = []
  , O._forward_UDPs = []
  , O._disable_SOCKS5 = False
  , O._obfuscation = False
  , O._listMethods = False
  , O._showDefaultConfig = False
  , O._params = []
  , O._denyList = mempty
  }

parseIPRangeList :: [Text] -> [IPRange]
parseIPRangeList =
                    toListOf $ each
                              . to T.strip
                              . _Text
                              . _Show


defaultEnv :: Env
defaultEnv =
  let _c = defaultConfig
      _o = defaultOptions
  in
  Env
  {
      _timeout                        = _c ^. C.timeout
    , _tcpBufferSize                  = _c ^. C.tcpBufferSize
    , _throttle                       = _c ^. C.throttle
    , _throttleSpeed                  = _c ^. C.throttleSpeed
    , _obfuscationFlushBound          = _c ^. C.obfuscationFlushBound
    , _fastOpen                       = _c ^. C.fastOpen
    , _socketOption_TCP_NOTSENT_LOWAT = _c ^. C.socketOption_TCP_NOTSENT_LOWAT
    , _obfuscation                    = _o ^. O.obfuscation
    , _forbidden_IPs                  = _c ^. C.forbidden_IPs
                                            & parseIPRangeList
    , _denyList                       = []
    {-, _config = defaultConfig-}
    , _cipherBox = let (a,b,c,d) = constCipherBox in CipherBox a b c d
  }

defaultRuntime :: Runtime
defaultRuntime =
  Runtime
    {
      _jobs = []
    , _env = defaultEnv
    }