2016-02-18 01:43:23 +09:00
|
|
|
{- This file is part of Vervis.
|
|
|
|
-
|
2019-01-19 14:56:58 +09:00
|
|
|
- Written in 2016, 2018, 2019 by fr33domlover <fr33domlover@riseup.net>.
|
2016-02-18 01:43:23 +09:00
|
|
|
-
|
|
|
|
- ♡ Copying is an act of love. Please copy, reuse and share.
|
|
|
|
-
|
|
|
|
- The author(s) have dedicated all copyright and related and neighboring
|
|
|
|
- rights to this software to the public domain worldwide. This software is
|
|
|
|
- distributed without any warranty.
|
|
|
|
-
|
|
|
|
- You should have received a copy of the CC0 Public Domain Dedication along
|
|
|
|
- with this software. If not, see
|
|
|
|
- <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
|
|
-}
|
|
|
|
|
2016-02-23 17:45:03 +09:00
|
|
|
module Vervis.Handler.Person
|
2018-03-18 07:16:02 +09:00
|
|
|
( getResendVerifyEmailR
|
|
|
|
, getPeopleR
|
2016-02-23 11:27:01 +09:00
|
|
|
, postPeopleR
|
2016-02-19 13:10:42 +09:00
|
|
|
, getPersonNewR
|
2016-02-18 01:43:23 +09:00
|
|
|
, getPersonR
|
2018-03-26 04:26:30 +09:00
|
|
|
, postPersonR
|
|
|
|
, getPersonActivitiesR
|
2016-02-18 01:43:23 +09:00
|
|
|
)
|
|
|
|
where
|
|
|
|
|
2016-02-23 17:45:03 +09:00
|
|
|
import Vervis.Import hiding ((==.))
|
2016-02-18 01:43:23 +09:00
|
|
|
--import Prelude
|
|
|
|
|
2019-01-19 14:56:58 +09:00
|
|
|
import Data.PEM (PEM (..))
|
2016-07-28 06:46:48 +09:00
|
|
|
import Database.Esqueleto hiding (isNothing, count)
|
2019-01-19 14:56:58 +09:00
|
|
|
import Network.URI (uriFragment, parseAbsoluteURI)
|
2016-02-25 12:10:30 +09:00
|
|
|
import Vervis.Form.Person
|
2016-02-18 01:43:23 +09:00
|
|
|
--import Model
|
2016-03-07 09:39:07 +09:00
|
|
|
import Text.Blaze.Html (toHtml)
|
2018-03-18 07:16:02 +09:00
|
|
|
import Yesod.Auth.Account (newAccountR, resendVerifyEmailWidget, username)
|
|
|
|
import Yesod.Auth.Account.Message (AccountMsg (MsgEmailUnverified))
|
|
|
|
|
2019-01-19 14:56:58 +09:00
|
|
|
import qualified Data.Text as T (unpack)
|
|
|
|
|
2018-03-18 07:16:02 +09:00
|
|
|
import Yesod.Auth.Unverified (requireUnverifiedAuth)
|
2016-02-18 01:43:23 +09:00
|
|
|
|
2018-03-06 11:26:27 +09:00
|
|
|
import Text.Email.Local
|
|
|
|
|
2019-01-19 14:56:58 +09:00
|
|
|
--import Vervis.ActivityStreams
|
|
|
|
import Vervis.ActivityPub
|
|
|
|
import Vervis.ActorKey
|
2016-05-24 05:46:54 +09:00
|
|
|
import Vervis.Model.Ident
|
2018-03-06 09:55:52 +09:00
|
|
|
import Vervis.Secure
|
2016-05-26 06:10:41 +09:00
|
|
|
import Vervis.Widget (avatarW)
|
2016-05-24 05:46:54 +09:00
|
|
|
|
2018-03-18 07:16:02 +09:00
|
|
|
-- | Account verification email resend form
|
|
|
|
getResendVerifyEmailR :: Handler Html
|
|
|
|
getResendVerifyEmailR = do
|
|
|
|
person <- requireUnverifiedAuth
|
|
|
|
defaultLayout $ do
|
|
|
|
setTitleI MsgEmailUnverified
|
|
|
|
[whamlet|
|
|
|
|
<p>_{MsgEmailUnverified}
|
|
|
|
^{resendVerifyEmailWidget (username person) AuthR}
|
|
|
|
|]
|
|
|
|
|
2016-02-19 13:10:42 +09:00
|
|
|
-- | Get list of users
|
2016-02-18 01:43:23 +09:00
|
|
|
getPeopleR :: Handler Html
|
|
|
|
getPeopleR = do
|
|
|
|
people <- runDB $ select $ from $ \ (sharer, person) -> do
|
|
|
|
where_ $ sharer ^. SharerId ==. person ^. PersonIdent
|
|
|
|
orderBy [asc $ sharer ^. SharerIdent]
|
|
|
|
return $ sharer ^. SharerIdent
|
2016-05-24 05:46:54 +09:00
|
|
|
defaultLayout $(widgetFile "people")
|
2016-02-18 01:43:23 +09:00
|
|
|
|
2016-02-19 13:10:42 +09:00
|
|
|
-- | Create new user
|
2016-02-23 11:27:01 +09:00
|
|
|
postPeopleR :: Handler Html
|
2018-03-04 06:33:59 +09:00
|
|
|
postPeopleR = redirect $ AuthR newAccountR
|
|
|
|
{-
|
2016-07-28 06:46:48 +09:00
|
|
|
settings <- getsYesod appSettings
|
|
|
|
if appRegister settings
|
2016-04-20 01:03:27 +09:00
|
|
|
then do
|
2016-07-28 06:46:48 +09:00
|
|
|
room <- case appAccounts settings of
|
|
|
|
Nothing -> return True
|
|
|
|
Just cap -> do
|
|
|
|
current <- runDB $ count ([] :: [Filter Person])
|
|
|
|
return $ current < cap
|
|
|
|
if room
|
|
|
|
then do
|
|
|
|
((result, widget), enctype) <- runFormPost newPersonForm
|
|
|
|
case result of
|
|
|
|
FormSuccess np -> do
|
|
|
|
now <- liftIO getCurrentTime
|
|
|
|
runDB $ do
|
|
|
|
let sharer = Sharer
|
|
|
|
{ sharerIdent = npLogin np
|
|
|
|
, sharerName = npName np
|
|
|
|
, sharerCreated = now
|
|
|
|
}
|
|
|
|
sid <- insert sharer
|
|
|
|
let person = Person
|
|
|
|
{ personIdent = sid
|
|
|
|
, personLogin = shr2text $ npLogin np
|
|
|
|
, personHash = Nothing
|
|
|
|
, personEmail = npEmail np
|
|
|
|
}
|
|
|
|
person' <- setPassword (npPass np) person
|
|
|
|
insert_ person'
|
|
|
|
redirectUltDest HomeR
|
|
|
|
FormMissing -> do
|
|
|
|
setMessage "Field(s) missing"
|
|
|
|
defaultLayout $(widgetFile "person-new")
|
|
|
|
FormFailure _l -> do
|
|
|
|
setMessage
|
|
|
|
"User registration failed, see errors below"
|
|
|
|
defaultLayout $(widgetFile "person-new")
|
|
|
|
else do
|
|
|
|
setMessage "Maximal number of registered users reached"
|
|
|
|
redirect PeopleR
|
|
|
|
else do
|
|
|
|
setMessage "User registration disabled"
|
|
|
|
redirect PeopleR
|
2018-03-04 06:33:59 +09:00
|
|
|
-}
|
2016-02-19 13:10:42 +09:00
|
|
|
|
|
|
|
getPersonNewR :: Handler Html
|
2018-03-04 06:33:59 +09:00
|
|
|
getPersonNewR = redirect $ AuthR newAccountR
|
|
|
|
{-
|
2016-05-25 06:48:21 +09:00
|
|
|
regEnabled <- getsYesod $ appRegister . appSettings
|
|
|
|
if regEnabled
|
|
|
|
then do
|
|
|
|
((_result, widget), enctype) <- runFormPost newPersonForm
|
|
|
|
defaultLayout $(widgetFile "person-new")
|
|
|
|
else notFound
|
2018-03-04 06:33:59 +09:00
|
|
|
-}
|
2016-02-19 13:10:42 +09:00
|
|
|
|
2018-03-26 04:26:30 +09:00
|
|
|
getPersonR :: ShrIdent -> Handler TypedContent
|
|
|
|
getPersonR shr = do
|
2016-03-03 17:35:29 +09:00
|
|
|
person <- runDB $ do
|
2018-03-26 04:26:30 +09:00
|
|
|
Entity sid _s <- getBy404 $ UniqueSharer shr
|
2016-03-03 17:35:29 +09:00
|
|
|
Entity _pid p <- getBy404 $ UniquePersonIdent sid
|
|
|
|
return p
|
2019-01-19 14:56:58 +09:00
|
|
|
renderUrl <- getUrlRender
|
|
|
|
let route2uri route =
|
|
|
|
case parseAbsoluteURI $ T.unpack $ renderUrl route of
|
|
|
|
Nothing -> error "getRenderUrl produced invalid URI!!!"
|
|
|
|
Just u -> u
|
|
|
|
me = route2uri $ PersonR shr
|
|
|
|
actorKey <-
|
|
|
|
liftIO . fmap actorKeyPublicBin . readTVarIO =<< getsYesod appActorKey
|
2018-03-26 04:26:30 +09:00
|
|
|
selectRep $ do
|
|
|
|
provideRep $ do
|
|
|
|
secure <- getSecure
|
|
|
|
defaultLayout $(widgetFile "person")
|
2019-01-19 14:56:58 +09:00
|
|
|
provideAP Actor
|
|
|
|
{ actorId = me
|
|
|
|
, actorType = ActorTypePerson
|
|
|
|
, actorUsername = shr2text shr
|
|
|
|
, actorInbox = route2uri InboxR
|
|
|
|
, actorPublicKey = PublicKey
|
|
|
|
{ publicKeyId = me { uriFragment = "#key" }
|
|
|
|
, publicKeyOwner = me
|
|
|
|
, publicKeyPem = PEM "PUBLIC KEY" [] actorKey
|
|
|
|
, publicKeyAlgo = Just AlgorithmEd25519
|
|
|
|
}
|
|
|
|
}
|
2018-03-26 04:26:30 +09:00
|
|
|
|
|
|
|
postPersonR :: ShrIdent -> Handler TypedContent
|
|
|
|
postPersonR _ = notFound
|
|
|
|
|
|
|
|
getPersonActivitiesR :: ShrIdent -> Handler TypedContent
|
|
|
|
getPersonActivitiesR _ = notFound
|