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
|
@ -1182,7 +1182,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
}
|
}
|
||||||
|
|
||||||
rootPart.TrimPermissions();
|
rootPart.TrimPermissions();
|
||||||
so.AggregateDeepPerms();
|
so.InvalidateDeepEffectivePerms();
|
||||||
|
|
||||||
if (isAttachment)
|
if (isAttachment)
|
||||||
so.FromItemID = item.ID;
|
so.FromItemID = item.ID;
|
||||||
|
|
|
@ -238,6 +238,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool LegacySitOffsets = true;
|
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>
|
/// <summary>
|
||||||
/// Can avatars cross from and to this region?
|
/// Can avatars cross from and to this region?
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -978,7 +988,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance);
|
m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance);
|
||||||
m_maxRegionViewDistance = startupConfig.GetFloat("MaxRegionsViewDistance", m_maxRegionViewDistance);
|
m_maxRegionViewDistance = startupConfig.GetFloat("MaxRegionsViewDistance", m_maxRegionViewDistance);
|
||||||
|
|
||||||
|
// old versions compatibility
|
||||||
LegacySitOffsets = startupConfig.GetBoolean("LegacySitOffsets", LegacySitOffsets);
|
LegacySitOffsets = startupConfig.GetBoolean("LegacySitOffsets", LegacySitOffsets);
|
||||||
|
PropagateGroupShareOutwards = startupConfig.GetBoolean("PropagateGroupShareOutwards", PropagateGroupShareOutwards);
|
||||||
|
PropagateAnyOneOutwards = startupConfig.GetBoolean("PropagateAnyOneOutwards", PropagateAnyOneOutwards);
|
||||||
|
|
||||||
if (m_defaultDrawDistance > m_maxDrawDistance)
|
if (m_defaultDrawDistance > m_maxDrawDistance)
|
||||||
m_defaultDrawDistance = m_maxDrawDistance;
|
m_defaultDrawDistance = m_maxDrawDistance;
|
||||||
|
@ -2390,8 +2403,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
EventManager.TriggerOnSceneObjectLoaded(group);
|
EventManager.TriggerOnSceneObjectLoaded(group);
|
||||||
SceneObjectPart rootPart = group.GetPart(group.UUID);
|
SceneObjectPart rootPart = group.GetPart(group.UUID);
|
||||||
rootPart.Flags &= ~PrimFlags.Scripted;
|
rootPart.Flags &= ~PrimFlags.Scripted;
|
||||||
group.AggregateDeepPerms();
|
|
||||||
rootPart.TrimPermissions();
|
rootPart.TrimPermissions();
|
||||||
|
group.InvalidateDeepEffectivePerms();
|
||||||
|
|
||||||
// Don't do this here - it will get done later on when sculpt data is loaded.
|
// Don't do this here - it will get done later on when sculpt data is loaded.
|
||||||
// group.CheckSculptAndLoad();
|
// group.CheckSculptAndLoad();
|
||||||
|
@ -2662,7 +2676,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (UserManagementModule != null)
|
if (UserManagementModule != null)
|
||||||
sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID);
|
sceneObject.RootPart.CreatorIdentification = UserManagementModule.GetUserUUI(ownerID);
|
||||||
|
|
||||||
sceneObject.AggregateDeepPerms();
|
sceneObject.InvalidateDeepEffectivePerms();;
|
||||||
sceneObject.ScheduleGroupForFullUpdate();
|
sceneObject.ScheduleGroupForFullUpdate();
|
||||||
|
|
||||||
return sceneObject;
|
return sceneObject;
|
||||||
|
|
|
@ -343,7 +343,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
sceneObject.ForceInventoryPersistence();
|
sceneObject.ForceInventoryPersistence();
|
||||||
sceneObject.HasGroupChanged = true;
|
sceneObject.HasGroupChanged = true;
|
||||||
}
|
}
|
||||||
sceneObject.AggregateDeepPerms();
|
sceneObject.InvalidateDeepEffectivePerms();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -254,13 +254,26 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// new test code, to place in better place later
|
// new test code, to place in better place later
|
||||||
private object m_PermissionsLock = new object();
|
private object m_PermissionsLock = new object();
|
||||||
private bool m_EffectivePermsInvalid = true;
|
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()
|
public void InvalidateEffectivePerms()
|
||||||
{
|
{
|
||||||
lock(m_PermissionsLock)
|
lock(m_PermissionsLock)
|
||||||
m_EffectivePermsInvalid = true;
|
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;
|
private uint m_EffectiveEveryOnePerms;
|
||||||
public uint 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()
|
public void AggregatePerms()
|
||||||
{
|
{
|
||||||
lock(m_PermissionsLock)
|
lock(m_PermissionsLock)
|
||||||
|
@ -410,15 +350,22 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
uint everyone = rootEveryonePerms;
|
uint everyone = rootEveryonePerms;
|
||||||
|
|
||||||
bool needUpdate = false;
|
bool needUpdate = false;
|
||||||
|
bool propGroupOut = Scene.PropagateGroupShareOutwards;
|
||||||
// date is time of writing april 30th 2017
|
// 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();
|
SceneObjectPart[] parts = m_parts.GetArray();
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
{
|
{
|
||||||
SceneObjectPart part = parts[i];
|
SceneObjectPart part = parts[i];
|
||||||
|
|
||||||
|
if(m_DeepEffectivePermsInvalid)
|
||||||
|
part.AggregateInnerPerms();
|
||||||
|
|
||||||
owner &= part.AggregatedInnerOwnerPerms;
|
owner &= part.AggregatedInnerOwnerPerms;
|
||||||
group &= part.AggregatedInnerGroupPerms;
|
group &= part.AggregatedInnerGroupPerms;
|
||||||
if(newObject)
|
if(propGroupOut)
|
||||||
|
group &= part.AggregatedInnerGroupPerms;
|
||||||
|
if(propAnyOut)
|
||||||
everyone &= part.AggregatedInnerEveryonePerms;
|
everyone &= part.AggregatedInnerEveryonePerms;
|
||||||
}
|
}
|
||||||
// recover modify and move
|
// recover modify and move
|
||||||
|
@ -477,6 +424,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_EffectiveGroupOrEveryOnePerms = tmpPerms;
|
m_EffectiveGroupOrEveryOnePerms = tmpPerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_DeepEffectivePermsInvalid = false;
|
||||||
m_EffectivePermsInvalid = false;
|
m_EffectivePermsInvalid = false;
|
||||||
|
|
||||||
if(needUpdate)
|
if(needUpdate)
|
||||||
|
|
|
@ -2677,7 +2677,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (dupe.m_rootPart.PhysActor != null)
|
if (dupe.m_rootPart.PhysActor != null)
|
||||||
dupe.m_rootPart.PhysActor.Building = false; // tell physics to finish building
|
dupe.m_rootPart.PhysActor.Building = false; // tell physics to finish building
|
||||||
|
|
||||||
dupe.AggregateDeepPerms();
|
dupe.InvalidateDeepEffectivePerms();
|
||||||
|
|
||||||
dupe.HasGroupChanged = true;
|
dupe.HasGroupChanged = true;
|
||||||
dupe.AttachToBackup();
|
dupe.AttachToBackup();
|
||||||
|
|
|
@ -979,7 +979,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
// old code end
|
// old code end
|
||||||
rootPart.TrimPermissions();
|
rootPart.TrimPermissions();
|
||||||
group.AggregateDeepPerms();
|
group.InvalidateDeepEffectivePerms();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -114,7 +114,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
// Script state may, or may not, exist. Not having any, is NOT
|
// Script state may, or may not, exist. Not having any, is NOT
|
||||||
// ever a problem.
|
// ever a problem.
|
||||||
sceneObject.LoadScriptState(reader);
|
sceneObject.LoadScriptState(reader);
|
||||||
sceneObject.AggregateDeepPerms();
|
sceneObject.InvalidateDeepEffectivePerms();
|
||||||
return sceneObject;
|
return sceneObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +278,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
// Script state may, or may not, exist. Not having any, is NOT
|
// Script state may, or may not, exist. Not having any, is NOT
|
||||||
// ever a problem.
|
// ever a problem.
|
||||||
sceneObject.LoadScriptState(doc);
|
sceneObject.LoadScriptState(doc);
|
||||||
sceneObject.AggregatePerms();
|
// sceneObject.AggregatePerms();
|
||||||
return sceneObject;
|
return sceneObject;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -70,7 +70,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
//obj.RegenerateFullIDs();
|
//obj.RegenerateFullIDs();
|
||||||
|
|
||||||
scene.AddNewSceneObject(obj, true);
|
scene.AddNewSceneObject(obj, true);
|
||||||
obj.AggregateDeepPerms();
|
obj.InvalidateDeepEffectivePerms();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -626,6 +626,7 @@ namespace OpenSim.Tests.Common
|
||||||
//part.ObjectFlags |= (uint)PrimFlags.Phantom;
|
//part.ObjectFlags |= (uint)PrimFlags.Phantom;
|
||||||
|
|
||||||
scene.AddNewSceneObject(so, true);
|
scene.AddNewSceneObject(so, true);
|
||||||
|
so.InvalidateDeepEffectivePerms();
|
||||||
|
|
||||||
return so;
|
return so;
|
||||||
}
|
}
|
||||||
|
@ -652,6 +653,7 @@ namespace OpenSim.Tests.Common
|
||||||
SceneObjectGroup so = CreateSceneObject(parts, ownerId, partNamePrefix, uuidTail);
|
SceneObjectGroup so = CreateSceneObject(parts, ownerId, partNamePrefix, uuidTail);
|
||||||
|
|
||||||
scene.AddNewSceneObject(so, false);
|
scene.AddNewSceneObject(so, false);
|
||||||
|
so.InvalidateDeepEffectivePerms();
|
||||||
|
|
||||||
return so;
|
return so;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue