merge fix

httptests
UbitUmarov 2017-05-04 12:57:11 +01:00
commit 5f5b7e56db
20 changed files with 157 additions and 130 deletions

View File

@ -357,7 +357,7 @@ namespace OpenSim.Region.ClientStack.Linden
rootpart.NextOwnerMask = next_owner_mask; rootpart.NextOwnerMask = next_owner_mask;
rootpart.Material = (byte)material; rootpart.Material = (byte)material;
obj.AggregatePerms(); obj.InvalidateDeepEffectivePerms();
m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor); m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor);

View File

@ -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;

View File

@ -146,7 +146,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
child.TriggerScriptChangedEvent(Changed.OWNER); child.TriggerScriptChangedEvent(Changed.OWNER);
child.ApplyNextOwnerPermissions(); child.ApplyNextOwnerPermissions();
} }
group.AggregatePerms(); group.InvalidateDeepEffectivePerms();
} }
part.ObjectSaleType = 0; part.ObjectSaleType = 0;

View File

@ -293,6 +293,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
scenePermissions.OnDeleteObject += CanDeleteObject; scenePermissions.OnDeleteObject += CanDeleteObject;
scenePermissions.OnEditObjectByIDs += CanEditObjectByIDs; scenePermissions.OnEditObjectByIDs += CanEditObjectByIDs;
scenePermissions.OnEditObject += CanEditObject; scenePermissions.OnEditObject += CanEditObject;
scenePermissions.OnEditObjectPerms += CanEditObjectPerms;
scenePermissions.OnInventoryTransfer += CanInventoryTransfer; scenePermissions.OnInventoryTransfer += CanInventoryTransfer;
scenePermissions.OnMoveObject += CanMoveObject; scenePermissions.OnMoveObject += CanMoveObject;
scenePermissions.OnTakeObject += CanTakeObject; scenePermissions.OnTakeObject += CanTakeObject;
@ -391,6 +392,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
scenePermissions.OnDeleteObject -= CanDeleteObject; scenePermissions.OnDeleteObject -= CanDeleteObject;
scenePermissions.OnEditObjectByIDs -= CanEditObjectByIDs; scenePermissions.OnEditObjectByIDs -= CanEditObjectByIDs;
scenePermissions.OnEditObject -= CanEditObject; scenePermissions.OnEditObject -= CanEditObject;
scenePermissions.OnEditObjectPerms -= CanEditObjectPerms;
scenePermissions.OnInventoryTransfer -= CanInventoryTransfer; scenePermissions.OnInventoryTransfer -= CanInventoryTransfer;
scenePermissions.OnMoveObject -= CanMoveObject; scenePermissions.OnMoveObject -= CanMoveObject;
scenePermissions.OnTakeObject -= CanTakeObject; scenePermissions.OnTakeObject -= CanTakeObject;
@ -1387,6 +1389,35 @@ namespace OpenSim.Region.CoreModules.World.Permissions
return true; return true;
} }
private bool CanEditObjectPerms(SceneObjectGroup sog, UUID userID)
{
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
if (m_bypassPermissions) return m_bypassPermissionsValue;
if (sog == null)
return false;
if(sog.OwnerID == userID || IsAdministrator(userID))
return true;
UUID sogGroupID = sog.GroupID;
if(sogGroupID == UUID.Zero || sogGroupID != sog.OwnerID)
return false;
uint perms = sog.EffectiveOwnerPerms;
if((perms & (uint)PermissionMask.Modify) == 0)
return false;
ulong powers = 0;
if(GroupMemberPowers(sogGroupID, userID, ref powers))
{
if((powers & (ulong)GroupPowers.ObjectManipulate) != 0)
return true;
}
return false;
}
private bool CanEditObjectInventory(UUID objectID, UUID userID) private bool CanEditObjectInventory(UUID objectID, UUID userID)
{ {
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
@ -1678,7 +1709,6 @@ namespace OpenSim.Region.CoreModules.World.Permissions
return false; return false;
} }
private bool CanReturnObjects(ILandObject land, ScenePresence sp, List<SceneObjectGroup> objects) private bool CanReturnObjects(ILandObject land, ScenePresence sp, List<SceneObjectGroup> objects)
{ {
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
@ -2289,23 +2319,31 @@ namespace OpenSim.Region.CoreModules.World.Permissions
if (sog == null) if (sog == null)
return false; return false;
uint perms = GetObjectPermissions(userID, sog, true); if(sog.OwnerID == userID || IsAdministrator(userID))
if((perms & (uint)PermissionMask.Modify) == 0) return true;
if(sog.IsAttachment)
return false;
UUID sogGroupID = sog.GroupID;
if(sogGroupID == UUID.Zero || sogGroupID != sog.OwnerID)
return false; return false;
TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID); TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID);
if(ti == null) if(ti == null)
return false; return false;
uint itperms = GetObjectItemPermissions(userID, ti); ulong powers = 0;
if(GroupMemberPowers(sogGroupID, userID, ref powers))
if((itperms & (uint)PermissionMask.Copy) == 0) {
return false; if((powers & (ulong)GroupPowers.ObjectManipulate) != 0)
if(sog.OwnerID != userID && (itperms & (uint)PermissionMask.Transfer) == 0)
return false;
return true; return true;
if((ti.EveryonePermissions & (uint)PermissionMask.Copy) != 0)
return true;
}
return false;
} }
// object inventory to object inventory item drag and drop // object inventory to object inventory item drag and drop

View File

@ -107,7 +107,7 @@ namespace OpenSim.Region.CoreModules.World.Vegetation
sceneObject.SetGroup(groupID, null); sceneObject.SetGroup(groupID, null);
m_scene.AddNewSceneObject(sceneObject, true); m_scene.AddNewSceneObject(sceneObject, true);
sceneObject.AggregatePerms(); sceneObject.InvalidateDeepEffectivePerms();
return sceneObject; return sceneObject;
} }

View File

@ -338,7 +338,7 @@ namespace OpenSim.Region.Framework.Scenes
// Update item with new asset // Update item with new asset
item.AssetID = asset.FullID; item.AssetID = asset.FullID;
group.UpdateInventoryItem(item); group.UpdateInventoryItem(item);
group.AggregatePerms(); group.InvalidateEffectivePerms();
part.SendPropertiesToClient(remoteClient); part.SendPropertiesToClient(remoteClient);
@ -1216,7 +1216,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
group.RemoveInventoryItem(localID, itemID); group.RemoveInventoryItem(localID, itemID);
group.AggregatePerms(); group.InvalidateEffectivePerms();
} }
part.SendPropertiesToClient(remoteClient); part.SendPropertiesToClient(remoteClient);
@ -1388,11 +1388,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
if (!Permissions.CanCopyObjectInventory(itemId, part.UUID, remoteClient.AgentId)) if (!Permissions.CanCopyObjectInventory(itemId, part.UUID, remoteClient.AgentId))
{
// check also if we can delete the no copy item
if(!Permissions.CanEditObject(part.UUID, remoteClient.AgentId))
return; return;
}
string message; string message;
InventoryItemBase item = MoveTaskInventoryItem(remoteClient, folderId, part, itemId, out message); InventoryItemBase item = MoveTaskInventoryItem(remoteClient, folderId, part, itemId, out message);
@ -1742,7 +1738,24 @@ namespace OpenSim.Region.Framework.Scenes
// Check if we're allowed to mess with permissions // Check if we're allowed to mess with permissions
if (!Permissions.IsGod(remoteClient.AgentId)) // Not a god if (!Permissions.IsGod(remoteClient.AgentId)) // Not a god
{ {
bool noChange;
if (remoteClient.AgentId != part.OwnerID) // Not owner if (remoteClient.AgentId != part.OwnerID) // Not owner
{
noChange = true;
if(itemInfo.OwnerID == UUID.Zero && itemInfo.GroupID != UUID.Zero)
{
if(remoteClient.IsGroupMember(itemInfo.GroupID))
{
ulong powers = remoteClient.GetGroupPowers(itemInfo.GroupID);
if((powers & (ulong)GroupPowers.ObjectManipulate) != 0)
noChange = false;
}
}
}
else
noChange = false;
if(noChange)
{ {
// Friends and group members can't change any perms // Friends and group members can't change any perms
itemInfo.BasePermissions = currentItem.BasePermissions; itemInfo.BasePermissions = currentItem.BasePermissions;
@ -1769,7 +1782,6 @@ namespace OpenSim.Region.Framework.Scenes
itemInfo.CurrentPermissions &= currentItem.BasePermissions; itemInfo.CurrentPermissions &= currentItem.BasePermissions;
itemInfo.NextPermissions &= currentItem.BasePermissions; itemInfo.NextPermissions &= currentItem.BasePermissions;
} }
} }
else else
{ {
@ -1955,7 +1967,7 @@ namespace OpenSim.Region.Framework.Scenes
part.Inventory.AddInventoryItem(taskItem, false); part.Inventory.AddInventoryItem(taskItem, false);
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
part.ParentGroup.AggregatePerms(); part.ParentGroup.InvalidateEffectivePerms();
// tell anyone managing scripts that a new script exists // tell anyone managing scripts that a new script exists
EventManager.TriggerNewScript(agentID, part, taskItem.ItemID); EventManager.TriggerNewScript(agentID, part, taskItem.ItemID);
@ -2643,7 +2655,7 @@ namespace OpenSim.Region.Framework.Scenes
// We can only call this after adding the scene object, since the scene object references the scene // We can only call this after adding the scene object, since the scene object references the scene
// to find out if scripts should be activated at all. // to find out if scripts should be activated at all.
group.AggregatePerms(); group.InvalidateEffectivePerms();
group.CreateScriptInstances(param, true, DefaultScriptEngine, 3); group.CreateScriptInstances(param, true, DefaultScriptEngine, 3);
group.ScheduleGroupForFullUpdate(); group.ScheduleGroupForFullUpdate();
@ -2740,7 +2752,7 @@ namespace OpenSim.Region.Framework.Scenes
// and with this comented code, if user does not set next permissions on the object // and with this comented code, if user does not set next permissions on the object
// and on ALL contents of ALL prims, he may loose rights, making the object useless // and on ALL contents of ALL prims, he may loose rights, making the object useless
sog.ApplyNextOwnerPermissions(); sog.ApplyNextOwnerPermissions();
sog.AggregatePerms(); sog.InvalidateEffectivePerms();
sog.ScheduleGroupForFullUpdate(); sog.ScheduleGroupForFullUpdate();

View File

@ -53,6 +53,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool DuplicateObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool DuplicateObjectHandler(SceneObjectGroup sog, ScenePresence sp);
public delegate bool EditObjectByIDsHandler(UUID objectID, UUID editorID); public delegate bool EditObjectByIDsHandler(UUID objectID, UUID editorID);
public delegate bool EditObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool EditObjectHandler(SceneObjectGroup sog, ScenePresence sp);
public delegate bool EditObjectPermsHandler(SceneObjectGroup sog, UUID editorID);
public delegate bool EditObjectInventoryHandler(UUID objectID, UUID editorID); public delegate bool EditObjectInventoryHandler(UUID objectID, UUID editorID);
public delegate bool MoveObjectHandler(SceneObjectGroup sog, ScenePresence sp); public delegate bool MoveObjectHandler(SceneObjectGroup sog, ScenePresence sp);
public delegate bool ObjectEntryHandler(SceneObjectGroup sog, bool enteringRegion, Vector3 newPoint); public delegate bool ObjectEntryHandler(SceneObjectGroup sog, bool enteringRegion, Vector3 newPoint);
@ -133,6 +134,7 @@ namespace OpenSim.Region.Framework.Scenes
public event DuplicateObjectHandler OnDuplicateObject; public event DuplicateObjectHandler OnDuplicateObject;
public event EditObjectByIDsHandler OnEditObjectByIDs; public event EditObjectByIDsHandler OnEditObjectByIDs;
public event EditObjectHandler OnEditObject; public event EditObjectHandler OnEditObject;
public event EditObjectPermsHandler OnEditObjectPerms;
public event EditObjectInventoryHandler OnEditObjectInventory; public event EditObjectInventoryHandler OnEditObjectInventory;
public event MoveObjectHandler OnMoveObject; public event MoveObjectHandler OnMoveObject;
public event ObjectEntryHandler OnObjectEntry; public event ObjectEntryHandler OnObjectEntry;
@ -511,6 +513,24 @@ namespace OpenSim.Region.Framework.Scenes
return true; return true;
} }
public bool CanEditObjectPermissions(SceneObjectGroup sog, UUID editorID)
{
EditObjectPermsHandler handler = OnEditObjectPerms;
if (handler != null)
{
if(sog == null)
return false;
Delegate[] list = handler.GetInvocationList();
foreach (EditObjectPermsHandler h in list)
{
if (h(sog, editorID) == false)
return false;
}
}
return true;
}
public bool CanEditObjectInventory(UUID objectID, UUID editorID) public bool CanEditObjectInventory(UUID objectID, UUID editorID)
{ {
EditObjectInventoryHandler handler = OnEditObjectInventory; EditObjectInventoryHandler handler = OnEditObjectInventory;

View File

@ -978,6 +978,7 @@ 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);
if (m_defaultDrawDistance > m_maxDrawDistance) if (m_defaultDrawDistance > m_maxDrawDistance)
@ -2390,8 +2391,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 +2664,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;

View File

@ -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;
} }
@ -2094,7 +2094,7 @@ namespace OpenSim.Region.Framework.Scenes
child.TriggerScriptChangedEvent(Changed.OWNER); child.TriggerScriptChangedEvent(Changed.OWNER);
child.ApplyNextOwnerPermissions(); child.ApplyNextOwnerPermissions();
} }
copy.AggregatePerms(); copy.InvalidateEffectivePerms();
} }
} }

