more changes to GenerateClientFlags(), use already cached presence group information, let it be aware of groups roles. (not exactly as the other grid)
parent
e0ab0b3b6b
commit
1253f19325
|
@ -480,6 +480,31 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool CheckGroupPowers(ScenePresence sp, UUID groupID, ulong powersMask)
|
||||||
|
{
|
||||||
|
if(sp == null || sp.ControllingClient == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ulong grpPowers = sp.ControllingClient.GetGroupPowers(groupID);
|
||||||
|
|
||||||
|
return (grpPowers & powersMask) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CheckActiveGroupPowers(ScenePresence sp, UUID groupID, ulong powersMask)
|
||||||
|
{
|
||||||
|
if(sp == null || sp.ControllingClient == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(sp.ControllingClient.ActiveGroupId != groupID)
|
||||||
|
return false;
|
||||||
|
// activeGroupPowers only get current selected role powers, at least with xmlgroups.
|
||||||
|
// lets get any role avoiding the extra burden of user also having to change role
|
||||||
|
// ulong grpPowers = sp.ControllingClient.ActiveGroupPowers(groupID);
|
||||||
|
ulong grpPowers = sp.ControllingClient.GetGroupPowers(groupID);
|
||||||
|
|
||||||
|
return (grpPowers & powersMask) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Parse a user set configuration setting
|
/// Parse a user set configuration setting
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -623,7 +648,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
PrimFlags.ObjectOwnerModify
|
PrimFlags.ObjectOwnerModify
|
||||||
);
|
);
|
||||||
|
|
||||||
public uint GenerateClientFlags(ScenePresence sp, UUID objID)
|
public uint GenerateClientFlags(ScenePresence sp, uint curEffectivePerms, UUID objID)
|
||||||
{
|
{
|
||||||
// ObjectFlags and Permission flags are two different enumerations
|
// ObjectFlags and Permission flags are two different enumerations
|
||||||
// ObjectFlags, tells the client what it will allow the user to do.
|
// ObjectFlags, tells the client what it will allow the user to do.
|
||||||
|
@ -634,12 +659,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
if (task == null)
|
if (task == null)
|
||||||
return (uint)0;
|
return (uint)0;
|
||||||
|
|
||||||
uint objflags = task.GetEffectiveObjectFlags();
|
if(curEffectivePerms == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
// Remove any of the objectFlags that are temporary. These will get added back if appropriate
|
// Remove any of the objectFlags that are temporary. These will get added back if appropriate
|
||||||
// in the next bit of code
|
// in the next bit of code
|
||||||
|
uint objflags = curEffectivePerms & NOT_DEFAULT_FLAGS ;
|
||||||
objflags &= NOT_DEFAULT_FLAGS;
|
|
||||||
|
|
||||||
// get a relevant class for current presence on task
|
// get a relevant class for current presence on task
|
||||||
PermissionClass permissionClass = GetPermissionClass(sp, task);
|
PermissionClass permissionClass = GetPermissionClass(sp, task);
|
||||||
|
@ -658,9 +683,35 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
|
|
||||||
case PermissionClass.Group:
|
case PermissionClass.Group:
|
||||||
// Customize the GroupMask
|
// Customize the GroupMask
|
||||||
returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags);
|
if(task.GroupID == task.OwnerID)
|
||||||
if (task.OwnerID != UUID.Zero)
|
{
|
||||||
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
// object is owned by group, owner rights do apply
|
||||||
|
// we are not limiting to group owned parcel so this work anywhere
|
||||||
|
if(CheckGroupPowers(sp, task.GroupID, (ulong)GroupPowers.ObjectManipulate))
|
||||||
|
// instead forcing active group can be safeguard againts casual mistakes ??
|
||||||
|
//if(CheckActiveGroupPowers(sp, task.GroupID, (ulong)GroupPowers.ObjectManipulate))
|
||||||
|
{
|
||||||
|
returnMask = ApplyObjectModifyMasks(task.OwnerMask | task.EveryoneMask, objflags);
|
||||||
|
returnMask |=
|
||||||
|
(uint)PrimFlags.ObjectGroupOwned |
|
||||||
|
(uint)PrimFlags.ObjectAnyOwner;
|
||||||
|
if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
|
||||||
|
returnMask |= (uint)PrimFlags.ObjectOwnerModify;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no special rights
|
||||||
|
returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags);
|
||||||
|
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// not group owned, group sharing rights apply
|
||||||
|
returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags);
|
||||||
|
if (task.OwnerID != UUID.Zero)
|
||||||
|
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PermissionClass.Everyone:
|
case PermissionClass.Everyone:
|
||||||
|
@ -726,7 +777,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
return PermissionClass.Owner;
|
return PermissionClass.Owner;
|
||||||
|
|
||||||
// Group permissions
|
// Group permissions
|
||||||
if (obj.GroupID != UUID.Zero && IsGroupMember(obj.GroupID, user, 0))
|
// in future group membership must leave llclentViewer, but for now it is there.
|
||||||
|
if (obj.GroupID != UUID.Zero && sp.ControllingClient != null && sp.ControllingClient.IsGroupMember(obj.GroupID))
|
||||||
return PermissionClass.Group;
|
return PermissionClass.Group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ using OpenSim.Region.Framework.Interfaces;
|
||||||
namespace OpenSim.Region.Framework.Scenes
|
namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
#region Delegates
|
#region Delegates
|
||||||
public delegate uint GenerateClientFlagsHandler(ScenePresence sp, UUID objectID);
|
public delegate uint GenerateClientFlagsHandler(ScenePresence sp, uint curEffectivePerms, UUID objectID);
|
||||||
public delegate void SetBypassPermissionsHandler(bool value);
|
public delegate void SetBypassPermissionsHandler(bool value);
|
||||||
public delegate bool BypassPermissionsHandler();
|
public delegate bool BypassPermissionsHandler();
|
||||||
public delegate bool PropagatePermissionsHandler();
|
public delegate bool PropagatePermissionsHandler();
|
||||||
|
@ -195,7 +195,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Delegate[] list = handlerGenerateClientFlags.GetInvocationList();
|
Delegate[] list = handlerGenerateClientFlags.GetInvocationList();
|
||||||
foreach (GenerateClientFlagsHandler check in list)
|
foreach (GenerateClientFlagsHandler check in list)
|
||||||
{
|
{
|
||||||
perms &= check(sp, objectID);
|
perms &= check(sp, perms, objectID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return perms;
|
return perms;
|
||||||
|
|
Loading…
Reference in New Issue