# HG changeset patch # User unc0rr # Date 1296894735 -10800 # Node ID c6d3aec73f93d4727b4268d8f1861702583de57b # Parent 8ff92bdc9f98a5e746dae6bab58a3036a61ddc6a Add Unique field to Client structure, and use it to check for matching recieved account status with client diff -r 8ff92bdc9f98 -r c6d3aec73f93 gameServer/Actions.hs --- a/gameServer/Actions.hs Sat Feb 05 11:05:16 2011 +0300 +++ b/gameServer/Actions.hs Sat Feb 05 11:32:15 2011 +0300 @@ -16,6 +16,7 @@ import Control.DeepSeq import Data.Time import Text.Printf +import Data.Unique ----------------------------- import CoreTypes import Utils @@ -308,8 +309,9 @@ (Just ci) <- gets clientIndex n <- client's nick h <- client's host + uid <- client's clUID db <- gets (dbQueries . serverInfo) - io $ writeChan db $ CheckAccount ci n h + io $ writeChan db $ CheckAccount ci (hashUnique uid) n h return () diff -r 8ff92bdc9f98 -r c6d3aec73f93 gameServer/CoreTypes.hs --- a/gameServer/CoreTypes.hs Sat Feb 05 11:05:16 2011 +0300 +++ b/gameServer/CoreTypes.hs Sat Feb 05 11:32:15 2011 +0300 @@ -13,6 +13,7 @@ import Network import Data.Function import Data.ByteString.Char8 as B +import Data.Unique import RoomsAndClients @@ -21,6 +22,7 @@ data ClientInfo = ClientInfo { + clUID :: Unique, sendChan :: ClientChan, clientSocket :: Socket, host :: B.ByteString, @@ -161,7 +163,7 @@ deriving (Show, Read) data DBQuery = - CheckAccount ClientIndex B.ByteString B.ByteString + CheckAccount ClientIndex Int B.ByteString B.ByteString | ClearCache | SendStats Int Int deriving (Show, Read) @@ -169,14 +171,14 @@ data CoreMessage = Accept ClientInfo | ClientMessage (ClientIndex, [B.ByteString]) - | ClientAccountInfo (ClientIndex, AccountInfo) + | ClientAccountInfo ClientIndex Int AccountInfo | TimerAction Int | Remove ClientIndex instance Show CoreMessage where show (Accept _) = "Accept" show (ClientMessage _) = "ClientMessage" - show (ClientAccountInfo _) = "ClientAccountInfo" + show (ClientAccountInfo {}) = "ClientAccountInfo" show (TimerAction _) = "TimerAction" show (Remove _) = "Remove" diff -r 8ff92bdc9f98 -r c6d3aec73f93 gameServer/NetRoutines.hs --- a/gameServer/NetRoutines.hs Sat Feb 05 11:05:16 2011 +0300 +++ b/gameServer/NetRoutines.hs Sat Feb 05 11:32:15 2011 +0300 @@ -2,11 +2,11 @@ module NetRoutines where import Network.Socket -import System.IO import Control.Concurrent.Chan import qualified Control.Exception as Exception import Data.Time import Control.Monad +import Data.Unique ----------------------------- import CoreTypes import Utils @@ -25,8 +25,11 @@ sendChan' <- newChan + uid <- newUnique + let newClient = (ClientInfo + uid sendChan' sock clientHost diff -r 8ff92bdc9f98 -r c6d3aec73f93 gameServer/OfficialServer/DBInteraction.hs --- a/gameServer/OfficialServer/DBInteraction.hs Sat Feb 05 11:05:16 2011 +0300 +++ b/gameServer/OfficialServer/DBInteraction.hs Sat Feb 05 11:32:15 2011 +0300 @@ -23,9 +23,8 @@ fakeDbConnection serverInfo = forever $ do q <- readChan $ dbQueries serverInfo case q of - CheckAccount clUid _ clHost -> do - writeChan (coreChan serverInfo) $ ClientAccountInfo (clUid, - if clHost `elem` localAddressList then Admin else Guest) + CheckAccount clId clUid _ clHost -> do + writeChan (coreChan serverInfo) $ ClientAccountInfo clId clUid (if clHost `elem` localAddressList then Admin else Guest) ClearCache -> return () SendStats {} -> return () @@ -36,7 +35,7 @@ do q <- readChan queries updatedCache <- case q of - CheckAccount clUid clNick _ -> do + CheckAccount clId clNick _ -> do let cacheEntry = clNick `Map.lookup` accountsCache currentTime <- getCurrentTime if (isNothing cacheEntry) || (currentTime `diffUTCTime` (fst . fromJust) cacheEntry > 2 * 24 * 60 * 60) then @@ -44,16 +43,16 @@ hPutStrLn hIn $ show q hFlush hIn - (clId, accountInfo) <- hGetLine hOut >>= (maybeException . maybeRead) + (clId', accountInfo) <- hGetLine hOut >>= (maybeException . maybeRead) - writeChan coreChan $ ClientAccountInfo (clId, accountInfo) + writeChan coreChan $ ClientAccountInfo (clId', accountInfo) return $ Map.insert clNick (currentTime, accountInfo) accountsCache `Exception.onException` (unGetChan queries q) else do - writeChan coreChan $ ClientAccountInfo (clUid, snd $ fromJust cacheEntry) + writeChan coreChan $ ClientAccountInfo (clId, snd $ fromJust cacheEntry) return accountsCache ClearCache -> return Map.empty diff -r 8ff92bdc9f98 -r c6d3aec73f93 gameServer/ServerCore.hs --- a/gameServer/ServerCore.hs Sat Feb 05 11:05:16 2011 +0300 +++ b/gameServer/ServerCore.hs Sat Feb 05 11:32:15 2011 +0300 @@ -9,6 +9,7 @@ import Data.Set as Set import qualified Data.ByteString.Char8 as B import Control.DeepSeq +import Data.Unique -------------------------------------- import CoreTypes import NetRoutines @@ -57,13 +58,14 @@ --debugM "Clients" "Message from dead client" --return (serverInfo, rnc) - ClientAccountInfo (ci, info) -> do + ClientAccountInfo ci uid info -> do rnc <- gets roomsClients exists <- liftIO $ clientExists rnc ci when (exists) $ do as <- get put $! as{clientIndex = Just ci} - processAction (ProcessAccountInfo info) + uid' <- client's clUID + when (uid == (hashUnique uid')) $ processAction (ProcessAccountInfo info) return () TimerAction tick ->