1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Always validate messages in debug mode. Fixes for schemas

This commit is contained in:
Ivan Savenko
2024-03-08 14:23:08 +02:00
parent efe10b05e9
commit c21e5bb0fb
8 changed files with 28 additions and 14 deletions

View File

@@ -19,11 +19,13 @@
#include "../windows/InfoWindows.h" #include "../windows/InfoWindows.h"
#include "../CServerHandler.h" #include "../CServerHandler.h"
#include "../mainmenu/CMainMenu.h" #include "../mainmenu/CMainMenu.h"
#include "../CGameInfo.h"
#include "../../lib/CConfigHandler.h" #include "../../lib/CConfigHandler.h"
#include "../../lib/MetaString.h" #include "../../lib/MetaString.h"
#include "../../lib/json/JsonUtils.h" #include "../../lib/json/JsonUtils.h"
#include "../../lib/TextOperations.h" #include "../../lib/TextOperations.h"
#include "../../lib/CGeneralTextHandler.h"
GlobalLobbyClient::GlobalLobbyClient() = default; GlobalLobbyClient::GlobalLobbyClient() = default;
GlobalLobbyClient::~GlobalLobbyClient() = default; GlobalLobbyClient::~GlobalLobbyClient() = default;
@@ -119,7 +121,7 @@ void GlobalLobbyClient::receiveLoginSuccess(const JsonNode & json)
if(!loginWindowPtr || !GH.windows().topWindow<GlobalLobbyLoginWindow>()) if(!loginWindowPtr || !GH.windows().topWindow<GlobalLobbyLoginWindow>())
throw std::runtime_error("lobby connection finished without active login window!"); throw std::runtime_error("lobby connection finished without active login window!");
loginWindowPtr->onConnectionSuccess(); loginWindowPtr->onLoginSuccess();
} }
void GlobalLobbyClient::receiveChatHistory(const JsonNode & json) void GlobalLobbyClient::receiveChatHistory(const JsonNode & json)
@@ -231,6 +233,8 @@ void GlobalLobbyClient::sendClientRegister(const std::string & accountName)
JsonNode toSend; JsonNode toSend;
toSend["type"].String() = "clientRegister"; toSend["type"].String() = "clientRegister";
toSend["displayName"].String() = accountName; toSend["displayName"].String() = accountName;
toSend["language"].String() = CGI->generaltexth->getPreferredLanguage();
toSend["version"].String() = VCMI_VERSION_STRING;
sendMessage(toSend); sendMessage(toSend);
} }
@@ -240,6 +244,8 @@ void GlobalLobbyClient::sendClientLogin()
toSend["type"].String() = "clientLogin"; toSend["type"].String() = "clientLogin";
toSend["accountID"] = settings["lobby"]["accountID"]; toSend["accountID"] = settings["lobby"]["accountID"];
toSend["accountCookie"] = settings["lobby"]["accountCookie"]; toSend["accountCookie"] = settings["lobby"]["accountCookie"];
toSend["language"].String() = CGI->generaltexth->getPreferredLanguage();
toSend["version"].String() = VCMI_VERSION_STRING;
sendMessage(toSend); sendMessage(toSend);
} }
@@ -274,7 +280,7 @@ void GlobalLobbyClient::onDisconnected(const std::shared_ptr<INetworkConnection>
void GlobalLobbyClient::sendMessage(const JsonNode & data) void GlobalLobbyClient::sendMessage(const JsonNode & data)
{ {
assert(JsonUtils::validate(data, "vcmi:lobbyProtocol/" + data["type"].String(), "network")); assert(JsonUtils::validate(data, "vcmi:lobbyProtocol/" + data["type"].String(), data["type"].String() + " pack"));
networkConnection->sendPacket(data.toBytes()); networkConnection->sendPacket(data.toBytes());
} }
@@ -364,6 +370,6 @@ void GlobalLobbyClient::sendProxyConnectionLogin(const NetworkConnectionPtr & ne
toSend["accountCookie"] = settings["lobby"]["accountCookie"]; toSend["accountCookie"] = settings["lobby"]["accountCookie"];
toSend["gameRoomID"] = settings["lobby"]["roomID"]; toSend["gameRoomID"] = settings["lobby"]["roomID"];
assert(JsonUtils::validate(toSend, "vcmi:lobbyProtocol/" + toSend["type"].String(), "network")); assert(JsonUtils::validate(toSend, "vcmi:lobbyProtocol/" + toSend["type"].String(), toSend["type"].String() + " pack"));
netConnection->sendPacket(toSend.toBytes()); netConnection->sendPacket(toSend.toBytes());
} }

