espial-0.0.1: src/ModelCrypto.hs
module ModelCrypto where
import Prelude
import Crypto.BCrypt as Import hiding (hashPassword)
import Database.Persist.Sql
import Safe (fromJustNote)
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
policy :: HashingPolicy
policy =
HashingPolicy
{ preferredHashCost = 12
, preferredHashAlgorithm = "$2a$"
}
newtype BCrypt = BCrypt
{ unBCrypt :: T.Text
} deriving (Eq, PersistField, PersistFieldSql, Show, Ord)
hashPassword :: T.Text -> IO BCrypt
hashPassword rawPassword = do
mPassword <- hashPasswordUsingPolicy policy $ TE.encodeUtf8 rawPassword
return $ BCrypt $ TE.decodeUtf8 $ fromJustNote "Invalid hashing policy" mPassword
passwordMatches :: BCrypt -> T.Text -> Bool
passwordMatches hash' pass =
validatePassword (TE.encodeUtf8 $ unBCrypt hash') (TE.encodeUtf8 pass)