Skip to content
Permalink
Browse files

Protect dropping from far node inventories

Also changes if/if to switch/case
  • Loading branch information
SmallJoker committed Mar 7, 2021
1 parent fc86402 commit 176f5866cbc8946c55a0a9bd0978a804ad310211
Showing with 23 additions and 24 deletions.
  1. +23 −24 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
*/

0 comments on commit 176f586

Please sign in to comment.