{-# LANGUAGE OverloadedStrings #-} module Sproxy.Application.Cookie ( AuthUser , cookieDecode , cookieEncode , getEmail , getEmailUtf8 , getFamilyNameUtf8 , getGivenNameUtf8 , newUser , setFamilyName , setGivenName ) where import Data.ByteString (ByteString) import Data.Text (Text, toLower, strip) import Data.Text.Encoding (decodeUtf8, encodeUtf8) import Foreign.C.Types (CTime) import qualified Data.Serialize as DS import qualified Sproxy.Application.State as State data AuthUser = AuthUser { auEmail :: ByteString , auGivenName :: ByteString , auFamilyName :: ByteString } instance DS.Serialize AuthUser where put u = DS.put (auEmail u, auGivenName u, auFamilyName u) get = do (e, n, f) <- DS.get return AuthUser { auEmail = e, auGivenName = n, auFamilyName = f } cookieDecode :: ByteString -> ByteString -> IO (Either String AuthUser) cookieDecode key d = do c <- State.decode key d return $ c >>= DS.decode cookieEncode :: ByteString -> Int -> AuthUser -> IO (ByteString, CTime) cookieEncode key shelflife = State.encode key (fromIntegral shelflife) . DS.encode getEmail :: AuthUser -> Text getEmail = decodeUtf8 . auEmail getEmailUtf8 :: AuthUser -> ByteString getEmailUtf8 = auEmail getGivenNameUtf8 :: AuthUser -> ByteString getGivenNameUtf8 = auGivenName getFamilyNameUtf8 :: AuthUser -> ByteString getFamilyNameUtf8 = auFamilyName newUser :: Text -> AuthUser newUser email = AuthUser { auEmail = encodeUtf8 . toLower . strip $ email , auGivenName = "" , auFamilyName = "" } setGivenName :: Text -> AuthUser -> AuthUser setGivenName given au = au{ auGivenName = encodeUtf8 . strip $ given } setFamilyName :: Text -> AuthUser -> AuthUser setFamilyName family au = au{ auFamilyName = encodeUtf8 . strip $ family }