Avoid use of error (#220)

This commit is contained in:
Michael Snoyman 2012-01-17 09:04:41 +02:00
parent d478065ffc
commit 0ca5e4878e
3 changed files with 19 additions and 4 deletions

View File

@ -5,6 +5,7 @@
{-# LANGUAGE RankNTypes #-} {-# LANGUAGE RankNTypes #-}
{-# LANGUAGE CPP #-} {-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# OPTIONS_GHC -fno-warn-orphans #-} {-# OPTIONS_GHC -fno-warn-orphans #-}
module Yesod.Auth module Yesod.Auth
( -- * Subsite ( -- * Subsite
@ -22,6 +23,8 @@ module Yesod.Auth
, maybeAuth , maybeAuth
, requireAuthId , requireAuthId
, requireAuth , requireAuth
-- * Exception
, AuthException (..)
) where ) where
#include "qq.h" #include "qq.h"
@ -48,6 +51,8 @@ import Yesod.Json
import Yesod.Auth.Message (AuthMessage, defaultMessage) import Yesod.Auth.Message (AuthMessage, defaultMessage)
import qualified Yesod.Auth.Message as Msg import qualified Yesod.Auth.Message as Msg
import Yesod.Form (FormMessage) import Yesod.Form (FormMessage)
import Data.Typeable (Typeable)
import Control.Exception (Exception)
data Auth = Auth data Auth = Auth
@ -233,3 +238,8 @@ redirectLogin = do
instance YesodAuth m => RenderMessage m AuthMessage where instance YesodAuth m => RenderMessage m AuthMessage where
renderMessage = renderAuthMessage renderMessage = renderAuthMessage
data AuthException = InvalidBrowserIDAssertion
| InvalidFacebookResponse
deriving (Show, Typeable)
instance Exception AuthException

View File

@ -13,6 +13,8 @@ import Yesod.Core
import Text.Hamlet (hamlet) import Text.Hamlet (hamlet)
import qualified Data.Text as T import qualified Data.Text as T
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Control.Monad.IO.Class (liftIO)
import Control.Exception (throwIO)
#include "qq.h" #include "qq.h"
@ -52,7 +54,7 @@ helper maudience = AuthPlugin
return $ T.takeWhile (/= '/') $ stripScheme $ r $ tm LoginR return $ T.takeWhile (/= '/') $ stripScheme $ r $ tm LoginR
memail <- lift $ checkAssertion audience assertion (authHttpManager master) memail <- lift $ checkAssertion audience assertion (authHttpManager master)
case memail of case memail of
Nothing -> error "Invalid assertion" Nothing -> liftIO $ throwIO InvalidBrowserIDAssertion
Just email -> setCreds True Creds Just email -> setCreds True Creds
{ credsPlugin = pid { credsPlugin = pid
, credsIdent = email , credsIdent = email

View File

@ -15,7 +15,6 @@ import Yesod.Auth
import qualified Web.Authenticate.Facebook as Facebook import qualified Web.Authenticate.Facebook as Facebook
import Data.Aeson import Data.Aeson
import Data.Aeson.Types (parseMaybe) import Data.Aeson.Types (parseMaybe)
import Data.Maybe (fromMaybe)
import Yesod.Form import Yesod.Form
import Yesod.Handler import Yesod.Handler
@ -25,6 +24,8 @@ import Control.Monad (liftM, mzero, when)
import Data.Monoid (mappend) import Data.Monoid (mappend)
import qualified Data.Aeson.Types import qualified Data.Aeson.Types
import qualified Yesod.Auth.Message as Msg import qualified Yesod.Auth.Message as Msg
import Control.Monad.IO.Class (liftIO)
import Control.Exception (throwIO)
-- | Route for login using this authentication plugin. -- | Route for login using this authentication plugin.
facebookLogin :: AuthRoute facebookLogin :: AuthRoute
@ -81,8 +82,10 @@ authFacebook cid secret perms =
let Facebook.AccessToken at' = at let Facebook.AccessToken at' = at
setSession facebookAccessTokenKey at' setSession facebookAccessTokenKey at'
so <- lift $ Facebook.getGraphData at "me" (authHttpManager master) so <- lift $ Facebook.getGraphData at "me" (authHttpManager master)
let c = fromMaybe (error "Invalid response from Facebook") c <- maybe
$ parseMaybe (parseCreds at') $ either error id so (liftIO $ throwIO InvalidFacebookResponse)
return
$ either (const Nothing) Just so >>= parseMaybe (parseCreds at')
setCreds True c setCreds True c
dispatch "GET" ["logout"] = do dispatch "GET" ["logout"] = do
m <- getYesod m <- getYesod