-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathAuth.hs
More file actions
73 lines (59 loc) · 2.88 KB
/
Copy pathAuth.hs
File metadata and controls
73 lines (59 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
{-# LANGUAGE NoMonomorphismRestriction, OverloadedStrings,CPP, DeriveDataTypeable, FlexibleContexts, GeneralizedNewtypeDeriving,
MultiParamTypeClasses #-}
module Auth where
import Data.Data (Data, Typeable)
type Login = String
type Password = String
data User t = User {login::Login,password::Password,userContent::t,session::Maybe SessionHash}
deriving (Eq, Ord, Read, Show, Data, Typeable)
data SessionHash = SessionHash {hash::String}
deriving (Eq, Ord, Read, Show, Data, Typeable)
data AppStatusTemplate t = AppStatusTemplate {users::[User t]}
deriving (Eq, Ord, Read, Show, Data, Typeable)
data LogInResult = SuccesfulLogIn SessionHash | NoSuchUser | WrongPassword
deriving (Eq, Ord, Read, Show, Data, Typeable)
data CheckHashResult = UserIsLogged | UserIsNotLogged
deriving (Eq, Ord, Read, Show, Data, Typeable)
data LogOutResult = SuccesfulLogOut | NoSuchSessionHash
deriving (Eq, Ord, Read, Show, Data, Typeable)
logIn ::Eq t=> AppStatusTemplate t -> Login -> Password ->SessionHash -> (LogInResult,AppStatusTemplate t)
logIn appStatus l p s =
if matchingUsers == []
then (NoSuchUser,appStatus)
else
if (password matchingUser) /= p
then (WrongPassword,appStatus)
else (SuccesfulLogIn newSessionHash, AppStatusTemplate {users=restUsers++[matchingUser {session=Just newSessionHash}]})
where
matchingUsers = filter (\u -> login u == l) (users appStatus)
matchingUser = head matchingUsers
restUsers = filter (\u -> login u /= l) (users appStatus)
newSessionHash = s
checkHash ::Eq t=> AppStatusTemplate t -> SessionHash -> CheckHashResult
checkHash appStatus sh =
if matchingUsers == []
then UserIsNotLogged
else UserIsLogged
where
matchingUsers = filter (\u -> session u == Just sh) (users appStatus)
matchingUser = head matchingUsers
logOut ::Eq t=> AppStatusTemplate t -> SessionHash -> (LogOutResult, AppStatusTemplate t)
logOut appStatus sh =
if matchingUsers == []
then (NoSuchSessionHash,appStatus)
else (SuccesfulLogOut, AppStatusTemplate {users=restUsers++[matchingUser {session=newSessionHash}]})
where
matchingUsers = filter (\u -> session u == Just sh) (users appStatus)
matchingUser = head matchingUsers
restUsers = filter (\u -> session u /= Just sh) (users appStatus)
newSessionHash = Nothing
updateUserContent :: Eq t => AppStatusTemplate t -> (t->t) -> SessionHash -> (Maybe t,AppStatusTemplate t)
updateUserContent appStatus f sh =
if matchingUsers == []
then (Nothing,appStatus)
else (Just newUserContent,AppStatusTemplate {users=restUsers++[matchingUser {userContent=newUserContent}]})
where
matchingUsers = filter (\u -> session u == Just sh) (users appStatus)
matchingUser = head matchingUsers
restUsers = filter (\u -> session u /= Just sh) (users appStatus)
newUserContent = f (userContent matchingUser)