Skip to content

Commit

Permalink
[WIP] [CSM] Add flavour limits controlled by server
Browse files Browse the repository at this point in the history
Server send flavour limits to client permitting to disable or limit some Lua calls
  • Loading branch information
nerzhul committed Jun 6, 2017
1 parent a6678d6 commit c5a8f74
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 10 deletions.
5 changes: 5 additions & 0 deletions src/client.h
Expand Up @@ -350,6 +350,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
void handleCommand_LocalPlayerAnimations(NetworkPacket* pkt);
void handleCommand_EyeOffset(NetworkPacket* pkt);
void handleCommand_SrpBytesSandB(NetworkPacket* pkt);
void handleCommand_CSMFlavourLimits(NetworkPacket *pkt);

void ProcessData(NetworkPacket *pkt);

Expand Down Expand Up @@ -688,6 +689,10 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
GameUIFlags *m_game_ui_flags;

bool m_shutdown;

// CSM flavour blacklist byteflag
u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FBL_NONE;

DISABLE_CLASS_COPY(Client);
};

Expand Down
2 changes: 1 addition & 1 deletion src/network/clientopcodes.cpp
Expand Up @@ -66,7 +66,7 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
{ "TOCLIENT_INVENTORY", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Inventory }, // 0x27
null_command_handler,
{ "TOCLIENT_TIME_OF_DAY", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_TimeOfDay }, // 0x29
null_command_handler,
{ "TOCLIENT_CSM_FLAVOUR_LIMITS", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_CSMFlavourLimits }, // 0x2A
null_command_handler,
null_command_handler,
null_command_handler,
Expand Down
5 changes: 5 additions & 0 deletions src/network/clientpackethandler.cpp
Expand Up @@ -1302,3 +1302,8 @@ void Client::handleCommand_SrpBytesSandB(NetworkPacket* pkt)
resp_pkt << std::string(bytes_M, len_M);
Send(&resp_pkt);
}

void Client::handleCommand_CSMFlavourLimits(NetworkPacket *pkt)
{
*pkt >> m_csm_flavour_limits;
}
16 changes: 13 additions & 3 deletions src/network/networkprotocol.h
Expand Up @@ -17,8 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef NETWORKPROTOCOL_HEADER
#define NETWORKPROTOCOL_HEADER
#pragma once

#include "util/string.h"

/*
Expand Down Expand Up @@ -300,6 +300,11 @@ enum ToClientCommand
f1000 time_speed
*/

TOCLIENT_CSM_FLAVOUR_LIMITS = 0x2A,
/*
u32 CSMFlavourLimits byteflag
*/

// (oops, there is some gap here)

TOCLIENT_CHAT_MESSAGE = 0x30,
Expand Down Expand Up @@ -965,4 +970,9 @@ const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
"This server has experienced an internal error. You will now be disconnected."
};

#endif
enum CSMFlavourLimit : u64 {
CSM_FBL_NONE = 0x00000000,
CSM_FBL_LOOKUP_NODES = 0x00000001, // Disable node lookups
CSM_FBL_CHAT_MESSAGES = 0x00000002, // Disable chat message sending from CSM
CSM_FBL_ALL = 0xFFFFFFFF,
};
2 changes: 1 addition & 1 deletion src/network/serveropcodes.cpp
Expand Up @@ -155,7 +155,7 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
{ "TOCLIENT_INVENTORY", 0, true }, // 0x27
null_command_factory,
{ "TOCLIENT_TIME_OF_DAY", 0, true }, // 0x29
null_command_factory,
{ "TOCLIENT_CSM_FLAVOUR_LIMITS", 0, true }, // 0x2A
null_command_factory,
null_command_factory,
null_command_factory,
Expand Down
2 changes: 2 additions & 0 deletions src/network/serverpackethandler.cpp
Expand Up @@ -643,6 +643,8 @@ void Server::handleCommand_Init2(NetworkPacket* pkt)
float time_speed = g_settings->getFloat("time_speed");
SendTimeOfDay(pkt->getPeerId(), time, time_speed);

SendCSMFlavourLimits(pkt->getPeerId());

// Warnings about protocol version can be issued here
if (getClient(pkt->getPeerId())->net_proto_version < LATEST_PROTOCOL_VERSION) {
SendChatMessage(pkt->getPeerId(), L"# Server: WARNING: YOUR CLIENT'S "
Expand Down
6 changes: 6 additions & 0 deletions src/server.cpp
Expand Up @@ -2028,7 +2028,13 @@ void Server::SendActiveObjectMessages(u16 peer_id, const std::string &datas, boo
m_clients.send(pkt.getPeerId(),
reliable ? clientCommandFactoryTable[pkt.getCommand()].channel : 1,
&pkt, reliable);
}

void Server::SendCSMFlavourLimits(u16 peer_id)
{
NetworkPacket pkt(TOCLIENT_CSM_FLAVOUR_LIMITS, sizeof(m_csm_flavour_limits), peer_id);
pkt << m_csm_flavour_limits;
Send(&pkt);
}

s32 Server::playSound(const SimpleSoundSpec &spec,
Expand Down
11 changes: 6 additions & 5 deletions src/server.h
Expand Up @@ -17,8 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef SERVER_HEADER
#define SERVER_HEADER
#pragma once

#include "network/connection.h"
#include "irr_v3d.h"
Expand Down Expand Up @@ -473,6 +472,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,

u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas);
void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true);
void SendCSMFlavourLimits(u16 peer_id);

/*
Something random
*/
Expand Down Expand Up @@ -672,6 +673,9 @@ class Server : public con::PeerHandler, public MapEventReceiver,
std::unordered_map<std::string, ModMetadata *> m_mod_storages;
float m_mod_storage_save_timer;

// CSM flavour blacklist byteflag
u64 m_csm_flavour_limits = CSMFlavourLimits::CSM_FBL_NONE;

DISABLE_CLASS_COPY(Server);
};

Expand All @@ -681,6 +685,3 @@ class Server : public con::PeerHandler, public MapEventReceiver,
Shuts down when kill is set to true.
*/
void dedicated_server_loop(Server &server, bool &kill);

#endif

0 comments on commit c5a8f74

Please sign in to comment.