guest IP-check and number of guest in lobby check combined now in one function

This commit is contained in:
Kai Philipp
2016-07-19 14:01:13 +02:00
parent 1abc9dc452
commit 1b5cf1bfb8
3 changed files with 19 additions and 36 deletions
+4 -8
View File
@@ -65,7 +65,6 @@
#define SERVER_MAX_NUM_LOBBY_SESSIONS 512 // Maximum number of idle users in lobby. #define SERVER_MAX_NUM_LOBBY_SESSIONS 512 // Maximum number of idle users in lobby.
#define SERVER_MAX_NUM_TOTAL_SESSIONS 2000 // Total maximum of sessions, fitting a 2048 handle limit #define SERVER_MAX_NUM_TOTAL_SESSIONS 2000 // Total maximum of sessions, fitting a 2048 handle limit
#define SERVER_MAX_GUEST_USERS 100 // LG: Maximum number of guests users allowed
#define SERVER_SAVE_STATISTICS_INTERVAL_SEC 60 #define SERVER_SAVE_STATISTICS_INTERVAL_SEC 60
#define SERVER_CHECK_SESSION_TIMEOUTS_INTERVAL_MSEC 500 #define SERVER_CHECK_SESSION_TIMEOUTS_INTERVAL_MSEC 500
@@ -1051,7 +1050,7 @@ ServerLobbyThread::HandleNetPacketInit(boost::shared_ptr<SessionData> session, c
bool validGuest = false; bool validGuest = false;
// productive: if (initMessage.login() == InitMessage::guestLogin) { // productive: if (initMessage.login() == InitMessage::guestLogin) {
// debug: if (initMessage.login() == InitMessage::unauthenticatedLogin) { // debug: if (initMessage.login() == InitMessage::unauthenticatedLogin) {
if (initMessage.login() == InitMessage::guestLogin) { if (initMessage.login() == InitMessage::unauthenticatedLogin) {
playerName = initMessage.nickname(); playerName = initMessage.nickname();
// Verify guest player name. // Verify guest player name.
if (playerName.length() > sizeof(SERVER_GUEST_PLAYER_NAME - 1) if (playerName.length() > sizeof(SERVER_GUEST_PLAYER_NAME - 1)
@@ -1061,12 +1060,9 @@ ServerLobbyThread::HandleNetPacketInit(boost::shared_ptr<SessionData> session, c
validGuest = true; validGuest = true;
noAuth = true; noAuth = true;
} }
// check if a guest session with same ip is already connected - decline if true // check if a guest session in lobby with same ip is already connected and
if(m_sessionManager.IsGuestConnectedMultiple(session->GetClientAddr())) { // if number of lobby guests >= SERVER_MAX_GUEST_USERS_LOBBY
SessionError(session, ERR_NET_SERVER_FULL); if(!m_sessionManager.IsGuestAllowedToConnect(session->GetClientAddr())) {
return;
}
if (m_sessionManager.GetGuestsCount() + m_gameSessionManager.GetGuestsCount() > SERVER_MAX_GUEST_USERS) {
SessionError(session, ERR_NET_SERVER_FULL); SessionError(session, ERR_NET_SERVER_FULL);
return; return;
} }
+14 -26
View File
@@ -34,8 +34,11 @@
#include <net/serverexception.h> #include <net/serverexception.h>
#include <net/socket_msg.h> #include <net/socket_msg.h>
#include <core/loghelper.h> // debug - remove me
using namespace std; using namespace std;
#define SERVER_MAX_GUEST_USERS_LOBBY 50 // LG: Maximum number of guests users in lobby allowed
SessionManager::SessionManager() SessionManager::SessionManager()
{ {
@@ -248,23 +251,25 @@ SessionManager::IsClientAddressConnected(const std::string &clientAddress) const
} }
bool bool
SessionManager::IsGuestConnectedMultiple(const std::string &clientAddress) const SessionManager::IsGuestAllowedToConnect(const std::string &clientAddress) const
{ {
bool retVal = false; bool retVal = true;
boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex);
SessionMap::const_iterator i = m_sessionMap.begin(); SessionMap::const_iterator i = m_sessionMap.begin();
SessionMap::const_iterator end = m_sessionMap.end(); SessionMap::const_iterator end = m_sessionMap.end();
int num = 0;
while (i != end) { while (i != end) {
boost::shared_ptr<PlayerData> tmpPlayer(i->second->GetPlayerData()); boost::shared_ptr<PlayerData> tmpPlayer(i->second->GetPlayerData());
// productive: if(tmpPlayer && tmpPlayer->GetRights() == PLAYER_RIGHTS_GUEST){
//if(tmpPlayer && tmpPlayer->GetRights() == PLAYER_RIGHTS_GUEST && i->second->GetClientAddr() == clientAddress){ num++;
// debug: if(i->second->GetClientAddr() == clientAddress || num >= SERVER_MAX_GUEST_USERS_LOBBY) {
// if(tmpPlayer && tmpPlayer->GetRights() == PLAYER_RIGHTS_NORMAL && i->second->GetClientAddr() == clientAddress){ // guest has same ip as another guest in lobby or
if(tmpPlayer && tmpPlayer->GetRights() == PLAYER_RIGHTS_GUEST && i->second->GetClientAddr() == clientAddress) { // number of guests in lobby >= SERVER_MAX_GUEST_USERS_LOBBY => not allowed
retVal = true; retVal = false;
break; break;
}
} }
++i; ++i;
} }
@@ -433,20 +438,3 @@ SessionManager::SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr<
} }
} }
unsigned
SessionManager::GetGuestsCount() const
{
unsigned counter = 0;
boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex);
SessionMap::const_iterator i = m_sessionMap.begin();
SessionMap::const_iterator end = m_sessionMap.end();
while (i != end) {
if (i->second && i->second->GetPlayerData() &&
i->second->GetPlayerData()->GetRights() == PLAYER_RIGHTS_GUEST)
++counter;
++i;
}
return counter;
}
+1 -2
View File
@@ -64,7 +64,7 @@ public:
bool IsPlayerConnected(const std::string &playerName) const; bool IsPlayerConnected(const std::string &playerName) const;
bool IsPlayerConnected(unsigned uniqueId) const; bool IsPlayerConnected(unsigned uniqueId) const;
bool IsClientAddressConnected(const std::string &clientAddress) const; bool IsClientAddressConnected(const std::string &clientAddress) const;
bool IsGuestConnectedMultiple(const std::string &clientAddress) const; bool IsGuestAllowedToConnect(const std::string &clientAddress) const;
void ForEach(boost::function<void (boost::shared_ptr<SessionData>)> func); void ForEach(boost::function<void (boost::shared_ptr<SessionData>)> func);
@@ -75,7 +75,6 @@ public:
unsigned GetRawSessionCount() const; unsigned GetRawSessionCount() const;
unsigned GetSessionCountWithState(int state) const; unsigned GetSessionCountWithState(int state) const;
bool HasSessionWithState(int state) const; bool HasSessionWithState(int state) const;
unsigned GetGuestsCount() const;
void SendToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, int state); void SendToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, int state);
void SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, int state); void SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, int state);