Core.hs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. {-# LANGUAGE TemplateHaskell #-}
  2. {-# LANGUAGE UndecidableInstances #-}
  3. {-# LANGUAGE FlexibleInstances #-}
  4. {-# LANGUAGE FlexibleContexts #-}
  5. {-# LANGUAGE TypeFamilies #-}
  6. {-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}
  7. module Yesod.Core
  8. ( -- * Type classes
  9. Yesod (..)
  10. , YesodDispatch (..)
  11. , YesodSubDispatch (..)
  12. , RenderRoute (..)
  13. , ParseRoute (..)
  14. , RouteAttrs (..)
  15. -- ** Breadcrumbs
  16. , YesodBreadcrumbs (..)
  17. , breadcrumbs
  18. -- * Types
  19. , Approot (..)
  20. , FileUpload (..)
  21. , ErrorResponse (..)
  22. -- * Utitlities
  23. , maybeAuthorized
  24. , widgetToPageContent
  25. -- * Defaults
  26. , defaultErrorHandler
  27. , defaultYesodMiddleware
  28. , authorizationCheck
  29. -- * Data types
  30. , AuthResult (..)
  31. , unauthorizedI
  32. -- * Logging
  33. , defaultMakeLogger
  34. , defaultMessageLoggerSource
  35. , defaultShouldLog
  36. , defaultShouldLogIO
  37. , formatLogMessage
  38. , LogLevel (..)
  39. , logDebug
  40. , logInfo
  41. , logWarn
  42. , logError
  43. , logOther
  44. , logDebugS
  45. , logInfoS
  46. , logWarnS
  47. , logErrorS
  48. , logOtherS
  49. -- * Sessions
  50. , SessionBackend (..)
  51. , customizeSessionCookies
  52. , defaultClientSessionBackend
  53. , envClientSessionBackend
  54. , clientSessionBackend
  55. , sslOnlySessions
  56. , sslOnlyMiddleware
  57. , clientSessionDateCacher
  58. , loadClientSession
  59. , Header(..)
  60. -- * CSRF protection
  61. , defaultCsrfMiddleware
  62. , defaultCsrfSetCookieMiddleware
  63. , csrfSetCookieMiddleware
  64. , defaultCsrfCheckMiddleware
  65. , csrfCheckMiddleware
  66. -- * JS loaders
  67. , ScriptLoadPosition (..)
  68. , BottomOfHeadAsync
  69. -- * Subsites
  70. , MonadHandler (..)
  71. , MonadWidget (..)
  72. , getRouteToParent
  73. , defaultLayoutSub
  74. -- * Approot
  75. , guessApproot
  76. , guessApprootOr
  77. , getApprootText
  78. -- * Misc
  79. , yesodVersion
  80. , yesodRender
  81. , Yesod.Core.runFakeHandler
  82. -- * LiteApp
  83. , module Yesod.Core.Internal.LiteApp
  84. -- * Low-level
  85. , yesodRunner
  86. -- * Re-exports
  87. , module Yesod.Core.Content
  88. , module Yesod.Core.Dispatch
  89. , module Yesod.Core.Handler
  90. , module Yesod.Core.Widget
  91. , module Yesod.Core.Json
  92. , module Text.Shakespeare.I18N
  93. , module Yesod.Core.Internal.Util
  94. , module Text.Blaze.Html
  95. , MonadTrans (..)
  96. , MonadIO (..)
  97. , MonadBase (..)
  98. , MonadBaseControl
  99. , MonadResource (..)
  100. , MonadLogger
  101. -- * Commonly referenced functions/datatypes
  102. , Application
  103. -- * Utilities
  104. , showIntegral
  105. , readIntegral
  106. -- * Shakespeare
  107. -- ** Hamlet
  108. , hamlet
  109. , shamlet
  110. , xhamlet
  111. , HtmlUrl
  112. -- ** Julius
  113. , julius
  114. , JavascriptUrl
  115. , renderJavascriptUrl
  116. -- ** Cassius/Lucius
  117. , cassius
  118. , lucius
  119. , CssUrl
  120. , renderCssUrl
  121. ) where
  122. import Yesod.Core.Content
  123. import Yesod.Core.Dispatch
  124. import Yesod.Core.Handler
  125. import Yesod.Core.Class.Handler
  126. import Yesod.Core.Widget
  127. import Yesod.Core.Json
  128. import Yesod.Core.Types
  129. import Text.Shakespeare.I18N
  130. import Yesod.Core.Internal.Util (formatW3 , formatRFC1123 , formatRFC822)
  131. import Text.Blaze.Html (Html, toHtml, preEscapedToMarkup)
  132. import Control.Monad.Logger
  133. import Control.Monad.Trans.Class (MonadTrans (..))
  134. import Yesod.Core.Internal.Session
  135. import Yesod.Core.Internal.Run (yesodRunner)
  136. import Yesod.Core.Class.Yesod
  137. import Yesod.Core.Class.Dispatch
  138. import Yesod.Core.Class.Breadcrumbs
  139. import Yesod.Core.Internal.Run (yesodRender)
  140. import qualified Yesod.Core.Internal.Run
  141. import qualified Paths_yesod_core
  142. import Data.Version (showVersion)
  143. import Yesod.Routes.Class
  144. import Control.Monad.IO.Class (MonadIO (..))
  145. import Control.Monad.Base (MonadBase (..))
  146. import Control.Monad.Trans.Control (MonadBaseControl (..))
  147. import Control.Monad.Trans.Resource (MonadResource (..))
  148. import Yesod.Core.Internal.LiteApp
  149. import Text.Hamlet
  150. import Text.Cassius
  151. import Text.Lucius
  152. import Text.Julius
  153. import Network.Wai (Application)
  154. runFakeHandler :: (Yesod site, MonadIO m) =>
  155. SessionMap
  156. -> (site -> Logger)
  157. -> site
  158. -> HandlerT site IO a
  159. -> m (Either ErrorResponse a)
  160. runFakeHandler = Yesod.Core.Internal.Run.runFakeHandler
  161. {-# DEPRECATED runFakeHandler "import runFakeHandler from Yesod.Core.Unsafe" #-}
  162. -- | Return an 'Unauthorized' value, with the given i18n message.
  163. unauthorizedI :: (MonadHandler m, RenderMessage (HandlerSite m) msg) => msg -> m AuthResult
  164. unauthorizedI msg = do
  165. mr <- getMessageRender
  166. return $ Unauthorized $ mr msg
  167. yesodVersion :: String
  168. yesodVersion = showVersion Paths_yesod_core.version
  169. -- | Return the same URL if the user is authorized to see it.
  170. --
  171. -- Built on top of 'isAuthorized'. This is useful for building page that only
  172. -- contain links to pages the user is allowed to see.
  173. maybeAuthorized :: Yesod site
  174. => Route site
  175. -> Bool -- ^ is this a write request?
  176. -> HandlerT site IO (Maybe (Route site))
  177. maybeAuthorized r isWrite = do
  178. x <- isAuthorized r isWrite
  179. return $ if x == Authorized then Just r else Nothing
  180. getRouteToParent :: Monad m => HandlerT child (HandlerT parent m) (Route child -> Route parent)
  181. getRouteToParent = HandlerT $ return . handlerToParent
  182. defaultLayoutSub :: Yesod parent
  183. => WidgetT child IO ()
  184. -> HandlerT child (HandlerT parent IO) Html
  185. defaultLayoutSub cwidget = widgetToParentWidget cwidget >>= lift . defaultLayout
  186. showIntegral :: Integral a => a -> String
  187. showIntegral x = show (fromIntegral x :: Integer)
  188. readIntegral :: Num a => String -> Maybe a
  189. readIntegral s =
  190. case reads s of
  191. (i, _):_ -> Just $ fromInteger i
  192. [] -> Nothing