{-# LANGUAGE CPP , RankNTypes , OverloadedStrings , RecordWildCards , QuasiQuotes , TemplateHaskell , TypeFamilies , TypeOperators , MultiParamTypeClasses , FunctionalDependencies , FlexibleContexts , FlexibleInstances , AllowAmbiguousTypes , UndecidableInstances , GeneralizedNewtypeDeriving , ScopedTypeVariables , TypeFamilyDependencies #-} module Yesod.Auth.HmacKeccak where import Yesod.Auth.Import import qualified Data.Text as T import qualified Data.Char as C import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Char8 as BC import Data.Maybe (fromJust) import qualified Database.Persist as P import System.Random import Numeric (readHex, showHex) import Yesod.Auth.Message import Yesod.Persist hiding (get, replace, Entity, entityVal) import Text.Julius (jsFile) import Yesod.Auth.JsPath -- | type alias type Username = Text -- | main class for defining internals class ( YesodAuth master , HmacSendMail master , HmacDB db , UserCredentials (UserAccount db) , TokenData (TokenFoo db) , RenderMessage master FormMessage ) => YesodHmacKeccak db master | master -> db where -- | function for accessing the database (runDB eqivalent). -- can be set to 'runHmacPersistDB' runHmacDB :: db a -> AuthHandler master a -- runHmacDB = runHmacPersistDB -- | function to determine a valid username. -- Default: 'defaultCheckValidUsername' checkValidUsername :: (MonadHandler m, HandlerSite m ~ master) => Username -> m (Either Text Username) checkValidUsername = defaultCheckValidUsername -- | Handler for rendering the registration page. -- Default: 'getNewAccountR'' getNewAccountR :: AuthHandler master Html getNewAccountR = getNewAccountR' -- | Handler for processing registration. -- Default: 'postNewAccountR'' postNewAccountR :: AuthHandler master Html postNewAccountR = postNewAccountR' -- | Handler for rendering reactivation request page. -- Default: 'getReactivateR'' getReactivateR :: AuthHandler master Html getReactivateR = getReactivateR' -- | Handler for processing reactivation requests. -- Default: 'postReactivateR'' postReactivateR :: AuthHandler master Html postReactivateR = postReactivateR' -- | Function for rendering all messages in this plugin. -- Default: 'defaultAccountMsg' renderAccountMessage :: master -> [Text] -> AccountMsg -> Text renderAccountMessage _ _ = defaultAccountMsg -- | Route for providing login without javascript. -- Default: 'Nothing' rawLoginRoute :: Maybe (Route (HandlerSite (WidgetFor master))) rawLoginRoute = Nothing -- | Widget for the login page. -- Default: 'defaultLoginWidget' loginWidget :: YesodHmacKeccak db master => (Route Auth -> Route master) -> WidgetFor master () loginWidget = defaultLoginWidget hmacPlugin :: YesodHmacKeccak db master => AuthPlugin master hmacPlugin = AuthPlugin "authHmacKeccak" dispatch loginWidget where dispatch "POST" ["login"] = postLoginR' >>= sendResponse dispatch "GET" ["newaccount"] = getNewAccountR >>= sendResponse dispatch "POST" ["newaccount"] = postNewAccountR >>= sendResponse dispatch "GET" ["resetpasswd"] = getReactivateR >>= sendResponse dispatch "POST" ["resetpasswd"] = postReactivateR >>= sendResponse dispatch "GET" ["verify", k] = getVerifyR' (encodeUtf8 k) >>= sendResponse dispatch "POST" ["verify", k] = postVerifyR' (encodeUtf8 k) >>= sendResponse dispatch _ _ = notFound newAccountR :: AuthRoute newAccountR = PluginR "authHmacKeccak" ["newaccount"] verifyR :: ByteString -> AuthRoute verifyR k = PluginR "authHmacKeccak" ["verify", (decodeUtf8 k)] resetPasswordR :: AuthRoute resetPasswordR = PluginR "authHmacKeccak" ["resetpasswd"] loginR :: AuthRoute loginR = PluginR "authHmacKeccak" ["login"] -- Login procedure. -- | Overridable default login widget defaultLoginWidget :: YesodHmacKeccak db master => (Route Auth -> Route master) -> WidgetFor master () defaultLoginWidget tm = do render <- getUrlRenderParams toWidgetHead $ $(jsFile jsPath) render [whamlet|