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     }