From 984345a2022ba805869990e0c495af08ffe40ce9 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 19 Jan 2017 13:10:04 +0000 Subject: add CanEdit check for SOGs, iclients and SPs that need to be in scene and use it --- .../World/Permissions/PermissionsModule.cs | 17 ++++++++- .../Region/Framework/Scenes/Scene.Permissions.cs | 44 +++++++++++++++++----- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 20 +++++----- 3 files changed, 60 insertions(+), 21 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 4f62827..1c8d4b8 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -283,6 +283,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_scene.Permissions.OnIsEstateManager += IsEstateManager; m_scene.Permissions.OnDuplicateObject += CanDuplicateObject; m_scene.Permissions.OnDeleteObject += CanDeleteObject; + m_scene.Permissions.OnEditObjectByIDs += CanEditObjectByIDs; m_scene.Permissions.OnEditObject += CanEditObject; m_scene.Permissions.OnEditParcelProperties += CanEditParcelProperties; m_scene.Permissions.OnInstantMessage += CanInstantMessage; @@ -1235,7 +1236,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions return true; } - private bool CanEditObject(UUID objectID, UUID userID, Scene scene) + private bool CanEditObjectByIDs(UUID objectID, UUID userID, Scene scene) { DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); if (m_bypassPermissions) return m_bypassPermissionsValue; @@ -1250,6 +1251,20 @@ namespace OpenSim.Region.CoreModules.World.Permissions return true; } + private bool CanEditObject(SceneObjectGroup sog, ScenePresence sp) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; + + if(sog == null || sog.IsDeleted || sp == null || sp.IsDeleted) + return false; + + uint perms = GetObjectPermissions(sp, sog, true); + if((perms & (uint)PermissionMask.Modify) == 0) + return false; + return true; + } + private bool CanEditObjectInventory(UUID objectID, UUID userID, Scene scene) { DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index e066c0a..3491792 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs @@ -48,7 +48,8 @@ namespace OpenSim.Region.Framework.Scenes public delegate bool SellGroupObjectHandler(UUID userID, UUID groupID, Scene scene); public delegate bool TakeCopyObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool DuplicateObjectHandler(int objectCount, UUID objectID, UUID owner, Scene scene, Vector3 objectPosition); - public delegate bool EditObjectHandler(UUID objectID, UUID editorID, Scene scene); + public delegate bool EditObjectByIDsHandler(UUID objectID, UUID editorID, Scene scene); + public delegate bool EditObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool EditObjectInventoryHandler(UUID objectID, UUID editorID, Scene scene); public delegate bool MoveObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool ObjectEntryHandler(UUID objectID, bool enteringRegion, Vector3 newPoint, Scene scene); @@ -118,6 +119,7 @@ namespace OpenSim.Region.Framework.Scenes public event SellGroupObjectHandler OnSellGroupObject; public event TakeCopyObjectHandler OnTakeCopyObject; public event DuplicateObjectHandler OnDuplicateObject; + public event EditObjectByIDsHandler OnEditObjectByIDs; public event EditObjectHandler OnEditObject; public event EditObjectInventoryHandler OnEditObjectInventory; public event MoveObjectHandler OnMoveObject; @@ -307,6 +309,9 @@ namespace OpenSim.Region.Framework.Scenes TakeObjectHandler handler = OnTakeObject; if (handler != null) { + if(sog == null || sp == null) + return false; + Delegate[] list = handler.GetInvocationList(); foreach (TakeObjectHandler h in list) { @@ -364,6 +369,8 @@ namespace OpenSim.Region.Framework.Scenes TakeCopyObjectHandler handler = OnTakeCopyObject; if (handler != null) { + if(sog == null || sp == null) + return false; Delegate[] list = handler.GetInvocationList(); foreach (TakeCopyObjectHandler h in list) { @@ -419,13 +426,33 @@ namespace OpenSim.Region.Framework.Scenes #region EDIT OBJECT public bool CanEditObject(UUID objectID, UUID editorID) { + EditObjectByIDsHandler handler = OnEditObjectByIDs; + if (handler != null) + { + Delegate[] list = handler.GetInvocationList(); + foreach (EditObjectByIDsHandler h in list) + { + if (h(objectID, editorID, m_scene) == false) + return false; + } + } + return true; + } + + public bool CanEditObject(SceneObjectGroup sog, IClientAPI client) + { EditObjectHandler handler = OnEditObject; if (handler != null) { + if(sog == null || client == null || client.SceneAgent == null) + return false; + + ScenePresence sp = client.SceneAgent as ScenePresence; + Delegate[] list = handler.GetInvocationList(); foreach (EditObjectHandler h in list) { - if (h(objectID, editorID, m_scene) == false) + if (h(sog, sp) == false) return false; } } @@ -452,17 +479,14 @@ namespace OpenSim.Region.Framework.Scenes #region MOVE OBJECT public bool CanMoveObject(SceneObjectGroup sog, IClientAPI client) { - if(sog == null || client == null) - return false; - - if(client.SceneAgent == null) - return false; - - ScenePresence sp = client.SceneAgent as ScenePresence; - MoveObjectHandler handler = OnMoveObject; if (handler != null) { + if(sog == null || client == null || client.SceneAgent == null) + return false; + + ScenePresence sp = client.SceneAgent as ScenePresence; + Delegate[] list = handler.GetInvocationList(); foreach (MoveObjectHandler h in list) { diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index ba2ee04..6a36982 100755 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -1358,7 +1358,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup grp = part.ParentGroup; if (grp != null) { - if (m_parentScene.Permissions.CanEditObject(grp.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(grp, remoteClient)) { // These two are exceptions SL makes in the interpretation // of the change flags. Must check them here because otherwise @@ -1406,7 +1406,7 @@ namespace OpenSim.Region.Framework.Scenes if (part != null) { - if (m_parentScene.Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(part.ParentGroup, remoteClient)) { bool physbuild = false; if (part.ParentGroup.RootPart.PhysActor != null) @@ -1428,7 +1428,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(localID); if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) { bool physbuild = false; if (group.RootPart.PhysActor != null) @@ -1603,7 +1603,7 @@ namespace OpenSim.Region.Framework.Scenes if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID,remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) { group.UpdateTextureEntry(localID, texture); } @@ -1627,7 +1627,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(localID); if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) { // VolumeDetect can't be set via UI and will always be off when a change is made there // now only change volume dtc if phantom off @@ -1674,7 +1674,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(primLocalID); if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) { group.SetPartName(Util.CleanString(name), primLocalID); group.HasGroupChanged = true; @@ -1692,7 +1692,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(primLocalID); if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) { group.SetPartDescription(Util.CleanString(description), primLocalID); group.HasGroupChanged = true; @@ -1714,7 +1714,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(primLocalID); if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) { SceneObjectPart part = m_parentScene.GetSceneObjectPart(primLocalID); if (part != null) @@ -1731,7 +1731,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup group = GetGroupByPrim(primLocalID); if (group != null) { - if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) + if (m_parentScene.Permissions.CanEditObject(group, remoteClient)) { SceneObjectPart part = m_parentScene.GetSceneObjectPart(primLocalID); if (part != null) @@ -2033,7 +2033,7 @@ namespace OpenSim.Region.Framework.Scenes // libomv will complain about PrimFlags.JointWheel being // deprecated, so we #pragma warning disable 0612 - if (IncludeInSearch && m_parentScene.Permissions.CanEditObject(sog.UUID, remoteClient.AgentId)) + if (IncludeInSearch && m_parentScene.Permissions.CanEditObject(sog, remoteClient)) { sog.RootPart.AddFlag(PrimFlags.JointWheel); sog.HasGroupChanged = true; -- cgit v1.1