View File

@@ -3,7 +3,7 @@
"$schema" : "http://json-schema.org/draft-06/schema", "$schema" : "http://json-schema.org/draft-06/schema",
"title" : "Lobby protocol: activateGameRoom", "title" : "Lobby protocol: activateGameRoom",
"description" : "Sent by client when player wants to activate a game room", "description" : "Sent by client when player wants to activate a game room",
"required" : [ "accountID", "accountCookie", "language", "version" ], "required" : [ "type", "hostAccountID", "roomType" ],
"additionalProperties" : false, "additionalProperties" : false,
"properties" : { "properties" : {

View File

@@ -22,10 +22,15 @@
"type" : "string", "type" : "string",
"description" : "ID of account that have sent this message" "description" : "ID of account that have sent this message"
}, },
"displayName" :
{
"type" : "string",
"description" : "Display name of account that have sent this message"
},
"roomMode" : "roomMode" :
{ {
"type" : "string", "type" : "string",
"const" : "general", "const" : "global",
"description" : "Type of room to which this message has been set. Right now can only be 'general'" "description" : "Type of room to which this message has been set. Right now can only be 'general'"
}, },
"roomName" : "roomName" :

View File

@@ -10,7 +10,7 @@
"type" : "type" :
{ {
"type" : "string", "type" : "string",
"const" : "clientLogin" "const" : "clientRegister"
}, },
"displayName" : "displayName" :
{ {

View File

@@ -3,7 +3,7 @@
"$schema" : "http://json-schema.org/draft-06/schema", "$schema" : "http://json-schema.org/draft-06/schema",
"title" : "Lobby protocol: sendChatMessage", "title" : "Lobby protocol: sendChatMessage",
"description" : "Sent by client when player requests lobby login", "description" : "Sent by client when player requests lobby login",
"required" : [ "accountID", "accountCookie", "language", "version" ], "required" : [ "type", "messageText" ],
"additionalProperties" : false, "additionalProperties" : false,
"properties" : { "properties" : {

View File

@@ -522,7 +522,6 @@ JsonValidator::TValidatorMap createCommonFields()
// Not implemented // Not implemented
ret["propertyNames"] = notImplementedCheck; ret["propertyNames"] = notImplementedCheck;
ret["contains"] = notImplementedCheck; ret["contains"] = notImplementedCheck;
ret["const"] = notImplementedCheck;
ret["examples"] = notImplementedCheck; ret["examples"] = notImplementedCheck;
return ret; return ret;

View File

@@ -60,7 +60,7 @@ NetworkConnectionPtr LobbyServer::findGameRoom(const std::string & gameRoomID) c
void LobbyServer::sendMessage(const NetworkConnectionPtr & target, const JsonNode & json) void LobbyServer::sendMessage(const NetworkConnectionPtr & target, const JsonNode & json)
{ {
assert(JsonUtils::validate(json, "vcmi:lobbyProtocol/" + json["type"].String(), "network")); assert(JsonUtils::validate(json, "vcmi:lobbyProtocol/" + json["type"].String(), json["type"].String() + " pack"));
target->sendPacket(json.toBytes()); target->sendPacket(json.toBytes());
} }
@@ -104,6 +104,7 @@ void LobbyServer::sendChatHistory(const NetworkConnectionPtr & target, const std
{ {
JsonNode reply; JsonNode reply;
reply["type"].String() = "chatHistory"; reply["type"].String() = "chatHistory";
reply["messages"].Vector(); // force creation of empty vector
for(const auto & message : boost::adaptors::reverse(history)) for(const auto & message : boost::adaptors::reverse(history))
{ {
@@ -126,6 +127,7 @@ void LobbyServer::broadcastActiveAccounts()
JsonNode reply; JsonNode reply;
reply["type"].String() = "activeAccounts"; reply["type"].String() = "activeAccounts";
reply["accounts"].Vector(); // force creation of empty vector
for(const auto & account : activeAccountsStats) for(const auto & account : activeAccountsStats)
{ {
@@ -145,6 +147,7 @@ JsonNode LobbyServer::prepareActiveGameRooms()
auto activeGameRoomStats = database->getActiveGameRooms(); auto activeGameRoomStats = database->getActiveGameRooms();
JsonNode reply; JsonNode reply;
reply["type"].String() = "activeGameRooms"; reply["type"].String() = "activeGameRooms";
reply["gameRooms"].Vector(); // force creation of empty vector
for(const auto & gameRoom : activeGameRoomStats) for(const auto & gameRoom : activeGameRoomStats)
{ {
@@ -262,7 +265,7 @@ JsonNode LobbyServer::parseAndValidateMessage(const std::vector<std::byte> & mes
std::string schemaName = "vcmi:lobbyProtocol/" + messageType; std::string schemaName = "vcmi:lobbyProtocol/" + messageType;
if (!JsonUtils::validate(json, schemaName, "network")) if (!JsonUtils::validate(json, schemaName, messageType + " pack"))
{ {
logGlobal->info("Json validation error encountered!"); logGlobal->info("Json validation error encountered!");
assert(0); assert(0);
@@ -369,7 +372,7 @@ void LobbyServer::receiveClientRegister(const NetworkConnectionPtr & connection,
std::string displayName = json["displayName"].String(); std::string displayName = json["displayName"].String();
std::string language = json["language"].String(); std::string language = json["language"].String();
if(isAccountNameValid(displayName)) if(!isAccountNameValid(displayName))
return sendOperationFailed(connection, "Illegal account name"); return sendOperationFailed(connection, "Illegal account name");
if(database->isAccountNameExists(displayName)) if(database->isAccountNameExists(displayName))

View File

@@ -47,7 +47,7 @@ void GlobalLobbyProcessor::onDisconnected(const std::shared_ptr<INetworkConnecti
message["type"].String() = "leaveGameRoom"; message["type"].String() = "leaveGameRoom";
message["accountID"].String() = proxy.first; message["accountID"].String() = proxy.first;
assert(JsonUtils::validate(message, "vcmi:lobbyProtocol/" + message["type"].String(), "network")); assert(JsonUtils::validate(message, "vcmi:lobbyProtocol/" + message["type"].String(), message["type"].String() + " pack"));
controlConnection->sendPacket(message.toBytes()); controlConnection->sendPacket(message.toBytes());
break; break;
} }
@@ -125,8 +125,9 @@ void GlobalLobbyProcessor::onConnectionEstablished(const std::shared_ptr<INetwor
toSend["gameRoomID"].String() = owner.uuid; toSend["gameRoomID"].String() = owner.uuid;
toSend["accountID"] = settings["lobby"]["accountID"]; toSend["accountID"] = settings["lobby"]["accountID"];
toSend["accountCookie"] = settings["lobby"]["accountCookie"]; toSend["accountCookie"] = settings["lobby"]["accountCookie"];
toSend["version"].String() = VCMI_VERSION_STRING;
assert(JsonUtils::validate(toSend, "vcmi:lobbyProtocol/" + toSend["type"].String(), "network")); assert(JsonUtils::validate(toSend, "vcmi:lobbyProtocol/" + toSend["type"].String(), toSend["type"].String() + " pack"));
connection->sendPacket(toSend.toBytes()); connection->sendPacket(toSend.toBytes());
} }
else else
@@ -143,7 +144,7 @@ void GlobalLobbyProcessor::onConnectionEstablished(const std::shared_ptr<INetwor
toSend["guestAccountID"].String() = guestAccountID; toSend["guestAccountID"].String() = guestAccountID;
toSend["accountCookie"] = settings["lobby"]["accountCookie"]; toSend["accountCookie"] = settings["lobby"]["accountCookie"];
assert(JsonUtils::validate(toSend, "vcmi:lobbyProtocol/" + toSend["type"].String(), "network")); assert(JsonUtils::validate(toSend, "vcmi:lobbyProtocol/" + toSend["type"].String(), toSend["type"].String() + " pack"));
connection->sendPacket(toSend.toBytes()); connection->sendPacket(toSend.toBytes());
proxyConnections[guestAccountID] = connection; proxyConnections[guestAccountID] = connection;