{-# LANGUAGE OverloadedStrings #-}
module Client.Network.Connect
( withConnection
, ircPort
, tlsParams
) where
import Client.Configuration.ServerSettings
import Control.Applicative
import Control.Exception (bracket)
import Control.Lens
import qualified Data.Text.Encoding as Text
import Network.Socket (PortNumber)
import Hookup
tlsParams :: ServerSettings -> TlsParams
tlsParams ss = TlsParams
{ tpClientCertificate = view ssTlsClientCert ss
, tpClientPrivateKey = view ssTlsClientKey ss <|> view ssTlsClientCert ss
, tpServerCertificate = view ssTlsServerCert ss
, tpCipherSuite = view ssTlsCiphers ss
, tpInsecure = not (view ssTlsVerify ss)
, tpClientPrivateKeyPassword =
case view ssTlsClientKeyPassword ss of
Just (SecretText str) -> Just (Text.encodeUtf8 str)
_ -> Nothing
}
proxyParams :: ServerSettings -> Maybe SocksParams
proxyParams ss =
view ssSocksHost ss <&> \host ->
SocksParams host (view ssSocksPort ss)
buildConnectionParams :: ServerSettings -> ConnectionParams
buildConnectionParams ss = ConnectionParams
{ cpHost = view ssHostName ss
, cpPort = ircPort ss
, cpTls = case view ssTls ss of
TlsYes -> Just (tlsParams ss)
TlsNo -> Nothing
TlsStart -> Nothing
, cpSocks = proxyParams ss
, cpBind = view ssBindHostName ss
}
ircPort :: ServerSettings -> PortNumber
ircPort args =
case view ssPort args of
Just p -> fromIntegral p
Nothing ->
case view ssTls args of
TlsYes -> 6697
TlsNo -> 6667
TlsStart -> 6667
withConnection :: ServerSettings -> (Connection -> IO a) -> IO a
withConnection settings k =
bracket (connect (buildConnectionParams settings)) close k