Merge pull request #2220 from woogerboy21/CleanupMaxUserCheck
Cleanup max user check at login
This commit is contained in:
commit
632a2db18e
7 changed files with 23 additions and 25 deletions
|
@ -393,6 +393,10 @@ void MainWindow::loginError(Response::ResponseCode r, QString reasonStr, quint32
|
||||||
client->disconnectFromServer();
|
client->disconnectFromServer();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case Response::RespServerFull: {
|
||||||
|
QMessageBox::critical(this, tr("Server Full"), tr("The server has reached its maximum user capacity, please check back later."));
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
QMessageBox::critical(this, tr("Error"), tr("Unknown login error: %1").arg(static_cast<int>(r)) + tr("\nThis usually means that your client version is out of date, and the server sent a reply your client doesn't understand."));
|
QMessageBox::critical(this, tr("Error"), tr("Unknown login error: %1").arg(static_cast<int>(r)) + tr("\nThis usually means that your client version is out of date, and the server sent a reply your client doesn't understand."));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -37,6 +37,7 @@ message Response {
|
||||||
RespRegistrationAcceptedNeedsActivation = 33; // Server accepted cient registration, but it will need token activation
|
RespRegistrationAcceptedNeedsActivation = 33; // Server accepted cient registration, but it will need token activation
|
||||||
RespClientIdRequired = 34; // Server requires client to generate and send its client id before allowing access
|
RespClientIdRequired = 34; // Server requires client to generate and send its client id before allowing access
|
||||||
RespClientUpdateRequired = 35; // Client is missing features that the server is requiring
|
RespClientUpdateRequired = 35; // Client is missing features that the server is requiring
|
||||||
|
RespServerFull = 36; // Server user limit reached
|
||||||
}
|
}
|
||||||
enum ResponseType {
|
enum ResponseType {
|
||||||
JOIN_ROOM = 1000;
|
JOIN_ROOM = 1000;
|
||||||
|
|
|
@ -62,6 +62,7 @@ public:
|
||||||
virtual bool getGameShouldPing() const { return false; }
|
virtual bool getGameShouldPing() const { return false; }
|
||||||
virtual bool getClientIdRequired() const { return false; }
|
virtual bool getClientIdRequired() const { return false; }
|
||||||
virtual bool getRegOnlyServer() const { return false; }
|
virtual bool getRegOnlyServer() const { return false; }
|
||||||
|
virtual bool getmaxUserLimitEnabled() const { return false; }
|
||||||
virtual int getPingClockInterval() const { return 0; }
|
virtual int getPingClockInterval() const { return 0; }
|
||||||
virtual int getMaxGameInactivityTime() const { return 9999999; }
|
virtual int getMaxGameInactivityTime() const { return 9999999; }
|
||||||
virtual int getMaxPlayerInactivityTime() const { return 9999999; }
|
virtual int getMaxPlayerInactivityTime() const { return 9999999; }
|
||||||
|
@ -71,6 +72,7 @@ public:
|
||||||
virtual int getMaxGamesPerUser() const { return 0; }
|
virtual int getMaxGamesPerUser() const { return 0; }
|
||||||
virtual int getCommandCountingInterval() const { return 0; }
|
virtual int getCommandCountingInterval() const { return 0; }
|
||||||
virtual int getMaxCommandCountPerInterval() const { return 0; }
|
virtual int getMaxCommandCountPerInterval() const { return 0; }
|
||||||
|
virtual int getMaxUserLimit() const { return 9999999; }
|
||||||
|
|
||||||
Server_DatabaseInterface *getDatabaseInterface() const;
|
Server_DatabaseInterface *getDatabaseInterface() const;
|
||||||
int getNextLocalGameId() { QMutexLocker locker(&nextLocalGameIdMutex); return ++nextLocalGameId; }
|
int getNextLocalGameId() { QMutexLocker locker(&nextLocalGameIdMutex); return ++nextLocalGameId; }
|
||||||
|
@ -89,6 +91,8 @@ public:
|
||||||
void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
|
void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
|
||||||
void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
|
void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
|
||||||
QList<PlayerReference> getPersistentPlayerReferences(const QString &userName) const;
|
QList<PlayerReference> getPersistentPlayerReferences(const QString &userName) const;
|
||||||
|
int getUsersCount() const;
|
||||||
|
int getGamesCount() const;
|
||||||
private:
|
private:
|
||||||
QMultiMap<QString, PlayerReference> persistentPlayers;
|
QMultiMap<QString, PlayerReference> persistentPlayers;
|
||||||
mutable QReadWriteLock persistentPlayersLock;
|
mutable QReadWriteLock persistentPlayersLock;
|
||||||
|
@ -118,9 +122,6 @@ protected:
|
||||||
QMap<QString, Server_AbstractUserInterface *> externalUsers;
|
QMap<QString, Server_AbstractUserInterface *> externalUsers;
|
||||||
QMap<int, Server_Room *> rooms;
|
QMap<int, Server_Room *> rooms;
|
||||||
QMap<QThread *, Server_DatabaseInterface *> databaseInterfaces;
|
QMap<QThread *, Server_DatabaseInterface *> databaseInterfaces;
|
||||||
|
|
||||||
int getUsersCount() const;
|
|
||||||
int getGamesCount() const;
|
|
||||||
void addRoom(Server_Room *newRoom);
|
void addRoom(Server_Room *newRoom);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -383,6 +383,14 @@ Response::ResponseCode Server_ProtocolHandler::cmdPing(const Command_Ping & /*cm
|
||||||
|
|
||||||
Response::ResponseCode Server_ProtocolHandler::cmdLogin(const Command_Login &cmd, ResponseContainer &rc)
|
Response::ResponseCode Server_ProtocolHandler::cmdLogin(const Command_Login &cmd, ResponseContainer &rc)
|
||||||
{
|
{
|
||||||
|
// limit the number of users that can connect to the server based on configuration settings
|
||||||
|
if (server->getmaxUserLimitEnabled()) {
|
||||||
|
if (server->getUsersCount() >= server->getMaxUserLimit()) {
|
||||||
|
qDebug() << "Max Users Total Limit Reached, please increase the max_users_total setting.";
|
||||||
|
return Response::RespServerFull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QString userName = QString::fromStdString(cmd.user_name()).simplified();
|
QString userName = QString::fromStdString(cmd.user_name()).simplified();
|
||||||
QString clientId = QString::fromStdString(cmd.clientid()).simplified();
|
QString clientId = QString::fromStdString(cmd.clientid()).simplified();
|
||||||
QString clientVersion = QString::fromStdString(cmd.clientver()).simplified();
|
QString clientVersion = QString::fromStdString(cmd.clientver()).simplified();
|
||||||
|
|
|
@ -234,11 +234,11 @@ bool Servatrice::initServer()
|
||||||
|
|
||||||
qDebug() << "Store Replays: " << settingsCache->value("game/store_replays", true).toBool();
|
qDebug() << "Store Replays: " << settingsCache->value("game/store_replays", true).toBool();
|
||||||
qDebug() << "Client ID Required: " << clientIdRequired;
|
qDebug() << "Client ID Required: " << clientIdRequired;
|
||||||
bool maxUserLimitEnabled = settingsCache->value("security/enable_max_user_limit", false).toBool();
|
maxUserLimitEnabled = settingsCache->value("security/enable_max_user_limit", false).toBool();
|
||||||
qDebug() << "Maximum user limit enabled: " << maxUserLimitEnabled;
|
qDebug() << "Maximum user limit enabled: " << maxUserLimitEnabled;
|
||||||
|
|
||||||
if (maxUserLimitEnabled){
|
if (maxUserLimitEnabled){
|
||||||
int maxUserLimit = settingsCache->value("security/max_users_total", 500).toInt();
|
maxUserLimit = settingsCache->value("security/max_users_total", 500).toInt();
|
||||||
qDebug() << "Maximum total user limit: " << maxUserLimit;
|
qDebug() << "Maximum total user limit: " << maxUserLimit;
|
||||||
int maxTcpUserLimit = settingsCache->value("security/max_users_tcp", 500).toInt();
|
int maxTcpUserLimit = settingsCache->value("security/max_users_tcp", 500).toInt();
|
||||||
qDebug() << "Maximum tcp user limit: " << maxTcpUserLimit;
|
qDebug() << "Maximum tcp user limit: " << maxTcpUserLimit;
|
||||||
|
|
|
@ -134,14 +134,14 @@ private:
|
||||||
int uptime;
|
int uptime;
|
||||||
QMutex txBytesMutex, rxBytesMutex;
|
QMutex txBytesMutex, rxBytesMutex;
|
||||||
quint64 txBytes, rxBytes;
|
quint64 txBytes, rxBytes;
|
||||||
int maxGameInactivityTime, maxPlayerInactivityTime;
|
int maxGameInactivityTime, maxPlayerInactivityTime, maxUserLimit;
|
||||||
int maxUsersPerAddress, messageCountingInterval, maxMessageCountPerInterval, maxMessageSizePerInterval, maxGamesPerUser, commandCountingInterval, maxCommandCountPerInterval, pingClockInterval;
|
int maxUsersPerAddress, messageCountingInterval, maxMessageCountPerInterval, maxMessageSizePerInterval, maxGamesPerUser, commandCountingInterval, maxCommandCountPerInterval, pingClockInterval;
|
||||||
|
|
||||||
QString shutdownReason;
|
QString shutdownReason;
|
||||||
int shutdownMinutes;
|
int shutdownMinutes;
|
||||||
int nextShutdownMessageMinutes;
|
int nextShutdownMessageMinutes;
|
||||||
QTimer *shutdownTimer;
|
QTimer *shutdownTimer;
|
||||||
bool isFirstShutdownMessage, clientIdRequired, regServerOnly;
|
bool isFirstShutdownMessage, clientIdRequired, regServerOnly, maxUserLimitEnabled;
|
||||||
|
|
||||||
mutable QMutex serverListMutex;
|
mutable QMutex serverListMutex;
|
||||||
QList<ServerProperties> serverList;
|
QList<ServerProperties> serverList;
|
||||||
|
@ -164,6 +164,7 @@ public:
|
||||||
bool getGameShouldPing() const { return true; }
|
bool getGameShouldPing() const { return true; }
|
||||||
bool getClientIdRequired() const { return clientIdRequired; }
|
bool getClientIdRequired() const { return clientIdRequired; }
|
||||||
bool getRegOnlyServer() const { return regServerOnly; }
|
bool getRegOnlyServer() const { return regServerOnly; }
|
||||||
|
bool getmaxUserLimitEnabled() const {return maxUserLimitEnabled; }
|
||||||
int getPingClockInterval() const { return pingClockInterval; }
|
int getPingClockInterval() const { return pingClockInterval; }
|
||||||
int getMaxGameInactivityTime() const { return maxGameInactivityTime; }
|
int getMaxGameInactivityTime() const { return maxGameInactivityTime; }
|
||||||
int getMaxPlayerInactivityTime() const { return maxPlayerInactivityTime; }
|
int getMaxPlayerInactivityTime() const { return maxPlayerInactivityTime; }
|
||||||
|
@ -174,6 +175,7 @@ public:
|
||||||
int getMaxGamesPerUser() const { return maxGamesPerUser; }
|
int getMaxGamesPerUser() const { return maxGamesPerUser; }
|
||||||
int getCommandCountingInterval() const { return commandCountingInterval; }
|
int getCommandCountingInterval() const { return commandCountingInterval; }
|
||||||
int getMaxCommandCountPerInterval() const { return maxCommandCountPerInterval; }
|
int getMaxCommandCountPerInterval() const { return maxCommandCountPerInterval; }
|
||||||
|
int getMaxUserLimit() const { return maxUserLimit; }
|
||||||
AuthenticationMethod getAuthenticationMethod() const { return authenticationMethod; }
|
AuthenticationMethod getAuthenticationMethod() const { return authenticationMethod; }
|
||||||
QString getDbPrefix() const { return dbPrefix; }
|
QString getDbPrefix() const { return dbPrefix; }
|
||||||
int getServerId() const { return serverId; }
|
int getServerId() const { return serverId; }
|
||||||
|
|
|
@ -94,23 +94,6 @@ bool AbstractServerSocketInterface::initSession()
|
||||||
sendProtocolItem(*identSe);
|
sendProtocolItem(*identSe);
|
||||||
delete identSe;
|
delete identSe;
|
||||||
|
|
||||||
//limit the number of total users based on configuration settings
|
|
||||||
bool enforceUserLimit = settingsCache->value("security/enable_max_user_limit", false).toBool();
|
|
||||||
if (enforceUserLimit){
|
|
||||||
int userLimit = settingsCache->value("security/max_users_total", 500).toInt();
|
|
||||||
int playerCount = (databaseInterface->getActiveUserCount() + 1);
|
|
||||||
if (playerCount > userLimit){
|
|
||||||
std::cerr << "Max Users Total Limit Reached, please increase the max_users_total setting." << std::endl;
|
|
||||||
logger->logMessage(QString("Max Users Total Limit Reached, please increase the max_users_total setting."), this);
|
|
||||||
Event_ConnectionClosed event;
|
|
||||||
event.set_reason(Event_ConnectionClosed::USER_LIMIT_REACHED);
|
|
||||||
SessionEvent *se = prepareSessionEvent(event);
|
|
||||||
sendProtocolItem(*se);
|
|
||||||
delete se;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//allow unlimited number of connections from the trusted sources
|
//allow unlimited number of connections from the trusted sources
|
||||||
QString trustedSources = settingsCache->value("security/trusted_sources","127.0.0.1,::1").toString();
|
QString trustedSources = settingsCache->value("security/trusted_sources","127.0.0.1,::1").toString();
|
||||||
if (trustedSources.contains(getAddress(),Qt::CaseInsensitive))
|
if (trustedSources.contains(getAddress(),Qt::CaseInsensitive))
|
||||||
|
@ -123,7 +106,6 @@ bool AbstractServerSocketInterface::initSession()
|
||||||
SessionEvent *se = prepareSessionEvent(event);
|
SessionEvent *se = prepareSessionEvent(event);
|
||||||
sendProtocolItem(*se);
|
sendProtocolItem(*se);
|
||||||
delete se;
|
delete se;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue