From 21a34eaaa1652eb96bb94f71721587bee7301494 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 31 Oct 2016 05:30:12 -0400 Subject: [PATCH] Cleanup server running variable information (#2239) * Created first round of helper functions Started to go through server init function and move statically defined variables that the server uses into helper functions to allow for dynamic changing while the server is up rather than requiring a restart. * Completed Helper Function Creation Completed adding all the helper functions along with updated the virtual server function calls and renamed helper functions to match settings cached ini value names for clarity. * Comment Cleanup Removed lines commented out throughout previous changes as well as cleaned up variable declarations that are no longer needed with helper functions that query the settingsCache * Added featureset dynamic refreshing Added slots/functions/calls for updating the required feature sets dynamically. * Created first round of helper functions Started to go through server init function and move statically defined variables that the server uses into helper functions to allow for dynamic changing while the server is up rather than requiring a restart. --- common/server.cpp | 4 +- common/server.h | 10 +- common/server_protocolhandler.cpp | 4 +- servatrice/servatrice.aps | Bin 0 -> 134416 bytes servatrice/src/isl_interface.cpp | 2 +- servatrice/src/servatrice.cpp | 352 +++++++++++------- servatrice/src/servatrice.h | 68 ++-- .../src/servatrice_database_interface.cpp | 8 +- servatrice/src/serversocketinterface.cpp | 1 + 9 files changed, 279 insertions(+), 170 deletions(-) create mode 100644 servatrice/servatrice.aps diff --git a/common/server.cpp b/common/server.cpp index 768fb752..69c08e31 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -115,7 +115,7 @@ AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString } else if (authState == UnknownUser) { // Change user name so that no two users have the same names, // don't interfere with registered user names though. - if (getRegOnlyServer()) { + if (getRegOnlyServerEnabled()) { qDebug("Login denied: registration required"); databaseInterface->unlockSessionTables(); return RegistrationRequired; @@ -155,7 +155,7 @@ AuthenticationResult Server::loginUser(Server_ProtocolHandler *session, QString if (clientid.isEmpty()){ // client id is empty, either out dated client or client has been modified - if (getClientIdRequired()) + if (getClientIDRequiredEnabled()) return ClientIdRequired; } else { diff --git a/common/server.h b/common/server.h index 3b4c0396..018e4a89 100644 --- a/common/server.h +++ b/common/server.h @@ -58,12 +58,13 @@ public: void removeClient(Server_ProtocolHandler *player); QList getOnlineModeratorList(); virtual QString getLoginMessage() const { return QString(); } + virtual QString getRequiredFeatures() const { return QString(); } virtual bool permitUnregisteredUsers() const { return true; } virtual bool getGameShouldPing() const { return false; } - virtual bool getClientIdRequired() const { return false; } - virtual bool getRegOnlyServer() const { return false; } + virtual bool getClientIDRequiredEnabled() const { return false; } + virtual bool getRegOnlyServerEnabled() const { return false; } virtual bool getMaxUserLimitEnabled() const { return false; } - virtual int getPingClockInterval() const { return 0; } + virtual int getClientKeepAlive() const { return 0; } virtual int getMaxGameInactivityTime() const { return 9999999; } virtual int getMaxPlayerInactivityTime() const { return 9999999; } virtual int getMessageCountingInterval() const { return 0; } @@ -72,7 +73,8 @@ public: virtual int getMaxGamesPerUser() const { return 0; } virtual int getCommandCountingInterval() const { return 0; } virtual int getMaxCommandCountPerInterval() const { return 0; } - virtual int getMaxUserLimit() const { return 9999999; } + virtual int getMaxUserTotal() const { return 9999999; } + virtual int getServerID() const { return 0; } Server_DatabaseInterface *getDatabaseInterface() const; int getNextLocalGameId() { QMutexLocker locker(&nextLocalGameIdMutex); return ++nextLocalGameId; } diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 1efd1500..7edf26dd 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -348,7 +348,7 @@ void Server_ProtocolHandler::pingClockTimeout() int cmdcountinterval = server->getCommandCountingInterval(); int msgcountinterval = server->getMessageCountingInterval(); - int pingclockinterval = server->getPingClockInterval(); + int pingclockinterval = server->getClientKeepAlive(); int interval = server->getMessageCountingInterval(); if (interval > 0) { @@ -443,7 +443,7 @@ Response::ResponseCode Server_ProtocolHandler::cmdLogin(const Command_Login &cmd // limit the number of non-privileged users that can connect to the server based on configuration settings if (QString::fromStdString(userInfo->privlevel()).toLower() == "none") { if (server->getMaxUserLimitEnabled()) { - if (server->getUsersCount() > server->getMaxUserLimit()) { + if (server->getUsersCount() > server->getMaxUserTotal()) { qDebug() << "Max Users Total Limit Reached, please increase the max_users_total setting."; return Response::RespServerFull; } diff --git a/servatrice/servatrice.aps b/servatrice/servatrice.aps new file mode 100644 index 0000000000000000000000000000000000000000..858afb7144db7a8922cd17e4e058a252080482ba GIT binary patch literal 134416 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 literal 0 HcmV?d00001 diff --git a/servatrice/src/isl_interface.cpp b/servatrice/src/isl_interface.cpp index 2a9ea41b..0bc32f82 100644 --- a/servatrice/src/isl_interface.cpp +++ b/servatrice/src/isl_interface.cpp @@ -115,7 +115,7 @@ void IslInterface::initServer() serverId = serverList[listIndex].id; Event_ServerCompleteList event; - event.set_server_id(server->getServerId()); + event.set_server_id(server->getServerID()); server->clientsLock.lockForRead(); QMapIterator userIterator(server->getUsers()); diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index e88723bd..4067a137 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -210,96 +210,61 @@ Servatrice::~Servatrice() bool Servatrice::initServer() { - serverName = settingsCache->value("server/name", "My Cockatrice server").toString(); - serverId = settingsCache->value("server/id", 0).toInt(); - clientIdRequired = settingsCache->value("server/requireclientid",0).toBool(); - regServerOnly = settingsCache->value("authentication/regonly", 0).toBool(); - - const QString authenticationMethodStr = settingsCache->value("authentication/method").toString(); - if (authenticationMethodStr == "sql") { + + serverId = getServerID(); + if (getAuthenticationMethodString() == "sql") { qDebug() << "Authenticating method: sql"; authenticationMethod = AuthenticationSql; - } else if(authenticationMethodStr == "password") { + } else if(getAuthenticationMethodString() == "password") { qDebug() << "Authenticating method: password"; authenticationMethod = AuthenticationPassword; } else { - if (regServerOnly) { + if (getRegOnlyServerEnabled()) { qDebug() << "Registration only server enabled but no authentication method defined: Error."; return false; } - qDebug() << "Authenticating method: none"; authenticationMethod = AuthenticationNone; } - qDebug() << "Store Replays: " << settingsCache->value("game/store_replays", true).toBool(); - qDebug() << "Client ID Required: " << clientIdRequired; - bool maxUserLimitEnabled = getMaxUserLimitEnabled(); - qDebug() << "Maximum user limit enabled: " << maxUserLimitEnabled; + qDebug() << "Store Replays: " << getStoreReplaysEnabled(); + qDebug() << "Client ID Required: " << getClientIDRequiredEnabled(); + qDebug() << "Maximum user limit enabled: " << getMaxUserLimitEnabled(); - if (maxUserLimitEnabled){ - int maxUserLimit = getMaxUserLimit(); - qDebug() << "Maximum total user limit: " << maxUserLimit; - int maxTcpUserLimit = settingsCache->value("security/max_users_tcp", 500).toInt(); - qDebug() << "Maximum tcp user limit: " << maxTcpUserLimit; - int maxWebsocketUserLimit = settingsCache->value("security/max_users_websocket", 500).toInt(); - qDebug() << "Maximum websocket user limit: " << maxWebsocketUserLimit; + if (getMaxUserLimitEnabled()) { + qDebug() << "Maximum total user limit: " << getMaxUserTotal(); + qDebug() << "Maximum tcp user limit: " << getMaxTcpUserLimit(); + qDebug() << "Maximum websocket user limit: " << getMaxWebSocketUserLimit(); } - bool registrationEnabled = settingsCache->value("registration/enabled", false).toBool(); - bool requireEmailForRegistration = settingsCache->value("registration/requireemail", true).toBool(); - bool requireEmailActivation = settingsCache->value("registration/requireemailactivation", true).toBool(); - - qDebug() << "Accept registered users only: " << regServerOnly; - qDebug() << "Registration enabled: " << registrationEnabled; - if (registrationEnabled) - { - qDebug() << "Require email address to register: " << requireEmailForRegistration; - qDebug() << "Require email activation via token: " << requireEmailActivation; + qDebug() << "Accept registered users only: " << getRegOnlyServerEnabled(); + qDebug() << "Registration enabled: " << getRegistrationEnabled(); + if (getRegistrationEnabled()) { + qDebug() << "Require email address to register: " << getRequireEmailForRegistrationEnabled(); + qDebug() << "Require email activation via token: " << getRequireEmailActivationEnabled(); } - FeatureSet features; - features.initalizeFeatureList(serverRequiredFeatureList); - requiredFeatures = settingsCache->value("server/requiredfeatures","").toString(); - QStringList listReqFeatures = requiredFeatures.split(",", QString::SkipEmptyParts); - if (!listReqFeatures.isEmpty()) - foreach(QString reqFeature, listReqFeatures) - features.enableRequiredFeature(serverRequiredFeatureList,reqFeature); - - qDebug() << "Required client features: " << serverRequiredFeatureList; - - QString dbTypeStr = settingsCache->value("database/type").toString(); - if (dbTypeStr == "mysql") + if (getDBTypeString() == "mysql") { databaseType = DatabaseMySql; - else + } else { databaseType = DatabaseNone; - + } servatriceDatabaseInterface = new Servatrice_DatabaseInterface(-1, this); setDatabaseInterface(servatriceDatabaseInterface); if (databaseType != DatabaseNone) { - settingsCache->beginGroup("database"); - dbPrefix = settingsCache->value("prefix").toString(); - bool dbOpened = - servatriceDatabaseInterface->initDatabase("QMYSQL", - settingsCache->value("hostname").toString(), - settingsCache->value("database").toString(), - settingsCache->value("user").toString(), - settingsCache->value("password").toString()); - settingsCache->endGroup(); + dbPrefix = getDBPrefixString(); + bool dbOpened = servatriceDatabaseInterface->initDatabase("QMYSQL",getDBHostNameString(),getDBDatabaseNameString(),getDBUserNameString(),getDBPasswordString()); if (!dbOpened) { qDebug() << "Failed to open database"; return false; } - updateServerList(); - qDebug() << "Clearing previous sessions..."; servatriceDatabaseInterface->clearSessionTables(); } - const QString roomMethod = settingsCache->value("rooms/method").toString(); - if (roomMethod == "sql") { + if (getRoomsMethodString() == "sql") { QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("select id, name, descr, permissionlevel, auto_join, join_message, chat_history_size from {prefix}_rooms where id_server = :id_server order by id asc"); query->bindValue(":id_server", serverId); servatriceDatabaseInterface->execSqlQuery(query); @@ -311,8 +276,7 @@ bool Servatrice::initServer() QStringList gameTypes; while (query2->next()) gameTypes.append(query2->value(0).toString()); - - addRoom(new Server_Room(query->value(0).toInt(), + addRoom(new Server_Room(query->value(0).toInt(), query->value(6).toInt(), query->value(1).toString(), query->value(2).toString(), @@ -320,14 +284,12 @@ bool Servatrice::initServer() query->value(4).toInt(), query->value(5).toString(), gameTypes, - this - )); + this)); } } else { int size = settingsCache->beginReadArray("rooms/roomlist"); for (int i = 0; i < size; ++i) { settingsCache->setArrayIndex(i); - QStringList gameTypes; int size2 = settingsCache->beginReadArray("game_types"); for (int j = 0; j < size2; ++j) { @@ -335,35 +297,13 @@ bool Servatrice::initServer() gameTypes.append(settingsCache->value("name").toString()); } settingsCache->endArray(); - - Server_Room *newRoom = new Server_Room( - i, - settingsCache->value("chathistorysize").toInt(), - settingsCache->value("name").toString(), - settingsCache->value("description").toString(), - settingsCache->value("permissionlevel").toString().toLower(), - settingsCache->value("autojoin").toBool(), - settingsCache->value("joinmessage").toString(), - gameTypes, - this - ); + Server_Room *newRoom = new Server_Room(i,settingsCache->value("chathistorysize").toInt(),settingsCache->value("name").toString(),settingsCache->value("description").toString(),settingsCache->value("permissionlevel").toString().toLower(),settingsCache->value("autojoin").toBool(),settingsCache->value("joinmessage").toString(),gameTypes,this); addRoom(newRoom); } - if(size==0) - { + if(size==0) { // no room defined in config, add a dummy one - Server_Room *newRoom = new Server_Room( - 0, - 100, - "General room", - "Play anything here.", - "none", - true, - "", - QStringList("Standard"), - this - ); + Server_Room *newRoom = new Server_Room(0,100,"General room","Play anything here.","none",true,"",QStringList("Standard"),this); addRoom(newRoom); } @@ -372,25 +312,12 @@ bool Servatrice::initServer() updateLoginMessage(); - maxGameInactivityTime = settingsCache->value("game/max_game_inactivity_time", 120).toInt(); - maxPlayerInactivityTime = settingsCache->value("server/max_player_inactivity_time", 15).toInt(); - pingClockInterval = settingsCache->value("server/clientkeepalive", 1).toInt(); - maxUsersPerAddress = settingsCache->value("security/max_users_per_address", 4).toInt(); - messageCountingInterval = settingsCache->value("security/message_counting_interval", 10).toInt(); - maxMessageCountPerInterval = settingsCache->value("security/max_message_count_per_interval", 15).toInt(); - maxMessageSizePerInterval = settingsCache->value("security/max_message_size_per_interval", 1000).toInt(); - maxGamesPerUser = settingsCache->value("security/max_games_per_user", 5).toInt(); - commandCountingInterval = settingsCache->value("game/command_counting_interval", 10).toInt(); - maxCommandCountPerInterval = settingsCache->value("game/max_command_count_per_interval", 20).toInt(); - - try { if (settingsCache->value("servernetwork/active", 0).toInt()) { + try { if (getISLNetworkEnabled()) { qDebug() << "Connecting to ISL network."; - const QString certFileName = settingsCache->value("servernetwork/ssl_cert").toString(); - const QString keyFileName = settingsCache->value("servernetwork/ssl_key").toString(); qDebug() << "Loading certificate..."; - QFile certFile(certFileName); + QFile certFile(getISLNetworkSSLCertFile()); if (!certFile.open(QIODevice::ReadOnly)) - throw QString("Error opening certificate file: %1").arg(certFileName); + throw QString("Error opening certificate file: %1").arg(getISLNetworkSSLCertFile()); QSslCertificate cert(&certFile); const QDateTime currentTime = QDateTime::currentDateTime(); @@ -400,9 +327,9 @@ bool Servatrice::initServer() throw(QString("Invalid certificate.")); qDebug() << "Loading private key..."; - QFile keyFile(keyFileName); + QFile keyFile(getISLNetworkSSLKeyFile()); if (!keyFile.open(QIODevice::ReadOnly)) - throw QString("Error opening private key file: %1").arg(keyFileName); + throw QString("Error opening private key file: %1").arg(getISLNetworkSSLKeyFile()); QSslKey key(&keyFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey); if (key.isNull()) throw QString("Invalid private key."); @@ -427,11 +354,9 @@ bool Servatrice::initServer() QMetaObject::invokeMethod(interface, "initClient", Qt::BlockingQueuedConnection); } - const int networkPort = settingsCache->value("servernetwork/port", 14747).toInt(); - qDebug() << "Starting ISL server on port" << networkPort; - + qDebug() << "Starting ISL server on port" << getISLNetworkPort(); islServer = new Servatrice_IslServer(this, cert, key, this); - if (islServer->listen(QHostAddress::Any, networkPort)) + if (islServer->listen(QHostAddress::Any, getISLNetworkPort())) qDebug() << "ISL server listening."; else throw QString("islServer->listen()"); @@ -442,25 +367,22 @@ bool Servatrice::initServer() pingClock = new QTimer(this); connect(pingClock, SIGNAL(timeout()), this, SIGNAL(pingClockTimeout())); - pingClock->start(pingClockInterval * 1000); + pingClock->start(getClientKeepAlive() * 1000); - int statusUpdateTime = settingsCache->value("server/statusupdate", 15000).toInt(); statusUpdateClock = new QTimer(this); connect(statusUpdateClock, SIGNAL(timeout()), this, SLOT(statusUpdate())); - if (statusUpdateTime != 0) { - qDebug() << "Starting status update clock, interval " << statusUpdateTime << " ms"; - statusUpdateClock->start(statusUpdateTime); + if (getServerStatusUpdateTime() != 0) { + qDebug() << "Starting status update clock, interval " << getServerStatusUpdateTime() << " ms"; + statusUpdateClock->start(getServerStatusUpdateTime()); } // SOCKET SERVER - const int numberPools = settingsCache->value("server/number_pools", 1).toInt(); - if(numberPools > 0) + if(getNumberOfTCPPools() > 0) { - gameServer = new Servatrice_GameServer(this, numberPools, servatriceDatabaseInterface->getDatabase(), this); + gameServer = new Servatrice_GameServer(this, getNumberOfTCPPools(), servatriceDatabaseInterface->getDatabase(), this); gameServer->setMaxPendingConnections(1000); - const int gamePort = settingsCache->value("server/port", 4747).toInt(); - qDebug() << "Starting server on port" << gamePort; - if (gameServer->listen(QHostAddress::Any, gamePort)) + qDebug() << "Starting server on port" << getServerTCPPort(); + if (gameServer->listen(QHostAddress::Any, getServerTCPPort())) qDebug() << "Server listening."; else { qDebug() << "gameServer->listen(): Error:" << gameServer->errorString(); @@ -470,14 +392,12 @@ bool Servatrice::initServer() #if QT_VERSION > 0x050300 // WEBSOCKET SERVER - const int wesocketNumberPools = settingsCache->value("server/websocket_number_pools", 1).toInt(); - if(wesocketNumberPools > 0) + if(getNumberOfWebSocketPools() > 0) { - websocketGameServer = new Servatrice_WebsocketGameServer(this, wesocketNumberPools, servatriceDatabaseInterface->getDatabase(), this); + websocketGameServer = new Servatrice_WebsocketGameServer(this, getNumberOfWebSocketPools(), servatriceDatabaseInterface->getDatabase(), this); websocketGameServer->setMaxPendingConnections(1000); - const int websocketGamePort = settingsCache->value("server/websocket_port", 4748).toInt(); - qDebug() << "Starting websocket server on port" << websocketGamePort; - if (websocketGameServer->listen(QHostAddress::Any, websocketGamePort)) + qDebug() << "Starting websocket server on port" << getServerWebSocketPort(); + if (websocketGameServer->listen(QHostAddress::Any, getServerWebSocketPort())) qDebug() << "Websocket server listening."; else { qDebug() << "websocketGameServer->listen(): Error:" << websocketGameServer->errorString(); @@ -485,6 +405,7 @@ bool Servatrice::initServer() } } #endif + setRequiredFeatures(getRequiredFeatures()); return true; } @@ -566,6 +487,18 @@ void Servatrice::updateLoginMessage() } } +void Servatrice::setRequiredFeatures(const QString featureList) { + FeatureSet features; + serverRequiredFeatureList.clear(); + features.initalizeFeatureList(serverRequiredFeatureList); + QStringList listReqFeatures = featureList.split(",", QString::SkipEmptyParts); + if (!listReqFeatures.isEmpty()) + foreach(QString reqFeature, listReqFeatures) + features.enableRequiredFeature(serverRequiredFeatureList, reqFeature); + + qDebug() << "Set required client features to: " << serverRequiredFeatureList; +} + void Servatrice::statusUpdate() { if (!servatriceDatabaseInterface->checkSql()) @@ -595,9 +528,7 @@ void Servatrice::statusUpdate() servatriceDatabaseInterface->execSqlQuery(query); // send activation emails - bool registrationEnabled = settingsCache->value("registration/enabled", false).toBool(); - bool requireEmailActivation = settingsCache->value("registration/requireemailactivation", true).toBool(); - if (registrationEnabled && requireEmailActivation) + if (getRegistrationEnabled() && getRequireEmailActivationEnabled()) { QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("select a.name, b.email, b.token from {prefix}_activation_emails a left join {prefix}_users b on a.name = b.name"); if (!servatriceDatabaseInterface->execSqlQuery(query)) @@ -682,14 +613,12 @@ void Servatrice::shutdownTimeout() bool Servatrice::islConnectionExists(int serverId) const { // Only call with islLock locked at least for reading - return islInterfaces.contains(serverId); } void Servatrice::addIslInterface(int serverId, IslInterface *interface) { // Only call with islLock locked for writing - islInterfaces.insert(serverId, interface); connect(interface, SIGNAL(externalUserJoined(ServerInfo_User)), this, SLOT(externalUserJoined(ServerInfo_User))); connect(interface, SIGNAL(externalUserLeft(QString)), this, SLOT(externalUserLeft(QString))); @@ -706,8 +635,7 @@ void Servatrice::addIslInterface(int serverId, IslInterface *interface) void Servatrice::removeIslInterface(int serverId) { // Only call with islLock locked for writing - - // XXX we probably need to delete everything that belonged to it... + // XXX we probably need to delete everything that belonged to it... <-- THIS SHOULD BE FIXED FOR ISL FUNCTIONALITY TO WORK COMPLETLY! islInterfaces.remove(serverId); } @@ -726,10 +654,164 @@ void Servatrice::doSendIslMessage(const IslMessage &msg, int serverId) } } -int Servatrice::getMaxUserLimit() const { +// start helper functions + +int Servatrice::getMaxUserTotal() const { return settingsCache->value("security/max_users_total", 500).toInt(); } bool Servatrice::getMaxUserLimitEnabled() const { return settingsCache->value("security/enable_max_user_limit", false).toBool(); +} + +QString Servatrice::getServerName() const { + return settingsCache->value("server/name", "My Cockatrice server").toString(); +} + +int Servatrice::getServerID() const { + return settingsCache->value("server/id", 0).toInt(); +} + +bool Servatrice::getClientIDRequiredEnabled() const { + return settingsCache->value("server/requireclientid", 0).toBool(); +} + +bool Servatrice::getRegOnlyServerEnabled() const { + return settingsCache->value("authentication/regonly", 0).toBool(); +} + +QString Servatrice::getAuthenticationMethodString() const { + return settingsCache->value("authentication/method").toString(); +} + +bool Servatrice::getStoreReplaysEnabled() const { + return settingsCache->value("game/store_replays", true).toBool(); +} + +int Servatrice::getMaxTcpUserLimit() const { + return settingsCache->value("security/max_users_tcp", 500).toInt(); +} + +int Servatrice::getMaxWebSocketUserLimit() const { + return settingsCache->value("security/max_users_websocket", 500).toInt(); +} + +bool Servatrice::getRegistrationEnabled() const { + return settingsCache->value("registration/enabled", false).toBool(); +} + +bool Servatrice::getRequireEmailForRegistrationEnabled() const { + return settingsCache->value("registration/requireemail", true).toBool(); +} + +bool Servatrice::getRequireEmailActivationEnabled() const { + return settingsCache->value("registration/requireemailactivation", true).toBool(); +} + +QString Servatrice::getRequiredFeatures() const { + return settingsCache->value("server/requiredfeatures", "").toString(); +} + +QString Servatrice::getDBTypeString() const { + return settingsCache->value("database/type").toString(); +} + +QString Servatrice::getDBPrefixString() const { + return settingsCache->value("database/prefix").toString(); +} + +QString Servatrice::getDBHostNameString() const { + return settingsCache->value("database/hostname").toString(); +} + +QString Servatrice::getDBDatabaseNameString() const { + return settingsCache->value("database/database").toString(); +} + +QString Servatrice::getDBUserNameString() const { + return settingsCache->value("database/user").toString(); +} + +QString Servatrice::getDBPasswordString() const { + return settingsCache->value("database/password").toString(); +} + +QString Servatrice::getRoomsMethodString() const { + return settingsCache->value("rooms/method").toString(); +} + +int Servatrice::getMaxGameInactivityTime() const { + return settingsCache->value("game/max_game_inactivity_time", 120).toInt(); +} + +int Servatrice::getMaxPlayerInactivityTime() const { + return settingsCache->value("server/max_player_inactivity_time", 15).toInt(); +} + +int Servatrice::getClientKeepAlive() const { + return settingsCache->value("server/clientkeepalive", 1).toInt(); +} + +int Servatrice::getMaxUsersPerAddress() const { + return settingsCache->value("security/max_users_per_address", 4).toInt(); +} + +int Servatrice::getMessageCountingInterval() const { + return settingsCache->value("security/message_counting_interval", 10).toInt(); +} + +int Servatrice::getMaxMessageCountPerInterval() const { + return settingsCache->value("security/max_message_count_per_interval", 15).toInt(); +} + +int Servatrice::getMaxMessageSizePerInterval() const { + return settingsCache->value("security/max_message_size_per_interval", 1000).toInt(); +} + +int Servatrice::getMaxGamesPerUser() const { + return settingsCache->value("security/max_games_per_user", 5).toInt(); +} + +int Servatrice::getCommandCountingInterval() const { + return settingsCache->value("game/command_counting_interval", 10).toInt(); +} + +int Servatrice::getMaxCommandCountPerInterval() const { + return settingsCache->value("game/max_command_count_per_interval", 20).toInt(); +} + +int Servatrice::getServerStatusUpdateTime() const { + return settingsCache->value("server/statusupdate", 15000).toInt(); +} + +int Servatrice::getNumberOfTCPPools() const { + return settingsCache->value("server/number_pools", 1).toInt(); +} + +int Servatrice::getServerTCPPort() const { + return settingsCache->value("server/port", 4747).toInt(); +} + +int Servatrice::getNumberOfWebSocketPools() const { + return settingsCache->value("server/websocket_number_pools", 1).toInt(); +} + +int Servatrice::getServerWebSocketPort() const { + return settingsCache->value("server/websocket_port", 4748).toInt(); +} + +bool Servatrice::getISLNetworkEnabled() const { + return settingsCache->value("servernetwork/active", false).toBool(); +} + +QString Servatrice::getISLNetworkSSLCertFile() const { + return settingsCache->value("servernetwork/ssl_cert").toString(); +} + +QString Servatrice::getISLNetworkSSLKeyFile() const { + return settingsCache->value("servernetwork/ssl_key").toString(); +} + +int Servatrice::getISLNetworkPort() const { + return settingsCache->value("servernetwork/port", 14747).toInt(); } \ No newline at end of file diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index 4e13ad09..84497cbc 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -122,7 +122,6 @@ private: Servatrice_WebsocketGameServer *websocketGameServer; #endif Servatrice_IslServer *islServer; - QString serverName; mutable QMutex loginMessageMutex; QString loginMessage; QString dbPrefix; @@ -134,51 +133,76 @@ private: int uptime; QMutex txBytesMutex, rxBytesMutex; quint64 txBytes, rxBytes; - int maxGameInactivityTime, maxPlayerInactivityTime; - int maxUsersPerAddress, messageCountingInterval, maxMessageCountPerInterval, maxMessageSizePerInterval, maxGamesPerUser, commandCountingInterval, maxCommandCountPerInterval, pingClockInterval; QString shutdownReason; int shutdownMinutes; int nextShutdownMessageMinutes; QTimer *shutdownTimer; - bool isFirstShutdownMessage, clientIdRequired, regServerOnly; + bool isFirstShutdownMessage; mutable QMutex serverListMutex; QList serverList; void updateServerList(); QMap islInterfaces; + + QString getDBPrefixString() const; + QString getDBHostNameString() const; + QString getDBDatabaseNameString() const; + QString getDBUserNameString() const; + QString getDBPasswordString() const; + QString getRoomsMethodString() const; + QString getISLNetworkSSLCertFile() const; + QString getISLNetworkSSLKeyFile() const; + + int getServerStatusUpdateTime() const; + int getNumberOfTCPPools() const; + int getServerTCPPort() const; + int getNumberOfWebSocketPools() const; + int getServerWebSocketPort() const; + int getISLNetworkPort() const; + bool getISLNetworkEnabled() const; + public slots: void scheduleShutdown(const QString &reason, int minutes); void updateLoginMessage(); + void setRequiredFeatures(const QString featureList); public: Servatrice(QObject *parent = 0); ~Servatrice(); bool initServer(); QMap getServerRequiredFeatureList() const { return serverRequiredFeatureList; } QString getOfficialWarningsList() const { return officialWarnings; } - QString getServerName() const { return serverName; } + QString getServerName() const; QString getLoginMessage() const { QMutexLocker locker(&loginMessageMutex); return loginMessage; } - QString getRequiredFeatures() const { return requiredFeatures; } + QString getRequiredFeatures() const; + QString getAuthenticationMethodString() const; + QString getDBTypeString() const; + QString getDbPrefix() const { return dbPrefix; } + AuthenticationMethod getAuthenticationMethod() const { return authenticationMethod; } bool permitUnregisteredUsers() const { return authenticationMethod != AuthenticationNone; } bool getGameShouldPing() const { return true; } - bool getClientIdRequired() const { return clientIdRequired; } - bool getRegOnlyServer() const { return regServerOnly; } + bool getClientIDRequiredEnabled() const; + bool getRegOnlyServerEnabled() const; bool getMaxUserLimitEnabled() const; - int getPingClockInterval() const { return pingClockInterval; } - int getMaxGameInactivityTime() const { return maxGameInactivityTime; } - int getMaxPlayerInactivityTime() const { return maxPlayerInactivityTime; } - int getMaxUsersPerAddress() const { return maxUsersPerAddress; } - int getMessageCountingInterval() const { return messageCountingInterval; } - int getMaxMessageCountPerInterval() const { return maxMessageCountPerInterval; } - int getMaxMessageSizePerInterval() const { return maxMessageSizePerInterval; } - int getMaxGamesPerUser() const { return maxGamesPerUser; } - int getCommandCountingInterval() const { return commandCountingInterval; } - int getMaxCommandCountPerInterval() const { return maxCommandCountPerInterval; } - int getMaxUserLimit() const; - AuthenticationMethod getAuthenticationMethod() const { return authenticationMethod; } - QString getDbPrefix() const { return dbPrefix; } - int getServerId() const { return serverId; } + bool getStoreReplaysEnabled() const; + bool getRegistrationEnabled() const; + bool getRequireEmailForRegistrationEnabled() const; + bool getRequireEmailActivationEnabled() const; + int getServerID() const; + int getMaxGameInactivityTime() const; + int getMaxPlayerInactivityTime() const; + int getClientKeepAlive() const; + int getMaxUsersPerAddress() const; + int getMessageCountingInterval() const; + int getMaxMessageCountPerInterval() const; + int getMaxMessageSizePerInterval() const; + int getMaxGamesPerUser() const; + int getCommandCountingInterval() const; + int getMaxCommandCountPerInterval() const; + int getMaxUserTotal() const; + int getMaxTcpUserLimit() const; + int getMaxWebSocketUserLimit() const; int getUsersWithAddress(const QHostAddress &address) const; QList getUsersWithAddressAsList(const QHostAddress &address) const; void incTxBytes(quint64 num); diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index da35796a..d2ac2c5f 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -568,7 +568,7 @@ void Servatrice_DatabaseInterface::clearSessionTables() { lockSessionTables(); QSqlQuery *query = prepareQuery("update {prefix}_sessions set end_time=now() where end_time is null and id_server = :id_server"); - query->bindValue(":id_server", server->getServerId()); + query->bindValue(":id_server", server->getServerID()); execSqlQuery(query); unlockSessionTables(); } @@ -590,7 +590,7 @@ bool Servatrice_DatabaseInterface::userSessionExists(const QString &userName) // Call only after lockSessionTables(). QSqlQuery *query = prepareQuery("select 1 from {prefix}_sessions where user_name = :user_name and id_server = :id_server and end_time is null"); - query->bindValue(":id_server", server->getServerId()); + query->bindValue(":id_server", server->getServerID()); query->bindValue(":user_name", userName); execSqlQuery(query); return query->next(); @@ -606,7 +606,7 @@ qint64 Servatrice_DatabaseInterface::startSession(const QString &userName, const QSqlQuery *query = prepareQuery("insert into {prefix}_sessions (user_name, id_server, ip_address, start_time, clientid, connection_type) values(:user_name, :id_server, :ip_address, NOW(), :client_id, :connection_type)"); query->bindValue(":user_name", userName); - query->bindValue(":id_server", server->getServerId()); + query->bindValue(":id_server", server->getServerID()); query->bindValue(":ip_address", address); query->bindValue(":client_id", clientId); query->bindValue(":connection_type", connectionType); @@ -880,7 +880,7 @@ int Servatrice_DatabaseInterface::getActiveUserCount(QString connectionType) text +=" AND connection_type = :connection_type"; QSqlQuery *query = prepareQuery(text); - query->bindValue(":serverid", server->getServerId()); + query->bindValue(":serverid", server->getServerID()); if(!connectionType.isEmpty()) query->bindValue(":connection_type", connectionType); diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index eeee6d1f..19341e04 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -1021,6 +1021,7 @@ Response::ResponseCode AbstractServerSocketInterface::cmdReloadConfig(const Comm { logDebugMessage("Received admin command: reloading configuration"); settingsCache->sync(); + QMetaObject::invokeMethod(server, "setRequiredFeatures", Q_ARG(QString, server->getRequiredFeatures())); return Response::RespOk; }