* Extended our semi-stupid implementation of in world object permissions to show a user's client that it can't edit a prim if it doesn't have permission.
* Permissions is due for a big revamp. The current way it's done is a hack at best.afrisby
parent
3ab3392def
commit
31cec30aa0
|
@ -344,7 +344,7 @@ namespace OpenSim
|
||||||
public UDPServer CreateRegion(RegionInfo regionInfo)
|
public UDPServer CreateRegion(RegionInfo regionInfo)
|
||||||
{
|
{
|
||||||
UDPServer udpServer;
|
UDPServer udpServer;
|
||||||
Scene scene = SetupScene(regionInfo, out udpServer);
|
Scene scene = SetupScene(regionInfo, out udpServer, m_permissions);
|
||||||
|
|
||||||
MainLog.Instance.Verbose("MODULES", "Loading Region's Modules");
|
MainLog.Instance.Verbose("MODULES", "Loading Region's Modules");
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ namespace OpenSim.Region.ClientStack
|
||||||
return physicsPluginManager.GetPhysicsScene(engine, meshEngine);
|
return physicsPluginManager.GetPhysicsScene(engine, meshEngine);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Scene SetupScene(RegionInfo regionInfo, out UDPServer udpServer)
|
protected Scene SetupScene(RegionInfo regionInfo, out UDPServer udpServer, bool m_permissions)
|
||||||
{
|
{
|
||||||
AgentCircuitManager circuitManager = new AgentCircuitManager();
|
AgentCircuitManager circuitManager = new AgentCircuitManager();
|
||||||
udpServer = new UDPServer(regionInfo.InternalEndPoint.Port, m_assetCache, m_log, circuitManager);
|
udpServer = new UDPServer(regionInfo.InternalEndPoint.Port, m_assetCache, m_log, circuitManager);
|
||||||
|
@ -146,7 +146,8 @@ namespace OpenSim.Region.ClientStack
|
||||||
}
|
}
|
||||||
|
|
||||||
scene.LandManager.resetSimLandObjects();
|
scene.LandManager.resetSimLandObjects();
|
||||||
scene.LoadPrimsFromStorage();
|
|
||||||
|
scene.LoadPrimsFromStorage(m_permissions);
|
||||||
|
|
||||||
scene.performParcelPrimCountUpdate();
|
scene.performParcelPrimCountUpdate();
|
||||||
scene.StartTimer();
|
scene.StartTimer();
|
||||||
|
|
|
@ -135,6 +135,114 @@ namespace OpenSim.Region.Environment
|
||||||
|
|
||||||
#region Object Permissions
|
#region Object Permissions
|
||||||
|
|
||||||
|
|
||||||
|
public virtual bool AnyoneCanCopyPermission(LLUUID user, LLUUID objId)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Default: deny
|
||||||
|
bool permission = false;
|
||||||
|
|
||||||
|
if (!m_scene.Entities.ContainsKey(objId))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it's not an object, we cant edit it.
|
||||||
|
if (!(m_scene.Entities[objId] is SceneObjectGroup))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 objectflags = task.RootPart.EveryoneMask;
|
||||||
|
|
||||||
|
// Object owners should be able to edit their own content
|
||||||
|
if (user == objectOwner)
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// If the 'anybody can move' flag is set then allow anyone to move it
|
||||||
|
if ((objectflags & (uint)LLObject.ObjectFlags.ObjectCopy ) != 0)
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// Estate users should be able to edit anything in the sim
|
||||||
|
if (IsEstateManager(user))
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// Admin objects should not be editable by the above
|
||||||
|
if (IsAdministrator(taskOwner))
|
||||||
|
permission = false;
|
||||||
|
|
||||||
|
// Admin should be able to edit anything in the sim (including admin objects)
|
||||||
|
if (IsAdministrator(user))
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
return permission;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public virtual bool AnyoneCanMovePermission(LLUUID user, LLUUID objId)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Default: deny
|
||||||
|
bool permission = false;
|
||||||
|
|
||||||
|
if (!m_scene.Entities.ContainsKey(objId))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it's not an object, we cant edit it.
|
||||||
|
if (!(m_scene.Entities[objId] is SceneObjectGroup))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 objectflags = task.RootPart.ObjectFlags;
|
||||||
|
|
||||||
|
// Object owners should be able to edit their own content
|
||||||
|
if (user == objectOwner)
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// If the 'anybody can move' flag is set then allow anyone to move it
|
||||||
|
if ((objectflags & (uint)LLObject.ObjectFlags.ObjectMove) != 0)
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// Estate users should be able to edit anything in the sim
|
||||||
|
if (IsEstateManager(user))
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
// Admin objects should not be editable by the above
|
||||||
|
if (IsAdministrator(taskOwner))
|
||||||
|
permission = false;
|
||||||
|
|
||||||
|
// Admin should be able to edit anything in the sim (including admin objects)
|
||||||
|
if (IsAdministrator(user))
|
||||||
|
permission = true;
|
||||||
|
|
||||||
|
return permission;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
protected virtual bool GenericObjectPermission(LLUUID user, LLUUID objId)
|
protected virtual bool GenericObjectPermission(LLUUID user, LLUUID objId)
|
||||||
{
|
{
|
||||||
// Default: deny
|
// Default: deny
|
||||||
|
|
|
@ -733,7 +733,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads the World's objects
|
/// Loads the World's objects
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void LoadPrimsFromStorage()
|
public virtual void LoadPrimsFromStorage(bool m_permissions)
|
||||||
{
|
{
|
||||||
MainLog.Instance.Verbose("Loading objects from datastore");
|
MainLog.Instance.Verbose("Loading objects from datastore");
|
||||||
List<SceneObjectGroup> PrimsFromDB = m_storageManager.DataStore.LoadObjects(m_regInfo.RegionID);
|
List<SceneObjectGroup> PrimsFromDB = m_storageManager.DataStore.LoadObjects(m_regInfo.RegionID);
|
||||||
|
@ -741,6 +741,20 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
AddEntityFromStorage(prim);
|
AddEntityFromStorage(prim);
|
||||||
SceneObjectPart rootPart = prim.GetChildPart(prim.UUID);
|
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;
|
||||||
|
}
|
||||||
bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim);
|
bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim);
|
||||||
if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
|
if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
|
||||||
rootPart.PhysActor = PhysicsScene.AddPrimShape(
|
rootPart.PhysActor = PhysicsScene.AddPrimShape(
|
||||||
|
@ -839,7 +853,8 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
// if grass or tree, make phantom
|
// if grass or tree, make phantom
|
||||||
if ((rootPart.Shape.PCode == 95) || (rootPart.Shape.PCode == 255))
|
if ((rootPart.Shape.PCode == 95) || (rootPart.Shape.PCode == 255))
|
||||||
{
|
{
|
||||||
rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom;
|
rootPart.AddFlag(LLObject.ObjectFlags.Phantom);
|
||||||
|
//rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom;
|
||||||
}
|
}
|
||||||
// if not phantom, add to physics
|
// if not phantom, add to physics
|
||||||
bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim);
|
bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim);
|
||||||
|
|
|
@ -466,6 +466,18 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
LLObject.ObjectFlags.CreateSelected |
|
LLObject.ObjectFlags.CreateSelected |
|
||||||
LLObject.ObjectFlags.ObjectOwnerModify;
|
LLObject.ObjectFlags.ObjectOwnerModify;
|
||||||
|
|
||||||
|
if (!ParentGroup.m_scene.PermissionsMngr.BypassPermissions)
|
||||||
|
{
|
||||||
|
EveryoneMask = (uint)m_flags;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
ScheduleFullUpdate();
|
ScheduleFullUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -503,6 +515,23 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
OffsetPosition = position;
|
OffsetPosition = position;
|
||||||
RotationOffset = rotation;
|
RotationOffset = rotation;
|
||||||
ObjectFlags = flags;
|
ObjectFlags = flags;
|
||||||
|
|
||||||
|
if (!ParentGroup.m_scene.PermissionsMngr.BypassPermissions)
|
||||||
|
{
|
||||||
|
EveryoneMask = (uint)m_flags;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
bool UsePhysics = ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
bool UsePhysics = ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
||||||
doPhysicsPropertyUpdate(UsePhysics, true);
|
doPhysicsPropertyUpdate(UsePhysics, true);
|
||||||
ScheduleFullUpdate();
|
ScheduleFullUpdate();
|
||||||
|
@ -519,6 +548,23 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart));
|
XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart));
|
||||||
SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader);
|
SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader);
|
||||||
|
|
||||||
|
if (!newobject.ParentGroup.m_scene.PermissionsMngr.BypassPermissions)
|
||||||
|
{
|
||||||
|
newobject.EveryoneMask = newobject.ObjectFlags;
|
||||||
|
newobject.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner;
|
||||||
|
newobject.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||||
|
newobject.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectCopy;
|
||||||
|
newobject.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
||||||
|
newobject.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
||||||
|
newobject.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectAnyOwner;
|
||||||
|
newobject.EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOfficer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newobject.EveryoneMask = newobject.ObjectFlags;
|
||||||
|
}
|
||||||
|
|
||||||
bool UsePhysics = ((newobject.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
bool UsePhysics = ((newobject.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
||||||
newobject.doPhysicsPropertyUpdate(UsePhysics, true);
|
newobject.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||||
|
|
||||||
|
@ -711,6 +757,9 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
//Console.WriteLine("Adding flag: " + ((LLObject.ObjectFlags) flag).ToString());
|
//Console.WriteLine("Adding flag: " + ((LLObject.ObjectFlags) flag).ToString());
|
||||||
m_flags |= flag;
|
m_flags |= flag;
|
||||||
|
BaseMask |= (uint)flag;
|
||||||
|
GroupMask |= (uint)flag;
|
||||||
|
EveryoneMask |= (uint)flag;
|
||||||
}
|
}
|
||||||
uint currflag = (uint) m_flags;
|
uint currflag = (uint) m_flags;
|
||||||
//System.Console.WriteLine("Aprev: " + prevflag.ToString() + " curr: " + m_flags.ToString());
|
//System.Console.WriteLine("Aprev: " + prevflag.ToString() + " curr: " + m_flags.ToString());
|
||||||
|
@ -724,6 +773,9 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
//Console.WriteLine("Removing flag: " + ((LLObject.ObjectFlags)flag).ToString());
|
//Console.WriteLine("Removing flag: " + ((LLObject.ObjectFlags)flag).ToString());
|
||||||
m_flags &= ~flag;
|
m_flags &= ~flag;
|
||||||
|
BaseMask &= ~(uint)flag;
|
||||||
|
GroupMask &= ~(uint)flag;
|
||||||
|
EveryoneMask &= ~(uint)flag;
|
||||||
}
|
}
|
||||||
//System.Console.WriteLine("prev: " + prevflag.ToString() + " curr: " + m_flags.ToString());
|
//System.Console.WriteLine("prev: " + prevflag.ToString() + " curr: " + m_flags.ToString());
|
||||||
//ScheduleFullUpdate();
|
//ScheduleFullUpdate();
|
||||||
|
@ -1201,19 +1253,36 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// If you can't edit it, send the base permissions minus the flag to edit
|
||||||
|
if (!ParentGroup.m_scene.PermissionsMngr.BypassPermissions)
|
||||||
|
{
|
||||||
|
if (ParentGroup.m_scene.PermissionsMngr.CanEditObject(remoteClient.AgentId, this.ParentGroup.UUID))
|
||||||
|
{
|
||||||
|
//clientFlags = ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
||||||
|
//clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
||||||
|
//clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
||||||
|
//clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||||
|
// Send EveryoneMask
|
||||||
|
clientFlags = ObjectFlags;
|
||||||
|
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If you can't edit it, send the base permissions minus the flag to edit
|
clientFlags = ObjectFlags;
|
||||||
if (!ParentGroup.m_scene.PermissionsMngr.CanEditObject(remoteClient.AgentId, this.ParentGroup.UUID))
|
if (!ParentGroup.m_scene.PermissionsMngr.AnyoneCanCopyPermission(remoteClient.AgentId, this.ParentGroup.UUID))
|
||||||
{
|
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectCopy;
|
||||||
clientFlags = ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
if (!ParentGroup.m_scene.PermissionsMngr.AnyoneCanMovePermission(remoteClient.AgentId, this.ParentGroup.UUID))
|
||||||
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectMove;
|
||||||
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
|
||||||
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectModify;
|
||||||
}
|
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop;
|
||||||
|
clientFlags = clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer;
|
||||||
|
clientFlags = EveryoneMask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
byte[] color = new byte[] { m_color.R, m_color.G, m_color.B, m_color.A };
|
byte[] color = new byte[] { m_color.R, m_color.G, m_color.B, m_color.A };
|
||||||
remoteClient.SendPrimitiveToClient(m_regionHandle, 64096, LocalID, m_shape, lPos, clientFlags, m_uuid,
|
remoteClient.SendPrimitiveToClient(m_regionHandle, 64096, LocalID, m_shape, lPos, clientFlags, m_uuid,
|
||||||
OwnerID,
|
OwnerID,
|
||||||
|
|
|
@ -98,7 +98,7 @@ namespace SimpleApp
|
||||||
m_moduleLoader = new ModuleLoader(m_log, m_config);
|
m_moduleLoader = new ModuleLoader(m_log, m_config);
|
||||||
m_moduleLoader.LoadDefaultSharedModules();
|
m_moduleLoader.LoadDefaultSharedModules();
|
||||||
|
|
||||||
Scene scene = SetupScene(regionInfo, out udpServer);
|
Scene scene = SetupScene(regionInfo, out udpServer, false);
|
||||||
|
|
||||||
m_moduleLoader.InitialiseSharedModules(scene);
|
m_moduleLoader.InitialiseSharedModules(scene);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue