move deep effective permissions aggregation to first time use and not on changes. There flag it is need with InvalidateDeepEffectivePerms(). Add config options PropagateGroupShareOutwards and PropagateAnyOneOutwards
parent
d62aed7f46
commit
3a8dd24fd1
OpenSim
Region
CoreModules/Framework/InventoryAccess
Tests/Common/Helpers
|
@ -1182,7 +1182,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
}
|
||||
|
||||
rootPart.TrimPermissions();
|
||||
so.AggregateDeepPerms();
|
||||
so.InvalidateDeepEffectivePerms();
|
||||
|
||||
if (isAttachment)
|
||||
so.FromItemID = item.ID;
|
||||
|
|
|
@ -238,6 +238,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public bool LegacySitOffsets = true;
|
||||
|
||||
/// <summary>
|
||||
/// set false to not propagare group rights outwards as legacy did
|
||||
/// </summary>
|
||||
public bool PropagateGroupShareOutwards = true;
|
||||
|
||||
/// <summary>
|
||||
/// set false to not propagare Everyone rights outwards as legacy did
|
||||
/// </summary>
|
||||
public bool PropagateAnyOneOutwards = true;
|
||||
|
||||
/// <summary>
|
||||
/// Can avatars cross from and to this region?
|
||||
/// </summary>
|
||||
|
@ -978,7 +988,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance);
|
||||
m_maxRegionViewDistance = startupConfig.GetFloat("MaxRegionsViewDistance", m_maxRegionViewDistance);
|
||||
|
||||
// old versions compatibility
|
||||
LegacySitOffsets = startupConfig.GetBoolean("LegacySitOffsets", LegacySitOffsets);
|
||||
PropagateGroupShareOutwards = startupConfig.GetBoolean("PropagateGroupShareOutwards", PropagateGroupShareOutwards);
|
||||
PropagateAnyOneOutwards = startupConfig.GetBoolean("PropagateAnyOneOutwards", PropagateAnyOneOutwards);
|
||||
|
||||
if (m_defaultDrawDistance > m_maxDrawDistance)
|
||||
m_defaultDrawDistance = m_maxDrawDistance;
|
||||
|
@ -2390,8 +2403,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
EventManager.TriggerOnSceneObjectLoaded(group);
|
||||
SceneObjectPart rootPart = group.GetPart(group.UUID);
|
||||
rootPart.Flags &= ~PrimFlags.Scripted;
|
||||
group.AggregateDeepPerms();
|
||||
|
||||
rootPart.TrimPermissions();
|
||||
group.InvalidateDeepEffectivePerms();
|
||||
|
||||
// Don't do this here - it will get done later on when sculpt data is loaded.
|
||||
// group.CheckSculptAndLoad();
|
||||
|
@ -2662,7 +2676,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (UserManagementModule != null)
|
||||
sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID);
|
||||
|
||||
sceneObject.AggregateDeepPerms();
|
||||
sceneObject.InvalidateDeepEffectivePerms();;
|
||||
sceneObject.ScheduleGroupForFullUpdate();
|
||||
|
||||
return sceneObject;
|
||||
|
|
|
@ -343,7 +343,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
sceneObject.ForceInventoryPersistence();
|
||||
sceneObject.HasGroupChanged = true;
|
||||
}
|
||||
sceneObject.AggregateDeepPerms();
|
||||
sceneObject.InvalidateDeepEffectivePerms();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -254,13 +254,26 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// new test code, to place in better place later
|
||||
private object m_PermissionsLock = new object();
|
||||
private bool m_EffectivePermsInvalid = true;
|
||||
private bool m_DeepEffectivePermsInvalid = true;
|
||||
|
||||
// should called when parts chanced by their contents did not, so we know their cacche is valid
|
||||
// in case of doubt call InvalidateDeepEffectivePerms(), it only costs a bit more cpu time
|
||||
public void InvalidateEffectivePerms()
|
||||
{
|
||||
lock(m_PermissionsLock)
|
||||
m_EffectivePermsInvalid = true;
|
||||
}
|
||||
|
||||
// should called when parts chanced and their contents where accounted for
|
||||
public void InvalidateDeepEffectivePerms()
|
||||
{
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
m_DeepEffectivePermsInvalid = true;
|
||||
m_EffectivePermsInvalid = true;
|
||||
}
|
||||
}
|
||||
|
||||
private uint m_EffectiveEveryOnePerms;
|
||||
public uint EffectiveEveryOnePerms
|
||||
{
|
||||
|
@ -317,79 +330,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
// aggregates perms scanning parts and their contents
|
||||
// AggregatePerms does same using cached parts content perms
|
||||
public void AggregateDeepPerms()
|
||||
{
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
// aux
|
||||
const uint allmask = (uint)PermissionMask.AllEffective;
|
||||
const uint movemodmask = (uint)(PermissionMask.Move | PermissionMask.Modify);
|
||||
const uint copytransfermask = (uint)(PermissionMask.Copy | PermissionMask.Transfer);
|
||||
|
||||
uint basePerms = (RootPart.BaseMask & allmask) | (uint)PermissionMask.Move;
|
||||
bool noBaseTransfer = (basePerms & (uint)PermissionMask.Transfer) == 0;
|
||||
|
||||
uint rootOwnerPerms = RootPart.OwnerMask;
|
||||
uint owner = rootOwnerPerms;
|
||||
uint rootGroupPerms = RootPart.GroupMask;
|
||||
uint group = rootGroupPerms;
|
||||
uint rootEveryonePerms = RootPart.EveryoneMask;
|
||||
uint everyone = rootEveryonePerms;
|
||||
|
||||
// date is time of writing april 30th 2017
|
||||
bool newObject = (RootPart.CreationDate == 0 || RootPart.CreationDate > 1493574994);
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
part.AggregateInnerPerms();
|
||||
owner &= part.AggregatedInnerOwnerPerms;
|
||||
group &= part.AggregatedInnerGroupPerms;
|
||||
if(newObject)
|
||||
everyone &= part.AggregatedInnerEveryonePerms;
|
||||
}
|
||||
// recover modify and move
|
||||
rootOwnerPerms &= movemodmask;
|
||||
owner |= rootOwnerPerms;
|
||||
if((owner & copytransfermask) == 0)
|
||||
owner |= (uint)PermissionMask.Transfer;
|
||||
|
||||
owner &= basePerms;
|
||||
m_EffectiveOwnerPerms = owner;
|
||||
uint ownertransfermask = owner & (uint)PermissionMask.Transfer;
|
||||
|
||||
// recover modify and move
|
||||
rootGroupPerms &= movemodmask;
|
||||
group |= rootGroupPerms;
|
||||
if(noBaseTransfer)
|
||||
group &=~(uint)PermissionMask.Copy;
|
||||
else
|
||||
group |= ownertransfermask;
|
||||
|
||||
uint groupOrEveryone = group;
|
||||
m_EffectiveGroupPerms = group & owner;
|
||||
|
||||
// recover move
|
||||
rootEveryonePerms &= (uint)PermissionMask.Move;
|
||||
everyone |= rootEveryonePerms;
|
||||
everyone &= ~(uint)PermissionMask.Modify;
|
||||
if(noBaseTransfer)
|
||||
everyone &=~(uint)PermissionMask.Copy;
|
||||
else
|
||||
everyone |= ownertransfermask;
|
||||
|
||||
groupOrEveryone |= everyone;
|
||||
|
||||
m_EffectiveEveryOnePerms = everyone & owner;
|
||||
m_EffectiveGroupOrEveryOnePerms = groupOrEveryone & owner;
|
||||
m_EffectivePermsInvalid = false;
|
||||
}
|
||||
}
|
||||
|
||||
// aggregates perms scanning parts, assuming their contents was already aggregated and cached
|
||||
// ie is AggregateDeepPerms without the part.AggregateInnerPerms() call on parts loop
|
||||
public void AggregatePerms()
|
||||
{
|
||||
lock(m_PermissionsLock)
|
||||
|
@ -410,15 +350,22 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
uint everyone = rootEveryonePerms;
|
||||
|
||||
bool needUpdate = false;
|
||||
bool propGroupOut = Scene.PropagateGroupShareOutwards;
|
||||
// date is time of writing april 30th 2017
|
||||
bool newObject = (RootPart.CreationDate == 0 || RootPart.CreationDate > 1493574994);
|
||||
bool propAnyOut = Scene.PropagateAnyOneOutwards & (RootPart.CreationDate == 0 || RootPart.CreationDate > 1493574994);
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
|
||||
if(m_DeepEffectivePermsInvalid)
|
||||
part.AggregateInnerPerms();
|
||||
|
||||
owner &= part.AggregatedInnerOwnerPerms;
|
||||
group &= part.AggregatedInnerGroupPerms;
|
||||
if(newObject)
|
||||
if(propGroupOut)
|
||||
group &= part.AggregatedInnerGroupPerms;
|
||||
if(propAnyOut)
|
||||
everyone &= part.AggregatedInnerEveryonePerms;
|
||||
}
|
||||
// recover modify and move
|
||||
|
@ -477,6 +424,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_EffectiveGroupOrEveryOnePerms = tmpPerms;
|
||||
}
|
||||
|
||||
m_DeepEffectivePermsInvalid = false;
|
||||
m_EffectivePermsInvalid = false;
|
||||
|
||||
if(needUpdate)
|
||||
|
|
|
@ -2677,7 +2677,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (dupe.m_rootPart.PhysActor != null)
|
||||
dupe.m_rootPart.PhysActor.Building = false; // tell physics to finish building
|
||||
|
||||
dupe.AggregateDeepPerms();
|
||||
dupe.InvalidateDeepEffectivePerms();
|
||||
|
||||
dupe.HasGroupChanged = true;
|
||||
dupe.AttachToBackup();
|
||||
|
|
|
@ -979,7 +979,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
// old code end
|
||||
rootPart.TrimPermissions();
|
||||
group.AggregateDeepPerms();
|
||||
group.InvalidateDeepEffectivePerms();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -114,7 +114,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
// Script state may, or may not, exist. Not having any, is NOT
|
||||
// ever a problem.
|
||||
sceneObject.LoadScriptState(reader);
|
||||
sceneObject.AggregateDeepPerms();
|
||||
sceneObject.InvalidateDeepEffectivePerms();
|
||||
return sceneObject;
|
||||
}
|
||||
|
||||
|
@ -278,7 +278,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
// Script state may, or may not, exist. Not having any, is NOT
|
||||
// ever a problem.
|
||||
sceneObject.LoadScriptState(doc);
|
||||
sceneObject.AggregatePerms();
|
||||
// sceneObject.AggregatePerms();
|
||||
return sceneObject;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
//obj.RegenerateFullIDs();
|
||||
|
||||
scene.AddNewSceneObject(obj, true);
|
||||
obj.AggregateDeepPerms();
|
||||
obj.InvalidateDeepEffectivePerms();
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -626,6 +626,7 @@ namespace OpenSim.Tests.Common
|
|||
//part.ObjectFlags |= (uint)PrimFlags.Phantom;
|
||||
|
||||
scene.AddNewSceneObject(so, true);
|
||||
so.InvalidateDeepEffectivePerms();
|
||||
|
||||
return so;
|
||||
}
|
||||
|
@ -652,6 +653,7 @@ namespace OpenSim.Tests.Common
|
|||
SceneObjectGroup so = CreateSceneObject(parts, ownerId, partNamePrefix, uuidTail);
|
||||
|
||||
scene.AddNewSceneObject(so, false);
|
||||
so.InvalidateDeepEffectivePerms();
|
||||
|
||||
return so;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue