summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSmallJoker <mk939@ymail.com>2021-03-07 11:35:53 +0100
committerSmallJoker <SmallJoker@users.noreply.github.com>2021-03-07 17:18:02 +0100
commit176f5866cbc8946c55a0a9bd0978a804ad310211 (patch)
tree096ab9a1f1cbf7bbcea2e64fdb5c4d4bed462e86
parentfc864029b9635106a5390aa09d227d7dac31d1a5 (diff)
downloadminetest-176f5866cbc8946c55a0a9bd0978a804ad310211.tar.gz
minetest-176f5866cbc8946c55a0a9bd0978a804ad310211.tar.bz2
minetest-176f5866cbc8946c55a0a9bd0978a804ad310211.zip
Protect dropping from far node inventories
Also changes if/if to switch/case
-rw-r--r--src/network/serverpackethandler.cpp47
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
*/