* Refactored Permissions into ScenePresence as requested by MW
* Un-hackerized generating the client_flags * Now handling the ObjectPermissions Update packet * Warning: Backup your prim before updating. If you fail to do so and something goes wrong then, All Yr prim are belong to us!afrisby
parent
a24b6fe924
commit
bb824eadee
|
@ -332,6 +332,9 @@ namespace OpenSim.Framework
|
|||
|
||||
public delegate void ConfirmXfer(IClientAPI remoteClient, ulong xferID, uint packetID);
|
||||
|
||||
public delegate void ObjectPermissions(IClientAPI remoteClinet, LLUUID AgentID, LLUUID SessionID, List<ObjectPermissionsPacket.ObjectDataBlock> permChanges);
|
||||
|
||||
|
||||
public interface IClientAPI
|
||||
{
|
||||
event ImprovedInstantMessage OnInstantMessage;
|
||||
|
@ -387,6 +390,7 @@ namespace OpenSim.Framework
|
|||
event StatusChange OnChildAgentStatus;
|
||||
event GenericCall2 OnStopMovement;
|
||||
event Action<LLUUID> OnRemoveAvatar;
|
||||
event ObjectPermissions OnObjectPermissions;
|
||||
|
||||
event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||
event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||
|
|
|
@ -564,6 +564,8 @@ namespace OpenSim.Region.ClientStack
|
|||
|
||||
// Previously ClientView.API partial class
|
||||
public event Action<IClientAPI> OnLogout;
|
||||
public event ObjectPermissions OnObjectPermissions;
|
||||
|
||||
public event Action<IClientAPI> OnConnectionClosed;
|
||||
public event ViewerEffectEventHandler OnViewerEffect;
|
||||
public event ImprovedInstantMessage OnInstantMessage;
|
||||
|
@ -2919,7 +2921,35 @@ namespace OpenSim.Region.ClientStack
|
|||
}
|
||||
break;
|
||||
case PacketType.ObjectPermissions:
|
||||
// MainLog.Instance.Warn("CLIENT", "unhandled packet " + Pack.ToString());
|
||||
MainLog.Instance.Warn("CLIENT", "unhandled packet " + PacketType.ObjectPermissions.ToString());
|
||||
ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
|
||||
|
||||
List<ObjectPermissionsPacket.ObjectDataBlock> permChanges = new List<ObjectPermissionsPacket.ObjectDataBlock>();
|
||||
|
||||
for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
|
||||
{
|
||||
permChanges.Add(newobjPerms.ObjectData[i]);
|
||||
}
|
||||
|
||||
// Here's our data,
|
||||
// PermField contains the field the info goes into
|
||||
// PermField determines which mask we're changing
|
||||
//
|
||||
// chmask is the mask of the change
|
||||
// setTF is whether we're adding it or taking it away
|
||||
//
|
||||
// objLocalID is the localID of the object.
|
||||
|
||||
// Unfortunately, we have to pass the event the packet because objData is an array
|
||||
// That means multiple object perms may be updated in a single packet.
|
||||
|
||||
LLUUID AgentID = newobjPerms.AgentData.AgentID;
|
||||
LLUUID SessionID = newobjPerms.AgentData.SessionID;
|
||||
if (OnObjectPermissions != null)
|
||||
{
|
||||
OnObjectPermissions(this, AgentID, SessionID, permChanges);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PacketType.RequestObjectPropertiesFamily:
|
||||
|
|
|
@ -164,7 +164,7 @@ namespace OpenSim.Region.Environment
|
|||
if (user == objectOwner)
|
||||
permission = true;
|
||||
|
||||
// If the 'anybody can move' flag is set then allow anyone to move it
|
||||
// If the 'anybody can move' flag is set then allow anyone to copy it
|
||||
if ((objectflags & (uint)LLObject.ObjectFlags.ObjectCopy ) != 0)
|
||||
permission = true;
|
||||
|
||||
|
@ -212,7 +212,7 @@ namespace OpenSim.Region.Environment
|
|||
// Added this because at this point in time it wouldn't be wise for
|
||||
// the administrator object permissions to take effect.
|
||||
LLUUID objectOwner = task.OwnerID;
|
||||
uint objectflags = task.RootPart.ObjectFlags;
|
||||
uint objectflags = task.RootPart.EveryoneMask;
|
||||
|
||||
// Object owners should be able to edit their own content
|
||||
if (user == objectOwner)
|
||||
|
@ -242,6 +242,54 @@ namespace OpenSim.Region.Environment
|
|||
return permission;
|
||||
|
||||
}
|
||||
public virtual uint GenerateClientFlags(LLUUID user, LLUUID objID)
|
||||
{
|
||||
if (!m_scene.Entities.ContainsKey(objID))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// If it's not an object, we cant edit it.
|
||||
if (!(m_scene.Entities[objID] is SceneObjectGroup))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objID];
|
||||
LLUUID taskOwner = null;
|
||||
// Added this because at this point in time it wouldn't be wise for
|
||||
// the administrator object permissions to take effect.
|
||||
LLUUID objectOwner = task.OwnerID;
|
||||
uint OwnerMask = task.RootPart.ObjectFlags | task.RootPart.OwnerMask;
|
||||
uint GroupMask = task.RootPart.ObjectFlags | task.RootPart.GroupMask;
|
||||
uint EveryoneMask = task.RootPart.ObjectFlags | task.RootPart.EveryoneMask;
|
||||
|
||||
if (m_bypassPermissions)
|
||||
return OwnerMask;
|
||||
|
||||
// Object owners should be able to edit their own content
|
||||
if (user == objectOwner)
|
||||
return OwnerMask;
|
||||
|
||||
// Users should be able to edit what is over their land.
|
||||
if (m_scene.LandManager.getLandObject(task.AbsolutePosition.X, task.AbsolutePosition.Y).landData.ownerID ==
|
||||
user)
|
||||
return OwnerMask;
|
||||
|
||||
// Estate users should be able to edit anything in the sim
|
||||
if (IsEstateManager(user))
|
||||
return OwnerMask;
|
||||
|
||||
// Admin objects should not be editable by the above
|
||||
if (IsAdministrator(taskOwner))
|
||||
return EveryoneMask;
|
||||
|
||||
// Admin should be able to edit anything in the sim (including admin objects)
|
||||
if (IsAdministrator(user))
|
||||
return OwnerMask;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected virtual bool GenericObjectPermission(LLUUID user, LLUUID objId)
|
||||
{
|
||||
|
|
|
@ -555,7 +555,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
public void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
|
||||
{
|
||||
if (PermissionsMngr.CanEditObject(remoteClient.AgentId, objectID))
|
||||
if (PermissionsMngr.CanEditObject(remoteClient.AgentId, objectID) || PermissionsMngr.AnyoneCanMovePermission(remoteClient.AgentId, objectID))
|
||||
{
|
||||
SceneObjectGroup group = GetGroupByPrim(objectID);
|
||||
if (group != null)
|
||||
|
@ -729,7 +729,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
if (originPrim != null)
|
||||
{
|
||||
if (PermissionsMngr.CanCopyObject(AgentID, originPrim.UUID))
|
||||
if (PermissionsMngr.CanCopyObject(AgentID, originPrim.UUID) || PermissionsMngr.AnyoneCanCopyPermission(AgentID, originPrim.UUID))
|
||||
{
|
||||
SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
|
||||
copy.AbsolutePosition = copy.AbsolutePosition + offset;
|
||||
|
|
|
@ -543,6 +543,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
AddEntity(group);
|
||||
group.AbsolutePosition = pos;
|
||||
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||
rootPart.ApplySanePermissions();
|
||||
bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim);
|
||||
if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
|
||||
{
|
||||
|
|
|
@ -733,20 +733,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
AddEntityFromStorage(prim);
|
||||
SceneObjectPart rootPart = prim.GetChildPart(prim.UUID);
|
||||
if (m_permissions)
|
||||
{
|
||||
rootPart.EveryoneMask = rootPart.ObjectFlags;
|
||||
rootPart.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner;
|
||||
rootPart.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||
rootPart.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
||||
rootPart.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
||||
rootPart.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectAnyOwner;
|
||||
rootPart.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOfficer;
|
||||
}
|
||||
else
|
||||
{
|
||||
rootPart.EveryoneMask = rootPart.ObjectFlags;
|
||||
}
|
||||
rootPart.ApplySanePermissions();
|
||||
|
||||
bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim);
|
||||
if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
|
||||
rootPart.PhysActor = PhysicsScene.AddPrimShape(
|
||||
|
@ -839,6 +827,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
AddEntity(sceneOb);
|
||||
SceneObjectPart rootPart = sceneOb.GetChildPart(sceneOb.UUID);
|
||||
// if grass or tree, make phantom
|
||||
//rootPart.ApplySanePermissions();
|
||||
if ((rootPart.Shape.PCode == 95) || (rootPart.Shape.PCode == 255))
|
||||
{
|
||||
rootPart.AddFlag(LLObject.ObjectFlags.Phantom);
|
||||
|
@ -983,6 +972,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
client.OnEstateOwnerMessage += new EstateOwnerMessageRequest(m_estateManager.handleEstateOwnerMessage);
|
||||
client.OnRequestGodlikePowers += handleRequestGodlikePowers;
|
||||
client.OnGodKickUser += handleGodlikeKickUser;
|
||||
client.OnObjectPermissions += HandleObjectPermissionsUpdate;
|
||||
|
||||
client.OnCreateNewInventoryItem += CreateNewInventoryItem;
|
||||
client.OnCreateNewInventoryFolder += CommsManager.UserProfileCacheService.HandleCreateInventoryFolder;
|
||||
|
@ -1407,13 +1397,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
if (agentid == new LLUUID("44e87126e7944ded05b37c42da3d5cdb"))
|
||||
{
|
||||
|
||||
ClientManager.ForEachClient(delegate (IClientAPI controller)
|
||||
ClientManager.ForEachClient(delegate(IClientAPI controller)
|
||||
{
|
||||
ScenePresence p = GetScenePresence(controller.AgentId);
|
||||
bool childagent = false;
|
||||
if (!p.Equals(null))
|
||||
if (p.IsChildAgent)
|
||||
childagent=true;
|
||||
childagent = true;
|
||||
if (controller.AgentId != godid && !childagent) // Do we really want to kick the initiator of this madness?
|
||||
{
|
||||
controller.Kick(Helpers.FieldToUTF8String(reason));
|
||||
|
@ -1424,7 +1414,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// This is a bit crude. It seems the client will be null before it actually stops the thread
|
||||
// The thread will kill itself eventually :/
|
||||
// Is there another way to make sure *all* clients get this 'inter region' message?
|
||||
ClientManager.ForEachClient(delegate (IClientAPI controller)
|
||||
ClientManager.ForEachClient(delegate(IClientAPI controller)
|
||||
{
|
||||
ScenePresence p = GetScenePresence(controller.AgentId);
|
||||
bool childagent = false;
|
||||
|
@ -1452,7 +1442,26 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
}
|
||||
}
|
||||
public void HandleObjectPermissionsUpdate (IClientAPI controller, LLUUID AgentID, LLUUID SessionID, List<libsecondlife.Packets.ObjectPermissionsPacket.ObjectDataBlock> permChanges)
|
||||
{
|
||||
// Check for spoofing.. since this is permissions we're talking about here!
|
||||
if ((controller.SessionId == SessionID) && (controller.AgentId == AgentID))
|
||||
{
|
||||
for (int i = 0; i < permChanges.Count; i++)
|
||||
{
|
||||
|
||||
// Tell the object to do permission update
|
||||
byte field = permChanges[i].Field;
|
||||
uint localID = permChanges[i].ObjectLocalID;
|
||||
uint mask = permChanges[i].Mask;
|
||||
byte addRemTF = permChanges[i].Set;
|
||||
SceneObjectGroup chObjectGroup = GetGroupByPrim(localID);
|
||||
chObjectGroup.UpdatePermissions(AgentID, field, localID, mask, addRemTF);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public void SendAlertToUser(string firstName, string lastName, string message, bool modal)
|
||||
{
|
||||
foreach (ScenePresence presence in m_scenePresences.Values)
|
||||
|
|
|
@ -283,7 +283,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
AddPart(part);
|
||||
part.RegionHandle = m_regionHandle;
|
||||
|
||||
part.ApplyPermissions();
|
||||
part.ApplySanePermissions();
|
||||
}
|
||||
break;
|
||||
case XmlNodeType.EndElement:
|
||||
|
@ -530,7 +530,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
dupe.m_regionHandle = m_regionHandle;
|
||||
|
||||
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID);
|
||||
|
||||
dupe.m_rootPart.ApplySanePermissions();
|
||||
|
||||
/// may need to create a new Physics actor.
|
||||
if (dupe.RootPart.PhysActor != null)
|
||||
|
@ -555,6 +555,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// So, we have to make a copy of this one, set it in it's place then set the owner on this one
|
||||
|
||||
SetRootPartOwner(m_rootPart, cAgentID, cGroupID);
|
||||
|
||||
|
||||
m_rootPart.ScheduleFullUpdate();
|
||||
|
||||
List<SceneObjectPart> partList = new List<SceneObjectPart>(m_parts.Values);
|
||||
|
@ -592,6 +594,15 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
part.LastOwnerID = part.OwnerID;
|
||||
part.OwnerID = cAgentID;
|
||||
part.GroupID = cGroupID;
|
||||
|
||||
|
||||
if (part.OwnerID != cAgentID)
|
||||
{
|
||||
// Apply Next Owner Permissions if we're not bypassing permissions
|
||||
if (!m_scene.PermissionsMngr.BypassPermissions)
|
||||
m_rootPart.ApplyNextOwnerPermissions();
|
||||
}
|
||||
|
||||
part.ScheduleFullUpdate();
|
||||
}
|
||||
|
||||
|
@ -1224,6 +1235,14 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
public void UpdatePermissions(LLUUID AgentID, byte field, uint localID, uint mask, byte addRemTF)
|
||||
{
|
||||
SceneObjectPart updatePart = GetChildPart(localID);
|
||||
updatePart.UpdatePermissions(AgentID,field,localID,mask,addRemTF);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Shape
|
||||
|
@ -1514,13 +1533,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
#region Client Updating
|
||||
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient)
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient, uint clientFlags)
|
||||
{
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
SendPartFullUpdate(remoteClient, part);
|
||||
SendPartFullUpdate(remoteClient, part, clientFlags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1530,15 +1549,15 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="part"></param>
|
||||
internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part)
|
||||
internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags)
|
||||
{
|
||||
if (m_rootPart.UUID == part.UUID)
|
||||
{
|
||||
part.SendFullUpdateToClient(remoteClient, AbsolutePosition);
|
||||
part.SendFullUpdateToClient(remoteClient, AbsolutePosition, clientFlags);
|
||||
}
|
||||
else
|
||||
{
|
||||
part.SendFullUpdateToClient(remoteClient);
|
||||
part.SendFullUpdateToClient(remoteClient, clientFlags);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,8 +44,12 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
public class SceneObjectPart : IScriptHost
|
||||
{
|
||||
private const uint FULL_MASK_PERMISSIONS = 2147483647;
|
||||
private const LLObject.ObjectFlags OBJFULL_MASK_GENERAL = LLObject.ObjectFlags.ObjectCopy | LLObject.ObjectFlags.ObjectModify | LLObject.ObjectFlags.ObjectTransfer;
|
||||
private const LLObject.ObjectFlags OBJFULL_MASK_OWNER = LLObject.ObjectFlags.ObjectCopy | LLObject.ObjectFlags.ObjectModify | LLObject.ObjectFlags.ObjectOwnerModify | LLObject.ObjectFlags.ObjectTransfer | LLObject.ObjectFlags.ObjectYouOwner;
|
||||
private const uint OBJNEXT_OWNER = 2147483647;
|
||||
|
||||
private const uint FULL_MASK_PERMISSIONS_GENERAL = 2147483647;
|
||||
private const uint FULL_MASK_PERMISSIONS_OWNER = 2147483647;
|
||||
private string m_inventoryFileName = "";
|
||||
private LLUUID m_folderID = LLUUID.Zero;
|
||||
|
||||
|
@ -64,11 +68,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
public Int32 CreationDate;
|
||||
public uint ParentID = 0;
|
||||
|
||||
public uint OwnerMask = FULL_MASK_PERMISSIONS;
|
||||
public uint NextOwnerMask = FULL_MASK_PERMISSIONS;
|
||||
public uint GroupMask = FULL_MASK_PERMISSIONS;
|
||||
public uint EveryoneMask = FULL_MASK_PERMISSIONS;
|
||||
public uint BaseMask = FULL_MASK_PERMISSIONS;
|
||||
// Main grid has default permissions as follows
|
||||
//
|
||||
public uint OwnerMask = FULL_MASK_PERMISSIONS_OWNER;
|
||||
public uint NextOwnerMask = OBJNEXT_OWNER;
|
||||
public uint GroupMask = (uint) LLObject.ObjectFlags.None;
|
||||
public uint EveryoneMask = (uint) LLObject.ObjectFlags.None;
|
||||
public uint BaseMask = FULL_MASK_PERMISSIONS_OWNER;
|
||||
|
||||
protected byte[] m_particleSystem = new byte[0];
|
||||
|
||||
|
@ -463,17 +469,11 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
m_folderID = LLUUID.Random();
|
||||
|
||||
m_flags = 0;
|
||||
m_flags |= LLObject.ObjectFlags.ObjectModify |
|
||||
LLObject.ObjectFlags.ObjectCopy |
|
||||
LLObject.ObjectFlags.ObjectYouOwner |
|
||||
LLObject.ObjectFlags.Touch |
|
||||
LLObject.ObjectFlags.ObjectMove |
|
||||
LLObject.ObjectFlags.AllowInventoryDrop |
|
||||
LLObject.ObjectFlags.ObjectTransfer |
|
||||
LLObject.ObjectFlags.CreateSelected |
|
||||
LLObject.ObjectFlags.ObjectOwnerModify;
|
||||
m_flags |= LLObject.ObjectFlags.Touch |
|
||||
LLObject.ObjectFlags.AllowInventoryDrop |
|
||||
LLObject.ObjectFlags.CreateSelected;
|
||||
|
||||
ApplyPermissions();
|
||||
ApplySanePermissions();
|
||||
|
||||
ScheduleFullUpdate();
|
||||
}
|
||||
|
@ -511,7 +511,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
RotationOffset = rotation;
|
||||
ObjectFlags = flags;
|
||||
|
||||
ApplyPermissions();
|
||||
ApplySanePermissions();
|
||||
// ApplyPhysics();
|
||||
|
||||
ScheduleFullUpdate();
|
||||
|
@ -552,24 +552,99 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
DoPhysicsPropertyUpdate(usePhysics, true);
|
||||
}
|
||||
|
||||
public void ApplyPermissions()
|
||||
public void ApplyNextOwnerPermissions()
|
||||
{
|
||||
if (!ParentGroup.m_scene.PermissionsMngr.BypassPermissions)
|
||||
{
|
||||
EveryoneMask = ObjectFlags;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectCopy;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectAnyOwner;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOfficer;
|
||||
}
|
||||
else
|
||||
{
|
||||
EveryoneMask = ObjectFlags;
|
||||
}
|
||||
BaseMask = NextOwnerMask;
|
||||
OwnerMask = NextOwnerMask;
|
||||
}
|
||||
public void ApplySanePermissions()
|
||||
{
|
||||
// These are some flags that The OwnerMask should never have
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.Physics;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.Phantom;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.Scripted;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.Touch;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.Temporary;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.AnimSource;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.Money;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.CastShadows;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty;
|
||||
OwnerMask &= ~(uint)LLObject.ObjectFlags.CreateSelected;
|
||||
|
||||
|
||||
// These are some flags that the next owner mask should never have
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Physics;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Phantom;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Scripted;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Touch;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Temporary;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.AnimSource;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Money;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.CastShadows;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty;
|
||||
NextOwnerMask &= ~(uint)LLObject.ObjectFlags.CreateSelected;
|
||||
|
||||
|
||||
// These are some flags that the GroupMask should never have
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.Physics;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.Phantom;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.Scripted;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.Touch;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.Temporary;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.AnimSource;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.Money;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.CastShadows;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty;
|
||||
GroupMask &= ~(uint)LLObject.ObjectFlags.CreateSelected;
|
||||
|
||||
|
||||
// These are some flags that EveryoneMask should never have
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.Physics;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.Phantom;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.Scripted;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.Touch;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.Temporary;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.AnimSource;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.Money;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.CastShadows;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty;
|
||||
EveryoneMask &= ~(uint)LLObject.ObjectFlags.CreateSelected;
|
||||
|
||||
|
||||
// These are some flags that ObjectFlags (m_flags) should never have
|
||||
ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner;
|
||||
ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||
ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify;
|
||||
ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectYouOfficer;
|
||||
ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectCopy;
|
||||
ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
||||
ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -774,9 +849,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
//Console.WriteLine("Adding flag: " + ((LLObject.ObjectFlags) flag).ToString());
|
||||
m_flags |= flag;
|
||||
BaseMask |= (uint)flag;
|
||||
GroupMask |= (uint)flag;
|
||||
EveryoneMask |= (uint)flag;
|
||||
|
||||
}
|
||||
uint currflag = (uint)m_flags;
|
||||
//System.Console.WriteLine("Aprev: " + prevflag.ToString() + " curr: " + m_flags.ToString());
|
||||
|
@ -790,9 +863,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
//Console.WriteLine("Removing flag: " + ((LLObject.ObjectFlags)flag).ToString());
|
||||
m_flags &= ~flag;
|
||||
BaseMask &= ~(uint)flag;
|
||||
GroupMask &= ~(uint)flag;
|
||||
EveryoneMask &= ~(uint)flag;
|
||||
|
||||
}
|
||||
//System.Console.WriteLine("prev: " + prevflag.ToString() + " curr: " + m_flags.ToString());
|
||||
//ScheduleFullUpdate();
|
||||
|
@ -1198,6 +1269,51 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
#endregion
|
||||
|
||||
public void UpdatePermissions(LLUUID AgentID, byte field, uint localID, uint mask, byte addRemTF)
|
||||
{
|
||||
// Are we the owner?
|
||||
if (AgentID == OwnerID)
|
||||
{
|
||||
MainLog.Instance.Verbose("PERMISSIONS", "field: " + field.ToString() + ", mask: " + mask.ToString() + " addRemTF: " + addRemTF.ToString());
|
||||
|
||||
//Field 8 = EveryoneMask
|
||||
if (field == (byte)8)
|
||||
{
|
||||
MainLog.Instance.Verbose("PERMISSIONS", "Left over: " + (OwnerMask - EveryoneMask));
|
||||
if (addRemTF == (byte)0)
|
||||
{
|
||||
//EveryoneMask = (uint)0;
|
||||
EveryoneMask &= ~mask;
|
||||
//EveryoneMask &= ~(uint)57344;
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//EveryoneMask = (uint)0;
|
||||
EveryoneMask |= mask;
|
||||
//EveryoneMask |= (uint)57344;
|
||||
|
||||
}
|
||||
ScheduleFullUpdate();
|
||||
}
|
||||
//Field 16 = NextownerMask
|
||||
if (field == (byte)16)
|
||||
{
|
||||
if (addRemTF == (byte)0)
|
||||
{
|
||||
NextOwnerMask &= ~mask;
|
||||
}
|
||||
else
|
||||
{
|
||||
NextOwnerMask |= mask;
|
||||
}
|
||||
ScheduleFullUpdate();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#region Client Update Methods
|
||||
|
||||
public void AddFullUpdateToAllAvatars()
|
||||
|
@ -1222,7 +1338,8 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
|
||||
for (int i = 0; i < avatars.Count; i++)
|
||||
{
|
||||
m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this);
|
||||
// Ugly reference :(
|
||||
m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this, avatars[i].GenerateClientFlags(this.UUID));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1230,20 +1347,20 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
///
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
public void SendFullUpdate(IClientAPI remoteClient)
|
||||
public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags)
|
||||
{
|
||||
m_parentGroup.SendPartFullUpdate(remoteClient, this);
|
||||
m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient)
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient, uint clientflags)
|
||||
{
|
||||
LLVector3 lPos;
|
||||
lPos = OffsetPosition;
|
||||
SendFullUpdateToClient(remoteClient, lPos);
|
||||
SendFullUpdateToClient(remoteClient, lPos, clientflags);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1251,56 +1368,13 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="lPos"></param>
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient, LLVector3 lPos)
|
||||
public void SendFullUpdateToClient(IClientAPI remoteClient, LLVector3 lPos, uint clientFlags)
|
||||
{
|
||||
LLQuaternion lRot;
|
||||
lRot = RotationOffset;
|
||||
uint clientFlags = ObjectFlags & ~(uint)LLObject.ObjectFlags.CreateSelected;
|
||||
|
||||
List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
|
||||
foreach (ScenePresence s in avatars)
|
||||
if (remoteClient.AgentId == OwnerID)
|
||||
{
|
||||
if (s.m_uuid == OwnerID)
|
||||
{
|
||||
if (s.ControllingClient == remoteClient)
|
||||
{
|
||||
clientFlags = ObjectFlags;
|
||||
m_flags &= ~LLObject.ObjectFlags.CreateSelected;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// If you can't edit it, send the base permissions minus the flag to edit
|
||||
|
||||
|
||||
// We're going to be moving this into ScenePresence and the PermissionsManager itself.
|
||||
if (!ParentGroup.m_scene.PermissionsMngr.BypassPermissions)
|
||||
{
|
||||
if (ParentGroup.m_scene.PermissionsMngr.CanEditObject(remoteClient.AgentId, this.ParentGroup.UUID))
|
||||
{
|
||||
// we should be merging the objectflags with the ownermask here.
|
||||
// TODO: Future refactoring here.
|
||||
clientFlags = ObjectFlags;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//clientFlags = ObjectFlags;
|
||||
clientFlags = EveryoneMask;
|
||||
if (!ParentGroup.m_scene.PermissionsMngr.AnyoneCanCopyPermission(remoteClient.AgentId, this.ParentGroup.UUID))
|
||||
{
|
||||
clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectCopy;
|
||||
}
|
||||
|
||||
if (!ParentGroup.m_scene.PermissionsMngr.AnyoneCanMovePermission(remoteClient.AgentId, this.ParentGroup.UUID))
|
||||
{
|
||||
clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
||||
}
|
||||
|
||||
clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
||||
clientFlags &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
||||
clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||
}
|
||||
clientFlags &= ~(uint)LLObject.ObjectFlags.CreateSelected;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1479,11 +1553,11 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
public LLUUID item_id = LLUUID.Zero;
|
||||
public LLUUID parent_id = LLUUID.Zero; //parent folder id
|
||||
|
||||
public uint base_mask = FULL_MASK_PERMISSIONS;
|
||||
public uint owner_mask = FULL_MASK_PERMISSIONS;
|
||||
public uint group_mask = FULL_MASK_PERMISSIONS;
|
||||
public uint everyone_mask = FULL_MASK_PERMISSIONS;
|
||||
public uint next_owner_mask = FULL_MASK_PERMISSIONS;
|
||||
public uint base_mask = FULL_MASK_PERMISSIONS_GENERAL;
|
||||
public uint owner_mask = FULL_MASK_PERMISSIONS_GENERAL;
|
||||
public uint group_mask = FULL_MASK_PERMISSIONS_GENERAL;
|
||||
public uint everyone_mask = FULL_MASK_PERMISSIONS_GENERAL;
|
||||
public uint next_owner_mask = FULL_MASK_PERMISSIONS_GENERAL;
|
||||
public LLUUID creator_id = LLUUID.Zero;
|
||||
public LLUUID owner_id = LLUUID.Zero;
|
||||
public LLUUID last_owner_id = LLUUID.Zero;
|
||||
|
|
|
@ -343,7 +343,10 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
// }
|
||||
}
|
||||
|
||||
public uint GenerateClientFlags(LLUUID ObjectID)
|
||||
{
|
||||
return m_scene.PermissionsMngr.GenerateClientFlags(this.m_uuid, ObjectID);
|
||||
}
|
||||
public void SendPrimUpdates()
|
||||
{
|
||||
// if (m_scene.QuadTree.GetNodeID(this.AbsolutePosition.X, this.AbsolutePosition.Y) != m_currentQuadNode)
|
||||
|
@ -380,7 +383,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
if (update.LastFullUpdateTime < part.TimeStampFull)
|
||||
{
|
||||
//need to do a full update
|
||||
part.SendFullUpdate(ControllingClient);
|
||||
part.SendFullUpdate(ControllingClient, GenerateClientFlags(part.UUID));
|
||||
|
||||
// We'll update to the part's timestamp rather than the current to
|
||||
// avoid the race condition whereby the next tick occurs while we are
|
||||
|
@ -403,7 +406,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
else
|
||||
{
|
||||
//never been sent to client before so do full update
|
||||
part.SendFullUpdate(ControllingClient);
|
||||
part.SendFullUpdate(ControllingClient, GenerateClientFlags(part.UUID));
|
||||
ScenePartUpdate update = new ScenePartUpdate();
|
||||
update.FullID = part.UUID;
|
||||
update.LastFullUpdateTime = part.TimeStampFull;
|
||||
|
|
|
@ -47,6 +47,7 @@ namespace SimpleApp
|
|||
#pragma warning disable 67
|
||||
|
||||
public event Action<IClientAPI> OnLogout;
|
||||
public event ObjectPermissions OnObjectPermissions;
|
||||
public event Action<IClientAPI> OnConnectionClosed;
|
||||
|
||||
public event ImprovedInstantMessage OnInstantMessage;
|
||||
|
|
Loading…
Reference in New Issue