gameServer/HWProtoNEState.hs
changeset 10076 b235e520ea21
parent 8401 87410ae372f6
child 10077 ca67740f19b2
equal deleted inserted replaced
10075:dbaf90a0fbe0 10076:b235e520ea21
     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