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 import qualified Data.Aeson as A policy :: HashingPolicy policy = HashingPolicy { preferredHashCost = 12 , preferredHashAlgorithm = "$2a$" } newtype BCrypt = BCrypt { unBCrypt :: T.Text } deriving (Eq, PersistField, PersistFieldSql, Show, Ord, A.FromJSON, A.ToJSON) hashPassword :: T.Text -> IO BCrypt hashPassword rawPassword = do mPassword <- hashPasswordUsingPolicy policy (TE.encodeUtf8 rawPassword) return (BCrypt (TE.decodeUtf8 (fromJustNote "Invalid hashing policy" mPassword))) validatePasswordHash :: BCrypt -> T.Text -> Bool validatePasswordHash hash' pass = do validatePassword (TE.encodeUtf8 (unBCrypt hash')) (TE.encodeUtf8 pass)