*Added all the permission checks to the sceneexternalchecks and modified permission module to follow this.

*This makes permission checking much more modular; allows restrictive and granting module to be made without modifying the existing permission module
0.6.0-stable
mingchen 2008-05-08 19:37:57 +00:00
parent 4b924f2eb6
commit 6c71a04da8
11 changed files with 666 additions and 215 deletions

View File

@ -5070,13 +5070,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
case "getinfo":
if (((Scene)m_scene).Permissions.GenericEstatePermission(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanBeGodLike(this.AgentId))
{
OnDetailedEstateDataRequest(this, messagePacket.MethodData.Invoice);
}
break;
case "setregioninfo":
if (((Scene)m_scene).Permissions.CanEditEstateTerrain(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanEditEstateTerrain(this.AgentId))
{
OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter),convertParamStringToBool(messagePacket.ParamList[1].Parameter),
convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
@ -5089,7 +5089,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
break;
case "texturebase":
if (((Scene)m_scene).Permissions.CanEditEstateTerrain(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanEditEstateTerrain(this.AgentId))
{
foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
{
@ -5104,7 +5104,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
break;
case "texturedetail":
if (((Scene)m_scene).Permissions.CanEditEstateTerrain(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanEditEstateTerrain(this.AgentId))
{
foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
{
@ -5122,7 +5122,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
break;
case "textureheights":
if (((Scene)m_scene).Permissions.CanEditEstateTerrain(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanEditEstateTerrain(this.AgentId))
{
foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
{
@ -5143,7 +5143,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OnCommitEstateTerrainTextureRequest(this);
break;
case "setregionterrain":
if (((Scene)m_scene).Permissions.CanEditEstateTerrain(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanEditEstateTerrain(this.AgentId))
{
if (messagePacket.ParamList.Length != 9)
{
@ -5178,7 +5178,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
break;
case "restart":
if (((Scene)m_scene).Permissions.CanRestartSim(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanRestartSim(this.AgentId))
{
// There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
@ -5192,7 +5192,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
break;
case "estatechangecovenantid":
if (((Scene)m_scene).Permissions.CanEditEstateTerrain(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanEditEstateTerrain(this.AgentId))
{
foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
{
@ -5202,7 +5202,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
break;
case "estateaccessdelta": // Estate access delta manages the banlist and allow list too.
if (((Scene)m_scene).Permissions.GenericEstatePermission(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanBeGodLike(this.AgentId))
{
int estateAccessType = Convert.ToInt16(Helpers.FieldToUTF8String(messagePacket.ParamList[1].Parameter));
OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice,estateAccessType,new LLUUID(Helpers.FieldToUTF8String(messagePacket.ParamList[2].Parameter)));
@ -5210,7 +5210,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
break;
case "simulatormessage":
if (((Scene)m_scene).Permissions.GenericEstatePermission(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanBeGodLike(this.AgentId))
{
LLUUID invoice = messagePacket.MethodData.Invoice;
LLUUID SenderID = new LLUUID(Helpers.FieldToUTF8String(messagePacket.ParamList[2].Parameter));
@ -5221,7 +5221,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
break;
case "instantmessage":
if (((Scene)m_scene).Permissions.GenericEstatePermission(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanBeGodLike(this.AgentId))
{
LLUUID invoice = messagePacket.MethodData.Invoice;
LLUUID SenderID = new LLUUID(Helpers.FieldToUTF8String(messagePacket.ParamList[2].Parameter));
@ -5232,7 +5232,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
break;
case "setregiondebug":
if (((Scene)m_scene).Permissions.GenericEstatePermission(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanBeGodLike(this.AgentId))
{
LLUUID invoice = messagePacket.MethodData.Invoice;
LLUUID SenderID = messagePacket.AgentData.AgentID;
@ -5244,7 +5244,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
break;
case "teleporthomeuser":
if (((Scene)m_scene).Permissions.GenericEstatePermission(this.AgentId))
if (((Scene)m_scene).ExternalChecks.ExternalChecksCanBeGodLike(this.AgentId))
{
LLUUID invoice = messagePacket.MethodData.Invoice;
LLUUID SenderID = messagePacket.AgentData.AgentID;

View File

@ -32,72 +32,6 @@ namespace OpenSim.Region.Environment.Interfaces
public interface IScenePermissions
{
bool BypassPermissions { get; set; }
#region Object Permissions
bool CanRezObject(LLUUID user, LLVector3 position, int count);
/// <summary>
/// Permissions check - can user delete an object?
/// </summary>
/// <param name="user">User attempting the delete</param>
/// <param name="obj">Target object</param>
/// <returns>Has permission?</returns>
bool CanDeRezObject(LLUUID user, LLUUID obj);
bool CanCopyObject(LLUUID user, LLUUID obj);
bool CanEditObject(LLUUID user, LLUUID obj);
bool CanEditObjectPosition(LLUUID user, LLUUID obj);
/// <summary>
/// Permissions check - can user enter an object?
/// </summary>
/// <param name="user">User attempting move an object</param>
/// <param name="oldPos">Source object-position</param>
/// <param name="newPos">Target object-position</param>
/// <returns>Has permission?</returns>
bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos);
bool CanReturnObject(LLUUID user, LLUUID obj);
#endregion
#region Uncategorized permissions
bool CanInstantMessage(LLUUID user, LLUUID target);
bool CanInventoryTransfer(LLUUID user, LLUUID target);
bool CanEditScript(LLUUID user, LLUUID script);
bool CanRunScript(LLUUID user, LLUUID script);
bool CanRunConsoleCommand(LLUUID user);
bool CanTerraform(LLUUID user, LLVector3 position);
#endregion
#region Estate Permissions
bool IsEstateManager(LLUUID user);
bool GenericEstatePermission(LLUUID user);
bool CanEditEstateTerrain(LLUUID user);
bool CanRestartSim(LLUUID user);
bool CanEditParcel(LLUUID user, ILandObject parcel);
bool CanSellParcel(LLUUID user, ILandObject parcel);
bool CanAbandonParcel(LLUUID user, ILandObject parcel);
#endregion
uint GenerateClientFlags(LLUUID user, LLUUID objID);
}
}

View File

@ -61,12 +61,33 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
{
m_scene = scene;
// FIXME: Possibly move all permissions related stuff to its own section
IConfig myConfig = config.Configs["Startup"];
m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", false);
m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", true);
m_scene.RegisterModuleInterface<IScenePermissions>(this);
//Register External Permission Checks!
m_scene.ExternalChecks.addCheckAbandonParcel(this.CanAbandonParcel);
m_scene.ExternalChecks.addCheckCopyObject(this.CanCopyObject);
m_scene.ExternalChecks.addCheckDeRezObject(this.CanDeRezObject);
m_scene.ExternalChecks.addCheckEditEstateTerrain(this.CanEditEstateTerrain);
m_scene.ExternalChecks.addCheckEditObject(this.CanEditObject);
m_scene.ExternalChecks.addCheckEditParcel(this.CanEditParcel);
m_scene.ExternalChecks.addCheckEditScript(this.CanEditScript);
m_scene.ExternalChecks.addCheckInstantMessage(this.CanInstantMessage);
m_scene.ExternalChecks.addCheckInventoryTransfer(this.CanInventoryTransfer);
m_scene.ExternalChecks.addCheckMoveObject(this.CanEditObjectPosition);
m_scene.ExternalChecks.addCheckRestartSim(this.CanRestartSim);
m_scene.ExternalChecks.addCheckReturnObject(this.CanReturnObject);
m_scene.ExternalChecks.addCheckRezObject(this.CanRezObject);
m_scene.ExternalChecks.addCheckBeGodLike(this.CanBeGodLike);
m_scene.ExternalChecks.addCheckRunConsoleCommand(this.CanRunConsoleCommand);
m_scene.ExternalChecks.addCheckRunScript(this.CanRunScript);
m_scene.ExternalChecks.addCheckSellParcel(this.CanSellParcel);
//m_scene.ExternalChecks.addCheckTakeObject; -- NOT YET IMPLEMENTED
m_scene.ExternalChecks.addCheckTerraformLandCommand(this.CanTerraform);
}
public void PostInitialise()
@ -89,12 +110,12 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
#endregion
protected virtual void SendPermissionError(LLUUID user, string reason)
protected void SendPermissionError(LLUUID user, string reason)
{
m_scene.EventManager.TriggerPermissionError(user, reason);
}
protected virtual bool IsAdministrator(LLUUID user)
protected bool IsAdministrator(LLUUID user)
{
if (m_bypassPermissions)
{
@ -110,7 +131,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
return false;
}
public virtual bool IsEstateManager(LLUUID user)
public bool IsEstateManager(LLUUID user)
{
if (m_bypassPermissions)
{
@ -130,17 +151,17 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
return false;
}
protected virtual bool IsGridUser(LLUUID user)
protected bool IsGridUser(LLUUID user)
{
return true;
}
protected virtual bool IsGuest(LLUUID user)
protected bool IsGuest(LLUUID user)
{
return false;
}
public virtual bool CanRezObject(LLUUID user, LLVector3 position, int objectCount)
public bool CanRezObject(int objectCount, LLUUID user, LLVector3 position,Scene scene)
{
bool permission = false;
@ -148,13 +169,6 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
string reason = "Insufficient permission";
//Perform ExternalChecks first!
bool results = m_scene.ExternalChecks.ExternalChecksCanRezObject(objectCount, user, position);
if (results == false)
{
return false;
}
ILandObject land = m_scene.LandChannel.GetLandObject(position.X, position.Y);
if (land == null) return false;
@ -189,7 +203,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
}
/// <see cref="Opensim.Region.Environment.Interfaces.IScenePermissions></see>
public virtual bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos)
public bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos)
{
if ((newPos.X > 257f || newPos.X < -1f || newPos.Y > 257f || newPos.Y < -1f))
{
@ -233,7 +247,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
#region Object Permissions
public virtual uint GenerateClientFlags(LLUUID user, LLUUID objID)
public uint GenerateClientFlags(LLUUID user, LLUUID objID)
{
// Here's the way this works,
// ObjectFlags and Permission flags are two different enumerations
@ -344,7 +358,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
return objectFlagsMask;
}
protected virtual bool GenericObjectPermission(LLUUID currentUser, LLUUID objId)
protected bool GenericObjectPermission(LLUUID currentUser, LLUUID objId)
{
// Default: deny
bool permission = false;
@ -414,17 +428,17 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
}
/// <see cref="Opensim.Region.Environment.Interfaces.IScenePermissions></see>
public virtual bool CanDeRezObject(LLUUID user, LLUUID obj)
public bool CanDeRezObject(LLUUID obj,LLUUID user, Scene scene)
{
return GenericObjectPermission(user, obj);
}
public virtual bool CanEditObject(LLUUID user, LLUUID obj)
public bool CanEditObject(LLUUID obj, LLUUID user, Scene scene)
{
return GenericObjectPermission(user, obj);
}
public virtual bool CanEditObjectPosition(LLUUID user, LLUUID obj)
public bool CanEditObjectPosition(LLUUID obj, LLUUID user, Scene scene)
{
bool permission = GenericObjectPermission(user, obj);
if (!permission)
@ -499,7 +513,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
return permission;
}
public virtual bool CanCopyObject(LLUUID user, LLUUID obj)
public bool CanCopyObject(int objectCount, LLUUID obj, LLUUID user, Scene scene, LLVector3 objectPosition)
{
bool permission = GenericObjectPermission(user, obj);
if (permission)
@ -521,15 +535,14 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
// the administrator object permissions to take effect.
LLUUID objectOwner = task.OwnerID;
//Check ExternalChecks!
if (m_scene.ExternalChecks.ExternalChecksCanRezObject(task.Children.Count, objectOwner, task.GroupCentrePoint) == false) return false;
if ((task.RootPart.EveryoneMask & PERM_COPY) != 0)
permission = true;
}
return permission;
}
public virtual bool CanReturnObject(LLUUID user, LLUUID obj)
public bool CanReturnObject(LLUUID obj, LLUUID user, Scene scene)
{
return GenericObjectPermission(user, obj);
}
@ -538,7 +551,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
#region Communication Permissions
protected virtual bool GenericCommunicationPermission(LLUUID user, LLUUID target)
protected bool GenericCommunicationPermission(LLUUID user, LLUUID target)
{
bool permission = false;
string reason = "Only registered users may communicate with another account.";
@ -563,36 +576,34 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
return permission;
}
public virtual bool CanInstantMessage(LLUUID user, LLUUID target)
public bool CanInstantMessage(LLUUID user, LLUUID target, Scene scene)
{
return GenericCommunicationPermission(user, target);
}
public virtual bool CanInventoryTransfer(LLUUID user, LLUUID target)
public bool CanInventoryTransfer(LLUUID user, LLUUID target, Scene scene)
{
return GenericCommunicationPermission(user, target);
}
#endregion
public virtual bool CanEditScript(LLUUID user, LLUUID script)
public bool CanEditScript(LLUUID script, LLUUID user, Scene scene)
{
return IsAdministrator(user);
}
public virtual bool CanRunScript(LLUUID user, LLUUID script)
{
//External Checks!
if (!m_scene.ExternalChecks.ExternalChecksCanRunScript(script, user)) return false;
return IsAdministrator(user);
}
public virtual bool CanRunConsoleCommand(LLUUID user)
public bool CanRunScript(LLUUID script, LLUUID user, Scene scene)
{
return IsAdministrator(user);
}
public virtual bool CanTerraform(LLUUID user, LLVector3 position)
public bool CanRunConsoleCommand(LLUUID user, Scene scene)
{
return IsAdministrator(user);
}
public bool CanTerraform(LLUUID user, LLVector3 position, Scene scene)
{
bool permission = false;
@ -625,7 +636,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
#region Estate Permissions
public virtual bool GenericEstatePermission(LLUUID user)
public bool GenericEstatePermission(LLUUID user)
{
// Default: deny
bool permission = false;
@ -641,12 +652,12 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
return permission;
}
public virtual bool CanEditEstateTerrain(LLUUID user)
public bool CanEditEstateTerrain(LLUUID user, Scene scene)
{
return GenericEstatePermission(user);
}
public virtual bool CanRestartSim(LLUUID user)
public bool CanRestartSim(LLUUID user, Scene scene)
{
// Since this is potentially going on a grid...
@ -654,11 +665,16 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
//return m_scene.RegionInfo.MasterAvatarAssignedUUID == user;
}
public bool CanBeGodLike(LLUUID user, Scene scene)
{
return GenericEstatePermission(user);
}
#endregion
#region Parcel Permissions
protected virtual bool GenericParcelPermission(LLUUID user, ILandObject parcel)
protected bool GenericParcelPermission(LLUUID user, ILandObject parcel)
{
bool permission = false;
@ -685,24 +701,24 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
return permission;
}
protected virtual bool GenericParcelPermission(LLUUID user, LLVector3 pos)
protected bool GenericParcelPermission(LLUUID user, LLVector3 pos)
{
ILandObject parcel = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
if (parcel == null) return false;
return GenericParcelPermission(user, parcel);
}
public virtual bool CanEditParcel(LLUUID user, ILandObject parcel)
public bool CanEditParcel(LLUUID user, ILandObject parcel, Scene scene)
{
return GenericParcelPermission(user, parcel);
}
public virtual bool CanSellParcel(LLUUID user, ILandObject parcel)
public bool CanSellParcel(LLUUID user, ILandObject parcel, Scene scene)
{
return GenericParcelPermission(user, parcel);
}
public virtual bool CanAbandonParcel(LLUUID user, ILandObject parcel)
public bool CanAbandonParcel(LLUUID user, ILandObject parcel, Scene scene)
{
return GenericParcelPermission(user, parcel);
}

View File

@ -449,7 +449,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
float south, float east, IClientAPI remoteClient)
{
// Not a good permissions check, if in area mode, need to check the entire area.
if (m_scene.Permissions.CanTerraform(remoteClient.AgentId, new LLVector3(north, west, 0)))
if (m_scene.ExternalChecks.ExternalChecksCanTerraformLand(remoteClient.AgentId, new LLVector3(north, west, 0)))
{
if (north == south && east == west)
{

View File

@ -394,7 +394,7 @@ namespace OpenSim.Region.Environment.Scenes
if (((SceneObjectGroup)obj).LocalId == objectLocalID)
{
SceneObjectGroup group = (SceneObjectGroup)obj;
if (m_parentScene.Permissions.CanEditObject(remoteClient.AgentId, obj.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditScript(obj.UUID, remoteClient.AgentId))
{
// If the attachment point isn't the same as the one previously used
// set it's offset position = 0 so that it appears on the attachment point
@ -1051,7 +1051,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditObject(group.UUID, remoteClient.AgentId))
{
group.Resize(scale, localID);
}
@ -1062,7 +1062,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditObject(group.UUID, remoteClient.AgentId))
{
group.GroupResize(scale, localID);
}
@ -1098,7 +1098,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(group.UUID, remoteClient.AgentId))
{
group.UpdateSingleRotation(rot, localID);
}
@ -1116,7 +1116,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(group.UUID, remoteClient.AgentId))
{
group.UpdateGroupRotation(rot);
}
@ -1135,7 +1135,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(group.UUID, remoteClient.AgentId))
{
group.UpdateGroupRotation(pos, rot);
}
@ -1148,12 +1148,13 @@ namespace OpenSim.Region.Environment.Scenes
if (group != null)
{
LLVector3 oldPos = group.AbsolutePosition;
if (!m_parentScene.Permissions.CanObjectEntry(remoteClient.AgentId, oldPos, pos) && !group.RootPart.m_IsAttachment)
{
//FIXME: ObjectEntry is not in ExternalChecks!
//if (!m_parentScene.Permissions.CanObjectEntry(remoteClient.AgentId, oldPos, pos) && !group.RootPart.m_IsAttachment)
//{
group.SendGroupTerseUpdate();
return;
}
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID) || group.RootPart.m_IsAttachment)
//return;
//}
if (m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(remoteClient.AgentId, group.UUID) || group.RootPart.m_IsAttachment)
{
group.UpdateSinglePosition(pos, localID);
}
@ -1179,12 +1180,13 @@ namespace OpenSim.Region.Environment.Scenes
}
else
{
if (!m_parentScene.Permissions.CanObjectEntry(remoteClient.AgentId, oldPos, pos) && !group.RootPart.m_IsAttachment)
{
//FIXME: ObjectEntry not in ExternalChecks!
//if (!m_parentScene.Permissions.CanObjectEntry(remoteClient.AgentId, oldPos, pos) && !group.RootPart.m_IsAttachment)
//{
group.SendGroupTerseUpdate();
return;
}
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID) || group.RootPart.m_IsAttachment)
// return;
//}
if (m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(group.UUID, remoteClient.AgentId) || group.RootPart.m_IsAttachment)
{
group.UpdateGroupPosition(pos);
}
@ -1203,7 +1205,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(group.UUID,remoteClient.AgentId))
{
group.UpdateTextureEntry(localID, texture);
}
@ -1221,7 +1223,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObject(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditObject(group.UUID, remoteClient.AgentId))
{
group.UpdatePrimFlags(localID, (ushort)packet.Type, true, packet.ToBytes());
}
@ -1233,7 +1235,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(objectID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(remoteClient.AgentId, group.UUID))// && PermissionsMngr.)
if (m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.)
{
group.GrabMovement(offset, pos, remoteClient);
}
@ -1255,7 +1257,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(primLocalID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObject(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditObject(group.UUID, remoteClient.AgentId))
{
group.SetPartName(Util.CleanString(name), primLocalID);
}
@ -1272,7 +1274,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(primLocalID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObject(remoteClient.AgentId, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditObject(group.UUID, remoteClient.AgentId))
{
group.SetPartDescription(Util.CleanString(description), primLocalID);
}
@ -1285,7 +1287,7 @@ namespace OpenSim.Region.Environment.Scenes
if (group != null)
{
if (m_parentScene.Permissions.CanEditObject(agentID, group.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditObject(group.UUID,agentID))
{
group.UpdateExtraParam(primLocalID, type, inUse, data);
}
@ -1302,7 +1304,7 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(primLocalID);
if (group != null)
{
if (m_parentScene.Permissions.CanEditObjectPosition(agentID, group.GetPartsFullID(primLocalID)))
if (m_parentScene.ExternalChecks.ExternalChecksCanEditObject(group.GetPartsFullID(primLocalID), agentID))
{
ObjectShapePacket.ObjectDataBlock shapeData = new ObjectShapePacket.ObjectDataBlock();
shapeData.ObjectLocalID = shapeBlock.ObjectLocalID;
@ -1489,11 +1491,11 @@ namespace OpenSim.Region.Environment.Scenes
// * Asset/DRM permission bit "modify" is enabled
//use CanEditObjectPosition
if (IncludeInSearch && m_parentScene.Permissions.CanEditObject(user, objid))
if (IncludeInSearch && m_parentScene.ExternalChecks.ExternalChecksCanEditObject(objid, user))
{
obj.AddFlag(LLObject.ObjectFlags.JointWheel);
}
else if (!IncludeInSearch && m_parentScene.Permissions.CanEditObjectPosition(user, objid))
else if (!IncludeInSearch && m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(objid,user))
{
obj.RemFlag(LLObject.ObjectFlags.JointWheel);
}
@ -1526,7 +1528,7 @@ namespace OpenSim.Region.Environment.Scenes
if (originPrim != null)
{
if (m_parentScene.Permissions.CanCopyObject(AgentID, originPrim.UUID))
if (m_parentScene.ExternalChecks.ExternalChecksCanCopyObject(originPrim.Children.Count, originPrim.UUID, AgentID, originPrim.AbsolutePosition))
{
SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
copy.AbsolutePosition = copy.AbsolutePosition + offset;

View File

@ -73,7 +73,7 @@ namespace OpenSim.Region.Environment.Scenes
remoteClient.SendInventoryItemCreateUpdate(item);
int userlevel = 0;
if (Permissions.IsEstateManager(remoteClient.AgentId))
if (ExternalChecks.ExternalChecksCanBeGodLike(remoteClient.AgentId))
{
userlevel = 1;
}
@ -988,13 +988,11 @@ namespace OpenSim.Region.Environment.Scenes
bool permission;
if (DeRezPacket.AgentBlock.Destination == 1)
{ // Take Copy
permission = Permissions.CanCopyObject(remoteClient.AgentId,
((SceneObjectGroup) selectedEnt).UUID);
permission = ExternalChecks.ExternalChecksCanTakeObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
}
else
{ // Take
permission = Permissions.CanDeRezObject(remoteClient.AgentId,
((SceneObjectGroup) selectedEnt).UUID);
permission = ExternalChecks.ExternalChecksCanTakeObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
}
if (permission)
@ -1285,7 +1283,7 @@ namespace OpenSim.Region.Environment.Scenes
{
string xmlData = Helpers.FieldToUTF8String(rezAsset.Data);
SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
if (!Permissions.CanRezObject(remoteClient.AgentId, pos, group.Children.Count) && !attachment)
if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count,remoteClient.AgentId, pos) && !attachment)
{
return null;
}
@ -1371,7 +1369,7 @@ namespace OpenSim.Region.Environment.Scenes
string xmlData = Helpers.FieldToUTF8String(rezAsset.Data);
SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
if (!Permissions.CanRezObject(ownerID, pos, group.Children.Count))
if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count, ownerID, pos))
{
return null;
}

View File

@ -85,7 +85,7 @@ namespace OpenSim.Region.Environment.Scenes
if (((SceneObjectGroup) ent).LocalId == primLocalID)
{
// A prim is only tainted if it's allowed to be edited by the person clicking it.
if (Permissions.CanEditObjectPosition(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID) || Permissions.CanEditObject(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID))
if (ExternalChecks.ExternalChecksCanEditObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId) || ExternalChecks.ExternalChecksCanMoveObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId))
{
((SceneObjectGroup) ent).GetProperties(remoteClient);
((SceneObjectGroup) ent).IsSelected = true;
@ -112,7 +112,7 @@ namespace OpenSim.Region.Environment.Scenes
{
if (((SceneObjectGroup) ent).LocalId == primLocalID)
{
if (Permissions.CanEditObjectPosition(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID) || Permissions.CanEditObject(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID))
if (ExternalChecks.ExternalChecksCanEditObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId) || ExternalChecks.ExternalChecksCanMoveObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId))
{
((SceneObjectGroup) ent).IsSelected = false;
LandChannel.SetPrimsTainted();

View File

@ -1245,7 +1245,7 @@ namespace OpenSim.Region.Environment.Scenes
LLVector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection, true, new LLVector3(0.5f,0.5f,0.5f), false);
if (Permissions.CanRezObject(ownerID, pos, 1))
if ( ExternalChecks.ExternalChecksCanRezObject(1,ownerID,pos))
{
// rez ON the ground, not IN the ground
pos.Z += 0.25F;
@ -2519,7 +2519,7 @@ namespace OpenSim.Region.Environment.Scenes
if (m_scenePresences.ContainsKey(agentID))
{
// First check that this is the sim owner
if (Permissions.GenericEstatePermission(agentID))
if (ExternalChecks.ExternalChecksCanBeGodLike(agentID))
{
// Next we check for spoofing.....
LLUUID testSessionID = m_scenePresences[agentID].ControllingClient.SessionId;
@ -2597,7 +2597,7 @@ namespace OpenSim.Region.Environment.Scenes
{
if (m_scenePresences.ContainsKey(agentID) || agentID == kickUserID)
{
if (Permissions.GenericEstatePermission(godID))
if (ExternalChecks.ExternalChecksCanBeGodLike(godID))
{
if (agentID == kickUserID)
{
@ -2918,7 +2918,7 @@ namespace OpenSim.Region.Environment.Scenes
}
else if ((parcel.landData.landFlags & (uint)Parcel.ParcelFlags.AllowGroupScripts) != 0)
{
if (part.OwnerID == parcel.landData.ownerID || (parcel.landData.isGroupOwned && part.GroupID == parcel.landData.groupID) || Permissions.GenericEstatePermission(part.OwnerID))
if (part.OwnerID == parcel.landData.ownerID || (parcel.landData.isGroupOwned && part.GroupID == parcel.landData.groupID) || ExternalChecks.ExternalChecksCanBeGodLike(part.OwnerID))
{
return true;
}

View File

@ -30,6 +30,7 @@ using System.Collections.Generic;
using System.Text;
using libsecondlife;
using OpenSim.Framework;
using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment.Scenes
{
@ -42,8 +43,10 @@ namespace OpenSim.Region.Environment.Scenes
m_scene = scene;
}
#region Object Permission Checks
#region REZ OBJECT
public delegate bool CanRezObject(int objectCount, LLUUID owner, IScene scene, LLVector3 objectPosition);
public delegate bool CanRezObject(int objectCount, LLUUID owner, LLVector3 objectPosition, Scene scene);
private List<CanRezObject> CanRezObjectCheckFunctions = new List<CanRezObject>();
public void addCheckRezObject(CanRezObject delegateFunc)
@ -61,7 +64,272 @@ namespace OpenSim.Region.Environment.Scenes
{
foreach (CanRezObject check in CanRezObjectCheckFunctions)
{
if (check(objectCount, owner, m_scene, objectPosition) == false)
if (check(objectCount, owner,objectPosition, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region DEREZ OBJECT
public delegate bool CanDeRezObject(LLUUID objectID, LLUUID deleter, Scene scene);
private List<CanDeRezObject> CanDeRezObjectCheckFunctions = new List<CanDeRezObject>();
public void addCheckDeRezObject(CanDeRezObject delegateFunc)
{
if (!CanDeRezObjectCheckFunctions.Contains(delegateFunc))
CanDeRezObjectCheckFunctions.Add(delegateFunc);
}
public void removeCheckDeRezObject(CanDeRezObject delegateFunc)
{
if (CanDeRezObjectCheckFunctions.Contains(delegateFunc))
CanDeRezObjectCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanDeRezObject(LLUUID objectID, LLUUID deleter)
{
foreach (CanDeRezObject check in CanDeRezObjectCheckFunctions)
{
if (check(objectID,deleter,m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region TAKE OBJECT
public delegate bool CanTakeObject(LLUUID objectID, LLUUID stealer, Scene scene);
private List<CanTakeObject> CanTakeObjectCheckFunctions = new List<CanTakeObject>();
public void addCheckTakeObject(CanTakeObject delegateFunc)
{
if (!CanTakeObjectCheckFunctions.Contains(delegateFunc))
CanTakeObjectCheckFunctions.Add(delegateFunc);
}
public void removeCheckTakeObject(CanTakeObject delegateFunc)
{
if (CanTakeObjectCheckFunctions.Contains(delegateFunc))
CanTakeObjectCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanTakeObject(LLUUID objectID, LLUUID stealer)
{
foreach (CanTakeObject check in CanTakeObjectCheckFunctions)
{
if (check(objectID, stealer, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region COPY OBJECT
public delegate bool CanCopyObject(int objectCount, LLUUID objectID, LLUUID owner, Scene scene, LLVector3 objectPosition);
private List<CanCopyObject> CanCopyObjectCheckFunctions = new List<CanCopyObject>();
public void addCheckCopyObject(CanCopyObject delegateFunc)
{
if (!CanCopyObjectCheckFunctions.Contains(delegateFunc))
CanCopyObjectCheckFunctions.Add(delegateFunc);
}
public void removeCheckCopyObject(CanCopyObject delegateFunc)
{
if (CanCopyObjectCheckFunctions.Contains(delegateFunc))
CanCopyObjectCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanCopyObject(int objectCount, LLUUID objectID, LLUUID owner, LLVector3 objectPosition)
{
foreach (CanCopyObject check in CanCopyObjectCheckFunctions)
{
if (check(objectCount, objectID, owner, m_scene, objectPosition) == false)
{
return false;
}
}
return true;
}
#endregion
#region EDIT OBJECT
public delegate bool CanEditObject(LLUUID objectID, LLUUID editorID, Scene scene);
private List<CanEditObject> CanEditObjectCheckFunctions = new List<CanEditObject>();
public void addCheckEditObject(CanEditObject delegateFunc)
{
if (!CanEditObjectCheckFunctions.Contains(delegateFunc))
CanEditObjectCheckFunctions.Add(delegateFunc);
}
public void removeCheckEditObject(CanEditObject delegateFunc)
{
if (CanEditObjectCheckFunctions.Contains(delegateFunc))
CanEditObjectCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanEditObject(LLUUID objectID, LLUUID editorID)
{
foreach (CanEditObject check in CanEditObjectCheckFunctions)
{
if (check(objectID, editorID, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region MOVE OBJECT
public delegate bool CanMoveObject(LLUUID objectID, LLUUID moverID, Scene scene);
private List<CanMoveObject> CanMoveObjectCheckFunctions = new List<CanMoveObject>();
public void addCheckMoveObject(CanMoveObject delegateFunc)
{
if (!CanMoveObjectCheckFunctions.Contains(delegateFunc))
CanMoveObjectCheckFunctions.Add(delegateFunc);
}
public void removeCheckMoveObject(CanMoveObject delegateFunc)
{
if (CanMoveObjectCheckFunctions.Contains(delegateFunc))
CanMoveObjectCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanMoveObject(LLUUID objectID, LLUUID moverID)
{
foreach (CanMoveObject check in CanMoveObjectCheckFunctions)
{
if (check(objectID,moverID,m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region RETURN OBJECT
public delegate bool CanReturnObject(LLUUID objectID, LLUUID returnerID, Scene scene);
private List<CanReturnObject> CanReturnObjectCheckFunctions = new List<CanReturnObject>();
public void addCheckReturnObject(CanReturnObject delegateFunc)
{
if (!CanReturnObjectCheckFunctions.Contains(delegateFunc))
CanReturnObjectCheckFunctions.Add(delegateFunc);
}
public void removeCheckReturnObject(CanReturnObject delegateFunc)
{
if (CanReturnObjectCheckFunctions.Contains(delegateFunc))
CanReturnObjectCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanReturnObject(LLUUID objectID, LLUUID returnerID)
{
foreach (CanReturnObject check in CanReturnObjectCheckFunctions)
{
if (check(objectID,returnerID,m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#endregion
#region Misc Permission Checks
#region INSTANT MESSAGE
public delegate bool CanInstantMessage(LLUUID user, LLUUID target, Scene startScene);
private List<CanInstantMessage> CanInstantMessageCheckFunctions = new List<CanInstantMessage>();
public void addCheckInstantMessage(CanInstantMessage delegateFunc)
{
if (!CanInstantMessageCheckFunctions.Contains(delegateFunc))
CanInstantMessageCheckFunctions.Add(delegateFunc);
}
public void removeCheckInstantMessage(CanInstantMessage delegateFunc)
{
if (CanInstantMessageCheckFunctions.Contains(delegateFunc))
CanInstantMessageCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanInstantMessage(LLUUID user, LLUUID target)
{
foreach (CanInstantMessage check in CanInstantMessageCheckFunctions)
{
if (check(user,target,m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region INVENTORY TRANSFER
public delegate bool CanInventoryTransfer(LLUUID user, LLUUID target, Scene startScene);
private List<CanInventoryTransfer> CanInventoryTransferCheckFunctions = new List<CanInventoryTransfer>();
public void addCheckInventoryTransfer(CanInventoryTransfer delegateFunc)
{
if (!CanInventoryTransferCheckFunctions.Contains(delegateFunc))
CanInventoryTransferCheckFunctions.Add(delegateFunc);
}
public void removeCheckInventoryTransfer(CanInventoryTransfer delegateFunc)
{
if (CanInventoryTransferCheckFunctions.Contains(delegateFunc))
CanInventoryTransferCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanInventoryTransfer(LLUUID user, LLUUID target)
{
foreach (CanInventoryTransfer check in CanInventoryTransferCheckFunctions)
{
if (check(user, target, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region EDIT SCRIPT
public delegate bool CanEditScript(LLUUID script, LLUUID user, Scene scene);
private List<CanEditScript> CanEditScriptCheckFunctions = new List<CanEditScript>();
public void addCheckEditScript(CanEditScript delegateFunc)
{
if (!CanEditScriptCheckFunctions.Contains(delegateFunc))
CanEditScriptCheckFunctions.Add(delegateFunc);
}
public void removeCheckEditScript(CanEditScript delegateFunc)
{
if (CanEditScriptCheckFunctions.Contains(delegateFunc))
CanEditScriptCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanEditScript(LLUUID script, LLUUID user)
{
foreach (CanEditScript check in CanEditScriptCheckFunctions)
{
if (check(script, user, m_scene) == false)
{
return false;
}
@ -72,7 +340,7 @@ namespace OpenSim.Region.Environment.Scenes
#endregion
#region RUN SCRIPT
public delegate bool CanRunScript(LLUUID script, LLUUID owner, IScene scene);
public delegate bool CanRunScript(LLUUID script, LLUUID user, Scene scene);
private List<CanRunScript> CanRunScriptCheckFunctions = new List<CanRunScript>();
public void addCheckRunScript(CanRunScript delegateFunc)
@ -86,11 +354,11 @@ namespace OpenSim.Region.Environment.Scenes
CanRunScriptCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanRunScript(LLUUID script, LLUUID owner)
public bool ExternalChecksCanRunScript(LLUUID script, LLUUID user)
{
foreach (CanRunScript check in CanRunScriptCheckFunctions)
{
if (check(script,owner,m_scene) == false)
if (check(script, user, m_scene) == false)
{
return false;
}
@ -100,5 +368,238 @@ namespace OpenSim.Region.Environment.Scenes
#endregion
#region TERRAFORM LAND
public delegate bool CanTerraformLandCommand(LLUUID user, LLVector3 position, Scene requestFromScene);
private List<CanTerraformLandCommand> CanTerraformLandCommandCheckFunctions = new List<CanTerraformLandCommand>();
public void addCheckTerraformLandCommand(CanTerraformLandCommand delegateFunc)
{
if (!CanTerraformLandCommandCheckFunctions.Contains(delegateFunc))
CanTerraformLandCommandCheckFunctions.Add(delegateFunc);
}
public void removeCheckTerraformLandCommand(CanTerraformLandCommand delegateFunc)
{
if (CanTerraformLandCommandCheckFunctions.Contains(delegateFunc))
CanTerraformLandCommandCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanTerraformLand(LLUUID user, LLVector3 pos)
{
foreach (CanTerraformLandCommand check in CanTerraformLandCommandCheckFunctions)
{
if (check(user, pos, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region RUN CONSOLE COMMAND
public delegate bool CanRunConsoleCommand(LLUUID user, Scene requestFromScene);
private List<CanRunConsoleCommand> CanRunConsoleCommandCheckFunctions = new List<CanRunConsoleCommand>();
public void addCheckRunConsoleCommand(CanRunConsoleCommand delegateFunc)
{
if (!CanRunConsoleCommandCheckFunctions.Contains(delegateFunc))
CanRunConsoleCommandCheckFunctions.Add(delegateFunc);
}
public void removeCheckRunConsoleCommand(CanRunConsoleCommand delegateFunc)
{
if (CanRunConsoleCommandCheckFunctions.Contains(delegateFunc))
CanRunConsoleCommandCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanRunConsoleCommand(LLUUID user)
{
foreach (CanRunConsoleCommand check in CanRunConsoleCommandCheckFunctions)
{
if (check(user, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region CAN BE GODLIKE
public delegate bool CanBeGodLike(LLUUID user, Scene requestFromScene);
private List<CanBeGodLike> CanBeGodLikeCheckFunctions = new List<CanBeGodLike>();
public void addCheckBeGodLike(CanBeGodLike delegateFunc)
{
if (!CanBeGodLikeCheckFunctions.Contains(delegateFunc))
CanBeGodLikeCheckFunctions.Add(delegateFunc);
}
public void removeCheckBeGodLike(CanBeGodLike delegateFunc)
{
if (CanBeGodLikeCheckFunctions.Contains(delegateFunc))
CanBeGodLikeCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanBeGodLike(LLUUID user)
{
foreach (CanBeGodLike check in CanBeGodLikeCheckFunctions)
{
if (check(user, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#endregion
#region Parcel and Estate Permission Checks
#region EDIT ESTATE TERRAIN
public delegate bool CanEditEstateTerrain(LLUUID user, Scene scene);
private List<CanEditEstateTerrain> CanEditEstateTerrainCheckFunctions = new List<CanEditEstateTerrain>();
public void addCheckEditEstateTerrain(CanEditEstateTerrain delegateFunc)
{
if (!CanEditEstateTerrainCheckFunctions.Contains(delegateFunc))
CanEditEstateTerrainCheckFunctions.Add(delegateFunc);
}
public void removeCheckEditEstateTerrain(CanEditEstateTerrain delegateFunc)
{
if (CanEditEstateTerrainCheckFunctions.Contains(delegateFunc))
CanEditEstateTerrainCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanEditEstateTerrain(LLUUID user)
{
foreach (CanEditEstateTerrain check in CanEditEstateTerrainCheckFunctions)
{
if (check(user, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region RESTART SIM
public delegate bool CanRestartSim(LLUUID user, Scene scene);
private List<CanRestartSim> CanRestartSimCheckFunctions = new List<CanRestartSim>();
public void addCheckRestartSim(CanRestartSim delegateFunc)
{
if (!CanRestartSimCheckFunctions.Contains(delegateFunc))
CanRestartSimCheckFunctions.Add(delegateFunc);
}
public void removeCheckRestartSim(CanRestartSim delegateFunc)
{
if (CanRestartSimCheckFunctions.Contains(delegateFunc))
CanRestartSimCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanRestartSim(LLUUID user)
{
foreach (CanRestartSim check in CanRestartSimCheckFunctions)
{
if (check(user, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region EDIT PARCEL
public delegate bool CanEditParcel(LLUUID user, ILandObject parcel, Scene scene);
private List<CanEditParcel> CanEditParcelCheckFunctions = new List<CanEditParcel>();
public void addCheckEditParcel(CanEditParcel delegateFunc)
{
if (!CanEditParcelCheckFunctions.Contains(delegateFunc))
CanEditParcelCheckFunctions.Add(delegateFunc);
}
public void removeCheckEditParcel(CanEditParcel delegateFunc)
{
if (CanEditParcelCheckFunctions.Contains(delegateFunc))
CanEditParcelCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanEditParcel(LLUUID user, ILandObject parcel)
{
foreach (CanEditParcel check in CanEditParcelCheckFunctions)
{
if (check(user, parcel, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region SELL PARCEL
public delegate bool CanSellParcel(LLUUID user, ILandObject parcel, Scene scene);
private List<CanSellParcel> CanSellParcelCheckFunctions = new List<CanSellParcel>();
public void addCheckSellParcel(CanSellParcel delegateFunc)
{
if (!CanSellParcelCheckFunctions.Contains(delegateFunc))
CanSellParcelCheckFunctions.Add(delegateFunc);
}
public void removeCheckSellParcel(CanSellParcel delegateFunc)
{
if (CanSellParcelCheckFunctions.Contains(delegateFunc))
CanSellParcelCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanSellParcel(LLUUID user, ILandObject parcel)
{
foreach (CanSellParcel check in CanSellParcelCheckFunctions)
{
if (check(user, parcel, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#region ABANDON PARCEL
public delegate bool CanAbandonParcel(LLUUID user, ILandObject parcel, Scene scene);
private List<CanAbandonParcel> CanAbandonParcelCheckFunctions = new List<CanAbandonParcel>();
public void addCheckAbandonParcel(CanAbandonParcel delegateFunc)
{
if (!CanAbandonParcelCheckFunctions.Contains(delegateFunc))
CanAbandonParcelCheckFunctions.Add(delegateFunc);
}
public void removeCheckAbandonParcel(CanAbandonParcel delegateFunc)
{
if (CanAbandonParcelCheckFunctions.Contains(delegateFunc))
CanAbandonParcelCheckFunctions.Remove(delegateFunc);
}
public bool ExternalChecksCanAbandonParcel(LLUUID user, ILandObject parcel)
{
foreach (CanAbandonParcel check in CanAbandonParcelCheckFunctions)
{
if (check(user, parcel, m_scene) == false)
{
return false;
}
}
return true;
}
#endregion
#endregion
}
}

View File

@ -181,7 +181,7 @@ namespace OpenSim.Region.ScriptEngine.Common
m_host.AddScriptLPS(1);
//Check to make sure that the script's owner is the estate manager/master
//World.Permissions.GenericEstatePermission(
if (World.Permissions.GenericEstatePermission(m_host.OwnerID))
if (World.ExternalChecks.ExternalChecksCanBeGodLike(m_host.OwnerID))
{
World.EventManager.TriggerRequestChangeWaterHeight((float)height);
}
@ -2647,7 +2647,7 @@ namespace OpenSim.Region.ScriptEngine.Common
public void llModifyLand(int action, int brush)
{
m_host.AddScriptLPS(1);
if (World.Permissions.CanTerraform(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0)))
if (World.ExternalChecks.ExternalChecksCanTerraformLand(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0)))
{
NotImplemented("llModifyLand");
}
@ -3900,7 +3900,7 @@ namespace OpenSim.Region.ScriptEngine.Common
{
if (m_host.ObjectOwner == parcel.landData.ownerID ||
(m_host.OwnerID == m_host.GroupID && m_host.GroupID == parcel.landData.groupID
&& parcel.landData.isGroupOwned) || World.Permissions.GenericEstatePermission(m_host.OwnerID))
&& parcel.landData.isGroupOwned) || World.ExternalChecks.ExternalChecksCanBeGodLike(m_host.OwnerID))
{
av.StandUp();
}

View File

@ -258,7 +258,7 @@ namespace OpenSim.Region.ScriptEngine.Common
if (x > 255 || x < 0 || y > 255 || y < 0)
LSLError("osTerrainSetHeight: Coordinate out of bounds");
if (World.Permissions.CanTerraform(m_host.OwnerID, new LLVector3(x, y, 0)))
if (World.ExternalChecks.ExternalChecksCanTerraformLand(m_host.OwnerID, new LLVector3(x, y, 0)))
{
World.Heightmap[x, y] = val;
return 1;
@ -281,7 +281,7 @@ namespace OpenSim.Region.ScriptEngine.Common
public int osRegionRestart(double seconds)
{
m_host.AddScriptLPS(1);
if (World.Permissions.CanRestartSim(m_host.OwnerID))
if (World.ExternalChecks.ExternalChecksCanRestartSim(m_host.OwnerID))
{
World.Restart((float)seconds);
return 1;
@ -406,7 +406,7 @@ namespace OpenSim.Region.ScriptEngine.Common
if (config.Configs["LL-Functions"].GetBoolean("AllowosConsoleCommand", false))
{
if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
if (World.ExternalChecks.ExternalChecksCanRunConsoleCommand(m_host.OwnerID))
{
MainConsole.Instance.RunCommand(command);
return true;