added migration script
This commit is contained in:
parent
2f03c48e4e
commit
fdefacf0cc
1 changed files with 95 additions and 0 deletions
95
Migrations/0.1.4.0-0.1.5.0/Migration.hs
Normal file
95
Migrations/0.1.4.0-0.1.5.0/Migration.hs
Normal file
|
@ -0,0 +1,95 @@
|
|||
{-# LANGUAGE QuasiQuotes, OverloadedStrings #-}
|
||||
|
||||
import Database.HDBC
|
||||
import Database.HDBC.PostgreSQL
|
||||
import System.IO
|
||||
import Control.Exception
|
||||
import qualified Data.Text as T
|
||||
import qualified Data.ByteString as B
|
||||
import qualified Data.ByteString.Char8 as BC
|
||||
|
||||
import Network.Mail.Mime
|
||||
import Text.Hamlet
|
||||
import System.Random
|
||||
import Text.Blaze.Html.Renderer.Utf8
|
||||
import Numeric (showHex)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
putStrLn "Enter app root (e.g.: \"https://eidolon.nek0.eu\""
|
||||
appRoot <- getLine
|
||||
putStrLn "Enter database host"
|
||||
dbHost <- getLine
|
||||
putStrLn "Enter database port"
|
||||
dbPort <- getLine
|
||||
putStrLn "Enter database user"
|
||||
dbUser <- getLine
|
||||
putStrLn "Enter database name"
|
||||
dbName <- getLine
|
||||
putStrLn "Enter database password"
|
||||
dbPasswd <- getPasswd
|
||||
let dbString = "host=" ++ dbHost ++ " port=" ++ dbPort ++ " user=" ++ dbUser ++ " dbname=" ++ dbName ++ " password=" ++ dbPasswd
|
||||
conn <- connectPostgreSQL dbString
|
||||
stmt1 <- prepare conn "select * from \"user\""
|
||||
_ <- execute stmt1 []
|
||||
rows <- fetchAllRowsAL stmt1
|
||||
mapM_ (\entry ->
|
||||
case entry of
|
||||
[("id", SqlInteger theId), _, ("slug", SqlByteString uSlug), ("email", SqlByteString uEmail), _, _, _, _] -> do
|
||||
rText <- (toHex . B.pack . take 16 . randoms) <$> newStdGen
|
||||
_ <- run conn ("insert into \"token\" (kind, token, \"user\") values (" ++
|
||||
"'activate', " ++
|
||||
"'" ++ BC.unpack rText ++ "', " ++
|
||||
show theId ++ ")") []
|
||||
let link = appRoot ++ "/activate/" ++ BC.unpack rText
|
||||
sendMail (BC.unpack uEmail) (BC.unpack uSlug) link
|
||||
putStrLn $ "Notified " ++ (BC.unpack uSlug)
|
||||
_ ->
|
||||
error "Malformed entry"
|
||||
) rows
|
||||
commit conn
|
||||
disconnect conn
|
||||
putStrLn "Migration successfull!!"
|
||||
|
||||
sendMail :: String -> String -> String -> IO ()
|
||||
sendMail toEmail userSlug link = do
|
||||
renderSendMail
|
||||
Mail
|
||||
{ mailFrom = Address Nothing "noreply"
|
||||
, mailTo = [Address Nothing (T.pack toEmail)]
|
||||
, mailCc = []
|
||||
, mailBcc = []
|
||||
, mailHeaders = [("Subject", "Please update your password")]
|
||||
, mailParts = [[Part
|
||||
{ partType = "text/html; charset=utf-8"
|
||||
, partEncoding = None
|
||||
, partFilename = Nothing
|
||||
, partHeaders = []
|
||||
, partContent = renderHtml [shamlet|
|
||||
<h1>Hello #{userSlug},
|
||||
<p>
|
||||
Due to changes in the Database your Password has been reset.
|
||||
Please reactivate your account by going to <a href="#{link}">#{link}
|
||||
|]
|
||||
}]]
|
||||
}
|
||||
|
||||
toHex :: B.ByteString -> B.ByteString
|
||||
toHex = BC.pack . concatMap mapByte . B.unpack
|
||||
where mapByte = pad 2 '0' . flip showHex ""
|
||||
pad len padding s
|
||||
| length s < len = pad len padding $ padding:s
|
||||
| otherwise = s
|
||||
|
||||
getPasswd :: IO String
|
||||
getPasswd = do
|
||||
putStr "Password: "
|
||||
hFlush stdout
|
||||
pass <- withEcho False getLine
|
||||
putChar '\n'
|
||||
return pass
|
||||
|
||||
withEcho :: Bool -> IO a -> IO a
|
||||
withEcho echo action = do
|
||||
old <- hGetEcho stdin
|
||||
bracket_ (hSetEcho stdin echo) (hSetEcho stdin old) action
|
Loading…
Reference in a new issue