diff options
author | Justin Clark-Casey (justincc) | 2012-05-23 01:58:10 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-05-23 01:58:10 +0100 |
commit | ff429a259b41f1205a6b153bb6da383d9a9f5daf (patch) | |
tree | 70d7a495cc6d846ef593f8bb0ed608c31b78f079 /OpenSim/Region/CoreModules/Framework/InventoryAccess | |
parent | Setting 'in transit' on a local teleport as well as inter-region teleports. (diff) | |
download | opensim-SC_OLD-ff429a259b41f1205a6b153bb6da383d9a9f5daf.zip opensim-SC_OLD-ff429a259b41f1205a6b153bb6da383d9a9f5daf.tar.gz opensim-SC_OLD-ff429a259b41f1205a6b153bb6da383d9a9f5daf.tar.bz2 opensim-SC_OLD-ff429a259b41f1205a6b153bb6da383d9a9f5daf.tar.xz |
Fix bug where an avatar that had an object they owned attached through llAttachToAvatar() or osForceAttachToAvatar() would wrongly have next permissions come into play when they detached that object and rezzed it in scene.
This is because the attachments module code was setting the 'object slam' bit by using PermissionMask.All
Solution here is to route the attachment item creation call through the existing inventory code in BasicInventoryAccessModule rather than copy/pasted code in AttachmentsModule itself.
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 8171487..f219d4c 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -295,9 +295,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
295 | return UUID.Zero; | 295 | return UUID.Zero; |
296 | } | 296 | } |
297 | 297 | ||
298 | public virtual UUID CopyToInventory(DeRezAction action, UUID folderID, | 298 | public virtual List<InventoryItemBase> CopyToInventory( |
299 | List<SceneObjectGroup> objectGroups, IClientAPI remoteClient) | 299 | DeRezAction action, UUID folderID, |
300 | List<SceneObjectGroup> objectGroups, IClientAPI remoteClient, bool asAttachment) | ||
300 | { | 301 | { |
302 | List<InventoryItemBase> copiedItems = new List<InventoryItemBase>(); | ||
303 | |||
301 | Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>(); | 304 | Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>(); |
302 | 305 | ||
303 | if (CoalesceMultipleObjectsToInventory) | 306 | if (CoalesceMultipleObjectsToInventory) |
@@ -324,16 +327,16 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
324 | } | 327 | } |
325 | } | 328 | } |
326 | 329 | ||
327 | // This is method scoped and will be returned. It will be the | 330 | // m_log.DebugFormat( |
328 | // last created asset id | 331 | // "[INVENTORY ACCESS MODULE]: Copying {0} object bundles to folder {1} action {2} for {3}", |
329 | UUID assetID = UUID.Zero; | 332 | // bundlesToCopy.Count, folderID, action, remoteClient.Name); |
330 | 333 | ||
331 | // Each iteration is really a separate asset being created, | 334 | // Each iteration is really a separate asset being created, |
332 | // with distinct destinations as well. | 335 | // with distinct destinations as well. |
333 | foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values) | 336 | foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values) |
334 | assetID = CopyBundleToInventory(action, folderID, bundle, remoteClient); | 337 | copiedItems.Add(CopyBundleToInventory(action, folderID, bundle, remoteClient, asAttachment)); |
335 | 338 | ||
336 | return assetID; | 339 | return copiedItems; |
337 | } | 340 | } |
338 | 341 | ||
339 | /// <summary> | 342 | /// <summary> |
@@ -344,12 +347,13 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
344 | /// <param name="folderID"></param> | 347 | /// <param name="folderID"></param> |
345 | /// <param name="objlist"></param> | 348 | /// <param name="objlist"></param> |
346 | /// <param name="remoteClient"></param> | 349 | /// <param name="remoteClient"></param> |
347 | /// <returns></returns> | 350 | /// <param name="asAttachment">Should be true if the bundle is being copied as an attachment. This prevents |
348 | protected UUID CopyBundleToInventory( | 351 | /// attempted serialization of any script state which would abort any operating scripts.</param> |
349 | DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient) | 352 | /// <returns>The inventory item created by the copy</returns> |
353 | protected InventoryItemBase CopyBundleToInventory( | ||
354 | DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient, | ||
355 | bool asAttachment) | ||
350 | { | 356 | { |
351 | UUID assetID = UUID.Zero; | ||
352 | |||
353 | CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); | 357 | CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); |
354 | Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); | 358 | Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); |
355 | 359 | ||
@@ -385,18 +389,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
385 | 389 | ||
386 | string itemXml; | 390 | string itemXml; |
387 | 391 | ||
392 | // If we're being called from a script, then trying to serialize that same script's state will not complete | ||
393 | // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if | ||
394 | // the client/server crashes rather than logging out normally, the attachment's scripts will resume | ||
395 | // without state on relog. Arguably, this is what we want anyway. | ||
388 | if (objlist.Count > 1) | 396 | if (objlist.Count > 1) |
389 | itemXml = CoalescedSceneObjectsSerializer.ToXml(coa); | 397 | itemXml = CoalescedSceneObjectsSerializer.ToXml(coa, !asAttachment); |
390 | else | 398 | else |
391 | itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]); | 399 | itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment); |
392 | 400 | ||
393 | // Restore the position of each group now that it has been stored to inventory. | 401 | // Restore the position of each group now that it has been stored to inventory. |
394 | foreach (SceneObjectGroup objectGroup in objlist) | 402 | foreach (SceneObjectGroup objectGroup in objlist) |
395 | objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; | 403 | objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; |
396 | 404 | ||
397 | InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); | 405 | InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); |
406 | |||
407 | // m_log.DebugFormat( | ||
408 | // "[INVENTORY ACCESS MODULE]: Created item is {0}", | ||
409 | // item != null ? item.ID.ToString() : "NULL"); | ||
410 | |||
398 | if (item == null) | 411 | if (item == null) |
399 | return UUID.Zero; | 412 | return null; |
400 | 413 | ||
401 | // Can't know creator is the same, so null it in inventory | 414 | // Can't know creator is the same, so null it in inventory |
402 | if (objlist.Count > 1) | 415 | if (objlist.Count > 1) |
@@ -406,7 +419,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
406 | } | 419 | } |
407 | else | 420 | else |
408 | { | 421 | { |
409 | item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); | 422 | item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); |
423 | item.CreatorData = objlist[0].RootPart.CreatorData; | ||
410 | item.SaleType = objlist[0].RootPart.ObjectSaleType; | 424 | item.SaleType = objlist[0].RootPart.ObjectSaleType; |
411 | item.SalePrice = objlist[0].RootPart.SalePrice; | 425 | item.SalePrice = objlist[0].RootPart.SalePrice; |
412 | } | 426 | } |
@@ -419,8 +433,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
419 | objlist[0].OwnerID.ToString()); | 433 | objlist[0].OwnerID.ToString()); |
420 | m_Scene.AssetService.Store(asset); | 434 | m_Scene.AssetService.Store(asset); |
421 | 435 | ||
422 | item.AssetID = asset.FullID; | 436 | item.AssetID = asset.FullID; |
423 | assetID = asset.FullID; | ||
424 | 437 | ||
425 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | 438 | if (DeRezAction.SaveToExistingUserInventoryItem == action) |
426 | { | 439 | { |
@@ -453,9 +466,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
453 | 466 | ||
454 | // This is a hook to do some per-asset post-processing for subclasses that need that | 467 | // This is a hook to do some per-asset post-processing for subclasses that need that |
455 | if (remoteClient != null) | 468 | if (remoteClient != null) |
456 | ExportAsset(remoteClient.AgentId, assetID); | 469 | ExportAsset(remoteClient.AgentId, asset.FullID); |
457 | 470 | ||
458 | return assetID; | 471 | return item; |
459 | } | 472 | } |
460 | 473 | ||
461 | protected virtual void ExportAsset(UUID agentID, UUID assetID) | 474 | protected virtual void ExportAsset(UUID agentID, UUID assetID) |
@@ -643,7 +656,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
643 | { | 656 | { |
644 | // Catch all. Use lost & found | 657 | // Catch all. Use lost & found |
645 | // | 658 | // |
646 | |||
647 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | 659 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); |
648 | } | 660 | } |
649 | } | 661 | } |
@@ -964,8 +976,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
964 | 976 | ||
965 | so.FromFolderID = item.Folder; | 977 | so.FromFolderID = item.Folder; |
966 | 978 | ||
967 | // Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", | 979 | // m_log.DebugFormat( |
968 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); | 980 | // "[INVENTORY ACCESS MODULE]: rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", |
981 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); | ||
969 | 982 | ||
970 | if ((rootPart.OwnerID != item.Owner) || | 983 | if ((rootPart.OwnerID != item.Owner) || |
971 | (item.CurrentPermissions & 16) != 0) | 984 | (item.CurrentPermissions & 16) != 0) |