Guest User

Untitled

a guest
Dec 8th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. {-# LANGUAGE OverloadedStrings #-}
  2.  
  3. module Auth where
  4.  
  5. import API
  6. import Control.Monad.IO.Class
  7. import qualified Data.ByteString.Char8 as BS
  8. import qualified Data.Text as T
  9. import qualified Data.Text as T
  10. import Data.Text.Encoding (decodeUtf8)
  11. import Data.Text.Encoding (decodeUtf8)
  12. import qualified Database.SQLite.Simple as S
  13. import Servant
  14. import System.POSIX.Crypt.SHA512
  15.  
  16. initDB :: FilePath -> IO ()
  17. initDB dbfile = S.withConnection dbfile $ \conn ->
  18. S.execute_ conn
  19. "CREATE TABLE IF NOT EXISTS users ( `id` INTEGER PRIMARY KEY AUTOINCREMENT\
  20. \, `email` TEXT NOT NULL\
  21. \, `password` TEXT NOT NULL\
  22. \)"
  23.  
  24. checkPassword :: String -> String -> Bool
  25. checkPassword pass hashed =
  26. let pass' = (maybe "messed up" (T.unpack . decodeUtf8) $ cryptSHA512 (BS.pack pass) (BS.pack hashed))
  27. in
  28. pass' == hashed
  29.  
  30. checkBasicAuth :: FilePath -> BasicAuthCheck User
  31. checkBasicAuth dbfile = BasicAuthCheck $ \basicAuthData ->
  32. let username = T.unpack $ decodeUtf8 (basicAuthUsername basicAuthData)
  33. password = T.unpack $ decodeUtf8 (basicAuthPassword basicAuthData)
  34. queryData = (S.Only username) :: (S.Only String)
  35. in
  36. liftIO . S.withConnection dbfile $ \conn -> do
  37. r <- S.query conn "SELECT id,email,password FROM users WHERE email = ?" queryData :: IO [(Int, String, String)]
  38. return $ case length r of
  39. 0 -> BadPassword
  40. _ -> let (uID, uName, uHash) = head r in
  41. if checkPassword password (drop 14 uHash)
  42. then Authorized (User uID uName)
  43. else BadPassword
Add Comment
Please, Sign In to add comment