update folded permitions if taking from world, or after unfold

httptests
UbitUmarov 2017-04-29 22:09:45 +01:00
parent 04117d9f75
commit 522695c821
4 changed files with 30 additions and 23 deletions

View File

@ -65,9 +65,9 @@ namespace OpenSim.Framework
return str; 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 if(folded == 0) // invalid we need to ignore
return; return;
@ -75,15 +75,15 @@ namespace OpenSim.Framework
folded &= (uint)PermissionMask.UnfoldedMask; // not really necessary but well folded &= (uint)PermissionMask.UnfoldedMask; // not really necessary but well
folded |= ~(uint)PermissionMask.UnfoldedMask; folded |= ~(uint)PermissionMask.UnfoldedMask;
uint tmp = target; uint tmp = targetPerms;
tmp &= folded; tmp &= folded;
target = tmp; targetPerms = tmp;
} }
// do not touch MOD // 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 if(folded == 0) // invalid we need to ignore
return; return;
@ -96,5 +96,21 @@ namespace OpenSim.Framework
target = tmp; 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;
}
} }
} }

View File

@ -594,16 +594,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
uint basePerms = effectivePerms & so.RootPart.NextOwnerMask; uint basePerms = effectivePerms & so.RootPart.NextOwnerMask;
// rebuild folded perms since we don't have then on inworld objects // rebuild folded perms since we don't have then on inworld objects
// possible existent ones where already unfolded basePerms = PermissionsUtil.FixAndFoldPermissions(basePerms);
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);
item.BasePermissions = basePerms; item.BasePermissions = basePerms;
item.CurrentPermissions = item.BasePermissions; item.CurrentPermissions = item.BasePermissions;
@ -1146,9 +1137,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if ((item.BasePermissions & (uint)PermissionMask.FoldedMask) != 0) if ((item.BasePermissions & (uint)PermissionMask.FoldedMask) != 0)
{ {
// We have permissions stored there so use them // We have permissions stored there so use them
part.NextOwnerMask = ((item.BasePermissions & 7) << 13); part.NextOwnerMask = ((item.BasePermissions & (uint)PermissionMask.FoldedMask) << (int)PermissionMask.FoldingShift);
if ((item.BasePermissions & (uint)PermissionMask.FoldedExport) != 0)
part.NextOwnerMask |= (uint)PermissionMask.Export;
part.NextOwnerMask |= (uint)PermissionMask.Move; part.NextOwnerMask |= (uint)PermissionMask.Move;
} }
else else

View File

@ -210,9 +210,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
PermissionsUtil.ApplyFoldedPermissions(perms, ref perms); 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.CurrentPermissions = item.BasePermissions;
item.NextPermissions = part.NextOwnerMask; item.NextPermissions = part.NextOwnerMask;

View File

@ -1272,14 +1272,16 @@ namespace OpenSim.Region.Framework.Scenes
{ {
uint perms = agentItem.BasePermissions; uint perms = agentItem.BasePermissions;
PermissionsUtil.ApplyFoldedPermissions(taskItem.CurrentPermissions, ref perms ); PermissionsUtil.ApplyFoldedPermissions(taskItem.CurrentPermissions, ref perms );
agentItem.BasePermissions = perms; // perms |= (uint)PermissionMask.Move;
// agentItem.BasePermissions = perms;
agentItem.BasePermissions = PermissionsUtil.FixAndFoldPermissions(perms);
} }
else else
agentItem.BasePermissions &= taskItem.CurrentPermissions; agentItem.BasePermissions &= taskItem.CurrentPermissions;
// always unlock // always unlock
agentItem.BasePermissions |= (uint)PermissionMask.Move; agentItem.BasePermissions |= (uint)PermissionMask.Move;
agentItem.CurrentPermissions = agentItem.BasePermissions; agentItem.CurrentPermissions = agentItem.BasePermissions;
agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;