headerMessagesMiddleware

This commit is contained in:
Gregor Kleen 2019-04-05 21:08:39 +02:00
parent 819ec36073
commit efac923cc2
3 changed files with 18 additions and 3 deletions

View File

@ -83,6 +83,8 @@ import Data.Bits (Bits(zeroBits))
import Network.Wai.Parse (lbsBackEnd)
import qualified Data.Aeson as JSON
instance DisplayAble b => DisplayAble (E.CryptoID a b) where
display = display . ciphertext
@ -814,7 +816,7 @@ instance Yesod UniWorX where
-- b) Validates that incoming write requests include that token in either a header or POST parameter.
-- To add it, chain it together with the defaultMiddleware: yesodMiddleware = defaultYesodMiddleware . defaultCsrfMiddleware
-- For details, see the CSRF documentation in the Yesod.Core.Handler module of the yesod-core package.
yesodMiddleware = defaultYesodMiddleware . normalizeRouteMiddleware . defaultCsrfMiddleware . updateFavouritesMiddleware
yesodMiddleware = defaultYesodMiddleware . normalizeRouteMiddleware . defaultCsrfMiddleware . updateFavouritesMiddleware . headerMessagesMiddleware
where
updateFavouritesMiddleware :: Handler a -> Handler a
updateFavouritesMiddleware handler = (*> handler) . runMaybeT $ do
@ -854,6 +856,14 @@ instance Yesod UniWorX where
when changed $ do
$logDebugS "normalizeRouteMiddleware" [st|Redirecting to #{tshow route'}|]
redirectWith movedPermanently301 route'
headerMessagesMiddleware :: Handler a -> Handler a
headerMessagesMiddleware handler = (*> handler) . runMaybeT $ do
isModal <- hasCustomHeader HeaderIsModal
dbTableShortcircuit <- hasCustomHeader HeaderDBTableShortcircuit
guard $ isModal || dbTableShortcircuit
msgs <- MaybeT $ mapM (\(msgState, content) -> Message <$> fromPathPiece msgState <*> Just content) <$> getMessages
addCustomHeader HeaderAlerts . decodeUtf8 $ JSON.encode msgs
-- Since we implement `errorHandler` ourselves we don't need `defaultMessageWidget`
defaultMessageWidget _title _body = error "defaultMessageWidget: undefined"

View File

@ -117,6 +117,7 @@ postAdminTestR = do
tell . pure $ Message Success [shamlet|Email-test gestartet (Job ##{tshow (fromSqlKey jId)})|]
return jId
writeJobCtl $ JobCtlPerform jId
addMessage Warning [shamlet|Inkorrekt ausgegebener Alert|] -- For testing alert handling when short circuiting; for proper (not fallback-solution) handling always use `tell` within `formResultModal`
let emailWidget' = wrapForm emailWidget def
{ formAction = Just . SomeRoute $ AdminTestR

View File

@ -624,10 +624,10 @@ takeSessionJson key = lookupSessionJson key <* deleteSession (toPathPiece key)
-- Moved to Utils.Parameters
---------------------------------
-- Custom HTTP Request-Headers --
-- Custom HTTP Headers --
---------------------------------
data CustomHeader = HeaderIsModal | HeaderDBTableShortcircuit
data CustomHeader = HeaderIsModal | HeaderDBTableShortcircuit | HeaderAlerts
deriving (Eq, Ord, Enum, Bounded, Read, Show, Generic)
instance Universe CustomHeader
@ -640,6 +640,10 @@ lookupCustomHeader ident = (>>= fromPathPiece . decodeUtf8) <$> lookupHeader (CI
hasCustomHeader :: MonadHandler m => CustomHeader -> m Bool
hasCustomHeader ident = isJust <$> lookupHeader (CI.mk . encodeUtf8 $ toPathPiece ident)
addCustomHeader, replaceOrAddCustomHeader :: (MonadHandler m, PathPiece payload) => CustomHeader -> payload -> m ()
addCustomHeader ident payload = addHeader (toPathPiece ident) (toPathPiece payload)
replaceOrAddCustomHeader ident payload = replaceOrAddHeader (toPathPiece ident) (toPathPiece payload)
------------------
-- Cryptography --
------------------