Fix link security issue
							parent
							
								
									6a4fae123a
								
							
						
					
					
						commit
						22b3217113
					
				|  | @ -73,7 +73,7 @@ namespace OpenSim.Framework | ||||||
| 
 | 
 | ||||||
|     public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children); |     public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children); | ||||||
| 
 | 
 | ||||||
|     public delegate void DelinkObjects(List<uint> primIds); |     public delegate void DelinkObjects(List<uint> primIds, IClientAPI client); | ||||||
| 
 | 
 | ||||||
|     public delegate void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag); |     public delegate void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6151,7 +6151,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | ||||||
|             DelinkObjects handlerDelinkObjects = OnDelinkObjects; |             DelinkObjects handlerDelinkObjects = OnDelinkObjects; | ||||||
|             if (handlerDelinkObjects != null) |             if (handlerDelinkObjects != null) | ||||||
|             { |             { | ||||||
|                 handlerDelinkObjects(prims); |                 handlerDelinkObjects(prims, this); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return true; |             return true; | ||||||
|  | @ -11820,4 +11820,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP | ||||||
|             OutPacket(dialog, ThrottleOutPacketType.Task); |             OutPacket(dialog, ThrottleOutPacketType.Task); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1721,7 +1721,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions | ||||||
|             DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |             DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||||||
|             if (m_bypassPermissions) return m_bypassPermissionsValue; |             if (m_bypassPermissions) return m_bypassPermissionsValue; | ||||||
| 
 | 
 | ||||||
|             return true; |             return GenericObjectPermission(editorID, objectID, false); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private bool CanDelinkObject(UUID userID, UUID objectID) |         private bool CanDelinkObject(UUID userID, UUID objectID) | ||||||
|  | @ -1729,7 +1729,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions | ||||||
|             DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |             DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||||||
|             if (m_bypassPermissions) return m_bypassPermissionsValue; |             if (m_bypassPermissions) return m_bypassPermissionsValue; | ||||||
| 
 | 
 | ||||||
|             return true; |             return GenericObjectPermission(editorID, objectID, false); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) |         private bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) | ||||||
|  | @ -1894,4 +1894,4 @@ namespace OpenSim.Region.CoreModules.World.Permissions | ||||||
|             return(false); |             return(false); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -69,7 +69,7 @@ namespace OpenSim.Region.DataSnapshot.Providers | ||||||
|                 byte RayEndIsIntersection) { this.Stale = true; }; |                 byte RayEndIsIntersection) { this.Stale = true; }; | ||||||
|             client.OnLinkObjects += delegate (IClientAPI remoteClient, uint parent, List<uint> children) |             client.OnLinkObjects += delegate (IClientAPI remoteClient, uint parent, List<uint> children) | ||||||
|                 { this.Stale = true; }; |                 { this.Stale = true; }; | ||||||
|             client.OnDelinkObjects += delegate(List<uint> primIds) { this.Stale = true; }; |             client.OnDelinkObjects += delegate(List<uint> primIds, IClientAPI clientApi) { this.Stale = true; }; | ||||||
|             client.OnGrabUpdate += delegate(UUID objectID, Vector3 offset, Vector3 grapPos, |             client.OnGrabUpdate += delegate(UUID objectID, Vector3 offset, Vector3 grapPos, | ||||||
|                 IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs) { this.Stale = true; }; |                 IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs) { this.Stale = true; }; | ||||||
|             client.OnObjectAttach += delegate(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, |             client.OnObjectAttach += delegate(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, | ||||||
|  |  | ||||||
|  | @ -1941,5 +1941,55 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 part.GetProperties(remoteClient); |                 part.GetProperties(remoteClient); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public void DelinkObjects(List<uint> primIds, IClientAPI client) | ||||||
|  |         { | ||||||
|  |             List<SceneObjectPart> parts = new List<SceneObjectPart>(); | ||||||
|  | 
 | ||||||
|  |             foreach (uint localID in primIds) | ||||||
|  |             { | ||||||
|  |                 SceneObjectPart part = GetSceneObjectPart(localID); | ||||||
|  | 
 | ||||||
|  |                 if (part == null) | ||||||
|  |                     continue; | ||||||
|  | 
 | ||||||
|  |                 if (Permissions.CanDelinkObject(client.AgentId, part.ParentGroup.RootPart.UUID)) | ||||||
|  |                     parts.Add(part); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             m_sceneGraph.DelinkObjects(parts); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void LinkObjects(IClientAPI client, uint parentPrimId, List<uint> childPrimIds) | ||||||
|  |         { | ||||||
|  |             List<UUID> owners = new List<UUID>(); | ||||||
|  | 
 | ||||||
|  |             List<SceneObjectPart> children = new List<SceneObjectPart>(); | ||||||
|  |             SceneObjectPart root = GetSceneObjectPart(parentPrimId); | ||||||
|  | 
 | ||||||
|  |             if (Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID)) | ||||||
|  |                 return; | ||||||
|  | 
 | ||||||
|  |             foreach (uint localID in childPrimIds) | ||||||
|  |             { | ||||||
|  |                 SceneObjectPart part = GetSceneObjectPart(localID); | ||||||
|  | 
 | ||||||
|  |                 if (part == null) | ||||||
|  |                     continue; | ||||||
|  | 
 | ||||||
|  |                 if (!owners.Contains(part.OwnerID)) | ||||||
|  |                     owners.Add(part.OwnerID); | ||||||
|  | 
 | ||||||
|  |                 if (Permissions.CanLinkObject(client.AgentId, part.ParentGroup.RootPart.UUID)) | ||||||
|  |                     children.Add(part); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // Must be all one owner | ||||||
|  |             // | ||||||
|  |             if (owners.Count > 1) | ||||||
|  |                 return; | ||||||
|  | 
 | ||||||
|  |             m_sceneGraph.LinkObjects(root, children); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2721,8 +2721,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             client.OnObjectName += m_sceneGraph.PrimName; |             client.OnObjectName += m_sceneGraph.PrimName; | ||||||
|             client.OnObjectClickAction += m_sceneGraph.PrimClickAction; |             client.OnObjectClickAction += m_sceneGraph.PrimClickAction; | ||||||
|             client.OnObjectMaterial += m_sceneGraph.PrimMaterial; |             client.OnObjectMaterial += m_sceneGraph.PrimMaterial; | ||||||
|             client.OnLinkObjects += m_sceneGraph.LinkObjects; |             client.OnLinkObjects += LinkObjects; | ||||||
|             client.OnDelinkObjects += m_sceneGraph.DelinkObjects; |             client.OnDelinkObjects += DelinkObjects; | ||||||
|             client.OnObjectDuplicate += m_sceneGraph.DuplicateObject; |             client.OnObjectDuplicate += m_sceneGraph.DuplicateObject; | ||||||
|             client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay; |             client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay; | ||||||
|             client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; |             client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; | ||||||
|  | @ -2878,8 +2878,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             client.OnObjectName -= m_sceneGraph.PrimName; |             client.OnObjectName -= m_sceneGraph.PrimName; | ||||||
|             client.OnObjectClickAction -= m_sceneGraph.PrimClickAction; |             client.OnObjectClickAction -= m_sceneGraph.PrimClickAction; | ||||||
|             client.OnObjectMaterial -= m_sceneGraph.PrimMaterial; |             client.OnObjectMaterial -= m_sceneGraph.PrimMaterial; | ||||||
|             client.OnLinkObjects -= m_sceneGraph.LinkObjects; |             client.OnLinkObjects -= LinkObjects; | ||||||
|             client.OnDelinkObjects -= m_sceneGraph.DelinkObjects; |             client.OnDelinkObjects -= DelinkObjects; | ||||||
|             client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject; |             client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject; | ||||||
|             client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay; |             client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay; | ||||||
|             client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags; |             client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags; | ||||||
|  |  | ||||||
|  | @ -1463,20 +1463,21 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         /// <param name="client"></param> |         /// <param name="client"></param> | ||||||
|         /// <param name="parentPrim"></param> |         /// <param name="parentPrim"></param> | ||||||
|         /// <param name="childPrims"></param> |         /// <param name="childPrims"></param> | ||||||
|         protected internal void LinkObjects(IClientAPI client, uint parentPrimId, List<uint> childPrimIds) |         protected internal void LinkObjects(SceneObjectPart root, List<SceneObjectPart> children) | ||||||
|         { |         { | ||||||
|             Monitor.Enter(m_updateLock); |             Monitor.Enter(m_updateLock); | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 SceneObjectGroup parentGroup = GetGroupByPrim(parentPrimId); |                 SceneObjectGroup parentGroup = root.ParentGroup; | ||||||
| 
 | 
 | ||||||
|                 List<SceneObjectGroup> childGroups = new List<SceneObjectGroup>(); |                 List<SceneObjectGroup> childGroups = new List<SceneObjectGroup>(); | ||||||
|                 if (parentGroup != null) |                 if (parentGroup != null) | ||||||
|                 { |                 { | ||||||
|                     // We do this in reverse to get the link order of the prims correct |                     // We do this in reverse to get the link order of the prims correct | ||||||
|                     for (int i = childPrimIds.Count - 1; i >= 0; i--) |                     for (int i = children.Count - 1; i >= 0; i--) | ||||||
|                     { |                     { | ||||||
|                         SceneObjectGroup child = GetGroupByPrim(childPrimIds[i]); |                         SceneObjectGroup child = children[i].ParentGroup; | ||||||
|  | 
 | ||||||
|                         if (child != null) |                         if (child != null) | ||||||
|                         { |                         { | ||||||
|                             // Make sure no child prim is set for sale |                             // Make sure no child prim is set for sale | ||||||
|  | @ -1509,17 +1510,6 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 parentGroup.HasGroupChanged = true; |                 parentGroup.HasGroupChanged = true; | ||||||
|                 parentGroup.ScheduleGroupForFullUpdate(); |                 parentGroup.ScheduleGroupForFullUpdate(); | ||||||
|                  |                  | ||||||
| //                if (client != null) |  | ||||||
| //                { |  | ||||||
| //                    parentGroup.GetProperties(client); |  | ||||||
| //                } |  | ||||||
| //                else |  | ||||||
| //                { |  | ||||||
| //                    foreach (ScenePresence p in GetScenePresences()) |  | ||||||
| //                    { |  | ||||||
| //                        parentGroup.GetProperties(p.ControllingClient); |  | ||||||
| //                    } |  | ||||||
| //                } |  | ||||||
|             } |             } | ||||||
|             finally |             finally | ||||||
|             { |             { | ||||||
|  | @ -1531,12 +1521,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         /// Delink a linkset |         /// Delink a linkset | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="prims"></param> |         /// <param name="prims"></param> | ||||||
|         protected internal void DelinkObjects(List<uint> primIds) |         protected internal void DelinkObjects(List<SceneObjectPart> prims) | ||||||
|         { |  | ||||||
|             DelinkObjects(primIds, true); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         protected internal void DelinkObjects(List<uint> primIds, bool sendEvents) |  | ||||||
|         { |         { | ||||||
|             Monitor.Enter(m_updateLock); |             Monitor.Enter(m_updateLock); | ||||||
|             try |             try | ||||||
|  | @ -1546,9 +1531,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 List<SceneObjectGroup> affectedGroups = new List<SceneObjectGroup>(); |                 List<SceneObjectGroup> affectedGroups = new List<SceneObjectGroup>(); | ||||||
|                 // Look them all up in one go, since that is comparatively expensive |                 // Look them all up in one go, since that is comparatively expensive | ||||||
|                 // |                 // | ||||||
|                 foreach (uint primID in primIds) |                 foreach (SceneObjectPart part in prims) | ||||||
|                 { |                 { | ||||||
|                     SceneObjectPart part = m_parentScene.GetSceneObjectPart(primID); |  | ||||||
|                     if (part != null) |                     if (part != null) | ||||||
|                     { |                     { | ||||||
|                         if (part.ParentGroup.Children.Count != 1) // Skip single |                         if (part.ParentGroup.Children.Count != 1) // Skip single | ||||||
|  | @ -1563,17 +1547,13 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                                 affectedGroups.Add(group); |                                 affectedGroups.Add(group); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         m_log.ErrorFormat("Viewer requested unlink of nonexistent part {0}", primID); |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 foreach (SceneObjectPart child in childParts) |                 foreach (SceneObjectPart child in childParts) | ||||||
|                 { |                 { | ||||||
|                     // Unlink all child parts from their groups |                     // Unlink all child parts from their groups | ||||||
|                     // |                     // | ||||||
|                     child.ParentGroup.DelinkFromGroup(child, sendEvents); |                     child.ParentGroup.DelinkFromGroup(child, true); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 foreach (SceneObjectPart root in rootParts) |                 foreach (SceneObjectPart root in rootParts) | ||||||
|  | @ -1628,12 +1608,9 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                             List<uint> linkIDs = new List<uint>(); |                             List<uint> linkIDs = new List<uint>(); | ||||||
| 
 | 
 | ||||||
|                             foreach (SceneObjectPart newChild in newSet) |                             foreach (SceneObjectPart newChild in newSet) | ||||||
|                             { |  | ||||||
|                                 newChild.UpdateFlag = 0; |                                 newChild.UpdateFlag = 0; | ||||||
|                                 linkIDs.Add(newChild.LocalId); |  | ||||||
|                             } |  | ||||||
| 
 | 
 | ||||||
|                             LinkObjects(null, newRoot.LocalId, linkIDs); |                             LinkObjects(newRoot, newSet); | ||||||
|                             if (!affectedGroups.Contains(newRoot.ParentGroup)) |                             if (!affectedGroups.Contains(newRoot.ParentGroup)) | ||||||
|                                 affectedGroups.Add(newRoot.ParentGroup); |                                 affectedGroups.Add(newRoot.ParentGroup); | ||||||
|                         } |                         } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Melanie
						Melanie