packages feed

yesod-auth 1.4.6.1 → 1.4.7

raw patch · 4 files changed

+45/−20 lines, 4 filesdep ~basedep ~conduitdep ~conduit-extraPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, conduit, conduit-extra, http-conduit, resourcet

API changes (from Hackage documentation)

- Yesod.Auth: apDispatch :: AuthPlugin master -> Method -> [Piece] -> AuthHandler master TypedContent
- Yesod.Auth: apLogin :: AuthPlugin master -> (Route Auth -> Route master) -> WidgetT master IO ()
- Yesod.Auth: apName :: AuthPlugin master -> Text
- Yesod.Auth: credsExtra :: Creds master -> [(Text, Text)]
- Yesod.Auth: credsIdent :: Creds master -> Text
- Yesod.Auth: credsPlugin :: Creds master -> Text
- Yesod.Auth: instance Exception AuthException
- Yesod.Auth: instance Show AuthException
- Yesod.Auth: instance Typeable AuthException
- Yesod.Auth: instance Typeable CachedMaybeAuth
- Yesod.Auth: instance YesodAuth master => RenderMessage master AuthMessage
- Yesod.Auth: instance YesodAuth master => YesodSubDispatch Auth (HandlerT master IO)
- Yesod.Auth.BrowserId: instance Default BrowserIdSettings
- Yesod.Auth.Email: emailCredsAuthId :: EmailCreds site -> Maybe (AuthId site)
- Yesod.Auth.Email: emailCredsEmail :: EmailCreds site -> Email
- Yesod.Auth.Email: emailCredsId :: EmailCreds site -> AuthEmailId site
- Yesod.Auth.Email: emailCredsStatus :: EmailCreds site -> VerStatus
- Yesod.Auth.Email: emailCredsVerkey :: EmailCreds site -> Maybe VerKey
- Yesod.Auth.GoogleEmail2: accessToken :: Token -> Text
- Yesod.Auth.GoogleEmail2: emailType :: Email -> EmailType
- Yesod.Auth.GoogleEmail2: emailValue :: Email -> Text
- Yesod.Auth.GoogleEmail2: imageUri :: PersonImage -> Text
- Yesod.Auth.GoogleEmail2: instance Eq Email
- Yesod.Auth.GoogleEmail2: instance Eq EmailType
- Yesod.Auth.GoogleEmail2: instance Eq Gender
- Yesod.Auth.GoogleEmail2: instance Eq Name
- Yesod.Auth.GoogleEmail2: instance Eq Organization
- Yesod.Auth.GoogleEmail2: instance Eq OrganizationType
- Yesod.Auth.GoogleEmail2: instance Eq Person
- Yesod.Auth.GoogleEmail2: instance Eq PersonImage
- Yesod.Auth.GoogleEmail2: instance Eq PersonURI
- Yesod.Auth.GoogleEmail2: instance Eq PersonURIType
- Yesod.Auth.GoogleEmail2: instance Eq Place
- Yesod.Auth.GoogleEmail2: instance Eq RelationshipStatus
- Yesod.Auth.GoogleEmail2: instance Eq Token
- Yesod.Auth.GoogleEmail2: instance FromJSON Email
- Yesod.Auth.GoogleEmail2: instance FromJSON EmailType
- Yesod.Auth.GoogleEmail2: instance FromJSON Gender
- Yesod.Auth.GoogleEmail2: instance FromJSON Name
- Yesod.Auth.GoogleEmail2: instance FromJSON Organization
- Yesod.Auth.GoogleEmail2: instance FromJSON OrganizationType
- Yesod.Auth.GoogleEmail2: instance FromJSON Person
- Yesod.Auth.GoogleEmail2: instance FromJSON PersonImage
- Yesod.Auth.GoogleEmail2: instance FromJSON PersonURI
- Yesod.Auth.GoogleEmail2: instance FromJSON PersonURIType
- Yesod.Auth.GoogleEmail2: instance FromJSON Place
- Yesod.Auth.GoogleEmail2: instance FromJSON RelationshipStatus
- Yesod.Auth.GoogleEmail2: instance FromJSON Token
- Yesod.Auth.GoogleEmail2: instance Show Email
- Yesod.Auth.GoogleEmail2: instance Show EmailType
- Yesod.Auth.GoogleEmail2: instance Show Gender
- Yesod.Auth.GoogleEmail2: instance Show Name
- Yesod.Auth.GoogleEmail2: instance Show Organization
- Yesod.Auth.GoogleEmail2: instance Show OrganizationType
- Yesod.Auth.GoogleEmail2: instance Show Person
- Yesod.Auth.GoogleEmail2: instance Show PersonImage
- Yesod.Auth.GoogleEmail2: instance Show PersonURI
- Yesod.Auth.GoogleEmail2: instance Show PersonURIType
- Yesod.Auth.GoogleEmail2: instance Show Place
- Yesod.Auth.GoogleEmail2: instance Show RelationshipStatus
- Yesod.Auth.GoogleEmail2: instance Show Token
- Yesod.Auth.GoogleEmail2: nameFamily :: Name -> Maybe Text
- Yesod.Auth.GoogleEmail2: nameFormatted :: Name -> Maybe Text
- Yesod.Auth.GoogleEmail2: nameGiven :: Name -> Maybe Text
- Yesod.Auth.GoogleEmail2: nameHonorificPrefix :: Name -> Maybe Text
- Yesod.Auth.GoogleEmail2: nameHonorificSuffix :: Name -> Maybe Text
- Yesod.Auth.GoogleEmail2: nameMiddle :: Name -> Maybe Text
- Yesod.Auth.GoogleEmail2: orgEndDate :: Organization -> Maybe Text
- Yesod.Auth.GoogleEmail2: orgName :: Organization -> Maybe Text
- Yesod.Auth.GoogleEmail2: orgPrimary :: Organization -> Maybe Bool
- Yesod.Auth.GoogleEmail2: orgStartDate :: Organization -> Maybe Text
- Yesod.Auth.GoogleEmail2: orgTitle :: Organization -> Maybe Text
- Yesod.Auth.GoogleEmail2: orgType :: Organization -> Maybe OrganizationType
- Yesod.Auth.GoogleEmail2: personAboutMe :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personBirthday :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personBraggingRights :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personCircledByCount :: Person -> Maybe Int
- Yesod.Auth.GoogleEmail2: personDisplayName :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personDomain :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personEmails :: Person -> [Email]
- Yesod.Auth.GoogleEmail2: personGender :: Person -> Maybe Gender
- Yesod.Auth.GoogleEmail2: personId :: Person -> Text
- Yesod.Auth.GoogleEmail2: personImage :: Person -> Maybe PersonImage
- Yesod.Auth.GoogleEmail2: personIsPlusUser :: Person -> Maybe Bool
- Yesod.Auth.GoogleEmail2: personLanguage :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personName :: Person -> Maybe Name
- Yesod.Auth.GoogleEmail2: personNickname :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personOccupation :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personOrganizations :: Person -> [Organization]
- Yesod.Auth.GoogleEmail2: personPlacesLived :: Person -> [Place]
- Yesod.Auth.GoogleEmail2: personPlusOneCount :: Person -> Maybe Int
- Yesod.Auth.GoogleEmail2: personProfileUri :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personRelationshipStatus :: Person -> Maybe RelationshipStatus
- Yesod.Auth.GoogleEmail2: personSkills :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personTagline :: Person -> Maybe Text
- Yesod.Auth.GoogleEmail2: personUris :: Person -> [PersonURI]
- Yesod.Auth.GoogleEmail2: personVerified :: Person -> Maybe Bool
- Yesod.Auth.GoogleEmail2: placePrimary :: Place -> Maybe Bool
- Yesod.Auth.GoogleEmail2: placeValue :: Place -> Maybe Text
- Yesod.Auth.GoogleEmail2: tokenType :: Token -> Text
- Yesod.Auth.GoogleEmail2: uriLabel :: PersonURI -> Maybe Text
- Yesod.Auth.GoogleEmail2: uriType :: PersonURI -> Maybe PersonURIType
- Yesod.Auth.GoogleEmail2: uriValue :: PersonURI -> Maybe Text
+ Yesod.Auth: [apDispatch] :: AuthPlugin master -> Method -> [Piece] -> AuthHandler master TypedContent
+ Yesod.Auth: [apLogin] :: AuthPlugin master -> (Route Auth -> Route master) -> WidgetT master IO ()
+ Yesod.Auth: [apName] :: AuthPlugin master -> Text
+ Yesod.Auth: [credsExtra] :: Creds master -> [(Text, Text)]
+ Yesod.Auth: [credsIdent] :: Creds master -> Text
+ Yesod.Auth: [credsPlugin] :: Creds master -> Text
+ Yesod.Auth: instance GHC.Exception.Exception Yesod.Auth.AuthException
+ Yesod.Auth: instance GHC.Show.Show Yesod.Auth.AuthException
+ Yesod.Auth: instance Yesod.Auth.YesodAuth master => Text.Shakespeare.I18N.RenderMessage master Yesod.Auth.Message.AuthMessage
+ Yesod.Auth: instance Yesod.Auth.YesodAuth master => Yesod.Core.Class.Dispatch.YesodSubDispatch Yesod.Auth.Routes.Auth (Yesod.Core.Types.HandlerT master GHC.Types.IO)
+ Yesod.Auth: runHttpRequest :: YesodAuth master => Request -> (Response BodyReader -> HandlerT master IO a) -> HandlerT master IO a
+ Yesod.Auth.BrowserId: instance Data.Default.Class.Default Yesod.Auth.BrowserId.BrowserIdSettings
+ Yesod.Auth.Email: [emailCredsAuthId] :: EmailCreds site -> Maybe (AuthId site)
+ Yesod.Auth.Email: [emailCredsEmail] :: EmailCreds site -> Email
+ Yesod.Auth.Email: [emailCredsId] :: EmailCreds site -> AuthEmailId site
+ Yesod.Auth.Email: [emailCredsStatus] :: EmailCreds site -> VerStatus
+ Yesod.Auth.Email: [emailCredsVerkey] :: EmailCreds site -> Maybe VerKey
+ Yesod.Auth.GoogleEmail2: [accessToken] :: Token -> Text
+ Yesod.Auth.GoogleEmail2: [emailType] :: Email -> EmailType
+ Yesod.Auth.GoogleEmail2: [emailValue] :: Email -> Text
+ Yesod.Auth.GoogleEmail2: [imageUri] :: PersonImage -> Text
+ Yesod.Auth.GoogleEmail2: [nameFamily] :: Name -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [nameFormatted] :: Name -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [nameGiven] :: Name -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [nameHonorificPrefix] :: Name -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [nameHonorificSuffix] :: Name -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [nameMiddle] :: Name -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [orgEndDate] :: Organization -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [orgName] :: Organization -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [orgPrimary] :: Organization -> Maybe Bool
+ Yesod.Auth.GoogleEmail2: [orgStartDate] :: Organization -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [orgTitle] :: Organization -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [orgType] :: Organization -> Maybe OrganizationType
+ Yesod.Auth.GoogleEmail2: [personAboutMe] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personBirthday] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personBraggingRights] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personCircledByCount] :: Person -> Maybe Int
+ Yesod.Auth.GoogleEmail2: [personDisplayName] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personDomain] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personEmails] :: Person -> [Email]
+ Yesod.Auth.GoogleEmail2: [personGender] :: Person -> Maybe Gender
+ Yesod.Auth.GoogleEmail2: [personId] :: Person -> Text
+ Yesod.Auth.GoogleEmail2: [personImage] :: Person -> Maybe PersonImage
+ Yesod.Auth.GoogleEmail2: [personIsPlusUser] :: Person -> Maybe Bool
+ Yesod.Auth.GoogleEmail2: [personLanguage] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personName] :: Person -> Maybe Name
+ Yesod.Auth.GoogleEmail2: [personNickname] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personOccupation] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personOrganizations] :: Person -> [Organization]
+ Yesod.Auth.GoogleEmail2: [personPlacesLived] :: Person -> [Place]
+ Yesod.Auth.GoogleEmail2: [personPlusOneCount] :: Person -> Maybe Int
+ Yesod.Auth.GoogleEmail2: [personProfileUri] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personRelationshipStatus] :: Person -> Maybe RelationshipStatus
+ Yesod.Auth.GoogleEmail2: [personSkills] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personTagline] :: Person -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [personUris] :: Person -> [PersonURI]
+ Yesod.Auth.GoogleEmail2: [personVerified] :: Person -> Maybe Bool
+ Yesod.Auth.GoogleEmail2: [placePrimary] :: Place -> Maybe Bool
+ Yesod.Auth.GoogleEmail2: [placeValue] :: Place -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [tokenType] :: Token -> Text
+ Yesod.Auth.GoogleEmail2: [uriLabel] :: PersonURI -> Maybe Text
+ Yesod.Auth.GoogleEmail2: [uriType] :: PersonURI -> Maybe PersonURIType
+ Yesod.Auth.GoogleEmail2: [uriValue] :: PersonURI -> Maybe Text
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.Email
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.EmailType
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.Gender
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.Name
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.Organization
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.OrganizationType
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.Person
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.PersonImage
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.PersonURI
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.PersonURIType
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.Place
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.RelationshipStatus
+ Yesod.Auth.GoogleEmail2: instance Data.Aeson.Types.Class.FromJSON Yesod.Auth.GoogleEmail2.Token
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.Email
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.EmailType
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.Gender
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.Name
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.Organization
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.OrganizationType
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.Person
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.PersonImage
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.PersonURI
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.PersonURIType
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.Place
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.RelationshipStatus
+ Yesod.Auth.GoogleEmail2: instance GHC.Classes.Eq Yesod.Auth.GoogleEmail2.Token
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.Email
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.EmailType
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.Gender
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.Name
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.Organization
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.OrganizationType
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.Person
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.PersonImage
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.PersonURI
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.PersonURIType
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.Place
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.RelationshipStatus
+ Yesod.Auth.GoogleEmail2: instance GHC.Show.Show Yesod.Auth.GoogleEmail2.Token
- Yesod.Auth: class (Yesod master, PathPiece (AuthId master), RenderMessage master FormMessage) => YesodAuth master where type family AuthId master authLayout = defaultLayout authenticate creds = do { muid <- getAuthId creds; return $ maybe (UserError InvalidLogin) Authenticated muid } getAuthId creds = do { auth <- authenticate creds; return $ case auth of { Authenticated auid -> Just auid _ -> Nothing } } loginHandler = do { tp <- getRouteToParent; lift $ authLayout $ do { setTitleI LoginTitle; master <- getYesod; mapM_ (flip apLogin tp) (authPlugins master) } } renderAuthMessage _ _ = defaultMessage redirectToReferer _ = False onLogin = setMessageI NowLoggedIn onLogout = return () maybeAuthId = defaultMaybeAuthId onErrorHtml dest msg = do { setMessage $ toHtml msg; fmap asHtml $ redirect dest }
+ Yesod.Auth: class (Yesod master, PathPiece (AuthId master), RenderMessage master FormMessage) => YesodAuth master where type family AuthId master authLayout = defaultLayout authenticate creds = do { muid <- getAuthId creds; return $ maybe (UserError InvalidLogin) Authenticated muid } getAuthId creds = do { auth <- authenticate creds; return $ case auth of { Authenticated auid -> Just auid _ -> Nothing } } loginHandler = do { tp <- getRouteToParent; lift $ authLayout $ do { setTitleI LoginTitle; master <- getYesod; mapM_ (flip apLogin tp) (authPlugins master) } } renderAuthMessage _ _ = defaultMessage redirectToReferer _ = False onLogin = setMessageI NowLoggedIn onLogout = return () maybeAuthId = defaultMaybeAuthId onErrorHtml dest msg = do { setMessage $ toHtml msg; fmap asHtml $ redirect dest } runHttpRequest req inner = do { man <- authHttpManager <$> getYesod; HandlerT $ \ t -> withResponse req man $ \ res -> unHandlerT (inner res) t }
- Yesod.Auth: class (YesodAuth master, YesodPersist master) => YesodAuthPersist master where type family AuthEntity master :: * type instance AuthEntity master = KeyEntity (AuthId master) getAuthEntity = runDB . get
+ Yesod.Auth: class (YesodAuth master, YesodPersist master) => YesodAuthPersist master where type family AuthEntity master :: * AuthEntity master = KeyEntity (AuthId master) getAuthEntity = runDB . get
- Yesod.Auth.Email: class (YesodAuth site, PathPiece (AuthEmailId site), RenderMessage site AuthMessage) => YesodAuthEmail site where type family AuthEmailId site randomKey _ = nonce128urlT defaultNonceGen needOldPassword aid' = do { mkey <- lookupSession loginLinkKey; case mkey >>= readMay . unpack of { Just (aidT, time) | Just aid <- fromPathPiece aidT, toPathPiece (aid `asTypeOf` aid') == toPathPiece aid' -> do { now <- liftIO getCurrentTime; return $ addUTCTime (60 * 30) time <= now } _ -> return True } } checkPasswordSecurity _ x | length x >= 3 = return $ Right () | otherwise = return $ Left "Password must be at least three characters" confirmationEmailSentResponse identifier = do { mr <- getMessageRender; selectRep $ do { provideJsonMessage (mr msg); provideRep $ authLayout $ do { setTitleI ConfirmationEmailSentTitle; (do { (asWidgetT . toWidget) ((preEscapedText . pack) "<p>"); ((liftM (toHtml .) getMessageRender) >>= (\ urender_asm3 -> (asWidgetT . toWidget) (urender_asm3 msg))); (asWidgetT . toWidget) ((preEscapedText . pack) "</p>") }) } } } where msg = ConfirmationEmailSent identifier normalizeEmailAddress _ = toLower registerHandler = defaultRegisterHandler forgotPasswordHandler = defaultForgotPasswordHandler setPasswordHandler = defaultSetPasswordHandler
+ Yesod.Auth.Email: class (YesodAuth site, PathPiece (AuthEmailId site), RenderMessage site AuthMessage) => YesodAuthEmail site where type family AuthEmailId site randomKey _ = nonce128urlT defaultNonceGen needOldPassword aid' = do { mkey <- lookupSession loginLinkKey; case mkey >>= readMay . unpack of { Just (aidT, time) | Just aid <- fromPathPiece aidT, toPathPiece (aid `asTypeOf` aid') == toPathPiece aid' -> do { now <- liftIO getCurrentTime; return $ addUTCTime (60 * 30) time <= now } _ -> return True } } checkPasswordSecurity _ x | length x >= 3 = return $ Right () | otherwise = return $ Left "Password must be at least three characters" confirmationEmailSentResponse identifier = do { mr <- getMessageRender; selectRep $ do { provideJsonMessage (mr msg); provideRep $ authLayout $ do { setTitleI ConfirmationEmailSentTitle; (do { (asWidgetT . toWidget) ((preEscapedText . pack) "<p>"); ((liftM (toHtml .) getMessageRender) >>= (\ urender_ayUY -> (asWidgetT . toWidget) (urender_ayUY msg))); (asWidgetT . toWidget) ((preEscapedText . pack) "</p>\n") }) } } } where msg = ConfirmationEmailSent identifier normalizeEmailAddress _ = toLower registerHandler = defaultRegisterHandler forgotPasswordHandler = defaultForgotPasswordHandler setPasswordHandler = defaultSetPasswordHandler

