chore(email): improve email validity checks
This commit is contained in:
parent
3865afbceb
commit
8cc04c8e11
@ -23,6 +23,7 @@ import qualified Database.Esqueleto.Utils as E
|
|||||||
import Handler.Utils.DateTime
|
import Handler.Utils.DateTime
|
||||||
import Handler.Utils.Avs
|
import Handler.Utils.Avs
|
||||||
import Handler.Utils.Widgets
|
import Handler.Utils.Widgets
|
||||||
|
import Handler.Utils.Users
|
||||||
|
|
||||||
import Handler.Admin.Test as Handler.Admin
|
import Handler.Admin.Test as Handler.Admin
|
||||||
import Handler.Admin.ErrorMessage as Handler.Admin
|
import Handler.Admin.ErrorMessage as Handler.Admin
|
||||||
@ -83,7 +84,7 @@ getAdminProblemsR = do
|
|||||||
|
|
||||||
getProblemUnreachableR :: Handler Html
|
getProblemUnreachableR :: Handler Html
|
||||||
getProblemUnreachableR = do
|
getProblemUnreachableR = do
|
||||||
unreachables <- runDB $ E.select retrieveUnreachableUsers
|
unreachables <- runDB retrieveUnreachableUsers'
|
||||||
siteLayoutMsg MsgProblemsUnreachableHeading $ do
|
siteLayoutMsg MsgProblemsUnreachableHeading $ do
|
||||||
setTitleI MsgProblemsUnreachableHeading
|
setTitleI MsgProblemsUnreachableHeading
|
||||||
[whamlet|
|
[whamlet|
|
||||||
@ -92,7 +93,7 @@ getProblemUnreachableR = do
|
|||||||
<ul>
|
<ul>
|
||||||
$forall usr <- unreachables
|
$forall usr <- unreachables
|
||||||
<li>
|
<li>
|
||||||
^{linkUserWidget ForProfileR usr}
|
^{linkUserWidget ForProfileR usr} (#{usr ^. _userDisplayEmail} / #{usr ^. _userEmail})
|
||||||
|]
|
|]
|
||||||
|
|
||||||
getProblemFbutNoR :: Handler Html
|
getProblemFbutNoR :: Handler Html
|
||||||
@ -151,6 +152,20 @@ retrieveUnreachableUsers = do
|
|||||||
E.&&. E.not_ ((user E.^. UserEmail) `E.like` E.val "%@%.%")
|
E.&&. E.not_ ((user E.^. UserEmail) `E.like` E.val "%@%.%")
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
retrieveUnreachableUsers' :: DB [Entity User]
|
||||||
|
retrieveUnreachableUsers' = do
|
||||||
|
obviousUnreachable <- E.select retrieveUnreachableUsers
|
||||||
|
emailUsers <- E.select $ do
|
||||||
|
user <- E.from $ E.table @User
|
||||||
|
E.where_ $ E.isNothing (user E.^. UserPostAddress)
|
||||||
|
E.&&. E.isNothing (user E.^. UserCompanyDepartment)
|
||||||
|
E.&&. ( ((user E.^. UserDisplayEmail) `E.like` E.val "%@%.%")
|
||||||
|
E.||. ((user E.^. UserEmail) `E.like` E.val "%@%.%"))
|
||||||
|
pure user
|
||||||
|
let hasInvalidEmail = isNothing . getEmailAddress . entityVal
|
||||||
|
invaldEmail = filter hasInvalidEmail emailUsers
|
||||||
|
return $ obviousUnreachable ++ invaldEmail
|
||||||
|
|
||||||
allDriversHaveAvsId :: Day -> DB Bool
|
allDriversHaveAvsId :: Day -> DB Bool
|
||||||
-- allDriversHaveAvsId = fmap isNothing . E.selectOne . retrieveDriversWithoutAvsId
|
-- allDriversHaveAvsId = fmap isNothing . E.selectOne . retrieveDriversWithoutAvsId
|
||||||
allDriversHaveAvsId = E.selectNotExists . retrieveDriversWithoutAvsId
|
allDriversHaveAvsId = E.selectNotExists . retrieveDriversWithoutAvsId
|
||||||
|
|||||||
@ -42,13 +42,13 @@ addRecipientsDB uFilter = runConduit $ transPipe (liftHandler . runDB) (selectSo
|
|||||||
userAddressFrom :: User -> Address
|
userAddressFrom :: User -> Address
|
||||||
-- ^ Format an e-mail address suitable for usage in a @From@-header
|
-- ^ Format an e-mail address suitable for usage in a @From@-header
|
||||||
--
|
--
|
||||||
-- Uses `userDisplayEmail`
|
-- Uses `userDisplayEmail` only
|
||||||
userAddressFrom User{userDisplayEmail, userDisplayName} = Address (Just userDisplayName) $ CI.original userDisplayEmail
|
userAddressFrom User{userDisplayEmail, userDisplayName} = Address (Just userDisplayName) $ CI.original userDisplayEmail
|
||||||
|
|
||||||
userAddress :: User -> Address
|
userAddress :: User -> Address
|
||||||
-- ^ Format an e-mail address suitable for usage as a recipient
|
-- ^ Format an e-mail address suitable for usage as a recipient
|
||||||
--
|
--
|
||||||
-- Like userAddressFrom and no longer uses `userEmail`, since unlike Uni2work, userEmail from LDAP is untrustworthy.
|
-- Like userAddressFrom, but prefers `userDisplayEmail` (if valid) and otherwise uses `userEmail`. Unlike Uni2work, userEmail from LDAP is untrustworthy.
|
||||||
userAddress User{userEmail, userDisplayEmail, userDisplayName}
|
userAddress User{userEmail, userDisplayEmail, userDisplayName}
|
||||||
= Address (Just userDisplayName) $ CI.original $ pickValidEmail userDisplayEmail userEmail
|
= Address (Just userDisplayName) $ CI.original $ pickValidEmail userDisplayEmail userEmail
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ userMailT uid mAct = do
|
|||||||
mapSubject ("[SUPERVISOR] " <>)
|
mapSubject ("[SUPERVISOR] " <>)
|
||||||
addHtmlMarkdownAlternatives' "InfoSupervisor" infoSupervisor -- adding explanation why the supervisor received this email
|
addHtmlMarkdownAlternatives' "InfoSupervisor" infoSupervisor -- adding explanation why the supervisor received this email
|
||||||
else -- do
|
else -- do
|
||||||
-- failedSubject <- lookupMailHeader "Subject"
|
-- failedSubject <- lookupMailHeader "Subject"
|
||||||
$logErrorS "Mail" $ "Attempt to email invalid address: " <> tshow mailtoAddr -- <> " with subject " <> tshow failedSubject
|
$logErrorS "Mail" $ "Attempt to email invalid address: " <> tshow mailtoAddr -- <> " with subject " <> tshow failedSubject
|
||||||
|
|
||||||
-- | like userMailT, but always sends a single mail to the given UserId, ignoring supervisors
|
-- | like userMailT, but always sends a single mail to the given UserId, ignoring supervisors
|
||||||
@ -138,20 +138,20 @@ userMailTdirect uid mAct = do
|
|||||||
, mcCsvOptions = userCsvOptions
|
, mcCsvOptions = userCsvOptions
|
||||||
}
|
}
|
||||||
mailtoAddr = userAddress user
|
mailtoAddr = userAddress user
|
||||||
unless (validEmail $ addressEmail mailtoAddr) ($logErrorS "Mail" $ "Attempt to email invalid address: " <> tshow mailtoAddr)
|
|
||||||
mailT ctx $ do
|
mailT ctx $ do
|
||||||
|
failedSubject <- lookupMailHeader "Subject"
|
||||||
|
unless (validEmail $ addressEmail mailtoAddr) ($logErrorS "Mail" $ "Attempt to email invalid address: " <> tshow mailtoAddr <> " with subject " <> tshow failedSubject)
|
||||||
_mailTo .= pure mailtoAddr
|
_mailTo .= pure mailtoAddr
|
||||||
mAct
|
mAct
|
||||||
-- TODO: ensure that the Email is VALID HERE!
|
{- Problematic due to return type a
|
||||||
-- if validEmail $ addressEmail mailtoAddr
|
if validEmail $ addressEmail mailtoAddr
|
||||||
-- then
|
then mailT ctx $ do
|
||||||
-- mailT ctx $ do
|
_mailTo .= pure mailtoAddr
|
||||||
-- _mailTo .= pure mailtoAddr
|
mAct
|
||||||
-- mAct
|
else
|
||||||
-- else do
|
-- failedSubject <- lookupMailHeader "Subject"
|
||||||
-- -- failedSubject <- lookupMailHeader "Subject"
|
$logErrorS "Mail" $ "Attempt to email invalid address: " <> tshow mailtoAdd -- <> " with subject " <> tshow failedSubject
|
||||||
-- $logErrorS "Mail" $ "Attempt to email invalid address: " <> tshow mailtoAddr -- <> " with subject " <> tshow failedSubject
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -80,6 +80,7 @@ validPostAddress (Just StoredMarkup {markupInput = addr})
|
|||||||
= True
|
= True
|
||||||
validPostAddress _ = False
|
validPostAddress _ = False
|
||||||
|
|
||||||
|
-- also see `Handler.Utils.Users.getEmailAddress` for Tests accepting User Type
|
||||||
validEmail :: Email -> Bool -- Email = Text
|
validEmail :: Email -> Bool -- Email = Text
|
||||||
validEmail email = validRFC5322 && not invalidFraport
|
validEmail email = validRFC5322 && not invalidFraport
|
||||||
where
|
where
|
||||||
|
|||||||
@ -386,14 +386,14 @@ fillDb = do
|
|||||||
= foldMap tshow cs : toMatrikel rest
|
= foldMap tshow cs : toMatrikel rest
|
||||||
| otherwise
|
| otherwise
|
||||||
= []
|
= []
|
||||||
manyUser (firstName, middleName, userSurname) (Just -> userMatrikelnummer) = User
|
manyUser (firstName, middleName, userSurname) userMatrikelnummer' = User
|
||||||
{ userIdent
|
{ userIdent
|
||||||
, userAuthentication = AuthLDAP
|
, userAuthentication = AuthLDAP
|
||||||
, userLastAuthentication = Nothing
|
, userLastAuthentication = Nothing
|
||||||
, userTokensIssuedAfter = Nothing
|
, userTokensIssuedAfter = Nothing
|
||||||
, userMatrikelnummer
|
, userMatrikelnummer = Just userMatrikelnummer'
|
||||||
, userEmail = userIdent
|
, userEmail = userEmail'
|
||||||
, userDisplayEmail = userIdent
|
, userDisplayEmail = userDisplayEmail'
|
||||||
, userDisplayName = case middleName of
|
, userDisplayName = case middleName of
|
||||||
Just middleName' -> [st|#{firstName} #{middleName'} #{userSurname}|]
|
Just middleName' -> [st|#{firstName} #{middleName'} #{userSurname}|]
|
||||||
Nothing -> [st|#{firstName} #{userSurname}|]
|
Nothing -> [st|#{firstName} #{userSurname}|]
|
||||||
@ -433,6 +433,18 @@ fillDb = do
|
|||||||
userIdent = fromString $ case middleName of
|
userIdent = fromString $ case middleName of
|
||||||
Just middleName' -> repack [st|#{firstName}.#{middleName'}.#{userSurname}@example.invalid|]
|
Just middleName' -> repack [st|#{firstName}.#{middleName'}.#{userSurname}@example.invalid|]
|
||||||
Nothing -> repack [st|#{firstName}.#{userSurname}@example.invalid|]
|
Nothing -> repack [st|#{firstName}.#{userSurname}@example.invalid|]
|
||||||
|
userEmail' :: CI Text
|
||||||
|
userEmail' = CI.mk $ case firstName of
|
||||||
|
"James" -> userIdent
|
||||||
|
"John" -> userIdent
|
||||||
|
--"Elizabeth" -> "AVSID:" <> userMatrikelnummer'
|
||||||
|
_ -> "E" <> userMatrikelnummer' <> "@fraport.de"
|
||||||
|
userDisplayEmail' :: CI Text
|
||||||
|
userDisplayEmail' = CI.mk $ case userSurname of
|
||||||
|
"Walker" -> "AVSNO:" <> userMatrikelnummer'
|
||||||
|
"Clark" -> "E" <> userMatrikelnummer' <> "@fraport.de"
|
||||||
|
_ -> userIdent
|
||||||
|
|
||||||
matrikel <- toMatrikel <$> getRandomRs (0 :: Int, 9 :: Int)
|
matrikel <- toMatrikel <$> getRandomRs (0 :: Int, 9 :: Int)
|
||||||
manyUsers <- insertMany . getZipList $ manyUser <$> ZipList ((,,) <$> firstNames <*> middlenames <*> surnames) <*> ZipList matrikel
|
manyUsers <- insertMany . getZipList $ manyUser <$> ZipList ((,,) <$> firstNames <*> middlenames <*> surnames) <*> ZipList matrikel
|
||||||
matUsers <- selectList [UserMatrikelnummer !=. Nothing] []
|
matUsers <- selectList [UserMatrikelnummer !=. Nothing] []
|
||||||
|
|||||||
Reference in New Issue
Block a user