From edee11ff8750d452f012690c556384984795f4be Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Fri, 14 Nov 2008 17:24:56 +0000 Subject: Reapplying a revised version of Christopher Yeoh's (IBM) patch for allow inventory drop. Also adds a new flags, "propagate_permissions" to OpenSim.ini to control that feature. --- .../Modules/World/Permissions/PermissionsModule.cs | 7 ++++- .../Region/Environment/Scenes/Scene.Inventory.cs | 19 ++++++++---- .../Scenes/SceneObjectGroup.Inventory.cs | 35 +++++++++++++++++----- .../Scenes/SceneObjectPart.Inventory.cs | 19 ++++++++---- .../Shared/Api/Implementation/LSL_Api.cs | 3 ++ .../Shared/Api/Implementation/OSSL_Api.cs | 2 +- 6 files changed, 64 insertions(+), 21 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs index 28e9850..7f567e5 100644 --- a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs @@ -64,6 +64,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions // Bypasses the permissions engine private bool m_bypassPermissions = true; private bool m_bypassPermissionsValue = true; + private bool m_propagatePermissions = false; private bool m_debugPermissions = false; private bool m_allowGridGods = false; private bool m_RegionOwnerIsGod = false; @@ -143,6 +144,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions m_allowGridGods = myConfig.GetBoolean("allow_grid_gods", false); m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", true); + m_propagatePermissions = myConfig.GetBoolean("propagate_permissions", true); m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true); m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true); @@ -278,7 +280,10 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions public bool PropagatePermissions() { - return false; + if (m_bypassPermissions) + return false; + + return m_propagatePermissions; } public bool BypassPermissions() diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 687a225..2c0c872 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -1179,7 +1179,7 @@ namespace OpenSim.Region.Environment.Scenes destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.Type = srcTaskItem.Type; - destPart.AddInventoryItem(destTaskItem); + destPart.AddInventoryItem(destTaskItem, part.OwnerID != destPart.OwnerID); if ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0) part.RemoveInventoryItem(itemId); @@ -1249,10 +1249,17 @@ namespace OpenSim.Region.Environment.Scenes if (part != null) { - if (!ExternalChecks.ExternalChecksCanEditObjectInventory(part.UUID, remoteClient.AgentId)) - return; - TaskInventoryItem currentItem = part.GetInventoryItem(itemID); + bool allowInventoryDrop = (part.GetEffectiveObjectFlags() + & (uint)PrimFlags.AllowInventoryDrop) != 0; + + // Explicity allow anyone to add to the inventory if the + // AllowInventoryDrop flag has been set. Don't however let + // them update an item unless they pass the external checks + // + if (!ExternalChecks.ExternalChecksCanEditObjectInventory(part.UUID, remoteClient.AgentId) + && (currentItem != null || !allowInventoryDrop )) + return; if (currentItem == null) { @@ -1417,7 +1424,7 @@ namespace OpenSim.Region.Environment.Scenes taskItem.PermsMask = 0; taskItem.AssetID = asset.FullID; - part.AddInventoryItem(taskItem); + part.AddInventoryItem(taskItem, false); part.GetProperties(remoteClient); part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); @@ -1512,7 +1519,7 @@ namespace OpenSim.Region.Environment.Scenes destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.Type = srcTaskItem.Type; - destPart.AddInventoryItemExclusive(destTaskItem); + destPart.AddInventoryItemExclusive(destTaskItem, false); if (running > 0) { diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs index bfa9763..2b560f4 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs @@ -151,23 +151,44 @@ namespace OpenSim.Region.Environment.Scenes taskItem.AssetID = item.AssetID; taskItem.Name = item.Name; taskItem.Description = item.Description; - taskItem.OwnerID = item.Owner; + taskItem.OwnerID = part.OwnerID; // Transfer ownership taskItem.CreatorID = item.Creator; taskItem.Type = item.AssetType; taskItem.InvType = item.InvType; - taskItem.BasePermissions = item.BasePermissions; - taskItem.CurrentPermissions = item.CurrentPermissions; - // FIXME: ignoring group permissions for now as they aren't stored in item - taskItem.EveryonePermissions = item.EveryOnePermissions; - taskItem.NextPermissions = item.NextPermissions; + if (remoteClient != null && + remoteClient.AgentId != part.OwnerID && + m_scene.ExternalChecks.ExternalChecksPropagatePermissions()) + { + taskItem.BasePermissions = item.BasePermissions & + item.NextPermissions; + taskItem.CurrentPermissions = item.CurrentPermissions & + item.NextPermissions; + taskItem.EveryonePermissions = item.EveryOnePermissions & + item.NextPermissions; + taskItem.NextPermissions = item.NextPermissions; + taskItem.CurrentPermissions |= 8; + } else { + taskItem.BasePermissions = item.BasePermissions; + taskItem.CurrentPermissions = item.CurrentPermissions; + taskItem.CurrentPermissions |= 8; + taskItem.EveryonePermissions = item.EveryOnePermissions; + taskItem.NextPermissions = item.NextPermissions; + } + taskItem.Flags = item.Flags; // TODO: These are pending addition of those fields to TaskInventoryItem // taskItem.SalePrice = item.SalePrice; // taskItem.SaleType = item.SaleType; taskItem.CreationDate = (uint)item.CreationDate; + + bool addFromAllowedDrop = false; + if (remoteClient!=null) + { + addFromAllowedDrop = remoteClient.AgentId!=part.OwnerID; + } - part.AddInventoryItem(taskItem); + part.AddInventoryItem(taskItem, addFromAllowedDrop); return true; } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index 501f199..073bccf 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs @@ -289,16 +289,16 @@ namespace OpenSim.Region.Environment.Scenes /// name is chosen. /// /// - public void AddInventoryItem(TaskInventoryItem item) + public void AddInventoryItem(TaskInventoryItem item, bool allowedDrop) { - AddInventoryItem(item.Name, item); + AddInventoryItem(item.Name, item, allowedDrop); } /// /// Add an item to this prim's inventory. If an item with the same name already exists, it is replaced. /// /// - public void AddInventoryItemExclusive(TaskInventoryItem item) + public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) { List il = new List(m_taskInventory.Values); foreach (TaskInventoryItem i in il) @@ -313,7 +313,7 @@ namespace OpenSim.Region.Environment.Scenes } } - AddInventoryItem(item.Name, item); + AddInventoryItem(item.Name, item, allowedDrop); } /// @@ -324,7 +324,10 @@ namespace OpenSim.Region.Environment.Scenes /// The item itself. The name within this structure is ignored in favour of the name /// given in this method's arguments /// - protected void AddInventoryItem(string name, TaskInventoryItem item) + /// + /// Item was only added to inventory because AllowedDrop is set + /// + protected void AddInventoryItem(string name, TaskInventoryItem item, bool allowedDrop) { name = FindAvailableInventoryName(name); if (name == String.Empty) @@ -337,7 +340,11 @@ namespace OpenSim.Region.Environment.Scenes lock (m_taskInventory) { m_taskInventory.Add(item.ItemID, item); - TriggerScriptChangedEvent(Changed.INVENTORY); + + if (allowedDrop) + TriggerScriptChangedEvent(Changed.ALLOWED_DROP); + else + TriggerScriptChangedEvent(Changed.INVENTORY); } m_inventorySerial++; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ab7b710..c1d718e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4006,6 +4006,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.ParentGroup.RootPart.AllowedDrop = true; else m_host.ParentGroup.RootPart.AllowedDrop = false; + + // Update the object flags + m_host.ParentGroup.RootPart.aggregateScriptEvents(); } public LSL_Vector llGetSunDirection() diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index f9302e9..8cac070 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1014,7 +1014,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api taskItem.PermsMask = 0; taskItem.AssetID = asset.FullID; - m_host.AddInventoryItem(taskItem); + m_host.AddInventoryItem(taskItem, false); } } } -- cgit v1.1