yesod-auth doesn't use redirects for JSON requests (fixes #479)

This commit is contained in:
Michael Snoyman 2013-03-11 11:37:40 +02:00
parent 8246aa4c1e
commit e2cd292877
2 changed files with 26 additions and 19 deletions

View File

@ -162,26 +162,39 @@ mkYesodSub "Auth"
/page/#Text/STRINGS PluginR /page/#Text/STRINGS PluginR
|] |]
setCreds :: YesodAuth master => Bool -> Creds master -> GHandler sub master () setCreds :: YesodAuth master
=> Bool
-> Creds master
-> GHandler sub master ()
setCreds doRedirects creds = do setCreds doRedirects creds = do
y <- getYesod y <- getYesod
maid <- getAuthId creds maid <- getAuthId creds
case maid of case maid of
Nothing -> Nothing -> when doRedirects $ do
when doRedirects $ do
case authRoute y of case authRoute y of
Nothing -> do rh <- defaultLayout $ toWidget [shamlet| Nothing -> do
$newline never res <- selectRep $ do
<h1>Invalid login provideRep $ defaultLayout $ toWidget [shamlet|<h1>Invalid login|]
|] provideRep $ return $ object ["message" .= ("Invalid Login" :: Text)]
sendResponse rh sendResponse res
Just ar -> do setMessageI Msg.InvalidLogin Just ar -> do
redirect ar res <- selectRep $ do
provideRepType typeHtml $ do
setMessageI Msg.InvalidLogin
_ <- redirect ar
return ()
provideRep $ return $ object ["message" .= ("Invalid Login" :: Text)]
sendResponse res
Just aid -> do Just aid -> do
setSession credsKey $ toPathPiece aid setSession credsKey $ toPathPiece aid
when doRedirects $ do when doRedirects $ do
onLogin onLogin
redirectUltDest $ loginDest y res <- selectRep $ do
provideRepType typeHtml $ do
_ <- redirectUltDest $ loginDest y
return ()
provideRep $ return $ object ["message" .= ("Login Successful" :: Text)]
sendResponse res
getCheckR :: YesodAuth master => GHandler Auth master TypedContent getCheckR :: YesodAuth master => GHandler Auth master TypedContent
getCheckR = do getCheckR = do

View File

@ -11,7 +11,6 @@ module Yesod.Core.Json
-- * Produce JSON values -- * Produce JSON values
, J.Value (..) , J.Value (..)
, object
, array , array
, (.=) , (.=)
@ -26,14 +25,13 @@ import Yesod.Content (TypedContent)
import Yesod.Internal.Core (defaultLayout, Yesod) import Yesod.Internal.Core (defaultLayout, Yesod)
import Yesod.Widget (GWidget) import Yesod.Widget (GWidget)
import Yesod.Routes.Class import Yesod.Routes.Class
import Control.Arrow (second)
import Control.Applicative ((<$>)) import Control.Applicative ((<$>))
import Control.Monad (join) import Control.Monad (join)
import qualified Data.Aeson as J import qualified Data.Aeson as J
import qualified Data.Aeson.Parser as JP import qualified Data.Aeson.Parser as JP
import Data.Aeson ((.=)) import Data.Aeson ((.=))
import Data.Conduit.Attoparsec (sinkParser) import Data.Conduit.Attoparsec (sinkParser)
import Data.Text (Text, pack) import Data.Text (pack)
import qualified Data.Vector as V import qualified Data.Vector as V
import Data.Conduit import Data.Conduit
import Network.Wai (requestBody, requestHeaders) import Network.Wai (requestBody, requestHeaders)
@ -87,10 +85,6 @@ parseJsonBody_ = do
J.Error s -> invalidArgs [pack s] J.Error s -> invalidArgs [pack s]
J.Success a -> return a J.Success a -> return a
-- | Convert a list of pairs to an 'J.Object'.
object :: J.ToJSON a => [(Text, a)] -> J.Value
object = J.object . map (second J.toJSON)
-- | Convert a list of values to an 'J.Array'. -- | Convert a list of values to an 'J.Array'.
array :: J.ToJSON a => [a] -> J.Value array :: J.ToJSON a => [a] -> J.Value
array = J.Array . V.fromList . map J.toJSON array = J.Array . V.fromList . map J.toJSON