diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 2408f377..1195ab97 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -710,6 +710,9 @@ private bool FilterPart(SceneObjectPart part, UUID ownerID) { bool filtered = false; + if (isWhitelistedObject(part)) + return false; + if (m_allowUserReassignment) { if (part.OwnerID != ownerID) @@ -822,6 +825,59 @@ private bool FilterItem(SceneObjectPart part, TaskInventoryItem item, UUID owner return filtered; } + // Special-case overrides for common items that should be allowed but are not normally allowed by creator or owner + private UUID ZAUBER = new UUID("7b772b49-0dde-4e08-a8d7-6c26e09a6842"); + const uint FULL_PERM = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify); + private bool isFullPerm(uint perms) + { + return ((perms & FULL_PERM) == FULL_PERM); + } + private bool isWhitelistedItem(TaskInventoryItem item) + { + if (item.Name.StartsWith("LiteRezzer", StringComparison.InvariantCultureIgnoreCase)) + return true; + + if (item.CreatorID == ZAUBER) + { + if (item.Name.ToLower().Trim().Equals("window beam")) + return true; + if (item.Name.ToLower().Trim().Equals("shutter")) + return true; + if (item.Name.ToUpper().Contains("OPTI")) + return true; + if (item.Description.ToUpper().Contains("OPTI")) + return true; + if (item.Name.ToUpper().Contains("SORTER") && isFullPerm(item.CurrentPermissions)) + return true; + } + + // No other special cases. + return false; + } + + private bool isWhitelistedObject(SceneObjectPart part) + { + if (part.Name.StartsWith("LiteRezzer", StringComparison.InvariantCultureIgnoreCase)) + return true; + + if (part.CreatorID == ZAUBER) + { + if (part.Name.ToLower().Equals("window beam")) + return true; + if (part.Name.ToLower().Equals("shutter")) + return true; + if (part.Name.ToUpper().Contains("OPTI")) + return true; + if (part.Description.ToUpper().Contains("OPTI")) + return true; + if (part.ParentGroup.Name.ToUpper().Contains("SORTER") && isFullPerm(part.ParentGroup.GetEffectivePermissions(false))) + return true; + } + + // No other special cases. + return false; + } + // depth==0 when it's the top-level object (no need to reserialize changes as asset) private bool FilterContents(SceneObjectPart part, UUID ownerID, int depth) { @@ -869,6 +925,13 @@ private bool FilterContents(SceneObjectPart part, UUID ownerID, int depth) m_keptItem++; } else + if (isWhitelistedItem(item)) + { + if (m_debugOars >= 2) + m_log.InfoFormat("[ARCHIVER]: Item '{0}' in part '{1}' by creator {2} is a whitelisted item.", item.Name, part.Name, item.CreatorID); + m_keptItem++; + } + else if (MustReplaceByAsset(item.AssetID, ownerID, item.CreatorID)) { if (m_debugOars >= 1) diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index 4b04bf24..3cd2622f 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs @@ -80,10 +80,12 @@ public ArchiveWriteRequestExecution( protected internal void ReceivedAllAssets( ICollection assetsFoundUuids, ICollection assetsNotFoundUuids) { + /* foreach (UUID uuid in assetsNotFoundUuids) { m_log.DebugFormat("[ARCHIVER]: Could not find asset {0}", uuid); } + */ m_log.InfoFormat( "[ARCHIVER]: Received {0} of {1} assets requested", diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 3f776630..170b2ad7 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs @@ -174,9 +174,15 @@ public void GatherAssetUuids(SceneObjectGroup sceneObject, IDictionary