View File

@ -183,7 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
addFromAllowedDrop = (part.ParentGroup.RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) != 0; addFromAllowedDrop = (part.ParentGroup.RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) != 0;
part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop); part.Inventory.AddInventoryItem(taskItem, addFromAllowedDrop);
part.ParentGroup.AggregatePerms(); part.ParentGroup.InvalidateEffectivePerms();
return true; return true;
} }
@ -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)
@ -411,14 +351,20 @@ namespace OpenSim.Region.Framework.Scenes
bool needUpdate = false; bool needUpdate = false;
// 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 newobj = (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(newobj)
group &= part.AggregatedInnerGroupPerms;
if(newobj)
everyone &= part.AggregatedInnerEveryonePerms; everyone &= part.AggregatedInnerEveryonePerms;
} }
// recover modify and move // recover modify and move
@ -477,6 +423,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)

View File

@ -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();
@ -2943,7 +2943,7 @@ namespace OpenSim.Region.Framework.Scenes
if (!m_scene.Permissions.BypassPermissions()) if (!m_scene.Permissions.BypassPermissions())
{ {
ApplyNextOwnerPermissions(); ApplyNextOwnerPermissions();
AggregatePerms(); InvalidateEffectivePerms();
} }
} }
@ -3605,7 +3605,7 @@ namespace OpenSim.Region.Framework.Scenes
InvalidBoundsRadius(); InvalidBoundsRadius();
InvalidatePartsLinkMaps(); InvalidatePartsLinkMaps();
objectGroup.AggregatePerms(); objectGroup.InvalidateEffectivePerms();
if (sendEvents) if (sendEvents)
linkPart.TriggerScriptChangedEvent(Changed.LINK); linkPart.TriggerScriptChangedEvent(Changed.LINK);
@ -4163,7 +4163,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat( // m_log.DebugFormat(
// "[SCENE OBJECT GROUP]: RootPart.OwnerMask now {0} for {1} in {2}", // "[SCENE OBJECT GROUP]: RootPart.OwnerMask now {0} for {1} in {2}",
// (OpenMetaverse.PermissionMask)RootPart.OwnerMask, Name, Scene.Name); // (OpenMetaverse.PermissionMask)RootPart.OwnerMask, Name, Scene.Name);
AggregatePerms(); InvalidateEffectivePerms();
RootPart.ScheduleFullUpdate(); RootPart.ScheduleFullUpdate();
} }
@ -4188,7 +4188,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
foreach (SceneObjectPart part in Parts) foreach (SceneObjectPart part in Parts)
part.Inventory.ApplyGodPermissions(RootPart.BaseMask); part.Inventory.ApplyGodPermissions(RootPart.BaseMask);
AggregatePerms(); InvalidateEffectivePerms();
} }
HasGroupChanged = true; HasGroupChanged = true;
@ -5447,7 +5447,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
part.ResetOwnerChangeFlag(); part.ResetOwnerChangeFlag();
}); });
AggregatePerms(); InvalidateEffectivePerms();
} }
// clear some references to easy cg // clear some references to easy cg

