Implement /register
This commit is contained in:
parent
19194426c2
commit
b8922b3157
3 changed files with 49 additions and 1 deletions
|
@ -243,6 +243,7 @@ instance Yesod App where
|
||||||
Just (ProjectInboxR _) -> return False
|
Just (ProjectInboxR _) -> return False
|
||||||
Just (GitUploadRequestR _) -> return False
|
Just (GitUploadRequestR _) -> return False
|
||||||
Just (DvaraR _) -> return False
|
Just (DvaraR _) -> return False
|
||||||
|
Just RegisterR -> return False
|
||||||
Just r -> isWriteRequest r
|
Just r -> isWriteRequest r
|
||||||
)
|
)
|
||||||
defaultCsrfHeaderName
|
defaultCsrfHeaderName
|
||||||
|
@ -851,6 +852,7 @@ instance YesodBreadcrumbs App where
|
||||||
ActorKey2R -> ("Actor Key 2", Just HomeR)
|
ActorKey2R -> ("Actor Key 2", Just HomeR)
|
||||||
RegisterEnabledR -> ("", Nothing)
|
RegisterEnabledR -> ("", Nothing)
|
||||||
RegisterAvailableR -> ("", Nothing)
|
RegisterAvailableR -> ("", Nothing)
|
||||||
|
RegisterR -> ("", Nothing)
|
||||||
|
|
||||||
HomeR -> ("Home", Nothing)
|
HomeR -> ("Home", Nothing)
|
||||||
BrowseR -> ("Browse", Just HomeR)
|
BrowseR -> ("Browse", Just HomeR)
|
||||||
|
|
|
@ -20,6 +20,7 @@ module Vervis.Handler.Client
|
||||||
, getActorKey2R
|
, getActorKey2R
|
||||||
, getRegisterEnabledR
|
, getRegisterEnabledR
|
||||||
, getRegisterAvailableR
|
, getRegisterAvailableR
|
||||||
|
, postRegisterR
|
||||||
|
|
||||||
, getHomeR
|
, getHomeR
|
||||||
, getBrowseR
|
, getBrowseR
|
||||||
|
@ -69,6 +70,7 @@ import Control.Applicative
|
||||||
import Control.Concurrent.STM.TVar
|
import Control.Concurrent.STM.TVar
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Control.Monad.Trans.Except
|
import Control.Monad.Trans.Except
|
||||||
|
import Data.Aeson
|
||||||
import Data.Bifunctor
|
import Data.Bifunctor
|
||||||
import Data.Bitraversable
|
import Data.Bitraversable
|
||||||
import Data.Function
|
import Data.Function
|
||||||
|
@ -86,7 +88,7 @@ import Yesod.Auth
|
||||||
import Yesod.Auth.Account
|
import Yesod.Auth.Account
|
||||||
import Yesod.Auth.Account.Message
|
import Yesod.Auth.Account.Message
|
||||||
import Yesod.Core
|
import Yesod.Core
|
||||||
import Yesod.Form
|
import Yesod.Form hiding (emailField)
|
||||||
import Yesod.Persist.Core
|
import Yesod.Persist.Core
|
||||||
|
|
||||||
import qualified Data.ByteString.Char8 as BC
|
import qualified Data.ByteString.Char8 as BC
|
||||||
|
@ -195,6 +197,49 @@ getRegisterAvailableR = do
|
||||||
runDB $ getBy $ UniquePersonUsername $ text2username username
|
runDB $ getBy $ UniquePersonUsername $ text2username username
|
||||||
unless (isNothing maybePerson) $ invalidArgs ["taken"]
|
unless (isNothing maybePerson) $ invalidArgs ["taken"]
|
||||||
|
|
||||||
|
postRegisterR :: Handler Encoding
|
||||||
|
postRegisterR = do
|
||||||
|
requireAppAuth
|
||||||
|
settings <- asksSite appSettings
|
||||||
|
unless (appRegister settings) $ invalidArgs ["disabled"]
|
||||||
|
room <-
|
||||||
|
case appAccounts settings of
|
||||||
|
Nothing -> return True
|
||||||
|
Just cap -> do
|
||||||
|
current <- runDB $ count ([] :: [Filter Person])
|
||||||
|
return $ current < cap
|
||||||
|
unless room $ invalidArgs ["full"]
|
||||||
|
|
||||||
|
(username, pass, email) <-
|
||||||
|
runInputPost $ (,,)
|
||||||
|
<$> ireq (checkM checkValidUsername textField) "username"
|
||||||
|
<*> ireq passwordField "passphrase"
|
||||||
|
<*> ireq emailField "email"
|
||||||
|
|
||||||
|
muser <- runDB $ getBy $ UniquePersonUsername $ text2username username
|
||||||
|
unless (isNothing muser) $ invalidArgs ["username_taken"]
|
||||||
|
|
||||||
|
muser' <- runDB $ getBy $ UniquePersonEmail email
|
||||||
|
unless (isNothing muser') $ invalidArgs ["email_taken"]
|
||||||
|
|
||||||
|
key <- newVerifyKey
|
||||||
|
hashed <- hashPassphrase pass
|
||||||
|
|
||||||
|
mnew <- unAccountPersistDB' $ addNewUser username email key hashed
|
||||||
|
person <-
|
||||||
|
case mnew of
|
||||||
|
Left err -> invalidArgs [err]
|
||||||
|
Right p -> pure p
|
||||||
|
|
||||||
|
verif <- getsYesod requireEmailVerification
|
||||||
|
if verif
|
||||||
|
then sendVerifyEmail username email $ AuthR $ verifyR username key
|
||||||
|
else unAccountPersistDB' $ verifyAccount person
|
||||||
|
|
||||||
|
return $ pairs
|
||||||
|
( "email_sent" .= verif
|
||||||
|
)
|
||||||
|
|
||||||
getHomeR :: Handler Html
|
getHomeR :: Handler Html
|
||||||
getHomeR = do
|
getHomeR = do
|
||||||
mp <- maybeAuth
|
mp <- maybeAuth
|
||||||
|
|
|
@ -120,6 +120,7 @@
|
||||||
|
|
||||||
/register/enabled RegisterEnabledR GET
|
/register/enabled RegisterEnabledR GET
|
||||||
/register/available RegisterAvailableR GET
|
/register/available RegisterAvailableR GET
|
||||||
|
/register RegisterR POST
|
||||||
|
|
||||||
---- Client ------------------------------------------------------------------
|
---- Client ------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue