From a5838cf0a689facd58bc17f11ed6c312ef541aab Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 11 Nov 2011 00:28:12 +0000
Subject: Prevent linking objects while they are deeded. On unlinking deeded
 objects, set LastOwnerID properly so the parts cannot be transferred,
 circumventing no trans perms

---
 OpenSim/Region/Framework/Scenes/SceneGraph.cs | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index b2e5dc3..743fd50 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1661,6 +1661,13 @@ namespace OpenSim.Region.Framework.Scenes
         /// <param name="childPrims"></param>
         protected internal void LinkObjects(SceneObjectPart root, List<SceneObjectPart> children)
         {
+            SceneObjectGroup parentGroup = root.ParentGroup;
+            if (parentGroup == null) return;
+
+            // Cowardly refuse to link to a group owned root
+            if (parentGroup.OwnerID == parentGroup.GroupID)
+                return;
+
             Monitor.Enter(m_updateLock);
             try
             {
@@ -1683,11 +1690,14 @@ namespace OpenSim.Region.Framework.Scenes
 
                 foreach (SceneObjectGroup child in childGroups)
                 {
-                    parentGroup.LinkToGroup(child);
+                    if (parentGroup.OwnerID == child.OwnerID)
+                    {
+                        parentGroup.LinkToGroup(child);
 
-                    // this is here so physics gets updated!
-                    // Don't remove!  Bad juju!  Stay away! or fix physics!
-                    child.AbsolutePosition = child.AbsolutePosition;
+                        // this is here so physics gets updated!
+                        // Don't remove!  Bad juju!  Stay away! or fix physics!
+                        child.AbsolutePosition = child.AbsolutePosition;
+                    }
                 }
 
                 // We need to explicitly resend the newly link prim's object properties since no other actions
@@ -1725,9 +1735,14 @@ namespace OpenSim.Region.Framework.Scenes
                         if (part.ParentGroup.PrimCount != 1) // Skip single
                         {
                             if (part.LinkNum < 2) // Root
+                            {
                                 rootParts.Add(part);
+                            }
                             else
+                            {
+                                part.LastOwnerID = part.ParentGroup.RootPart.LastOwnerID;
                                 childParts.Add(part);
+                            }
 
                             SceneObjectGroup group = part.ParentGroup;
                             if (!affectedGroups.Contains(group))
-- 
cgit v1.1