packages feed

hulk-0.1.1: src/Hulk/Auth.hs

{-# OPTIONS -Wall -fno-warn-name-shadowing #-}
module Hulk.Auth where

import Codec.Binary.UTF8.String
import Control.Arrow
import Control.Monad
import Data.Char
import Data.HMAC
import Numeric

import Hulk.Types

sha1 :: String -> String -> String
sha1 key str =
  concat $ map (\x -> showHex x "")
         $ hmac_sha1 (encode key) (encode str)

authenticate :: MonadProvider m => String -> String -> m Bool
authenticate user pass = do
  key <- filter keyChars `liftM` provideKey
  passwds <- liftM getPasswds $ providePasswords
  return $ any (== (user,sha1 key pass)) passwds
  where getPasswds = map readPair . lines
            where readPair = second (drop 1) . span (/=' ')
        keyChars c = elem c ['a'..'z'] || isDigit c