Protect dropping from far node inventories

Also changes if/if to switch/case
This commit is contained in:
SmallJoker 2021-03-07 11:35:53 +01:00 committed by SmallJoker
parent fc864029b9
commit 176f5866cb
1 changed files with 23 additions and 24 deletions

View File

@ -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
*/