1 {-# LANGUAGE OverloadedStrings #-} 2 module Databrary.Static.Service 3 ( Static(..) 4 , initStatic 5 ) where 6 7 import qualified Crypto.Hash.Algorithms as Hash 8 import Crypto.MAC.HMAC (HMAC, hmac) 9 import qualified Data.ByteString as BS 10 import Data.Maybe (fromMaybe) 11 import qualified Network.HTTP.Client as HC 12 import Network.HTTP.Types (methodPost, hContentType) 13 14 import qualified Databrary.Store.Config as C 15 16 data Static = Static 17 { staticAuthorizeAddr :: !BS.ByteString 18 , staticAssistAddr :: !BS.ByteString 19 , staticInvestigator :: !(Maybe HC.Request) 20 , staticKey :: !(BS.ByteString -> HMAC Hash.SHA256) 21 } 22 23 initStatic :: C.Config -> IO Static 24 initStatic conf = do 25 fillin <- mapM HC.parseRequest $ conf C.! "fillin" 26 return $ Static 27 { staticAuthorizeAddr = conf C.! "authorize" 28 , staticAssistAddr = conf C.! "assist" 29 , staticInvestigator = fmap (\f -> f 30 { HC.method = methodPost 31 , HC.requestHeaders = (hContentType, "application/x-www-form-urlencoded") : HC.requestHeaders f 32 , HC.cookieJar = Nothing 33 , HC.redirectCount = 0 34 }) fillin 35 , staticKey = hmac $ fromMaybe ("databrary" :: BS.ByteString) $ conf C.! "key" 36 }