Fix llGiveInventory() so that it checks the destination part for AllowInventoryDrop, not the source.

This allows llAllowInventoryDrop() to work.
Regression test added for this case.
0.7.4.1
Justin Clark-Casey (justincc) 2012-03-22 22:33:37 +00:00
parent 3bcf71c647
commit 760010d6fb
2 changed files with 63 additions and 6 deletions

View File

@ -1210,9 +1210,9 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary> /// <summary>
/// Copy a task (prim) inventory item to another task (prim) /// Copy a task (prim) inventory item to another task (prim)
/// </summary> /// </summary>
/// <param name="destId"></param> /// <param name="destId">ID of destination part</param>
/// <param name="part"></param> /// <param name="part">Source part</param>
/// <param name="itemId"></param> /// <param name="itemId">Source item id to transfer</param>
public void MoveTaskInventoryItem(UUID destId, SceneObjectPart part, UUID itemId) public void MoveTaskInventoryItem(UUID destId, SceneObjectPart part, UUID itemId)
{ {
TaskInventoryItem srcTaskItem = part.Inventory.GetInventoryItem(itemId); TaskInventoryItem srcTaskItem = part.Inventory.GetInventoryItem(itemId);
@ -1240,10 +1240,10 @@ namespace OpenSim.Region.Framework.Scenes
// Can't transfer this // Can't transfer this
// //
if ((part.OwnerID != destPart.OwnerID) && ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)) if (part.OwnerID != destPart.OwnerID && (srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
return; return;
if (part.OwnerID != destPart.OwnerID && (part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) if (part.OwnerID != destPart.OwnerID && (destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0)
{ {
// object cannot copy items to an object owned by a different owner // object cannot copy items to an object owned by a different owner
// unless llAllowInventoryDrop has been called // unless llAllowInventoryDrop has been called

View File

@ -75,7 +75,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
/// Test giving inventory from an object to an object where both are owned by the same user. /// Test giving inventory from an object to an object where both are owned by the same user.
/// </summary> /// </summary>
[Test] [Test]
public void TestLlGiveInventorySameOwner() public void TestLlGiveInventoryO2OSameOwner()
{ {
TestHelpers.InMethod(); TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure(); // log4net.Config.XmlConfigurator.Configure();
@ -107,5 +107,62 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.That(copiedItems.Count, Is.EqualTo(1)); Assert.That(copiedItems.Count, Is.EqualTo(1));
Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName)); Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName));
} }
/// <summary>
/// Test giving inventory from an object to an object where they have different owners
/// </summary>
[Test]
public void TestLlGiveInventoryO2ODifferentOwners()
{
TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure();
UUID user1Id = TestHelpers.ParseTail(0x1);
UUID user2Id = TestHelpers.ParseTail(0x2);
string inventoryItemName = "item1";
SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10);
m_scene.AddSceneObject(so1);
LSL_Api api = new LSL_Api();
api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID);
// Create an object embedded inside the first
UUID itemId = TestHelpers.ParseTail(0x20);
TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, user1Id);
// Create a second object
SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100);
m_scene.AddSceneObject(so2);
LSL_Api api2 = new LSL_Api();
api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, so2.RootPart.UUID);
// *** Firstly, we test where llAllowInventoryDrop() has not been called. ***
api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
{
// Item has copy permissions so original should stay intact.
List<TaskInventoryItem> originalItems = so1.RootPart.Inventory.GetInventoryItems();
Assert.That(originalItems.Count, Is.EqualTo(1));
// Should have not copied
List<TaskInventoryItem> copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName);
Assert.That(copiedItems.Count, Is.EqualTo(0));
}
// *** Secondly, we turn on allow inventory drop in the target and retest. ***
api2.llAllowInventoryDrop(1);
api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
{
// Item has copy permissions so original should stay intact.
List<TaskInventoryItem> originalItems = so1.RootPart.Inventory.GetInventoryItems();
Assert.That(originalItems.Count, Is.EqualTo(1));
// Should now have copied.
List<TaskInventoryItem> copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName);
Assert.That(copiedItems.Count, Is.EqualTo(1));
Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName));
}
}
} }
} }