From: Christopher Yeoh <cyeoh@au1.ibm.com>

This patch makes llAllowInventoryDrop work with the permissions module
enabled. Changes include:

- Enabled PropagatePermissions when permissions module serverside perms
  is on

- change ownership of item when item is dropped into an object.
  Ownership changes to the owner of the object the item is dropped into

- propagation of permissions if the permissions module enabled (eg
  next-owner mask applied)

- CHANGED_ALLOWED_DROP is now passed to the change script event if an
  item was allowed to be dropped into the object only because
  llAllowInventoryDrop is enabled (instead of CHANGED_INVENTORY being
  passed).

- Sets object flags correctly when llAllowInventoryDrop is called so
  clients are notified immediately of the change in state. Am not
  sure that calling aggregateScriptEvents is the right way to do it,
  but it works and seems to be the only way without making further
  changes to update LocalFlags
0.6.1-post-fixes
Dr Scofield 2008-11-14 10:55:14 +00:00
parent 62317ded9f
commit 5e20e32b69
7 changed files with 59 additions and 23 deletions

View File

@ -591,7 +591,9 @@ namespace OpenSim.Data.Tests
Assert.That(t.ItemID,Is.EqualTo(id)); Assert.That(t.ItemID,Is.EqualTo(id));
Assert.That(t.LastOwnerID, Is.EqualTo(sog.RootPart.LastOwnerID)); Assert.That(t.LastOwnerID, Is.EqualTo(sog.RootPart.LastOwnerID));
Assert.That(t.NextPermissions, Is.EqualTo(nextperm)); Assert.That(t.NextPermissions, Is.EqualTo(nextperm));
Assert.That(t.OwnerID,Is.EqualTo(owner)); // Ownership changes when you drop an object into an object
// owned by someone else
Assert.That(t.OwnerID,Is.EqualTo(sog.RootPart.OwnerID));
Assert.That(t.CurrentPermissions, Is.EqualTo(curperm)); Assert.That(t.CurrentPermissions, Is.EqualTo(curperm));
Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID)); Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID));
Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID)); Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID));
@ -848,4 +850,4 @@ namespace OpenSim.Data.Tests
// return f; // return f;
// } // }
} }
} }

View File

@ -277,7 +277,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
public bool PropagatePermissions() public bool PropagatePermissions()
{ {
return false; return !m_bypassPermissions;
} }
public bool BypassPermissions() public bool BypassPermissions()

View File

