{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving, TemplateHaskell #-} module Distribution.Server.Users.Types ( module Distribution.Server.Users.Types, module Distribution.Server.Framework.AuthTypes ) where import Distribution.Server.Framework.AuthTypes import Distribution.Server.Framework.MemSize import Distribution.Text ( Text(..) ) import qualified Distribution.Server.Util.Parse as Parse import qualified Distribution.Compat.ReadP as Parse import qualified Text.PrettyPrint as Disp import qualified Data.Char as Char import Data.Serialize (Serialize) import Control.Applicative ((<$>)) import Data.SafeCopy (base, deriveSafeCopy) import Data.Typeable (Typeable) newtype UserId = UserId Int deriving (Eq, Ord, Show, Serialize, Typeable, MemSize) newtype UserName = UserName String deriving (Eq, Ord, Show, Serialize, Typeable, MemSize) data UserInfo = UserInfo { userName :: !UserName, userStatus :: !UserStatus } deriving (Eq, Show, Typeable) data UserStatus = AccountEnabled UserAuth | AccountDisabled (Maybe UserAuth) | AccountDeleted deriving (Eq, Show, Typeable) newtype UserAuth = UserAuth PasswdHash deriving (Show, Eq, Typeable) isActiveAccount :: UserStatus -> Bool isActiveAccount (AccountEnabled _) = True isActiveAccount (AccountDisabled _) = True isActiveAccount AccountDeleted = False instance MemSize UserInfo where memSize (UserInfo a b) = memSize2 a b instance MemSize UserStatus where memSize (AccountEnabled a) = memSize1 a memSize (AccountDisabled a) = memSize1 a memSize (AccountDeleted) = memSize0 instance MemSize UserAuth where memSize (UserAuth a) = memSize1 a instance Text UserId where disp (UserId uid) = Disp.int uid parse = UserId <$> Parse.int instance Text UserName where disp (UserName name) = Disp.text name parse = UserName <$> Parse.munch1 Char.isAlphaNum $(deriveSafeCopy 0 'base ''UserId) $(deriveSafeCopy 0 'base ''UserName) $(deriveSafeCopy 1 'base ''UserAuth) $(deriveSafeCopy 0 'base ''UserStatus) $(deriveSafeCopy 0 'base ''UserInfo)