diff options
4 files changed, 186 insertions, 11 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index a29b7f1..06f8ac1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1733,7 +1733,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1733 | // Autoreturn has a null client. Nothing else does. So | 1733 | // Autoreturn has a null client. Nothing else does. So |
1734 | // allow only returns | 1734 | // allow only returns |
1735 | if (action != DeRezAction.Return) | 1735 | if (action != DeRezAction.Return) |
1736 | { | ||
1737 | m_log.WarnFormat( | ||
1738 | "[AGENT INVENTORY]: Ignoring attempt to {0} {1} {2} without a client", | ||
1739 | action, grp.Name, grp.UUID); | ||
1736 | return; | 1740 | return; |
1741 | } | ||
1737 | 1742 | ||
1738 | permissionToTakeCopy = false; | 1743 | permissionToTakeCopy = false; |
1739 | } | 1744 | } |
@@ -1741,13 +1746,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1741 | { | 1746 | { |
1742 | if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId)) | 1747 | if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId)) |
1743 | permissionToTakeCopy = false; | 1748 | permissionToTakeCopy = false; |
1749 | |||
1744 | if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId)) | 1750 | if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId)) |
1745 | permissionToTake = false; | 1751 | permissionToTake = false; |
1746 | 1752 | ||
1747 | if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId)) | 1753 | if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId)) |
1748 | permissionToDelete = false; | 1754 | permissionToDelete = false; |
1749 | } | 1755 | } |
1750 | |||
1751 | } | 1756 | } |
1752 | 1757 | ||
1753 | // Handle god perms | 1758 | // Handle god perms |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index 06890a0..d67638a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs | |||
@@ -27,13 +27,15 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | ||
30 | using System.Text; | 31 | using System.Text; |
32 | using log4net; | ||
31 | using OpenMetaverse; | 33 | using OpenMetaverse; |
32 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
33 | using OpenSim.Region.Framework.Interfaces; | 35 | using OpenSim.Region.Framework.Interfaces; |
34 | 36 | ||
35 | namespace OpenSim.Region.Framework.Scenes | 37 | namespace OpenSim.Region.Framework.Scenes |
36 | { | 38 | { |
37 | #region Delegates | 39 | #region Delegates |
38 | public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectID); | 40 | public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectID); |
39 | public delegate void SetBypassPermissionsHandler(bool value); | 41 | public delegate void SetBypassPermissionsHandler(bool value); |
@@ -88,6 +90,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
88 | 90 | ||
89 | public class ScenePermissions | 91 | public class ScenePermissions |
90 | { | 92 | { |
93 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
94 | |||
91 | private Scene m_scene; | 95 | private Scene m_scene; |
92 | 96 | ||
93 | public ScenePermissions(Scene scene) | 97 | public ScenePermissions(Scene scene) |
@@ -242,6 +246,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
242 | #region DELETE OBJECT | 246 | #region DELETE OBJECT |
243 | public bool CanDeleteObject(UUID objectID, UUID deleter) | 247 | public bool CanDeleteObject(UUID objectID, UUID deleter) |
244 | { | 248 | { |
249 | bool result = true; | ||
250 | |||
245 | DeleteObjectHandler handler = OnDeleteObject; | 251 | DeleteObjectHandler handler = OnDeleteObject; |
246 | if (handler != null) | 252 | if (handler != null) |
247 | { | 253 | { |
@@ -249,10 +255,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
249 | foreach (DeleteObjectHandler h in list) | 255 | foreach (DeleteObjectHandler h in list) |
250 | { | 256 | { |
251 | if (h(objectID, deleter, m_scene) == false) | 257 | if (h(objectID, deleter, m_scene) == false) |
252 | return false; | 258 | { |
259 | result = false; | ||
260 | break; | ||
261 | } | ||
253 | } | 262 | } |
254 | } | 263 | } |
255 | return true; | 264 | |
265 | // m_log.DebugFormat( | ||
266 | // "[SCENE PERMISSIONS]: CanDeleteObject() fired for object {0}, deleter {1}, result {2}", | ||
267 | // objectID, deleter, result); | ||
268 | |||
269 | return result; | ||
256 | } | 270 | } |
257 | 271 | ||
258 | #endregion | 272 | #endregion |
@@ -260,6 +274,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
260 | #region TAKE OBJECT | 274 | #region TAKE OBJECT |
261 | public bool CanTakeObject(UUID objectID, UUID AvatarTakingUUID) | 275 | public bool CanTakeObject(UUID objectID, UUID AvatarTakingUUID) |
262 | { | 276 | { |
277 | bool result = true; | ||
278 | |||
263 | TakeObjectHandler handler = OnTakeObject; | 279 | TakeObjectHandler handler = OnTakeObject; |
264 | if (handler != null) | 280 | if (handler != null) |
265 | { | 281 | { |
@@ -267,10 +283,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
267 | foreach (TakeObjectHandler h in list) | 283 | foreach (TakeObjectHandler h in list) |
268 | { | 284 | { |
269 | if (h(objectID, AvatarTakingUUID, m_scene) == false) | 285 | if (h(objectID, AvatarTakingUUID, m_scene) == false) |
270 | return false; | 286 | { |
287 | result = false; | ||
288 | break; | ||
289 | } | ||
271 | } | 290 | } |
272 | } | 291 | } |
273 | return true; | 292 | |
293 | // m_log.DebugFormat( | ||
294 | // "[SCENE PERMISSIONS]: CanTakeObject() fired for object {0}, taker {1}, result {2}", | ||
295 | // objectID, AvatarTakingUUID, result); | ||
296 | |||
297 | return result; | ||
274 | } | 298 | } |
275 | 299 | ||
276 | #endregion | 300 | #endregion |
@@ -278,6 +302,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
278 | #region TAKE COPY OBJECT | 302 | #region TAKE COPY OBJECT |
279 | public bool CanTakeCopyObject(UUID objectID, UUID userID) | 303 | public bool CanTakeCopyObject(UUID objectID, UUID userID) |
280 | { | 304 | { |
305 | bool result = true; | ||
306 | |||
281 | TakeCopyObjectHandler handler = OnTakeCopyObject; | 307 | TakeCopyObjectHandler handler = OnTakeCopyObject; |
282 | if (handler != null) | 308 | if (handler != null) |
283 | { | 309 | { |
@@ -285,10 +311,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
285 | foreach (TakeCopyObjectHandler h in list) | 311 | foreach (TakeCopyObjectHandler h in list) |
286 | { | 312 | { |
287 | if (h(objectID, userID, m_scene) == false) | 313 | if (h(objectID, userID, m_scene) == false) |
288 | return false; | 314 | { |
315 | result = false; | ||
316 | break; | ||
317 | } | ||
289 | } | 318 | } |
290 | } | 319 | } |
291 | return true; | 320 | |
321 | // m_log.DebugFormat( | ||
322 | // "[SCENE PERMISSIONS]: CanTakeCopyObject() fired for object {0}, user {1}, result {2}", | ||
323 | // objectID, userID, result); | ||
324 | |||
325 | return result; | ||
292 | } | 326 | } |
293 | 327 | ||
294 | #endregion | 328 | #endregion |
@@ -383,6 +417,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
383 | #region RETURN OBJECT | 417 | #region RETURN OBJECT |
384 | public bool CanReturnObjects(ILandObject land, UUID user, List<SceneObjectGroup> objects) | 418 | public bool CanReturnObjects(ILandObject land, UUID user, List<SceneObjectGroup> objects) |
385 | { | 419 | { |
420 | bool result = true; | ||
421 | |||
386 | ReturnObjectsHandler handler = OnReturnObjects; | 422 | ReturnObjectsHandler handler = OnReturnObjects; |
387 | if (handler != null) | 423 | if (handler != null) |
388 | { | 424 | { |
@@ -390,10 +426,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
390 | foreach (ReturnObjectsHandler h in list) | 426 | foreach (ReturnObjectsHandler h in list) |
391 | { | 427 | { |
392 | if (h(land, user, objects, m_scene) == false) | 428 | if (h(land, user, objects, m_scene) == false) |
393 | return false; | 429 | { |
430 | result = false; | ||
431 | break; | ||
432 | } | ||
394 | } | 433 | } |
395 | } | 434 | } |
396 | return true; | 435 | |
436 | // m_log.DebugFormat( | ||
437 | // "[SCENE PERMISSIONS]: CanReturnObjects() fired for user {0} for {1} objects on {2}, result {3}", | ||
438 | // user, objects.Count, land.LandData.Name, result); | ||
439 | |||
440 | return result; | ||
397 | } | 441 | } |
398 | 442 | ||
399 | #endregion | 443 | #endregion |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserTests.cs new file mode 100644 index 0000000..7851f72 --- /dev/null +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserTests.cs | |||
@@ -0,0 +1,124 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Reflection; | ||
30 | using Nini.Config; | ||
31 | using NUnit.Framework; | ||
32 | using NUnit.Framework.SyntaxHelpers; | ||
33 | using OpenMetaverse; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Communications; | ||
36 | using OpenSim.Region.CoreModules.World.Permissions; | ||
37 | using OpenSim.Region.Framework.Scenes; | ||
38 | using OpenSim.Tests.Common; | ||
39 | using OpenSim.Tests.Common.Mock; | ||
40 | using OpenSim.Tests.Common.Setup; | ||
41 | |||
42 | namespace OpenSim.Region.Framework.Scenes.Tests | ||
43 | { | ||
44 | /// <summary> | ||
45 | /// Tests manipulation of scene objects by users. | ||
46 | /// </summary> | ||
47 | /// | ||
48 | /// This is at a level above the SceneObjectBasicTests, which act on the scene directly. | ||
49 | /// FIXME: These tests are very incomplete - they only test for a few conditions. | ||
50 | [TestFixture] | ||
51 | public class SceneObjectUserTests | ||
52 | { | ||
53 | /// <summary> | ||
54 | /// Test deleting an object from a scene. | ||
55 | /// </summary> | ||
56 | [Test] | ||
57 | public void TestDeRezSceneObject() | ||
58 | { | ||
59 | TestHelper.InMethod(); | ||
60 | // log4net.Config.XmlConfigurator.Configure(); | ||
61 | |||
62 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); | ||
63 | |||
64 | TestScene scene = SceneSetupHelpers.SetupScene(); | ||
65 | IConfigSource configSource = new IniConfigSource(); | ||
66 | IConfig config = configSource.AddConfig("Startup"); | ||
67 | config.Set("serverside_object_permissions", true); | ||
68 | SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() }); | ||
69 | TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId); | ||
70 | |||
71 | // Turn off the timer on the async sog deleter - we'll crank it by hand for this test. | ||
72 | AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; | ||
73 | sogd.Enabled = false; | ||
74 | |||
75 | SceneObjectPart part | ||
76 | = new SceneObjectPart(userId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); | ||
77 | part.Name = "obj1"; | ||
78 | scene.AddNewSceneObject(new SceneObjectGroup(part), false); | ||
79 | |||
80 | scene.DeRezObject(client, part.LocalId, UUID.Zero, DeRezAction.Delete, UUID.Zero); | ||
81 | sogd.InventoryDeQueueAndDelete(); | ||
82 | |||
83 | SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId); | ||
84 | Assert.That(retrievedPart, Is.Null); | ||
85 | } | ||
86 | |||
87 | /// <summary> | ||
88 | /// Test deleting an object from a scene where the deleter is not the owner | ||
89 | /// </summary> | ||
90 | /// | ||
91 | /// This test assumes that the deleter is not a god. | ||
92 | [Test] | ||
93 | public void TestDeRezSceneObjectNotOwner() | ||
94 | { | ||
95 | TestHelper.InMethod(); | ||
96 | // log4net.Config.XmlConfigurator.Configure(); | ||
97 | |||
98 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); | ||
99 | UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001"); | ||
100 | |||
101 | TestScene scene = SceneSetupHelpers.SetupScene(); | ||
102 | IConfigSource configSource = new IniConfigSource(); | ||
103 | IConfig config = configSource.AddConfig("Startup"); | ||
104 | config.Set("serverside_object_permissions", true); | ||
105 | SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() }); | ||
106 | TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId); | ||
107 | |||
108 | // Turn off the timer on the async sog deleter - we'll crank it by hand for this test. | ||
109 | AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; | ||
110 | sogd.Enabled = false; | ||
111 | |||
112 | SceneObjectPart part | ||
113 | = new SceneObjectPart(objectOwnerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); | ||
114 | part.Name = "obj1"; | ||
115 | scene.AddNewSceneObject(new SceneObjectGroup(part), false); | ||
116 | |||
117 | scene.DeRezObject(client, part.LocalId, UUID.Zero, DeRezAction.Delete, UUID.Zero); | ||
118 | sogd.InventoryDeQueueAndDelete(); | ||
119 | |||
120 | SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId); | ||
121 | Assert.That(retrievedPart.UUID, Is.EqualTo(part.UUID)); | ||
122 | } | ||
123 | } | ||
124 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs index ab5968c..ef52363 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs | |||
@@ -65,6 +65,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
65 | [TestFixtureSetUp] | 65 | [TestFixtureSetUp] |
66 | public void Init() | 66 | public void Init() |
67 | { | 67 | { |
68 | TestHelper.InMethod(); | ||
69 | |||
68 | scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); | 70 | scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); |
69 | scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); | 71 | scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); |
70 | scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); | 72 | scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); |