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