module Jobs.Handler.SendPasswordReset ( dispatchJobSendPasswordReset ) where import Import import Handler.Utils import Handler.Utils.Users import qualified Data.ByteString.Base64 as Base64 import qualified Data.ByteArray as BA import qualified Data.HashSet as HashSet import Text.Hamlet dispatchJobSendPasswordReset :: UserId -> Handler () dispatchJobSendPasswordReset jRecipient = userMailT jRecipient $ do cID <- encrypt jRecipient User{..} <- liftHandler . runDB $ getJust jRecipient replaceMailHeader "Auto-Submitted" $ Just "auto-generated" setSubjectI MsgMailSubjectPasswordReset now <- liftIO getCurrentTime let localNow = utcToLocalTime now tomorrowEndOfDay = case localTimeToUTC (LocalTime (addDays 2 $ localDay localNow) midnight) of LTUUnique utc' _ -> utc' _other -> UTCTime (addDays 2 $ utctDay now) 0 resetToken' <- bearerToken (Right jRecipient) (Just . HashSet.singleton $ UserPasswordR cID) Nothing (Just $ Just tomorrowEndOfDay) Nothing let resetToken = resetToken' & tokenRestrict (UserPasswordR cID) (decodeUtf8 . Base64.encode . BA.convert $ computeUserAuthenticationDigest userAuthentication) encodedToken <- encodeToken resetToken resetUrl <- toTextUrl (UserPasswordR cID, [(toPathPiece GetBearer, toPathPiece encodedToken)]) addAlternatives $ providePreferredAlternative ($(ihamletFile "templates/mail/passwordReset.hamlet") :: HtmlUrlI18n UniWorXMessage (Route UniWorX))