aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey2014-11-11 17:28:41 +0000
committerJustin Clark-Casey2014-11-11 17:59:56 +0000
commit5aa8ba1b45c8a0a2965888287ba68e5773471db8 (patch)
tree43247203314bae5b3f75c3ba0d26a774c6b37129
parentMerge branch 'master' of ssh://opensimulator.org/var/git/opensim (diff)
downloadopensim-SC_OLD-5aa8ba1b45c8a0a2965888287ba68e5773471db8.zip
opensim-SC_OLD-5aa8ba1b45c8a0a2965888287ba68e5773471db8.tar.gz
opensim-SC_OLD-5aa8ba1b45c8a0a2965888287ba68e5773471db8.tar.bz2
opensim-SC_OLD-5aa8ba1b45c8a0a2965888287ba68e5773471db8.tar.xz
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.
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs20
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs48
2 files changed, 60 insertions, 8 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 3c120ff..5cc5606 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1940,8 +1940,11 @@ namespace OpenSim.Region.Framework.Scenes
1940 /// Rez a script into a prim's inventory from another prim 1940 /// Rez a script into a prim's inventory from another prim
1941 /// </summary> 1941 /// </summary>
1942 /// <param name="remoteClient"></param> 1942 /// <param name="remoteClient"></param>
1943 /// <param name="itemID"> </param> 1943 /// <param name="srcPart"> </param>
1944 /// <param name="localID"></param> 1944 /// <param name="destId"> </param>
1945 /// <param name="pin"></param>
1946 /// <param name="running"></param>
1947 /// <param name="start_param"></param>
1945 public void RezScriptFromPrim(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param) 1948 public void RezScriptFromPrim(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param)
1946 { 1949 {
1947 TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId); 1950 TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId);
@@ -1961,12 +1964,11 @@ namespace OpenSim.Region.Framework.Scenes
1961 if (destPart == null) 1964 if (destPart == null)
1962 { 1965 {
1963 m_log.ErrorFormat( 1966 m_log.ErrorFormat(
1964 "[PRIM INVENTORY]: " + 1967 "[PRIM INVENTORY]: Could not find part {0} to insert script item {1} from {2} {3} in {4}",
1965 "Could not find script for ID {0}", 1968 destId, srcId, srcPart.Name, srcPart.UUID, Name);
1966 destId);
1967 return; 1969 return;
1968 } 1970 }
1969 1971
1970 // Must own the object, and have modify rights 1972 // Must own the object, and have modify rights
1971 if (srcPart.OwnerID != destPart.OwnerID) 1973 if (srcPart.OwnerID != destPart.OwnerID)
1972 { 1974 {
@@ -1974,12 +1976,14 @@ namespace OpenSim.Region.Framework.Scenes
1974 if ((destPart.GroupID == UUID.Zero) || (destPart.GroupID != srcPart.GroupID) || 1976 if ((destPart.GroupID == UUID.Zero) || (destPart.GroupID != srcPart.GroupID) ||
1975 ((destPart.GroupMask & (uint)PermissionMask.Modify) == 0)) 1977 ((destPart.GroupMask & (uint)PermissionMask.Modify) == 0))
1976 return; 1978 return;
1977 } else { 1979 }
1980 else
1981 {
1978 if ((destPart.OwnerMask & (uint)PermissionMask.Modify) == 0) 1982 if ((destPart.OwnerMask & (uint)PermissionMask.Modify) == 0)
1979 return; 1983 return;
1980 } 1984 }
1981 1985
1982 if (destPart.ScriptAccessPin != pin) 1986 if (destPart.ScriptAccessPin == 0 || destPart.ScriptAccessPin != pin)
1983 { 1987 {
1984 m_log.WarnFormat( 1988 m_log.WarnFormat(
1985 "[PRIM INVENTORY]: " + 1989 "[PRIM INVENTORY]: " +
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
index 37caa5d..1ad0a99 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
@@ -238,5 +238,53 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
238 Assert.IsNotNull(receivedItem); 238 Assert.IsNotNull(receivedItem);
239 Assert.AreEqual(0, receivedItem.CurrentPermissions & (uint)PermissionMask.Modify); 239 Assert.AreEqual(0, receivedItem.CurrentPermissions & (uint)PermissionMask.Modify);
240 } 240 }
241
242 [Test]
243 public void TestLlRemoteLoadScriptPin()
244 {
245 TestHelpers.InMethod();
246// TestHelpers.EnableLogging();
247
248 UUID user1Id = TestHelpers.ParseTail(0x1);
249 UUID user2Id = TestHelpers.ParseTail(0x2);
250
251 SceneObjectGroup sourceSo = SceneHelpers.AddSceneObject(m_scene, 1, user1Id, "sourceSo", 0x10);
252 m_scene.AddSceneObject(sourceSo);
253 LSL_Api api = new LSL_Api();
254 api.Initialize(m_engine, sourceSo.RootPart, null, null);
255 TaskInventoryHelpers.AddScript(m_scene, sourceSo.RootPart, "script", "Hello World");
256
257 SceneObjectGroup targetSo = SceneHelpers.AddSceneObject(m_scene, 1, user1Id, "targetSo", 0x20);
258 SceneObjectGroup otherOwnedTargetSo
259 = SceneHelpers.AddSceneObject(m_scene, 1, user2Id, "otherOwnedTargetSo", 0x30);
260
261 // Test that we cannot load a script when the target pin has never been set (i.e. it is zero)
262 api.llRemoteLoadScriptPin(targetSo.UUID.ToString(), "script", 0, 0, 0);
263 Assert.IsNull(targetSo.RootPart.Inventory.GetInventoryItem("script"));
264
265 // Test that we cannot load a script when the given pin does not match the target
266 targetSo.RootPart.ScriptAccessPin = 5;
267 api.llRemoteLoadScriptPin(targetSo.UUID.ToString(), "script", 3, 0, 0);
268 Assert.IsNull(targetSo.RootPart.Inventory.GetInventoryItem("script"));
269
270 // Test that we cannot load into a prim with a different owner
271 otherOwnedTargetSo.RootPart.ScriptAccessPin = 3;
272 api.llRemoteLoadScriptPin(otherOwnedTargetSo.UUID.ToString(), "script", 3, 0, 0);
273 Assert.IsNull(otherOwnedTargetSo.RootPart.Inventory.GetInventoryItem("script"));
274
275 // Test that we can load a script when given pin and dest pin match.
276 targetSo.RootPart.ScriptAccessPin = 3;
277 api.llRemoteLoadScriptPin(targetSo.UUID.ToString(), "script", 3, 0, 0);
278 TaskInventoryItem insertedItem = targetSo.RootPart.Inventory.GetInventoryItem("script");
279 Assert.IsNotNull(insertedItem);
280
281 // Test that we can no longer load if access pin is unset
282 targetSo.RootPart.Inventory.RemoveInventoryItem(insertedItem.ItemID);
283 Assert.IsNull(targetSo.RootPart.Inventory.GetInventoryItem("script"));
284
285 targetSo.RootPart.ScriptAccessPin = 0;
286 api.llRemoteLoadScriptPin(otherOwnedTargetSo.UUID.ToString(), "script", 3, 0, 0);
287 Assert.IsNull(otherOwnedTargetSo.RootPart.Inventory.GetInventoryItem("script"));
288 }
241 } 289 }
242} \ No newline at end of file 290} \ No newline at end of file