New i18n stuff

This commit is contained in:
Michael Snoyman 2011-05-15 17:10:51 +03:00
parent c44ee5509e
commit 13d9932c74
5 changed files with 30 additions and 53 deletions

View File

@ -25,7 +25,6 @@ module Yesod.Auth
import Yesod.Core import Yesod.Core
import Yesod.Persist import Yesod.Persist
import Yesod.Json import Yesod.Json
import Text.Blaze
import Language.Haskell.TH.Syntax hiding (lift) import Language.Haskell.TH.Syntax hiding (lift)
import qualified Network.Wai as W import qualified Network.Wai as W
import Text.Hamlet (hamlet) import Text.Hamlet (hamlet)
@ -39,6 +38,7 @@ import Data.Text.Encoding.Error (lenientDecode)
import Web.Routes.Quasi (toSinglePiece, fromSinglePiece) import Web.Routes.Quasi (toSinglePiece, fromSinglePiece)
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)
data Auth = Auth data Auth = Auth
@ -61,7 +61,7 @@ data Creds m = Creds
, credsExtra :: [(Text, Text)] , credsExtra :: [(Text, Text)]
} }
class (Yesod m, SinglePiece (AuthId m)) => YesodAuth m where class (Yesod m, SinglePiece (AuthId m), RenderMessage m FormMessage) => YesodAuth m where
type AuthId m type AuthId m
-- | Default destination on successful login, if no other -- | Default destination on successful login, if no other
@ -85,11 +85,9 @@ class (Yesod m, SinglePiece (AuthId m)) => YesodAuth m where
renderAuthMessage :: m renderAuthMessage :: m
-> [Text] -- ^ languages -> [Text] -- ^ languages
-> AuthMessage -> Html -> AuthMessage -> Text
renderAuthMessage _ _ = defaultMessage renderAuthMessage _ _ = defaultMessage
type Texts = [Text]
mkYesodSub "Auth" mkYesodSub "Auth"
[ ClassP ''YesodAuth [VarT $ mkName "master"] [ ClassP ''YesodAuth [VarT $ mkName "master"]
] ]
@ -114,7 +112,6 @@ setCreds doRedirects creds = do
y <- getYesod y <- getYesod
maid <- getAuthId creds maid <- getAuthId creds
l <- languages l <- languages
let mr = renderMessage Auth y l
case maid of case maid of
Nothing -> Nothing ->
if doRedirects if doRedirects
@ -131,14 +128,14 @@ setCreds doRedirects creds = do
|] |]
sendResponse rh sendResponse rh
Just ar -> do Just ar -> do
setMessage $ mr Msg.InvalidLogin setMessageI Msg.InvalidLogin
redirect RedirectTemporary ar redirect RedirectTemporary ar
else return () else return ()
Just aid -> do Just aid -> do
setSession credsKey $ toSinglePiece aid setSession credsKey $ toSinglePiece aid
if doRedirects if doRedirects
then do then do
setMessage $ mr Msg.NowLoggedIn setMessageI Msg.NowLoggedIn
redirectUltDest RedirectTemporary $ loginDest y redirectUltDest RedirectTemporary $ loginDest y
else return () else return ()
@ -229,6 +226,5 @@ redirectLogin = do
Just z -> redirect RedirectTemporary z Just z -> redirect RedirectTemporary z
Nothing -> permissionDenied "Please configure authRoute" Nothing -> permissionDenied "Please configure authRoute"
instance YesodAuth m => YesodMessage Auth m where instance YesodAuth m => RenderMessage m AuthMessage where
type Message Auth m = AuthMessage renderMessage = renderAuthMessage
renderMessage = const renderAuthMessage

View File

@ -81,7 +81,6 @@ authEmail =
AuthPlugin "email" dispatch $ \tm -> do AuthPlugin "email" dispatch $ \tm -> do
y <- lift getYesod y <- lift getYesod
l <- lift languages l <- lift languages
let mr = renderMessage (getAuth 'x') y l
#if GHC7 #if GHC7
[whamlet| [whamlet|
#else #else
@ -90,16 +89,16 @@ authEmail =
<form method="post" action="@{tm loginR}"> <form method="post" action="@{tm loginR}">
<table> <table>
<tr> <tr>
<th>#{mr Msg.Email} <th>_{Msg.Email}
<td> <td>
<input type="email" name="email"> <input type="email" name="email">
<tr> <tr>
<th>#{mr Msg.Password} <th>_{Msg.Password}
<td> <td>
<input type="password" name="password"> <input type="password" name="password">
<tr> <tr>
<td colspan="2"> <td colspan="2">
<input type="submit" value=#{mr Msg.LoginViaEmail}> <input type="submit" value=_{Msg.LoginViaEmail}>
<a href="@{tm registerR}">I don't have an account <a href="@{tm registerR}">I don't have an account
|] |]
where where
@ -117,9 +116,8 @@ authEmail =
getRegisterR :: YesodAuthEmail master => GHandler Auth master RepHtml getRegisterR :: YesodAuthEmail master => GHandler Auth master RepHtml
getRegisterR = do getRegisterR = do
toMaster <- getRouteToMaster toMaster <- getRouteToMaster
mr <- getMessageRender
defaultLayout $ do defaultLayout $ do
setTitle $ mr Msg.RegisterLong setTitleI Msg.RegisterLong
addWidget addWidget
#if GHC7 #if GHC7
[whamlet| [whamlet|
@ -153,9 +151,8 @@ postRegisterR = do
tm <- getRouteToMaster tm <- getRouteToMaster
let verUrl = render $ tm $ verify (toSinglePiece lid) verKey let verUrl = render $ tm $ verify (toSinglePiece lid) verKey
sendVerifyEmail email verKey verUrl sendVerifyEmail email verKey verUrl
mr <- getMessageRender
defaultLayout $ do defaultLayout $ do
setTitle $ mr Msg.ConfirmationEmailSentTitle setTitleI Msg.ConfirmationEmailSentTitle
addWidget addWidget
#if GHC7 #if GHC7
[whamlet| [whamlet|
@ -178,13 +175,11 @@ getVerifyR lid key = do
Just _uid -> do Just _uid -> do
setCreds False $ Creds "email" email [("verifiedEmail", email)] -- FIXME uid? setCreds False $ Creds "email" email [("verifiedEmail", email)] -- FIXME uid?
toMaster <- getRouteToMaster toMaster <- getRouteToMaster
mr <- getMessageRender setMessageI Msg.AddressVerified
setMessage $ mr Msg.AddressVerified
redirect RedirectTemporary $ toMaster setpassR redirect RedirectTemporary $ toMaster setpassR
_ -> return () _ -> return ()
mr <- getMessageRender
defaultLayout $ do defaultLayout $ do
setTitle $ mr Msg.InvalidKey setTitleI Msg.InvalidKey
addWidget addWidget
#if GHC7 #if GHC7
[whamlet| [whamlet|
@ -215,8 +210,7 @@ postLoginR = do
Just _aid -> Just _aid ->
setCreds True $ Creds "email" email [("verifiedEmail", email)] -- FIXME aid? setCreds True $ Creds "email" email [("verifiedEmail", email)] -- FIXME aid?
Nothing -> do Nothing -> do
mr <- getMessageRender setMessageI Msg.InvalidEmailPass
setMessage $ mr Msg.InvalidEmailPass
toMaster <- getRouteToMaster toMaster <- getRouteToMaster
redirect RedirectTemporary $ toMaster LoginR redirect RedirectTemporary $ toMaster LoginR
@ -224,14 +218,13 @@ getPasswordR :: YesodAuthEmail master => GHandler Auth master RepHtml
getPasswordR = do getPasswordR = do
toMaster <- getRouteToMaster toMaster <- getRouteToMaster
maid <- maybeAuthId maid <- maybeAuthId
mr <- getMessageRender
case maid of case maid of
Just _ -> return () Just _ -> return ()
Nothing -> do Nothing -> do
setMessage $ mr Msg.BadSetPass setMessageI Msg.BadSetPass
redirect RedirectTemporary $ toMaster loginR redirect RedirectTemporary $ toMaster loginR
defaultLayout $ do defaultLayout $ do
setTitle $ mr Msg.SetPassTitle setTitleI Msg.SetPassTitle
addWidget addWidget
#if GHC7 #if GHC7
[whamlet| [whamlet|
@ -262,20 +255,17 @@ postPasswordR = do
toMaster <- getRouteToMaster toMaster <- getRouteToMaster
y <- getYesod y <- getYesod
when (new /= confirm) $ do when (new /= confirm) $ do
mr <- getMessageRender setMessageI Msg.PassMismatch
setMessage $ mr Msg.PassMismatch
redirect RedirectTemporary $ toMaster setpassR redirect RedirectTemporary $ toMaster setpassR
maid <- maybeAuthId maid <- maybeAuthId
aid <- case maid of aid <- case maid of
Nothing -> do Nothing -> do
mr <- getMessageRender setMessageI Msg.BadSetPass
setMessage $ mr Msg.BadSetPass
redirect RedirectTemporary $ toMaster loginR redirect RedirectTemporary $ toMaster loginR
Just aid -> return aid Just aid -> return aid
salted <- liftIO $ saltPass new salted <- liftIO $ saltPass new
setPassword aid salted setPassword aid salted
mr <- getMessageRender setMessageI Msg.PassUpdated
setMessage $ mr Msg.PassUpdated
redirect RedirectTemporary $ loginDest y redirect RedirectTemporary $ loginDest y
saltLength :: Int saltLength :: Int

View File

@ -15,8 +15,6 @@ import Data.Maybe (fromMaybe)
import Yesod.Form import Yesod.Form
import Yesod.Handler import Yesod.Handler
import Yesod.Widget import Yesod.Widget
import Yesod.Request (languages)
import Text.Hamlet (hamlet)
import Control.Monad.IO.Class (liftIO) import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Class (lift)
import Data.Text (Text) import Data.Text (Text)
@ -58,17 +56,13 @@ authFacebook cid secret perms =
render <- lift getUrlRender render <- lift getUrlRender
let fb = Facebook.Facebook cid secret $ render $ tm url let fb = Facebook.Facebook cid secret $ render $ tm url
let furl = Facebook.getForwardUrl fb $ perms let furl = Facebook.getForwardUrl fb $ perms
y <- lift getYesod
l <- lift languages
let mr = renderMessage (getAuth 'x') y l
addHtml
#if GHC7 #if GHC7
[hamlet| [whamlet|
#else #else
[$hamlet| [$whamlet|
#endif #endif
<p> <p>
<a href="#{furl}">#{mr Msg.Facebook} <a href="#{furl}">_{Msg.Facebook}
|] |]
parseCreds :: Text -> Value -> Data.Aeson.Types.Parser (Creds m) parseCreds :: Text -> Value -> Data.Aeson.Types.Parser (Creds m)

View File

@ -34,7 +34,7 @@ data AuthMessage =
| InvalidLogin | InvalidLogin
| NowLoggedIn | NowLoggedIn
defaultMessage :: AuthMessage -> Html defaultMessage :: AuthMessage -> Text
defaultMessage NoOpenID = "No OpenID identifier found" defaultMessage NoOpenID = "No OpenID identifier found"
defaultMessage LoginOpenID = "Login via OpenID" defaultMessage LoginOpenID = "Login via OpenID"
defaultMessage Email = "Email" defaultMessage Email = "Email"
@ -45,7 +45,7 @@ defaultMessage EnterEmail = "Enter your e-mail address below, and a confirmation
defaultMessage ConfirmationEmailSentTitle = "Confirmation e-mail sent" defaultMessage ConfirmationEmailSentTitle = "Confirmation e-mail sent"
defaultMessage (ConfirmationEmailSent email) = defaultMessage (ConfirmationEmailSent email) =
"A confirmation e-mail has been sent to " `mappend` "A confirmation e-mail has been sent to " `mappend`
toHtml email `mappend` email `mappend`
"." "."
defaultMessage AddressVerified = "Address verified, please set a new password" defaultMessage AddressVerified = "Address verified, please set a new password"
defaultMessage InvalidKeyTitle = "Invalid verification key" defaultMessage InvalidKeyTitle = "Invalid verification key"

View File

@ -43,17 +43,15 @@ authOpenId =
padding-left: 18px; padding-left: 18px;
|] |]
l <- lift languages l <- lift languages
let mr = renderMessage (getAuth 'x') y l
addHamlet
#if GHC7 #if GHC7
[hamlet| [whamlet|
#else #else
[$hamlet| [$whamlet|
#endif #endif
<form method="get" action="@{tm forwardUrl}"> <form method="get" action="@{tm forwardUrl}">
<label for="#{ident}">OpenID: <label for="#{ident}">OpenID: #
<input id="#{ident}" type="text" name="#{name}" value="http://"> <input id="#{ident}" type="text" name="#{name}" value="http://">
<input type="submit" value="#{mr Msg.LoginOpenID}"> <input type="submit" value="_{Msg.LoginOpenID}">
|] |]
dispatch "GET" ["forward"] = do dispatch "GET" ["forward"] = do
roid <- runInputGet $ iopt textField name roid <- runInputGet $ iopt textField name
@ -72,8 +70,7 @@ authOpenId =
res res
Nothing -> do Nothing -> do
toMaster <- getRouteToMaster toMaster <- getRouteToMaster
mr <- getMessageRender setMessageI Msg.NoOpenID
setMessage $ mr Msg.NoOpenID
redirect RedirectTemporary $ toMaster LoginR redirect RedirectTemporary $ toMaster LoginR
dispatch "GET" ["complete", ""] = dispatch "GET" ["complete"] -- compatibility issues dispatch "GET" ["complete", ""] = dispatch "GET" ["complete"] -- compatibility issues
dispatch "GET" ["complete"] = do dispatch "GET" ["complete"] = do