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:
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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" : {
|
||||||
|
|||||||
@@ -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" :
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"type" :
|
"type" :
|
||||||
{
|
{
|
||||||
"type" : "string",
|
"type" : "string",
|
||||||
"const" : "clientLogin"
|
"const" : "clientRegister"
|
||||||
},
|
},
|
||||||
"displayName" :
|
"displayName" :
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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" : {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user