From 50e318c401f69b7b3946b0a630d455bf7fe4118c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 22 Jan 2017 03:23:50 +0000 Subject: work around group sharing and owned permitions issues, fix a non copy objects delete issue --- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 33 ++++++++-------------- .../Region/Framework/Scenes/Scene.Permissions.cs | 32 +++++++++++++++++++-- .../Framework/Scenes/SceneObjectGroup.Inventory.cs | 32 ++++++++------------- 3 files changed, 54 insertions(+), 43 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 3230a2b..a1eb721 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -1380,18 +1380,10 @@ namespace OpenSim.Region.Framework.Scenes return; } - if ((taskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0) + if (!Permissions.CanCopyObjectInventory(itemId, part.UUID, remoteClient.AgentId)) { - // If the item to be moved is no copy, we need to be able to - // edit the prim. - if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId)) - return; - } - else - { - // If the item is copiable, then we just need to have perms - // on it. The delete check is a pure rights check - if (!Permissions.CanDeleteObject(part.UUID, remoteClient.AgentId)) + // check also if we can delete the no copy item + if(!Permissions.CanEditObject(part.UUID, remoteClient.AgentId)) return; } @@ -2125,6 +2117,7 @@ namespace OpenSim.Region.Framework.Scenes List deleteIDs = new List(); List deleteGroups = new List(); List takeGroups = new List(); + List takeDeleteGroups = new List(); ScenePresence sp = remoteClient.SceneAgent as ScenePresence; @@ -2192,7 +2185,7 @@ namespace OpenSim.Region.Framework.Scenes if (!Permissions.CanTakeObject(grp, sp)) permissionToTake = false; - if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId)) + if (!Permissions.CanDeleteObject(grp, remoteClient)) permissionToDelete = false; } @@ -2249,26 +2242,24 @@ namespace OpenSim.Region.Framework.Scenes } } - if (permissionToTake && (!permissionToDelete)) - takeGroups.Add(grp); - if (permissionToDelete) { if (permissionToTake) + takeDeleteGroups.Add(grp); + else deleteGroups.Add(grp); deleteIDs.Add(grp.LocalId); } + else if(permissionToTake) + takeGroups.Add(grp); } SendKillObject(deleteIDs); - if (deleteGroups.Count > 0) + if (takeDeleteGroups.Count > 0) { - foreach (SceneObjectGroup g in deleteGroups) - deleteIDs.Remove(g.LocalId); - m_asyncSceneObjectDeleter.DeleteToInventory( - action, destinationID, deleteGroups, remoteClient, + action, destinationID, takeDeleteGroups, remoteClient, true); } if (takeGroups.Count > 0) @@ -2277,7 +2268,7 @@ namespace OpenSim.Region.Framework.Scenes action, destinationID, takeGroups, remoteClient, false); } - if (deleteIDs.Count > 0) + if (deleteGroups.Count > 0) { foreach (SceneObjectGroup g in deleteGroups) DeleteSceneObject(g, true); diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index e941210..754609a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs @@ -42,7 +42,8 @@ namespace OpenSim.Region.Framework.Scenes public delegate bool BypassPermissionsHandler(); public delegate bool PropagatePermissionsHandler(); public delegate bool RezObjectHandler(int objectCount, UUID owner, Vector3 objectPosition, Scene scene); - public delegate bool DeleteObjectHandler(UUID objectID, UUID deleter, Scene scene); + public delegate bool DeleteObjectHandlerByIDs(UUID objectID, UUID deleter, Scene scene); + public delegate bool DeleteObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool TransferObjectHandler(UUID objectID, UUID recipient, Scene scene); public delegate bool TakeObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool SellGroupObjectHandler(UUID userID, UUID groupID, Scene scene); @@ -114,6 +115,7 @@ namespace OpenSim.Region.Framework.Scenes public event BypassPermissionsHandler OnBypassPermissions; public event PropagatePermissionsHandler OnPropagatePermissions; public event RezObjectHandler OnRezObject; + public event DeleteObjectHandlerByIDs OnDeleteObjectByIDs; public event DeleteObjectHandler OnDeleteObject; public event TransferObjectHandler OnTransferObject; public event TakeObjectHandler OnTakeObject; @@ -262,13 +264,39 @@ namespace OpenSim.Region.Framework.Scenes { bool result = true; + DeleteObjectHandlerByIDs handler = OnDeleteObjectByIDs; + if (handler != null) + { + Delegate[] list = handler.GetInvocationList(); + foreach (DeleteObjectHandlerByIDs h in list) + { + if (h(objectID, deleter, m_scene) == false) + { + result = false; + break; + } + } + } + + return result; + } + + public bool CanDeleteObject(SceneObjectGroup sog, IClientAPI client) + { + bool result = true; + DeleteObjectHandler handler = OnDeleteObject; if (handler != null) { + if(sog == null || client == null || client.SceneAgent == null) + return false; + + ScenePresence sp = client.SceneAgent as ScenePresence; + Delegate[] list = handler.GetInvocationList(); foreach (DeleteObjectHandler h in list) { - if (h(objectID, deleter, m_scene) == false) + if (h(sog, sp) == false) { result = false; break; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index b9fa8e4..ddb03c3 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs @@ -315,8 +315,7 @@ namespace OpenSim.Region.Framework.Scenes const uint copytransfermast = (uint)(PermissionMask.Copy | PermissionMask.Transfer); uint basePerms = (RootPart.BaseMask & allmask) | (uint)PermissionMask.Move; - bool noBaseTransfer = (RootPart.OwnerID != RootPart.GroupID && - (basePerms & (uint)PermissionMask.Transfer) == 0); + bool noBaseTransfer = (basePerms & (uint)PermissionMask.Transfer) == 0; uint rootOwnerPerms = RootPart.OwnerMask; uint owner = rootOwnerPerms; @@ -342,17 +341,17 @@ namespace OpenSim.Region.Framework.Scenes owner &= basePerms; m_EffectiveOwnerPerms = owner; + uint ownertransfermask = owner & (uint)PermissionMask.Transfer; // recover modify and move rootGroupPerms &= movemodmask; group |= rootGroupPerms; if(noBaseTransfer) group &=~(uint)PermissionMask.Copy; + else + group |= ownertransfermask; uint groupOrEveryone = group; - - if((group & copytransfermast) == 0) - group |= (uint)PermissionMask.Transfer; m_EffectiveGroupPerms = group & owner; // recover move @@ -361,15 +360,12 @@ namespace OpenSim.Region.Framework.Scenes everyone &= ~(uint)PermissionMask.Modify; if(noBaseTransfer) everyone &=~(uint)PermissionMask.Copy; + else + everyone |= ownertransfermask; groupOrEveryone |= everyone; - if((everyone & copytransfermast) == 0) - everyone |= (uint)PermissionMask.Transfer; m_EffectiveEveryOnePerms = everyone & owner; - - if((groupOrEveryone & copytransfermast) == 0) - groupOrEveryone |= (uint)PermissionMask.Transfer; m_EffectiveGroupOrEveryOnePerms = groupOrEveryone & owner; } } @@ -386,8 +382,7 @@ namespace OpenSim.Region.Framework.Scenes const uint copytransfermast = (uint)(PermissionMask.Copy | PermissionMask.Transfer); uint basePerms = (RootPart.BaseMask & allmask) | (uint)PermissionMask.Move; - bool noBaseTransfer = (RootPart.OwnerID == RootPart.GroupID && - (basePerms & (uint)PermissionMask.Transfer) == 0); + bool noBaseTransfer = (basePerms & (uint)PermissionMask.Transfer) == 0; uint rootOwnerPerms = RootPart.OwnerMask; uint owner = rootOwnerPerms; @@ -412,17 +407,17 @@ namespace OpenSim.Region.Framework.Scenes owner &= basePerms; m_EffectiveOwnerPerms = owner; + uint ownertransfermask = owner & (uint)PermissionMask.Transfer; // recover modify and move rootGroupPerms &= movemodmask; group |= rootGroupPerms; if(noBaseTransfer) group &=~(uint)PermissionMask.Copy; + else + group |= ownertransfermask; uint groupOrEveryone = group; - - if((group & copytransfermast) == 0) - group |= (uint)PermissionMask.Transfer; m_EffectiveGroupPerms = group & owner; // recover move @@ -431,15 +426,12 @@ namespace OpenSim.Region.Framework.Scenes everyone &= ~(uint)PermissionMask.Modify; if(noBaseTransfer) everyone &=~(uint)PermissionMask.Copy; + else + everyone |= ownertransfermask; groupOrEveryone |= everyone; - if((everyone & copytransfermast) == 0) - everyone |= (uint)PermissionMask.Transfer; m_EffectiveEveryOnePerms = everyone & owner; - - if((groupOrEveryone & copytransfermast) == 0) - groupOrEveryone |= (uint)PermissionMask.Transfer; m_EffectiveGroupOrEveryOnePerms = groupOrEveryone & owner; } } -- cgit v1.1