1 {-# LANGUAGE OverloadedStrings, CPP #-} |
1 {-# LANGUAGE OverloadedStrings, CPP #-} |
2 module HWProtoNEState where |
2 module HWProtoNEState where |
3 |
3 |
4 import Control.Monad.Reader |
4 import Control.Monad.Reader |
|
5 import qualified Data.ByteString.Lazy as BL |
5 import qualified Data.ByteString.Char8 as B |
6 import qualified Data.ByteString.Char8 as B |
|
7 import Data.Digest.Pure.SHA |
6 -------------------------------------- |
8 -------------------------------------- |
7 import CoreTypes |
9 import CoreTypes |
8 import Actions |
10 import Actions |
9 import Utils |
11 import Utils |
10 import RoomsAndClients |
12 import RoomsAndClients |
40 |
42 |
41 handleCmd_NotEntered ["PASSWORD", passwd] = do |
43 handleCmd_NotEntered ["PASSWORD", passwd] = do |
42 (ci, irnc) <- ask |
44 (ci, irnc) <- ask |
43 let cl = irnc `client` ci |
45 let cl = irnc `client` ci |
44 |
46 |
45 if passwd == webPassword cl then |
47 if clientProto cl < 48 && passwd == webPassword cl then |
46 return $ JoinLobby : [AnswerClients [sendChan cl] ["ADMIN_ACCESS"] | isAdministrator cl] |
48 return $ JoinLobby : [AnswerClients [sendChan cl] ["ADMIN_ACCESS"] | isAdministrator cl] |
47 else |
49 else |
48 return [ByeClient "Authentication failed"] |
50 return [ByeClient "Authentication failed"] |
49 |
51 |
|
52 |
|
53 handleCmd_NotEntered ["PASSWORD", passwd, clientSalt] = do |
|
54 (ci, irnc) <- ask |
|
55 let cl = irnc `client` ci |
|
56 |
|
57 let clientHash = h [clientSalt, serverSalt cl, webPassword cl, showB $ clientProto cl, "!hedgewars"] |
|
58 let serverHash = h [serverSalt cl, clientSalt, webPassword cl, showB $ clientProto cl, "!hedgewars"] |
|
59 |
|
60 if passwd == clientHash then |
|
61 return $ |
|
62 AnswerClients [sendChan cl] ["SERVER_AUTH", serverHash] |
|
63 : JoinLobby |
|
64 : [AnswerClients [sendChan cl] ["ADMIN_ACCESS"] | isAdministrator cl] |
|
65 else |
|
66 return [ByeClient "Authentication failed"] |
|
67 where |
|
68 h = B.pack . showDigest . sha1 . BL.fromChunks |
50 |
69 |
51 #if defined(OFFICIAL_SERVER) |
70 #if defined(OFFICIAL_SERVER) |
52 handleCmd_NotEntered ["CHECKER", protoNum, newNick, password] = do |
71 handleCmd_NotEntered ["CHECKER", protoNum, newNick, password] = do |
53 (ci, irnc) <- ask |
72 (ci, irnc) <- ask |
54 let cl = irnc `client` ci |
73 let cl = irnc `client` ci |