View File

@ -4460,8 +4460,11 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
if (god) if (god)
baseMask = 0x7ffffff0; baseMask = 0x7ffffff0;
// Are we the owner? bool canChange = (AgentID == OwnerID) || god;
if ((AgentID == OwnerID) || god) if(!canChange)
canChange = ParentGroup.Scene.Permissions.CanEditObjectPermissions(ParentGroup, AgentID);
if (canChange)
{ {
switch (field) switch (field)
{ {

View File

@ -235,12 +235,9 @@ namespace OpenSim.Region.Framework.Scenes
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
foreach (TaskInventoryItem item in items) foreach (TaskInventoryItem item in items)
{
if (groupID != item.GroupID)
{ {
item.GroupID = groupID; item.GroupID = groupID;
} }
}
m_items.LockItemsForWrite(false); m_items.LockItemsForWrite(false);
} }
@ -982,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;
@ -1020,6 +1017,9 @@ namespace OpenSim.Region.Framework.Scenes
if (item.GroupPermissions != (uint)PermissionMask.None) if (item.GroupPermissions != (uint)PermissionMask.None)
item.GroupID = m_part.GroupID; item.GroupID = m_part.GroupID;
if(item.OwnerID == UUID.Zero) // viewer to internal enconding of group owned
item.OwnerID = item.GroupID;
if (item.AssetID == UUID.Zero) if (item.AssetID == UUID.Zero)
item.AssetID = m_items[item.ItemID].AssetID; item.AssetID = m_items[item.ItemID].AssetID;
@ -1031,8 +1031,7 @@ namespace OpenSim.Region.Framework.Scenes
if (considerChanged) if (considerChanged)
{ {
m_part.AggregateInnerPerms(); m_part.ParentGroup.InvalidateDeepEffectivePerms();
m_part.ParentGroup.AggregatePerms();
HasInventoryChanged = true; HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true; m_part.ParentGroup.HasGroupChanged = true;
} }
@ -1075,8 +1074,7 @@ namespace OpenSim.Region.Framework.Scenes
m_items.Remove(itemID); m_items.Remove(itemID);
m_items.LockItemsForWrite(false); m_items.LockItemsForWrite(false);
m_part.AggregateInnerPerms(); m_part.ParentGroup.InvalidateDeepEffectivePerms();
m_part.ParentGroup.AggregatePerms();
m_inventorySerial++; m_inventorySerial++;
m_part.TriggerScriptChangedEvent(Changed.INVENTORY); m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
@ -1199,15 +1197,20 @@ namespace OpenSim.Region.Framework.Scenes
invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
invString.AddNameValueLine("owner_id", ownerID.ToString());
invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
invString.AddNameValueLine("group_id",groupID.ToString()); invString.AddNameValueLine("group_id",groupID.ToString());
if(groupID != UUID.Zero && ownerID == groupID) if(groupID != UUID.Zero && ownerID == groupID)
{
invString.AddNameValueLine("owner_id", UUID.Zero.ToString());
invString.AddNameValueLine("group_owned","1"); invString.AddNameValueLine("group_owned","1");
}
else else
{
invString.AddNameValueLine("owner_id", ownerID.ToString());
invString.AddNameValueLine("group_owned","0"); invString.AddNameValueLine("group_owned","0");
}
invString.AddSectionEnd(); invString.AddSectionEnd();

View File

@ -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)

View File

@ -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

View File

@ -174,7 +174,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
child.TriggerScriptChangedEvent(Changed.OWNER); child.TriggerScriptChangedEvent(Changed.OWNER);
child.ApplyNextOwnerPermissions(); child.ApplyNextOwnerPermissions();
} }
hostgroup.AggregatePerms(); hostgroup.InvalidateEffectivePerms();
} }
hostgroup.RootPart.ObjectSaleType = 0; hostgroup.RootPart.ObjectSaleType = 0;

View File

@ -665,7 +665,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
taskItem.AssetID = asset.FullID; taskItem.AssetID = asset.FullID;
host.Inventory.AddInventoryItem(taskItem, false); host.Inventory.AddInventoryItem(taskItem, false);
host.ParentGroup.AggregatePerms(); host.ParentGroup.InvalidateEffectivePerms();
m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString()); m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString());
} }

View File

@ -525,7 +525,7 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator
sceneObject.SetGroup(groupID, null); sceneObject.SetGroup(groupID, null);
m_scene.AddNewSceneObject(sceneObject, true); m_scene.AddNewSceneObject(sceneObject, true);
sceneObject.AggregatePerms(); sceneObject.InvalidateEffectivePerms();
return sceneObject; return sceneObject;
} }

View File

@ -2048,7 +2048,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.Inventory.AddInventoryItemExclusive(taskItem, false); m_host.Inventory.AddInventoryItemExclusive(taskItem, false);
else else
m_host.Inventory.AddInventoryItem(taskItem, false); m_host.Inventory.AddInventoryItem(taskItem, false);
m_host.ParentGroup.AggregatePerms(); m_host.ParentGroup.InvalidateDeepEffectivePerms();
return taskItem; return taskItem;
} }

View File

@ -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;
} }