@ -1179,7 +1179,8 @@ namespace OpenSim.Region.Environment.Scenes
destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.InvType = srcTaskItem.InvType;
destTaskItem.Type = srcTaskItem.Type; destTaskItem.Type = srcTaskItem.Type;
destPart.AddInventoryItem(destTaskItem); destPart.AddInventoryItem(destTaskItem, part.OwnerID!=destPart.OwnerID
&& ExternalChecks.ExternalChecksPropagatePermissions());
if ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0) if ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
part.RemoveInventoryItem(itemId); part.RemoveInventoryItem(itemId);
@ -1249,10 +1250,15 @@ namespace OpenSim.Region.Environment.Scenes
if (part != null) if (part != null)
{ {
if (!ExternalChecks.ExternalChecksCanEditObjectInventory(part.UUID, remoteClient.AgentId))
return;
TaskInventoryItem currentItem = part.GetInventoryItem(itemID); 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) if (currentItem == null)
{ {
@ -1417,7 +1423,7 @@ namespace OpenSim.Region.Environment.Scenes
taskItem.PermsMask = 0; taskItem.PermsMask = 0;
taskItem.AssetID = asset.FullID; taskItem.AssetID = asset.FullID;
part.AddInventoryItem(taskItem); part.AddInventoryItem(taskItem, false);
part.GetProperties(remoteClient); part.GetProperties(remoteClient);
part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
@ -1512,7 +1518,7 @@ namespace OpenSim.Region.Environment.Scenes
destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.InvType = srcTaskItem.InvType;
destTaskItem.Type = srcTaskItem.Type; destTaskItem.Type = srcTaskItem.Type;
destPart.AddInventoryItemExclusive(destTaskItem); destPart.AddInventoryItemExclusive(destTaskItem, false);
if (running > 0) if (running > 0)
{ {

View File

@ -151,23 +151,42 @@ namespace OpenSim.Region.Environment.Scenes
taskItem.AssetID = item.AssetID; taskItem.AssetID = item.AssetID;
taskItem.Name = item.Name; taskItem.Name = item.Name;
taskItem.Description = item.Description; taskItem.Description = item.Description;
taskItem.OwnerID = item.Owner; taskItem.OwnerID = part.OwnerID; // Transfer ownership
taskItem.CreatorID = item.Creator; taskItem.CreatorID = item.Creator;
taskItem.Type = item.AssetType; taskItem.Type = item.AssetType;
taskItem.InvType = item.InvType; taskItem.InvType = item.InvType;
taskItem.BasePermissions = item.BasePermissions; if (remoteClient!=null && remoteClient.AgentId!=part.OwnerID &&
taskItem.CurrentPermissions = item.CurrentPermissions; m_scene.ExternalChecks.ExternalChecksPropagatePermissions()) {
// FIXME: ignoring group permissions for now as they aren't stored in item taskItem.BasePermissions = item.BasePermissions & item.NextPermissions;
taskItem.EveryonePermissions = item.EveryOnePermissions; taskItem.CurrentPermissions = item.CurrentPermissions & item.NextPermissions;
taskItem.NextPermissions = 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; taskItem.Flags = item.Flags;
// TODO: These are pending addition of those fields to TaskInventoryItem // TODO: These are pending addition of those fields to TaskInventoryItem
// taskItem.SalePrice = item.SalePrice; // taskItem.SalePrice = item.SalePrice;
// taskItem.SaleType = item.SaleType; // taskItem.SaleType = item.SaleType;
taskItem.CreationDate = (uint)item.CreationDate; taskItem.CreationDate = (uint)item.CreationDate;
bool addFromAllowedDrop = false;
if (remoteClient!=null)
{
addFromAllowedDrop = remoteClient.AgentId!=part.OwnerID &&
m_scene.ExternalChecks.ExternalChecksPropagatePermissions();
}
part.AddInventoryItem(taskItem); part.AddInventoryItem(taskItem, addFromAllowedDrop);
return true; return true;
} }

View File

@ -289,16 +289,16 @@ namespace OpenSim.Region.Environment.Scenes
/// name is chosen. /// name is chosen.
/// </summary> /// </summary>
/// <param name="item"></param> /// <param name="item"></param>
public void AddInventoryItem(TaskInventoryItem item) public void AddInventoryItem(TaskInventoryItem item, bool allowedDrop)
{ {
AddInventoryItem(item.Name, item); AddInventoryItem(item.Name, item, allowedDrop);
} }
/// <summary> /// <summary>
/// Add an item to this prim's inventory. If an item with the same name already exists, it is replaced. /// Add an item to this prim's inventory. If an item with the same name already exists, it is replaced.
/// </summary> /// </summary>
/// <param name="item"></param> /// <param name="item"></param>
public void AddInventoryItemExclusive(TaskInventoryItem item) public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop)
{ {
List<TaskInventoryItem> il = new List<TaskInventoryItem>(m_taskInventory.Values); List<TaskInventoryItem> il = new List<TaskInventoryItem>(m_taskInventory.Values);
foreach (TaskInventoryItem i in il) foreach (TaskInventoryItem i in il)
@ -313,7 +313,7 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
AddInventoryItem(item.Name, item); AddInventoryItem(item.Name, item, allowedDrop);
} }
/// <summary> /// <summary>
@ -324,7 +324,10 @@ namespace OpenSim.Region.Environment.Scenes
/// The item itself. The name within this structure is ignored in favour of the name /// The item itself. The name within this structure is ignored in favour of the name
/// given in this method's arguments /// given in this method's arguments
/// </param> /// </param>
protected void AddInventoryItem(string name, TaskInventoryItem item) /// <param name="allowedDrop">
// Item was only added to inventory because AllowedDrop is set
/// </param>
protected void AddInventoryItem(string name, TaskInventoryItem item, bool allowedDrop)
{ {
name = FindAvailableInventoryName(name); name = FindAvailableInventoryName(name);
if (name == String.Empty) if (name == String.Empty)
@ -337,7 +340,10 @@ namespace OpenSim.Region.Environment.Scenes
lock (m_taskInventory) lock (m_taskInventory)
{ {
m_taskInventory.Add(item.ItemID, item); m_taskInventory.Add(item.ItemID, item);
TriggerScriptChangedEvent(Changed.INVENTORY); if (allowedDrop)
TriggerScriptChangedEvent(Changed.ALLOWED_DROP);
else
TriggerScriptChangedEvent(Changed.INVENTORY);
} }
m_inventorySerial++; m_inventorySerial++;

View File

@ -4006,6 +4006,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.ParentGroup.RootPart.AllowedDrop = true; m_host.ParentGroup.RootPart.AllowedDrop = true;
else else
m_host.ParentGroup.RootPart.AllowedDrop = false; m_host.ParentGroup.RootPart.AllowedDrop = false;
// Update the object flags
m_host.ParentGroup.RootPart.aggregateScriptEvents();
} }
public LSL_Vector llGetSunDirection() public LSL_Vector llGetSunDirection()

View File

@ -1014,7 +1014,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
taskItem.PermsMask = 0; taskItem.PermsMask = 0;
taskItem.AssetID = asset.FullID; taskItem.AssetID = asset.FullID;
m_host.AddInventoryItem(taskItem); m_host.AddInventoryItem(taskItem, false);
} }
} }
} }