Fix issue where llRemoteLoadScriptPin() would treat 0 (the default) as a valid set pin in a destination prim rather than the unset no pin state
Adds regression test for this case.ghosts
parent
6affa906ee
commit
1d56029848
|
@ -1940,8 +1940,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// Rez a script into a prim's inventory from another prim
|
/// Rez a script into a prim's inventory from another prim
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="remoteClient"></param>
|
/// <param name="remoteClient"></param>
|
||||||
/// <param name="itemID"> </param>
|
/// <param name="srcPart"> </param>
|
||||||
/// <param name="localID"></param>
|
/// <param name="destId"> </param>
|
||||||
|
/// <param name="pin"></param>
|
||||||
|
/// <param name="running"></param>
|
||||||
|
/// <param name="start_param"></param>
|
||||||
public void RezScriptFromPrim(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param)
|
public void RezScriptFromPrim(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param)
|
||||||
{
|
{
|
||||||
TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId);
|
TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId);
|
||||||
|
@ -1961,12 +1964,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (destPart == null)
|
if (destPart == null)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[PRIM INVENTORY]: " +
|
"[PRIM INVENTORY]: Could not find part {0} to insert script item {1} from {2} {3} in {4}",
|
||||||
"Could not find script for ID {0}",
|
destId, srcId, srcPart.Name, srcPart.UUID, Name);
|
||||||
destId);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must own the object, and have modify rights
|
// Must own the object, and have modify rights
|
||||||
if (srcPart.OwnerID != destPart.OwnerID)
|
if (srcPart.OwnerID != destPart.OwnerID)
|
||||||
{
|
{
|
||||||
|
@ -1974,12 +1976,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if ((destPart.GroupID == UUID.Zero) || (destPart.GroupID != srcPart.GroupID) ||
|
if ((destPart.GroupID == UUID.Zero) || (destPart.GroupID != srcPart.GroupID) ||
|
||||||
((destPart.GroupMask & (uint)PermissionMask.Modify) == 0))
|
((destPart.GroupMask & (uint)PermissionMask.Modify) == 0))
|
||||||
return;
|
return;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if ((destPart.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
if ((destPart.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destPart.ScriptAccessPin != pin)
|
if (destPart.ScriptAccessPin == 0 || destPart.ScriptAccessPin != pin)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat(
|
m_log.WarnFormat(
|
||||||
"[PRIM INVENTORY]: " +
|
"[PRIM INVENTORY]: " +
|
||||||
|
|
|
@ -237,5 +237,52 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
||||||
Assert.IsNotNull(receivedItem);
|
Assert.IsNotNull(receivedItem);
|
||||||
Assert.AreEqual(0, receivedItem.CurrentPermissions & (uint)PermissionMask.Modify);
|
Assert.AreEqual(0, receivedItem.CurrentPermissions & (uint)PermissionMask.Modify);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestLlRemoteLoadScriptPin()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
UUID user1Id = TestHelpers.ParseTail(0x1);
|
||||||
|
UUID user2Id = TestHelpers.ParseTail(0x2);
|
||||||
|
|
||||||
|
SceneObjectGroup sourceSo = SceneHelpers.AddSceneObject((m_scene, "sourceSo", user1Id);
|
||||||
|
m_scene.AddSceneObject(sourceSo);
|
||||||
|
LSL_Api api = new LSL_Api();
|
||||||
|
api.Initialize(m_engine, sourceSo.RootPart, null, null);
|
||||||
|
TaskInventoryHelpers.AddScript(m_scene, sourceSo.RootPart, "script", "Hello World");
|
||||||
|
|
||||||
|
SceneObjectGroup targetSo = SceneHelpers.AddSceneObject(m_scene, "targetSo", user1Id);
|
||||||
|
SceneObjectGroup otherOwnedTargetSo = SceneHelpers.AddSceneObject(m_scene, "otherOwnedTargetSo", user2Id);
|
||||||
|
|
||||||
|
// Test that we cannot load a script when the target pin has never been set (i.e. it is zero)
|
||||||
|
api.llRemoteLoadScriptPin(targetSo.UUID.ToString(), "script", 0, 0, 0);
|
||||||
|
Assert.IsNull(targetSo.RootPart.Inventory.GetInventoryItem("script"));
|
||||||
|
|
||||||
|
// Test that we cannot load a script when the given pin does not match the target
|
||||||
|
targetSo.RootPart.ScriptAccessPin = 5;
|
||||||
|
api.llRemoteLoadScriptPin(targetSo.UUID.ToString(), "script", 3, 0, 0);
|
||||||
|
Assert.IsNull(targetSo.RootPart.Inventory.GetInventoryItem("script"));
|
||||||
|
|
||||||
|
// Test that we cannot load into a prim with a different owner
|
||||||
|
otherOwnedTargetSo.RootPart.ScriptAccessPin = 3;
|
||||||
|
api.llRemoteLoadScriptPin(otherOwnedTargetSo.UUID.ToString(), "script", 3, 0, 0);
|
||||||
|
Assert.IsNull(otherOwnedTargetSo.RootPart.Inventory.GetInventoryItem("script"));
|
||||||
|
|
||||||
|
// Test that we can load a script when given pin and dest pin match.
|
||||||
|
targetSo.RootPart.ScriptAccessPin = 3;
|
||||||
|
api.llRemoteLoadScriptPin(targetSo.UUID.ToString(), "script", 3, 0, 0);
|
||||||
|
TaskInventoryItem insertedItem = targetSo.RootPart.Inventory.GetInventoryItem("script");
|
||||||
|
Assert.IsNotNull(insertedItem);
|
||||||
|
|
||||||
|
// Test that we can no longer load if access pin is unset
|
||||||
|
targetSo.RootPart.Inventory.RemoveInventoryItem(insertedItem.ItemID);
|
||||||
|
Assert.IsNull(targetSo.RootPart.Inventory.GetInventoryItem("script"));
|
||||||
|
|
||||||
|
targetSo.RootPart.ScriptAccessPin = 0;
|
||||||
|
api.llRemoteLoadScriptPin(otherOwnedTargetSo.UUID.ToString(), "script", 3, 0, 0);
|
||||||
|
Assert.IsNull(otherOwnedTargetSo.RootPart.Inventory.GetInventoryItem("script"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue