Simple build permissions feature. NOTE: EXPERIMENTAL, DISABLED BY DEFAULT. Turns out that this can't be expressed by cascading Permission modules, so I did it as per this patch.

0.7.4.1
Diva Canto 2012-03-22 12:57:12 -07:00
parent a8c87bab64
commit 6146e7ef25
6 changed files with 103 additions and 6 deletions

View File

@ -63,6 +63,7 @@ namespace OpenSim.Framework
bool ContainsPoint(int x, int y);
ILandObject Copy();
ILandObject MemberwiseCopy();
void SendLandUpdateToAvatarsOverMe();
@ -70,6 +71,7 @@ namespace OpenSim.Framework
void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client);
bool IsEitherBannedOrRestricted(UUID avatar);
bool IsBannedFromLand(UUID avatar);
bool IsAllowedInLand(UUID avatar);
bool IsRestrictedFromLand(UUID avatar);
void SendLandUpdateToClient(IClientAPI remote_client);
void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client);

View File

@ -169,6 +169,11 @@ namespace OpenSim.Region.CoreModules.World.Land
return newLand;
}
public ILandObject MemberwiseCopy()
{
return (ILandObject)this.MemberwiseClone();
}
static overrideParcelMaxPrimCountDelegate overrideParcelMaxPrimCount;
static overrideSimulatorMaxPrimCountDelegate overrideSimulatorMaxPrimCount;
@ -242,11 +247,13 @@ namespace OpenSim.Region.CoreModules.World.Land
m_lastSeqId = seq_id;
}
ILandObject landToSend = this;
m_scene.Permissions.LandObjectForClient(remote_client.AgentId, (ILandObject)this, out landToSend);
remote_client.SendLandProperties(seq_id,
snap_selection, request_result, this,
(float)m_scene.RegionInfo.RegionSettings.ObjectBonus,
GetParcelMaxPrimCount(),
GetSimulatorMaxPrimCount(), regionFlags);
snap_selection, request_result, landToSend,
(float)m_scene.RegionInfo.RegionSettings.ObjectBonus,
GetParcelMaxPrimCount(),
GetSimulatorMaxPrimCount(), regionFlags);
}
public void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client)
@ -475,6 +482,32 @@ namespace OpenSim.Region.CoreModules.World.Land
return false;
}
public bool IsAllowedInLand(UUID avatar)
{
ExpireAccessList();
if (m_scene.Permissions.IsAdministrator(avatar))
return true;
if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar))
return true;
if (avatar == LandData.OwnerID)
return true;
if (LandData.ParcelAccessList.FindIndex(
delegate(LandAccessEntry e)
{
if (e.AgentID == avatar && e.Flags == AccessList.Access)
return true;
return false;
}) != -1)
{
return true;
}
return false;
}
public void SendLandUpdateToClient(IClientAPI remote_client)
{
SendLandProperties(0, false, 0, remote_client);

View File

@ -94,7 +94,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions
private bool m_RegionOwnerIsGod = false;
private bool m_RegionManagerIsGod = false;
private bool m_ParcelOwnerIsGod = false;
private bool m_SimpleBuildPermissions = false;
/// <value>
/// The set of users that are allowed to create scripts. This is only active if permissions are not being
/// bypassed. This overrides normal permissions.
@ -139,7 +141,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true);
m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false);
m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true);
m_SimpleBuildPermissions = myConfig.GetBoolean("simple_build_permissions", false);
m_allowedScriptCreators
= ParseUserSetConfigSetting(myConfig, "allowed_script_creators", m_allowedScriptCreators);
m_allowedScriptEditors
@ -206,6 +210,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia;
m_scene.Permissions.OnInteractWithPrimMedia += CanInteractWithPrimMedia;
if (m_SimpleBuildPermissions)
m_scene.Permissions.OnSendLandProperties += GenerateLandProperties;
m_scene.AddCommand("Users", this, "bypass permissions",
"bypass permissions <true / false>",
"Bypass permission checks",
@ -824,6 +831,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions
permission = true;
}
if (m_SimpleBuildPermissions &&
(parcel.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && parcel.IsAllowedInLand(user))
permission = true;
return permission;
}
@ -1966,5 +1977,24 @@ namespace OpenSim.Region.CoreModules.World.Permissions
return false;
}
private void GenerateLandProperties(UUID userID, ILandObject realLand, out ILandObject landToSend)
{
landToSend = realLand;
if (m_bypassPermissions) return;
if (m_SimpleBuildPermissions &&
!m_scene.Permissions.IsAdministrator(userID) &&
!realLand.LandData.OwnerID.Equals(userID) &&
((realLand.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && realLand.IsAllowedInLand(userID)))
{
ILandObject clone = realLand.MemberwiseCopy();
LandData ldata = realLand.LandData.Copy();
clone.LandData = ldata;
clone.LandData.Flags |= (uint)(ParcelFlags.AllowAPrimitiveEntry | ParcelFlags.AllowFly | ParcelFlags.AllowOtherScripts | ParcelFlags.CreateObjects);
landToSend = clone;
}
}
}
}

View File

@ -90,6 +90,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool TeleportHandler(UUID userID, Scene scene);
public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face);
public delegate bool InteractWithPrimMediaHandler(UUID userID, UUID primID, int face);
public delegate void SendLandPropertiesHandler(UUID userID, ILandObject realLand, out ILandObject landToSend);
#endregion
public class ScenePermissions
@ -157,6 +158,7 @@ namespace OpenSim.Region.Framework.Scenes
public event TeleportHandler OnTeleport;
public event ControlPrimMediaHandler OnControlPrimMedia;
public event InteractWithPrimMediaHandler OnInteractWithPrimMedia;
public event SendLandPropertiesHandler OnSendLandProperties;
#endregion
#region Object Permission Checks
@ -1098,5 +1100,20 @@ namespace OpenSim.Region.Framework.Scenes
}
return true;
}
public void LandObjectForClient(UUID userID, ILandObject realLand, out ILandObject landToSend)
{
landToSend = realLand;
SendLandPropertiesHandler handler = OnSendLandProperties;
if (handler != null)
{
Delegate[] list = handler.GetInvocationList();
foreach (SendLandPropertiesHandler h in list)
{
h(userID, realLand, out landToSend);
}
}
}
}
}

View File

@ -194,6 +194,14 @@
; region_manager_is_god = false
; parcel_owner_is_god = true
;; More control over permissions
;; This is definitely not SL!
; Provides a simple control for land owners to give build rights to specific avatars
; in publicly accessible parcels that disallow object creation in general.
; Owners specific avatars by adding them to the Access List of the parcel
; without having to use the Groups feature
; simple_build_permissions = false
;; Default script engine to use. Currently, we only have XEngine
; DefaultScriptEngine = "XEngine"

View File

@ -260,6 +260,13 @@
; Default value is all
; allowed_script_editors = all
; Provides a simple control for land owners to give build rights to
; publicly accessible parcels that disallow object creation in general.
; Owners specific avatars by adding them to the Access List of the parcel
; without having to use the Groups feature
; Disabled by default
; simple_build_permissions = False
; ##
; ## SCRIPT ENGINE
; ##