Merge branch 'master' of opensimulator.org:/var/git/opensim
commit
b9eb3afb62
|
@ -592,10 +592,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
|
|
||||||
protected bool IsFriendWithPerms(UUID user, UUID objectOwner)
|
protected bool IsFriendWithPerms(UUID user, UUID objectOwner)
|
||||||
{
|
{
|
||||||
if (user == UUID.Zero)
|
if (FriendsModule == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (FriendsModule == null)
|
if (user == UUID.Zero)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int friendPerms = FriendsModule.GetRightsGrantedByFriend(user, objectOwner);
|
int friendPerms = FriendsModule.GetRightsGrantedByFriend(user, objectOwner);
|
||||||
|
@ -684,7 +684,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
// gods have owner rights with Modify and Move always on
|
// gods have owner rights with Modify and Move always on
|
||||||
if(sp.IsGod)
|
if(sp.IsGod)
|
||||||
{
|
{
|
||||||
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true);
|
||||||
returnMask |= EXTRAGODMASK;
|
returnMask |= EXTRAGODMASK;
|
||||||
return returnMask;
|
return returnMask;
|
||||||
}
|
}
|
||||||
|
@ -692,20 +692,22 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
//bypass option == owner rights
|
//bypass option == owner rights
|
||||||
if (m_bypassPermissions)
|
if (m_bypassPermissions)
|
||||||
{
|
{
|
||||||
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true);
|
||||||
returnMask |= EXTRAOWNERMASK;
|
returnMask |= EXTRAOWNERMASK;
|
||||||
if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
|
if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
|
||||||
returnMask |= (uint)PrimFlags.ObjectOwnerModify;
|
returnMask |= (uint)PrimFlags.ObjectOwnerModify;
|
||||||
return returnMask;
|
return returnMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool unlocked = (task.ParentGroup.RootPart.OwnerMask & (uint)PermissionMask.Move) != 0;
|
||||||
|
|
||||||
UUID taskOwnerID = task.OwnerID;
|
UUID taskOwnerID = task.OwnerID;
|
||||||
UUID spID = sp.UUID;
|
UUID spID = sp.UUID;
|
||||||
|
|
||||||
// owner
|
// owner
|
||||||
if (spID == taskOwnerID)
|
if (spID == taskOwnerID)
|
||||||
{
|
{
|
||||||
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked);
|
||||||
returnMask |= EXTRAOWNERMASK;
|
returnMask |= EXTRAOWNERMASK;
|
||||||
if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
|
if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
|
||||||
returnMask |= (uint)PrimFlags.ObjectOwnerModify;
|
returnMask |= (uint)PrimFlags.ObjectOwnerModify;
|
||||||
|
@ -715,16 +717,19 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
// if not god or owner, do attachments as everyone
|
// if not god or owner, do attachments as everyone
|
||||||
if(task.ParentGroup.IsAttachment)
|
if(task.ParentGroup.IsAttachment)
|
||||||
{
|
{
|
||||||
returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags, unlocked);
|
||||||
if (taskOwnerID != UUID.Zero)
|
if (taskOwnerID != UUID.Zero)
|
||||||
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
||||||
return returnMask;
|
return returnMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UUID taskGroupID = task.GroupID;
|
||||||
|
bool groupdOwned = taskOwnerID == taskGroupID;
|
||||||
|
|
||||||
// if friends with rights then owner
|
// if friends with rights then owner
|
||||||
if (IsFriendWithPerms(spID, taskOwnerID))
|
if (!groupdOwned && IsFriendWithPerms(spID, taskOwnerID))
|
||||||
{
|
{
|
||||||
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked);
|
||||||
returnMask |= EXTRAOWNERMASK;
|
returnMask |= EXTRAOWNERMASK;
|
||||||
if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
|
if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
|
||||||
returnMask |= (uint)PrimFlags.ObjectOwnerModify;
|
returnMask |= (uint)PrimFlags.ObjectOwnerModify;
|
||||||
|
@ -732,18 +737,15 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
}
|
}
|
||||||
|
|
||||||
// group owned or shared ?
|
// group owned or shared ?
|
||||||
UUID taskGroupID = task.GroupID;
|
|
||||||
IClientAPI client = sp.ControllingClient;
|
IClientAPI client = sp.ControllingClient;
|
||||||
if(taskGroupID != UUID.Zero && client != null && client.IsGroupMember(taskGroupID))
|
if(taskGroupID != UUID.Zero && client != null && client.IsGroupMember(taskGroupID))
|
||||||
{
|
{
|
||||||
if(taskGroupID == taskOwnerID)
|
if(groupdOwned)
|
||||||
{
|
{
|
||||||
// object is owned by group, owner rights and group role powers do apply
|
// object is owned by group, check role powers
|
||||||
if((client.GetGroupPowers(taskGroupID) & (ulong)GroupPowers.ObjectManipulate) != 0)
|
if((client.GetGroupPowers(taskGroupID) & (ulong)GroupPowers.ObjectManipulate) != 0)
|
||||||
// instead forcing active group can be safeguard againts casual mistakes ??
|
|
||||||
//if(CheckActiveGroupPowers(sp, task.GroupID, (ulong)GroupPowers.ObjectManipulate))
|
|
||||||
{
|
{
|
||||||
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked);
|
||||||
returnMask |=
|
returnMask |=
|
||||||
(uint)PrimFlags.ObjectGroupOwned |
|
(uint)PrimFlags.ObjectGroupOwned |
|
||||||
(uint)PrimFlags.ObjectAnyOwner;
|
(uint)PrimFlags.ObjectAnyOwner;
|
||||||
|
@ -753,16 +755,18 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no special rights
|
// group sharing or everyone
|
||||||
returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags, unlocked);
|
||||||
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
returnMask |=
|
||||||
|
(uint)PrimFlags.ObjectGroupOwned |
|
||||||
|
(uint)PrimFlags.ObjectAnyOwner;
|
||||||
return returnMask;
|
return returnMask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// group sharing
|
// group sharing or everyone
|
||||||
returnMask = ApplyObjectModifyMasks(task.GroupMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags, unlocked);
|
||||||
if (taskOwnerID != UUID.Zero)
|
if (taskOwnerID != UUID.Zero)
|
||||||
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
||||||
return returnMask;
|
return returnMask;
|
||||||
|
@ -770,13 +774,13 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
}
|
}
|
||||||
|
|
||||||
// fallback is everyone rights
|
// fallback is everyone rights
|
||||||
returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags);
|
returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags, unlocked);
|
||||||
if (taskOwnerID != UUID.Zero)
|
if (taskOwnerID != UUID.Zero)
|
||||||
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
returnMask |= (uint)PrimFlags.ObjectAnyOwner;
|
||||||
return returnMask;
|
return returnMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private uint ApplyObjectModifyMasks(uint setPermissionMask, uint objectFlagsMask)
|
private uint ApplyObjectModifyMasks(uint setPermissionMask, uint objectFlagsMask, bool unlocked)
|
||||||
{
|
{
|
||||||
// We are adding the temporary objectflags to the object's objectflags based on the
|
// We are adding the temporary objectflags to the object's objectflags based on the
|
||||||
// permission flag given. These change the F flags on the client.
|
// permission flag given. These change the F flags on the client.
|
||||||
|
@ -786,6 +790,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
objectFlagsMask |= (uint)PrimFlags.ObjectCopy;
|
objectFlagsMask |= (uint)PrimFlags.ObjectCopy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unlocked)
|
||||||
|
{
|
||||||
if ((setPermissionMask & (uint)PermissionMask.Move) != 0)
|
if ((setPermissionMask & (uint)PermissionMask.Move) != 0)
|
||||||
{
|
{
|
||||||
objectFlagsMask |= (uint)PrimFlags.ObjectMove;
|
objectFlagsMask |= (uint)PrimFlags.ObjectMove;
|
||||||
|
@ -795,6 +801,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
{
|
{
|
||||||
objectFlagsMask |= (uint)PrimFlags.ObjectModify;
|
objectFlagsMask |= (uint)PrimFlags.ObjectModify;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((setPermissionMask & (uint)PermissionMask.Transfer) != 0)
|
if ((setPermissionMask & (uint)PermissionMask.Transfer) != 0)
|
||||||
{
|
{
|
||||||
|
@ -1559,36 +1566,36 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene)
|
private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene)
|
||||||
{
|
{
|
||||||
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
||||||
if (m_bypassPermissions) return m_bypassPermissionsValue;
|
if (m_bypassPermissions)
|
||||||
|
return m_bypassPermissionsValue;
|
||||||
|
|
||||||
// m_log.DebugFormat("[PERMISSIONS MODULE]: Checking rez object at {0} in {1}", objectPosition, m_scene.Name);
|
// m_log.DebugFormat("[PERMISSIONS MODULE]: Checking rez object at {0} in {1}", objectPosition, m_scene.Name);
|
||||||
|
|
||||||
ILandObject parcel = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y);
|
ILandObject parcel = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y);
|
||||||
if (parcel == null)
|
if (parcel == null || parcel.LandData == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((parcel.LandData.Flags & (uint)ParcelFlags.CreateObjects) != 0)
|
LandData landdata = parcel.LandData;
|
||||||
|
if ((owner == landdata.OwnerID))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ((landdata.Flags & (uint)ParcelFlags.CreateObjects) != 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if(IsAdministrator(owner))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if(landdata.GroupID != UUID.Zero)
|
||||||
{
|
{
|
||||||
|
if ((landdata.Flags & (uint)ParcelFlags.CreateGroupObjects) != 0)
|
||||||
|
return IsGroupMember(landdata.GroupID, owner, 0);
|
||||||
|
|
||||||
|
if (landdata.IsGroupOwned && IsGroupMember(landdata.GroupID, owner, (ulong)GroupPowers.AllowRez))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if ((owner == parcel.LandData.OwnerID) || IsAdministrator(owner))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (((parcel.LandData.Flags & (uint)ParcelFlags.CreateGroupObjects) != 0)
|
|
||||||
&& (parcel.LandData.GroupID != UUID.Zero) && IsGroupMember(parcel.LandData.GroupID, owner, 0))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (parcel.LandData.GroupID != UUID.Zero && IsGroupMember(parcel.LandData.GroupID, owner, (ulong)GroupPowers.AllowRez))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private bool CanRunConsoleCommand(UUID user, Scene requestFromScene)
|
private bool CanRunConsoleCommand(UUID user, Scene requestFromScene)
|
||||||
{
|
{
|
||||||
|
|
|
@ -183,8 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
part.SendFullUpdate(remoteClient);
|
part.SendFullUpdate(remoteClient);
|
||||||
|
|
||||||
// A prim is only tainted if it's allowed to be edited by the person clicking it.
|
// A prim is only tainted if it's allowed to be edited by the person clicking it.
|
||||||
if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId)
|
if (Permissions.CanChangeSelectedState(sog.UUID, (ScenePresence)remoteClient.SceneAgent))
|
||||||
|| Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId))
|
|
||||||
{
|
{
|
||||||
part.IsSelected = true;
|
part.IsSelected = true;
|
||||||
EventManager.TriggerParcelPrimCountTainted();
|
EventManager.TriggerParcelPrimCountTainted();
|
||||||
|
@ -250,8 +249,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// handled by group, but by prim. Legacy cruft.
|
// handled by group, but by prim. Legacy cruft.
|
||||||
// TODO: Make selection flagging per prim!
|
// TODO: Make selection flagging per prim!
|
||||||
//
|
//
|
||||||
if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)
|
if (Permissions.CanChangeSelectedState(part.ParentGroup.UUID, (ScenePresence)remoteClient.SceneAgent))
|
||||||
|| Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId))
|
|
||||||
{
|
{
|
||||||
part.IsSelected = false;
|
part.IsSelected = false;
|
||||||
if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected)
|
if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected)
|
||||||
|
|
|
@ -404,6 +404,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region persence EDIT or MOVE OBJECT
|
||||||
|
private const uint CANSELECTMASK = (uint)(
|
||||||
|
PrimFlags.ObjectMove |
|
||||||
|
PrimFlags.ObjectModify |
|
||||||
|
PrimFlags.ObjectOwnerModify
|
||||||
|
);
|
||||||
|
|
||||||
|
public bool CanChangeSelectedState(UUID objectID, ScenePresence sp)
|
||||||
|
{
|
||||||
|
uint perms = GenerateClientFlags(sp , objectID);
|
||||||
|
return (perms & CANSELECTMASK) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
#region EDIT OBJECT
|
#region EDIT OBJECT
|
||||||
public bool CanEditObject(UUID objectID, UUID editorID)
|
public bool CanEditObject(UUID objectID, UUID editorID)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue