{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE DataKinds #-} module Web.Apiary.ClientSession ( I.Session -- * config , I.SessionConfig(..), I.KeySource(..) , I.embedKeyConfig, I.embedDefaultKeyConfig -- * initializer , initSession -- * getter , getSessionConfig -- * setter , setSession , csrfToken -- ** with sessionConfig , setSessionWith -- * filter , session , checkToken -- * Reexport -- | deleteCookie , module Web.Apiary.Cookie ) where import Web.Apiary import Data.Apiary.Extension import Data.Apiary.Proxy import qualified Web.Apiary.ClientSession.Internal as I import Web.Apiary.Cookie (deleteCookie) import qualified Data.ByteString as S import Control.Monad.Apiary.Filter.Internal.Strategy initSession :: MonadIO m => I.SessionConfig -> Initializer' m I.Session initSession c = initializer' $ I.makeSession c setSession :: (Has I.Session exts, MonadIO m) => S.ByteString -> S.ByteString -> ActionT exts m () setSession k v = do sess <- getExt (Proxy :: Proxy I.Session) I.setSession sess k v getSessionConfig :: (Has I.Session exts, Monad m) => ActionT exts m I.SessionConfig getSessionConfig = do sess <- getExt (Proxy :: Proxy I.Session) return $ I.sessionConfig sess setSessionWith :: (Has I.Session exts, MonadIO m) => I.SessionConfig -> S.ByteString -> S.ByteString -> ActionT exts m () setSessionWith cfg k v = do sess <- getExt (Proxy :: Proxy I.Session) I.setSession sess { I.sessionConfig = cfg } k v session :: (Has I.Session exts, Query a, Strategy w, MonadIO actM) => S.ByteString -> w a -> ApiaryT exts (SNext w prms a) actM m () -> ApiaryT exts prms actM m () session k w m = I.session k w m -- | create crypto random (generate random by AES CTR(cprng-aes package) and encode by base64), -- -- set it client session cookie, set XSRF-TOKEN header(when Just angularXsrfCookieName), -- -- and return value. since 0.9.0.0. csrfToken :: (Has I.Session exts, MonadIO m) => ActionT exts m S.ByteString csrfToken = getExt (Proxy :: Proxy I.Session) >>= I.csrfToken -- | check csrf token. since 0.9.0.0. checkToken :: (Has I.Session exts, MonadIO actM) => ApiaryT exts prms actM m () -> ApiaryT exts prms actM m () checkToken m = I.checkToken m