From 522695c821c9f68d6c13533220de428f0d036dd7 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 29 Apr 2017 22:09:45 +0100 Subject: [PATCH] update folded permitions if taking from world, or after unfold --- OpenSim/Framework/PermissionsUtil.cs | 28 +++++++++++++++---- .../InventoryAccess/InventoryAccessModule.cs | 15 ++-------- .../World/Objects/BuySell/BuySellModule.cs | 4 +-- .../Framework/Scenes/Scene.Inventory.cs | 6 ++-- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/OpenSim/Framework/PermissionsUtil.cs b/OpenSim/Framework/PermissionsUtil.cs index a7f933c6cd..39ccaba2ff 100644 --- a/OpenSim/Framework/PermissionsUtil.cs +++ b/OpenSim/Framework/PermissionsUtil.cs @@ -65,9 +65,9 @@ namespace OpenSim.Framework return str; } - public static void ApplyFoldedPermissions(uint source, ref uint target) + public static void ApplyFoldedPermissions(uint foldedSourcePerms, ref uint targetPerms) { - uint folded = source & (uint)PermissionMask.FoldedMask; + uint folded = foldedSourcePerms & (uint)PermissionMask.FoldedMask; if(folded == 0) // invalid we need to ignore return; @@ -75,15 +75,15 @@ namespace OpenSim.Framework folded &= (uint)PermissionMask.UnfoldedMask; // not really necessary but well folded |= ~(uint)PermissionMask.UnfoldedMask; - uint tmp = target; + uint tmp = targetPerms; tmp &= folded; - target = tmp; + targetPerms = tmp; } // do not touch MOD - public static void ApplyNoModFoldedPermissions(uint source, ref uint target) + public static void ApplyNoModFoldedPermissions(uint foldedSourcePerms, ref uint target) { - uint folded = source & (uint)PermissionMask.FoldedMask; + uint folded = foldedSourcePerms & (uint)PermissionMask.FoldedMask; if(folded == 0) // invalid we need to ignore return; @@ -96,5 +96,21 @@ namespace OpenSim.Framework target = tmp; } + public static uint FixAndFoldPermissions(uint perms) + { + uint tmp = perms; + + // C & T rule + if((tmp & (uint)(PermissionMask.Copy | PermissionMask.Transfer)) == 0) + tmp |= (uint)PermissionMask.Transfer; + + // unlock + tmp |= (uint)PermissionMask.Move; + + tmp &= ~(uint)PermissionMask.FoldedMask; + tmp |= ((tmp >> (int)PermissionMask.FoldingShift) & (uint)PermissionMask.FoldedMask); + + return tmp; + } } } diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index bce0610fd7..d4f9c16e7d 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -594,16 +594,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess uint basePerms = effectivePerms & so.RootPart.NextOwnerMask; // rebuild folded perms since we don't have then on inworld objects - // possible existent ones where already unfolded - - if((basePerms & (uint)PermissionMask.Copy) == 0) - basePerms |= (uint)PermissionMask.Transfer; - - // unlock - basePerms |= (uint)PermissionMask.Move; - - basePerms &= ~(uint)PermissionMask.FoldedMask; - basePerms |= ((basePerms >> (int)PermissionMask.FoldingShift) & (uint)PermissionMask.FoldedMask); + basePerms = PermissionsUtil.FixAndFoldPermissions(basePerms); item.BasePermissions = basePerms; item.CurrentPermissions = item.BasePermissions; @@ -1146,9 +1137,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess if ((item.BasePermissions & (uint)PermissionMask.FoldedMask) != 0) { // We have permissions stored there so use them - part.NextOwnerMask = ((item.BasePermissions & 7) << 13); - if ((item.BasePermissions & (uint)PermissionMask.FoldedExport) != 0) - part.NextOwnerMask |= (uint)PermissionMask.Export; + part.NextOwnerMask = ((item.BasePermissions & (uint)PermissionMask.FoldedMask) << (int)PermissionMask.FoldingShift); part.NextOwnerMask |= (uint)PermissionMask.Move; } else diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs index 84f33d1bba..af53aa3ef0 100644 --- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -210,9 +210,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell PermissionsUtil.ApplyFoldedPermissions(perms, ref perms); - item.BasePermissions = perms & part.NextOwnerMask; + perms &= part.NextOwnerMask; -// we need to rebuild folded here + item.BasePermissions = PermissionsUtil.FixAndFoldPermissions(perms); item.CurrentPermissions = item.BasePermissions; item.NextPermissions = part.NextOwnerMask; diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5e19a8ae1e..054957157a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -1272,14 +1272,16 @@ namespace OpenSim.Region.Framework.Scenes { uint perms = agentItem.BasePermissions; PermissionsUtil.ApplyFoldedPermissions(taskItem.CurrentPermissions, ref perms ); - agentItem.BasePermissions = perms; +// perms |= (uint)PermissionMask.Move; +// agentItem.BasePermissions = perms; + agentItem.BasePermissions = PermissionsUtil.FixAndFoldPermissions(perms); } else agentItem.BasePermissions &= taskItem.CurrentPermissions; // always unlock agentItem.BasePermissions |= (uint)PermissionMask.Move; - + agentItem.CurrentPermissions = agentItem.BasePermissions; agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;