object Take and TakeCopy are for in scene SOPs and SPs and permitions module is NOT a shared module

UbitUmarov [2017-01-19 11:34:40]
object Take and TakeCopy are for in scene SOPs and SPs and permitions module is NOT a shared module
Filename
OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 8b8ac20..a900a2a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -1322,7 +1322,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
                 if (part == null)
                     return;

-                if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId))
+                SceneObjectGroup group = part.ParentGroup;
+
+                if (!m_scene.Permissions.CanTakeObject(group, sp))
                 {
                     remoteClient.SendAgentAlertMessage(
                         "You don't have sufficient permissions to attach this object", false);
@@ -1334,7 +1336,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
                 AttachmentPt &= 0x7f;

                 // Calls attach with a Zero position
-                SceneObjectGroup group = part.ParentGroup;
                 if (AttachObject(sp, group , AttachmentPt, false, true, append))
                 {
                     if (DebugLevel > 0)
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index 95e7456..ba3a7c9 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -541,16 +541,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess

         #region Permissions

-        private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene)
+        private bool CanTakeObject(SceneObjectGroup sog, ScenePresence sp)
         {
             if (m_bypassPermissions) return true;

-            if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(stealer))
+            if(sp == null || sog == null)
+                return false;
+
+            if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(sp.UUID))
             {
-                SceneObjectGroup sog = null;
-                if (m_Scene.TryGetSceneObjectGroup(objectID, out sog) && sog.OwnerID == stealer)
+                if (sog.OwnerID == sp.UUID)
                     return true;
-
                 return false;
             }

diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index da4b826..3f310c7 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -1671,39 +1671,45 @@ namespace OpenSim.Region.CoreModules.World.Permissions
             return IsGroupMember(groupID, userID, (ulong)GroupPowers.ObjectSetForSale);
         }

-        private bool CanTakeObject(UUID objectID, UUID userID, Scene scene)
+        private bool CanTakeObject(SceneObjectGroup sog, ScenePresence sp)
         {
             DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
             if (m_bypassPermissions) return m_bypassPermissionsValue;

-            SceneObjectGroup sog = m_scene.GetGroupByPrim(objectID);
-            if (sog == null)
+            if (sog == null || sog.IsDeleted || sp == null || sp.IsDeleted)
+                return false;
+
+            // take is not a attachment op
+            if(sog.IsAttachment)
                 return false;

             // ignore locked, viewers shell ask for confirmation
-            uint perms = GetObjectPermissions(userID, sog, false);
+            uint perms = GetObjectPermissions(sp, sog, false);
             if((perms & (uint)PermissionMask.Modify) == 0)
                 return false;

-            if (sog.OwnerID != userID && ((perms & (uint)PermissionMask.Transfer) == 0))
+            if (sog.OwnerID != sp.UUID && ((perms & (uint)PermissionMask.Transfer) == 0))
                  return false;
             return true;
         }

-        private bool CanTakeCopyObject(UUID objectID, UUID userID, Scene inScene)
+        private bool CanTakeCopyObject(SceneObjectGroup sog, ScenePresence sp)
         {
             DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
             if (m_bypassPermissions) return m_bypassPermissionsValue;

-            SceneObjectGroup sog = m_scene.GetGroupByPrim(objectID);
-            if (sog == null)
+            if (sog == null || sog.IsDeleted || sp == null || sp.IsDeleted)
                 return false;

-            uint perms = GetObjectPermissions(userID, sog, true);
+            // refuse on attachments
+            if(sog.IsAttachment && !sp.IsGod)
+                return false;
+
+            uint perms = GetObjectPermissions(sp, sog, true);
             if((perms & (uint)PermissionMask.Copy) == 0)
                 return false;

-            if(sog.OwnerID != userID && sog.OwnerID != sog.GroupID && (perms & (uint)PermissionMask.Transfer) == 0)
+            if(sog.OwnerID != sp.UUID && sog.OwnerID != sog.GroupID && (perms & (uint)PermissionMask.Transfer) == 0)
                  return false;
             return true;
         }
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 473589a..ad913f7 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2126,6 +2126,8 @@ namespace OpenSim.Region.Framework.Scenes
             List<SceneObjectGroup> deleteGroups = new List<SceneObjectGroup>();
             List<SceneObjectGroup> takeGroups = new List<SceneObjectGroup>();

+            ScenePresence sp = remoteClient.SceneAgent as ScenePresence;
+
             // Start with true for both, then remove the flags if objects
             // that we can't derez are part of the selection
             bool permissionToTake = true;
@@ -2180,14 +2182,14 @@ namespace OpenSim.Region.Framework.Scenes
                 {
                     if (action == DeRezAction.TakeCopy)
                     {
-                        if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
+                        if (!Permissions.CanTakeCopyObject(grp, sp))
                             permissionToTakeCopy = false;
                     }
                     else
                     {
                         permissionToTakeCopy = false;
                     }
-                    if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId))
+                    if (!Permissions.CanTakeObject(grp, sp))
                         permissionToTake = false;

                     if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId))
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index e42d4c2..8194606 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -44,9 +44,9 @@ namespace OpenSim.Region.Framework.Scenes
     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 TransferObjectHandler(UUID objectID, UUID recipient, Scene scene);
-    public delegate bool TakeObjectHandler(UUID objectID, UUID stealer, Scene scene);
+    public delegate bool TakeObjectHandler(SceneObjectGroup sog, ScenePresence sp);
     public delegate bool SellGroupObjectHandler(UUID userID, UUID groupID, Scene scene);
-    public delegate bool TakeCopyObjectHandler(UUID objectID, UUID userID, Scene inScene);
+    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 EditObjectInventoryHandler(UUID objectID, UUID editorID, Scene scene);
@@ -300,7 +300,7 @@ namespace OpenSim.Region.Framework.Scenes
         #endregion

         #region TAKE OBJECT
-        public bool CanTakeObject(UUID objectID, UUID AvatarTakingUUID)
+        public bool CanTakeObject(SceneObjectGroup sog, ScenePresence sp)
         {
             bool result = true;

@@ -310,7 +310,7 @@ namespace OpenSim.Region.Framework.Scenes
                 Delegate[] list = handler.GetInvocationList();
                 foreach (TakeObjectHandler h in list)
                 {
-                    if (h(objectID, AvatarTakingUUID, m_scene) == false)
+                    if (h(sog, sp) == false)
                     {
                         result = false;
                         break;
@@ -357,7 +357,7 @@ namespace OpenSim.Region.Framework.Scenes


         #region TAKE COPY OBJECT
-        public bool CanTakeCopyObject(UUID objectID, UUID userID)
+        public bool CanTakeCopyObject(SceneObjectGroup sog, ScenePresence sp)
         {
             bool result = true;

@@ -367,7 +367,7 @@ namespace OpenSim.Region.Framework.Scenes
                 Delegate[] list = handler.GetInvocationList();
                 foreach (TakeCopyObjectHandler h in list)
                 {
-                    if (h(objectID, userID, m_scene) == false)
+                    if (h(sog, sp) == false)
                     {
                         result = false;
                         break;
ViewGit