diff --git a/src/core/common/avatarmanager.cpp b/src/core/common/avatarmanager.cpp index 5634b095..d5eb5ab7 100644 --- a/src/core/common/avatarmanager.cpp +++ b/src/core/common/avatarmanager.cpp @@ -32,8 +32,8 @@ #include #include -#define MAX_NUMBER_OF_FILES GetMaxNumberOfAvatarFiles() -#define MAX_AVATAR_CACHE_AGE GetMaxAvatarCacheAgeSec() +#define MAX_NUMBER_OF_FILES NetHelper::GetMaxNumberOfAvatarFiles() +#define MAX_AVATAR_CACHE_AGE NetHelper::GetMaxAvatarCacheAgeSec() #define PNG_HEADER "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" #define PNG_HEADER_SIZE (sizeof(PNG_HEADER) - 1) diff --git a/src/net/common/net_helper_client.cpp b/src/net/common/net_helper_client.cpp index dab1185d..3a9c838d 100644 --- a/src/net/common/net_helper_client.cpp +++ b/src/net/common/net_helper_client.cpp @@ -24,14 +24,19 @@ #include unsigned -GetMaxNumberOfAvatarFiles() +NetHelper::GetMaxNumberOfAvatarFiles() { return 256; } unsigned -GetMaxAvatarCacheAgeSec() +NetHelper::GetMaxAvatarCacheAgeSec() { return 604800; // 1 Week } +unsigned +NetHelper::GetLoginLockSec() +{ + return 1; +} diff --git a/src/net/common/net_helper_server.cpp b/src/net/common/net_helper_server.cpp index d3e25726..e41ad829 100644 --- a/src/net/common/net_helper_server.cpp +++ b/src/net/common/net_helper_server.cpp @@ -24,14 +24,19 @@ #include unsigned -GetMaxNumberOfAvatarFiles() +NetHelper::GetMaxNumberOfAvatarFiles() { return 2048; } unsigned -GetMaxAvatarCacheAgeSec() +NetHelper::GetMaxAvatarCacheAgeSec() { return 2592000; // 1 Month } +unsigned +NetHelper::GetLoginLockSec() +{ + return 30; +} diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 924ac8bf..a8182efb 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -413,11 +413,15 @@ ServerGameStateInit::HandleNewSession(boost::shared_ptr server, Sess void ServerGameStateInit::RegisterAdminTimer(boost::shared_ptr server) { - server->GetStateTimer1().expires_from_now( - boost::posix_time::seconds(SERVER_GAME_ADMIN_TIMEOUT_SEC - SERVER_GAME_ADMIN_WARNING_REMAINING_SEC)); - server->GetStateTimer1().async_wait( - boost::bind( - &ServerGameStateInit::TimerAdminWarning, this, boost::asio::placeholders::error, server)); + // No admin timeout in LAN games. + if (server->GetLobbyThread().GetServerMode() != SERVER_MODE_LAN) + { + server->GetStateTimer1().expires_from_now( + boost::posix_time::seconds(SERVER_GAME_ADMIN_TIMEOUT_SEC - SERVER_GAME_ADMIN_WARNING_REMAINING_SEC)); + server->GetStateTimer1().async_wait( + boost::bind( + &ServerGameStateInit::TimerAdminWarning, this, boost::asio::placeholders::error, server)); + } } void @@ -429,11 +433,15 @@ ServerGameStateInit::UnregisterAdminTimer(boost::shared_ptr server) void ServerGameStateInit::RegisterAutoStartTimer(boost::shared_ptr server) { - server->GetStateTimer2().expires_from_now( - boost::posix_time::seconds(SERVER_AUTOSTART_GAME_DELAY_SEC)); - server->GetStateTimer2().async_wait( - boost::bind( - &ServerGameStateInit::TimerAutoStart, this, boost::asio::placeholders::error, server)); + // No autostart in LAN games. + if (server->GetLobbyThread().GetServerMode() != SERVER_MODE_LAN) + { + server->GetStateTimer2().expires_from_now( + boost::posix_time::seconds(SERVER_AUTOSTART_GAME_DELAY_SEC)); + server->GetStateTimer2().async_wait( + boost::bind( + &ServerGameStateInit::TimerAutoStart, this, boost::asio::placeholders::error, server)); + } } void diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index d789c624..8be1e804 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -58,14 +58,13 @@ #define SERVER_UPDATE_LOGIN_LOCK_INTERVAL_MSEC 1000 #define SERVER_PROCESS_SEND_INTERVAL_MSEC 10 -#define SERVER_INIT_LOGIN_CLIENT_LOCK_SEC 30 // Forbid a client to send an additional avatar. +#define SERVER_INIT_LOGIN_CLIENT_LOCK_SEC NetHelper::GetLoginLockSec() #define SERVER_INIT_SESSION_TIMEOUT_SEC 60 #define SERVER_TIMEOUT_WARNING_REMAINING_SEC 60 #define SERVER_SESSION_ACTIVITY_TIMEOUT_SEC 1800 // 30 min, MUST be > SERVER_TIMEOUT_WARNING_REMAINING_SEC #define SERVER_SESSION_FORCED_TIMEOUT_SEC 86400 // 1 day, should be quite large. - #define SERVER_STATISTICS_FILE_NAME "server_statistics.log" #define SERVER_STATISTICS_STR_TOTAL_PLAYERS "TotalNumPlayersLoggedIn" #define SERVER_STATISTICS_STR_TOTAL_GAMES "TotalNumGamesCreated" @@ -637,6 +636,12 @@ ServerLobbyThread::GetStartTime() const return m_startTime; } +ServerMode +ServerLobbyThread::GetServerMode() const +{ + return m_mode; +} + SenderHelper & ServerLobbyThread::GetSender() { @@ -989,22 +994,18 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage // Before any other processing, perform some denial of service and // brute force attack prevention by checking whether the user recently sent an // Init packet. - // This check is not performed on LAN servers. - if (m_mode != SERVER_MODE_LAN) + bool recentlySentInit = false; { - bool recentlySentInit = false; - { - boost::mutex::scoped_lock lock(m_timerClientAddressMapMutex); - if (m_timerClientAddressMap.find(session.sessionData->GetClientAddr()) != m_timerClientAddressMap.end()) - recentlySentInit = true; - else - m_timerClientAddressMap[session.sessionData->GetClientAddr()] = boost::timers::portable::microsec_timer(); - } - if (recentlySentInit) - { - SessionError(session, ERR_NET_INIT_BLOCKED); - return; - } + boost::mutex::scoped_lock lock(m_timerClientAddressMapMutex); + if (m_timerClientAddressMap.find(session.sessionData->GetClientAddr()) != m_timerClientAddressMap.end()) + recentlySentInit = true; + else + m_timerClientAddressMap[session.sessionData->GetClientAddr()] = boost::timers::portable::microsec_timer(); + } + if (recentlySentInit) + { + SessionError(session, ERR_NET_INIT_BLOCKED); + return; } // Check the protocol version. diff --git a/src/net/net_helper.h b/src/net/net_helper.h index 65ac947f..44e0c36a 100644 --- a/src/net/net_helper.h +++ b/src/net/net_helper.h @@ -23,8 +23,13 @@ #define SERVER_COMPUTER_PLAYER_NAME "Computer" #define SERVER_GUEST_PLAYER_NAME "Guest" -unsigned GetMaxNumberOfAvatarFiles(); -unsigned GetMaxAvatarCacheAgeSec(); +class NetHelper +{ +public: + static unsigned GetMaxNumberOfAvatarFiles(); + static unsigned GetMaxAvatarCacheAgeSec(); + static unsigned GetLoginLockSec(); +}; #endif diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index 760454cb..698bd9e4 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -103,6 +103,7 @@ public: ServerStats GetStats() const; boost::posix_time::ptime GetStartTime() const; + ServerMode GetServerMode() const; SenderHelper &GetSender(); boost::asio::io_service &GetIOService();