Browse Source

Load certificates

master
Denis Tereshkin 9 years ago
parent
commit
b703c77a62
  1. 57
      app/Main.hs
  2. 3
      quik-connector.cabal

57
app/Main.hs

@ -7,6 +7,7 @@ import QuoteSource.DataImport
import Control.Concurrent hiding (readChan, writeChan) import Control.Concurrent hiding (readChan, writeChan)
import Control.Monad import Control.Monad
import Control.Exception import Control.Exception
import Control.Error.Util
import Control.Monad.IO.Class import Control.Monad.IO.Class
import Data.IORef import Data.IORef
import Graphics.UI.Gtk hiding (Action, backspace) import Graphics.UI.Gtk hiding (Action, backspace)
@ -21,6 +22,7 @@ import ATrade.Broker.Protocol
import Broker.PaperBroker import Broker.PaperBroker
import Broker.QuikBroker import Broker.QuikBroker
import System.Directory
import System.Log.Logger import System.Log.Logger
import System.Log.Handler.Simple import System.Log.Handler.Simple
import System.Log.Handler (setFormatter) import System.Log.Handler (setFormatter)
@ -34,6 +36,7 @@ import qualified Data.ByteString.Lazy as BL
import qualified Data.HashMap.Strict as HM import qualified Data.HashMap.Strict as HM
import qualified Data.Vector as V import qualified Data.Vector as V
import qualified Data.Text as T import qualified Data.Text as T
import Data.Maybe
import Control.Monad.Trans.Except import Control.Monad.Trans.Except
import Broker.QuikBroker.Trans2QuikApi import Broker.QuikBroker.Trans2QuikApi
@ -54,6 +57,8 @@ data Config = Config {
brokerserverEndpoint :: String, brokerserverEndpoint :: String,
whitelist :: [T.Text], whitelist :: [T.Text],
blacklist :: [T.Text], blacklist :: [T.Text],
brokerServerCertPath :: Maybe FilePath,
brokerClientCertificateDir :: Maybe FilePath,
tables :: [TableConfig], tables :: [TableConfig],
quikPath :: String, quikPath :: String,
dllPath :: String, dllPath :: String,
@ -76,6 +81,8 @@ parseConfig = withObject "object" $ \obj -> do
bse <- obj .: "brokerserver-endpoint" bse <- obj .: "brokerserver-endpoint"
whitelist' <- obj .:? "whitelist" .!= [] whitelist' <- obj .:? "whitelist" .!= []
blacklist' <- obj .:? "blacklist" .!= [] blacklist' <- obj .:? "blacklist" .!= []
serverCert <- obj .:? "broker_server_certificate"
clientCerts <- obj .:? "broker_client_certificates"
rt <- case HM.lookup "tables" obj of rt <- case HM.lookup "tables" obj of
Just v -> parseTables v Just v -> parseTables v
Nothing -> fail "Expected tables array" Nothing -> fail "Expected tables array"
@ -89,6 +96,8 @@ parseConfig = withObject "object" $ \obj -> do
brokerserverEndpoint = bse, brokerserverEndpoint = bse,
whitelist = whitelist', whitelist = whitelist',
blacklist = blacklist', blacklist = blacklist',
brokerServerCertPath = serverCert,
brokerClientCertificateDir = clientCerts,
tables = rt, tables = rt,
quikPath = qp, quikPath = qp,
dllPath = dp, dllPath = dp,
@ -156,17 +165,43 @@ main = do
Left errmsg -> warningM "main" $ "Can't load quik broker: " ++ T.unpack errmsg Left errmsg -> warningM "main" $ "Can't load quik broker: " ++ T.unpack errmsg
Right brokerQ -> Right brokerQ ->
withContext (\ctx -> withContext (\ctx ->
bracket (startQuoteSourceServer c2 ctx (T.pack $ quotesourceEndpoint config)) stopQuoteSourceServer (\qsServer -> do withZapHandler ctx (\zap -> do
bracket (startBrokerServer [broker, brokerQ] ctx (T.pack $ brokerserverEndpoint config) (tradeSink config)) stopBrokerServer (\broServer -> do zapSetWhitelist zap $ whitelist config
void initGUI zapSetBlacklist zap $ blacklist config
window <- windowNew
window `on` deleteEvent $ do case brokerClientCertificateDir config of
liftIO mainQuit Just path -> do
return False certs <- loadCertificatesFromDirectory path
widgetShowAll window forM_ certs (\cert -> zapAddClientCertificate zap cert)
mainGUI) Nothing -> return ()
infoM "main" "BRS down")
) serverCert <- case brokerServerCertPath config of
Just certFile -> do
eitherCert <- loadCertificateFromFile certFile
case eitherCert of
Left err -> do
warningM "main" $ "Unable to load server certificate: " ++ err
return Nothing
Right cert -> return $ Just cert
Nothing -> return Nothing
let serverParams = defaultServerSecurityParams { sspDomain = Just "global",
sspCertificate = serverCert }
bracket (startQuoteSourceServer c2 ctx (T.pack $ quotesourceEndpoint config)) stopQuoteSourceServer (\qsServer -> do
bracket (startBrokerServer [broker, brokerQ] ctx (T.pack $ brokerserverEndpoint config) (tradeSink config) serverParams) stopBrokerServer (\broServer -> do
void initGUI
window <- windowNew
window `on` deleteEvent $ do
liftIO mainQuit
return False
widgetShowAll window
mainGUI)
infoM "main" "BRS down")
))
killThread forkId killThread forkId
infoM "main" "Main thread done" infoM "main" "Main thread done"
loadCertificatesFromDirectory path = do
files <- listDirectory path
catMaybes <$> forM files (\file -> hush <$> loadCertificateFromFile file)

3
quik-connector.cabal

@ -82,6 +82,7 @@ executable quik-connector-exe
, vector , vector
, text , text
, zeromq4-haskell , zeromq4-haskell
, zeromq4-haskell-zap
, libatrade , libatrade
, transformers , transformers
, stm , stm
@ -89,6 +90,8 @@ executable quik-connector-exe
, http-client-tls , http-client-tls
, utf8-string , utf8-string
, connection , connection
, directory
, errors
default-language: Haskell2010 default-language: Haskell2010
extra-libraries: "user32" extra-libraries: "user32"

Loading…
Cancel
Save