Files

ChangeLog.md view
@@ -1,3 +1,7 @@+## 1.4.7++* add a runHttpRequest function for handling HTTP errors+ ## 1.4.6  * Use nonce package to generate verification keys and CSRF tokens [#1011](https://github.com/yesodweb/yesod/pull/1011)
Yesod/Auth.hs view
@@ -46,6 +46,7 @@     , asHtml     ) where +import           Control.Applicative ((<$>)) import Control.Monad                 (when) import Control.Monad.Trans.Maybe @@ -57,11 +58,12 @@ import qualified Data.Text as T import qualified Data.HashMap.Lazy as Map import Data.Monoid (Endo)-import Network.HTTP.Conduit (Manager)+import Network.HTTP.Client (Manager, Request, withResponse, Response, BodyReader)  import qualified Network.Wai as W  import Yesod.Core+import Yesod.Core.Types (HandlerT(..), unHandlerT) import Yesod.Persist import Yesod.Auth.Message (AuthMessage, defaultMessage) import qualified Yesod.Auth.Message as Msg@@ -146,7 +148,7 @@     authPlugins :: master -> [AuthPlugin master]      -- | What to show on the login page.-    -- +    --     -- Default handler concatenates plugin widgets and wraps the result     -- in 'authLayout'. Override if you need fancy widget containers     -- or entirely custom page.@@ -207,6 +209,16 @@     onErrorHtml dest msg = do         setMessage $ toHtml msg         fmap asHtml $ redirect dest++    -- | runHttpRequest gives you a chance to handle an HttpException and retry+    --  The default behavior is to simply execute the request which will throw an exception on failure+    --+    --  The HTTP 'Request' is given in case it is useful to change behavior based on inspecting the request.+    --  This is an experimental API that is not broadly used throughout the yesod-auth code base+    runHttpRequest :: Request -> (Response BodyReader -> HandlerT master IO a) -> HandlerT master IO a+    runHttpRequest req inner = do+      man <- authHttpManager <$> getYesod+      HandlerT $ \t -> withResponse req man $ \res -> unHandlerT (inner res) t      {-# MINIMAL loginDest, logoutDest, (authenticate | getAuthId), authPlugins, authHttpManager #-} 
Yesod/Auth/GoogleEmail2.hs view
@@ -50,11 +50,11 @@ import           Yesod.Auth               (Auth, AuthPlugin (AuthPlugin),                                            AuthRoute, Creds (Creds),                                            Route (PluginR), YesodAuth,-                                           authHttpManager, setCredsRedirect)+                                           runHttpRequest, setCredsRedirect) import qualified Yesod.Auth.Message       as Msg import           Yesod.Core               (HandlerSite, HandlerT, MonadHandler,                                            TypedContent, getRouteToParent,-                                           getUrlRender, getYesod, invalidArgs,+                                           getUrlRender, invalidArgs,                                            lift, liftIO, lookupGetParam,                                            lookupSession, notFound, redirect,                                            setSession, whamlet, (.:))@@ -63,7 +63,8 @@ import           Blaze.ByteString.Builder (fromByteString, toByteString) import           Control.Applicative      ((<$>), (<*>)) import           Control.Arrow            (second)-import           Control.Monad            (liftM, unless, when)+import           Control.Monad            (unless, when)+import           Control.Monad.IO.Class   (MonadIO) import qualified Crypto.Nonce             as Nonce import           Data.Aeson               ((.:?)) import qualified Data.Aeson               as A@@ -71,7 +72,7 @@ import           Data.Aeson.Parser        (json') import           Data.Aeson.Types         (FromJSON (parseJSON), parseEither,                                            parseMaybe, withObject, withText)-import           Data.Conduit             (($$+-))+import           Data.Conduit             (($$+-), ($$)) import           Data.Conduit.Attoparsec  (sinkParser) import qualified Data.HashMap.Strict      as M import           Data.Maybe               (fromMaybe)@@ -83,7 +84,8 @@ import qualified Data.Text.Lazy.Builder   as TL import           Network.HTTP.Client      (Manager, parseUrl, requestHeaders,                                            responseBody, urlEncodedBody)-import           Network.HTTP.Conduit     (http)+import           Network.HTTP.Client.Conduit (Request, bodyReaderSource)+import           Network.HTTP.Conduit (http) import           Network.HTTP.Types       (renderQueryText) import           System.IO.Unsafe         (unsafePerformIO) @@ -202,9 +204,7 @@                     req'                         { requestHeaders = []                         }-        manager <- liftM authHttpManager $ lift getYesod-        res <- http req manager-        value <- responseBody res $$+- sinkParser json'+        value <- makeHttpRequest req         token@(Token accessToken' tokenType') <-             case parseEither parseJSON value of                 Left e -> error e@@ -215,7 +215,7 @@         -- User's access token is saved for further access to API         when storeToken $ setSession accessTokenKey accessToken' -        personValue <- lift $ getPersonValue manager token+        personValue <- makeHttpRequest =<< personValueRequest token         person <- case parseEither parseJSON personValue of                 Left e -> error e                 Right x -> return x@@ -229,25 +229,33 @@      dispatch _ _ = notFound +makeHttpRequest+  :: (YesodAuth site)+  => Request+  -> HandlerT Auth (HandlerT site IO) A.Value+makeHttpRequest req = lift $+    runHttpRequest req $ \res -> bodyReaderSource (responseBody res) $$ sinkParser json'+ -- | Allows to fetch information about a user from Google's API. --   In case of parsing error returns 'Nothing'. --   Will throw 'HttpException' in case of network problems or error response code. -- -- Since 1.4.3 getPerson :: Manager -> Token -> HandlerT site IO (Maybe Person)-getPerson manager token = parseMaybe parseJSON <$> getPersonValue manager token+getPerson manager token = parseMaybe parseJSON <$> (do+    req <- personValueRequest token+    res <- http req manager+    responseBody res $$+- sinkParser json'+  ) -getPersonValue :: Manager -> Token -> HandlerT site IO A.Value-getPersonValue manager token = do+personValueRequest :: MonadIO m => Token -> m Request+personValueRequest token = do     req2' <- liftIO $ parseUrl "https://www.googleapis.com/plus/v1/people/me"-    let req2 = req2'+    return req2'             { requestHeaders =                 [ ("Authorization", encodeUtf8 $ "Bearer " `mappend` accessToken token)                 ]             }-    res2 <- http req2 manager-    val <- responseBody res2 $$+- sinkParser json'-    return val  -------------------------------------------------------------------------------- -- | An authentication token which was acquired from OAuth callback.
yesod-auth.cabal view
@@ -1,5 +1,5 @@ name:            yesod-auth-version:         1.4.6.1+version:         1.4.7 license:         MIT license-file:    LICENSE author:          Michael Snoyman, Patrick Brisbin@@ -39,7 +39,8 @@                    , transformers            >= 0.2.2                    , persistent              >= 2.1       && < 2.3                    , persistent-template     >= 2.1       && < 2.2-                   , http-conduit            >= 1.5+                   , http-client+                   , http-conduit            >= 2.1                    , aeson                   >= 0.7                    , lifted-base             >= 0.1                    , blaze-html              >= 0.5