From f6bf4c39be634bb8d1a03de5fd048edc54b7df50 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Tue, 24 Jun 2008 23:55:33 +0000 Subject: Mantis#1587. Thank you kindly, Melanie for a patch that: Add permissions magling to llGiveInventoryItem, correct some corner case functionality --- .../Region/Environment/Scenes/Scene.Inventory.cs | 49 ++++++++++++++++------ OpenSim/Region/Environment/Scenes/Scene.cs | 4 +- 2 files changed, 38 insertions(+), 15 deletions(-) (limited to 'OpenSim/Region/Environment') diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 3580b99..517066d 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -882,12 +882,6 @@ namespace OpenSim.Region.Environment.Scenes return; } - // Only owner can copy - if (remoteClient.AgentId != taskItem.OwnerID) - { - return; - } - InventoryItemBase agentItem = new InventoryItemBase(); agentItem.ID = LLUUID.Random(); @@ -925,13 +919,13 @@ namespace OpenSim.Region.Environment.Scenes } /// - /// MoveTaskInventoryItem + /// ClientMoveTaskInventoryItem /// /// /// /// /// - public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, uint primLocalId, LLUUID itemId) + public void ClientMoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, uint primLocalId, LLUUID itemId) { SceneObjectPart part = GetSceneObjectPart(primLocalId); @@ -944,6 +938,15 @@ namespace OpenSim.Region.Environment.Scenes return; } + + TaskInventoryItem taskItem = part.GetInventoryItem(itemId); + + // Only owner can copy + if (remoteClient.AgentId != taskItem.OwnerID) + { + return; + } + MoveTaskInventoryItem(remoteClient, folderId, part, itemId); } @@ -977,7 +980,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void CopyTaskInventoryItem(LLUUID destId, SceneObjectPart part, LLUUID itemId) + public void MoveTaskInventoryItem(LLUUID destId, SceneObjectPart part, LLUUID itemId) { TaskInventoryItem srcTaskItem = part.GetInventoryItem(itemId); @@ -1003,23 +1006,43 @@ namespace OpenSim.Region.Environment.Scenes destTaskItem.ItemID = LLUUID.Random(); destTaskItem.CreatorID = srcTaskItem.CreatorID; destTaskItem.AssetID = srcTaskItem.AssetID; - destTaskItem.GroupID = srcTaskItem.GroupID; - destTaskItem.OwnerID = srcTaskItem.OwnerID; - destTaskItem.ParentID = srcTaskItem.ParentID; - destTaskItem.ParentPartID = srcTaskItem.ParentPartID; + destTaskItem.GroupID = destPart.GroupID; + destTaskItem.OwnerID = destPart.OwnerID; + destTaskItem.ParentID = destPart.UUID; + destTaskItem.ParentPartID = destPart.UUID; destTaskItem.BaseMask = srcTaskItem.BaseMask; destTaskItem.EveryoneMask = srcTaskItem.EveryoneMask; destTaskItem.GroupMask = srcTaskItem.GroupMask; destTaskItem.OwnerMask = srcTaskItem.OwnerMask; + destTaskItem.NextOwnerMask = srcTaskItem.NextOwnerMask; destTaskItem.Flags = srcTaskItem.Flags; + if(destPart.OwnerID != part.OwnerID) + { + if (ExternalChecks.ExternalChecksPropagatePermissions()) + { + destTaskItem.OwnerMask = srcTaskItem.OwnerMask & + srcTaskItem.NextOwnerMask; + destTaskItem.GroupMask = srcTaskItem.GroupMask & + srcTaskItem.NextOwnerMask; + destTaskItem.EveryoneMask = srcTaskItem.EveryoneMask & + srcTaskItem.NextOwnerMask; + destTaskItem.BaseMask = srcTaskItem.BaseMask & + srcTaskItem.NextOwnerMask; + destTaskItem.OwnerMask |= 8; // Slam! + } + } + destTaskItem.Description = srcTaskItem.Description; destTaskItem.Name = srcTaskItem.Name; destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.Type = srcTaskItem.Type; destPart.AddInventoryItem(destTaskItem); + + if((srcTaskItem.OwnerMask & (uint)PermissionMask.Copy) == 0) + part.RemoveInventoryItem(itemId); } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 69981e2..bbef28f 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -2010,7 +2010,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnRequestTaskInventory += RequestTaskInventory; client.OnRemoveTaskItem += RemoveTaskInventory; client.OnUpdateTaskInventory += UpdateTaskInventory; - client.OnMoveTaskItem += MoveTaskInventoryItem; + client.OnMoveTaskItem += ClientMoveTaskInventoryItem; client.OnGrabObject += ProcessObjectGrab; client.OnDeGrabObject += ProcessObjectDeGrab; client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; @@ -3628,4 +3628,4 @@ namespace OpenSim.Region.Environment.Scenes } } - \ No newline at end of file + -- cgit v1.1