diff options
author | SmallJoker <mk939@ymail.com> | 2021-03-07 11:35:53 +0100 |
---|---|---|
committer | SmallJoker <SmallJoker@users.noreply.github.com> | 2021-03-07 17:18:02 +0100 |
commit | 176f5866cbc8946c55a0a9bd0978a804ad310211 (patch) | |
tree | 096ab9a1f1cbf7bbcea2e64fdb5c4d4bed462e86 /src | |
parent | fc864029b9635106a5390aa09d227d7dac31d1a5 (diff) | |
download | minetest-176f5866cbc8946c55a0a9bd0978a804ad310211.tar.gz minetest-176f5866cbc8946c55a0a9bd0978a804ad310211.tar.bz2 minetest-176f5866cbc8946c55a0a9bd0978a804ad310211.zip |
Protect dropping from far node inventories
Also changes if/if to switch/case
Diffstat (limited to 'src')
-rw-r--r-- | src/network/serverpackethandler.cpp | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index f1ed42302..b863e1828 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -628,23 +628,34 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) auto check_inv_access = [player, player_has_interact, this] ( const InventoryLocation &loc) -> bool { - if (loc.type == InventoryLocation::CURRENT_PLAYER) - return false; // Only used internally on the client, never sent - if (loc.type == InventoryLocation::PLAYER) { - // Allow access to own inventory in all cases - return loc.name == player->getName(); - } - if (loc.type == InventoryLocation::DETACHED) { - if (!getInventoryMgr()->checkDetachedInventoryAccess(loc, player->getName())) - return false; - } - if (!player_has_interact) { + // Players without interact may modify their own inventory + if (!player_has_interact && loc.type != InventoryLocation::PLAYER) { infostream << "Cannot modify foreign inventory: " << "No interact privilege" << std::endl; return false; } - return true; + + switch (loc.type) { + case InventoryLocation::CURRENT_PLAYER: + // Only used internally on the client, never sent + return false; + case InventoryLocation::PLAYER: + // Allow access to own inventory in all cases + return loc.name == player->getName(); + case InventoryLocation::NODEMETA: + { + // Check for out-of-range interaction + v3f node_pos = intToFloat(loc.p, BS); + v3f player_pos = player->getPlayerSAO()->getEyePosition(); + f32 d = player_pos.getDistanceFrom(node_pos); + return checkInteractDistance(player, d, "inventory"); + } + case InventoryLocation::DETACHED: + return getInventoryMgr()->checkDetachedInventoryAccess(loc, player->getName()); + default: + return false; + } }; /* @@ -664,18 +675,6 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) !check_inv_access(ma->to_inv)) return; - InventoryLocation *remote = ma->from_inv.type == InventoryLocation::PLAYER ? - &ma->to_inv : &ma->from_inv; - - // Check for out-of-range interaction - if (remote->type == InventoryLocation::NODEMETA) { - v3f node_pos = intToFloat(remote->p, BS); - v3f player_pos = player->getPlayerSAO()->getEyePosition(); - f32 d = player_pos.getDistanceFrom(node_pos); - if (!checkInteractDistance(player, d, "inventory")) - return; - } - /* Disable moving items out of craftpreview */ |