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); bool ContainsPoint(int x, int y);
ILandObject Copy(); ILandObject Copy();
ILandObject MemberwiseCopy();
void SendLandUpdateToAvatarsOverMe(); void SendLandUpdateToAvatarsOverMe();
@ -70,6 +71,7 @@ namespace OpenSim.Framework
void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client); void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client);
bool IsEitherBannedOrRestricted(UUID avatar); bool IsEitherBannedOrRestricted(UUID avatar);
bool IsBannedFromLand(UUID avatar); bool IsBannedFromLand(UUID avatar);
bool IsAllowedInLand(UUID avatar);
bool IsRestrictedFromLand(UUID avatar); bool IsRestrictedFromLand(UUID avatar);
void SendLandUpdateToClient(IClientAPI remote_client); void SendLandUpdateToClient(IClientAPI remote_client);
void SendLandUpdateToClient(bool snap_selection, 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; return newLand;
} }
public ILandObject MemberwiseCopy()
{
return (ILandObject)this.MemberwiseClone();
}
static overrideParcelMaxPrimCountDelegate overrideParcelMaxPrimCount; static overrideParcelMaxPrimCountDelegate overrideParcelMaxPrimCount;
static overrideSimulatorMaxPrimCountDelegate overrideSimulatorMaxPrimCount; static overrideSimulatorMaxPrimCountDelegate overrideSimulatorMaxPrimCount;
@ -242,8 +247,10 @@ namespace OpenSim.Region.CoreModules.World.Land
m_lastSeqId = seq_id; m_lastSeqId = seq_id;
} }
ILandObject landToSend = this;
m_scene.Permissions.LandObjectForClient(remote_client.AgentId, (ILandObject)this, out landToSend);
remote_client.SendLandProperties(seq_id, remote_client.SendLandProperties(seq_id,
snap_selection, request_result, this, snap_selection, request_result, landToSend,
(float)m_scene.RegionInfo.RegionSettings.ObjectBonus, (float)m_scene.RegionInfo.RegionSettings.ObjectBonus,
GetParcelMaxPrimCount(), GetParcelMaxPrimCount(),
GetSimulatorMaxPrimCount(), regionFlags); GetSimulatorMaxPrimCount(), regionFlags);
@ -475,6 +482,32 @@ namespace OpenSim.Region.CoreModules.World.Land
return false; 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) public void SendLandUpdateToClient(IClientAPI remote_client)
{ {
SendLandProperties(0, false, 0, remote_client); SendLandProperties(0, false, 0, remote_client);

View File

@ -95,6 +95,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
private bool m_RegionManagerIsGod = false; private bool m_RegionManagerIsGod = false;
private bool m_ParcelOwnerIsGod = false; private bool m_ParcelOwnerIsGod = false;
private bool m_SimpleBuildPermissions = false;
/// <value> /// <value>
/// The set of users that are allowed to create scripts. This is only active if permissions are not being /// The set of users that are allowed to create scripts. This is only active if permissions are not being
/// bypassed. This overrides normal permissions. /// bypassed. This overrides normal permissions.
@ -140,6 +142,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false); m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false);
m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true); m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true);
m_SimpleBuildPermissions = myConfig.GetBoolean("simple_build_permissions", false);
m_allowedScriptCreators m_allowedScriptCreators
= ParseUserSetConfigSetting(myConfig, "allowed_script_creators", m_allowedScriptCreators); = ParseUserSetConfigSetting(myConfig, "allowed_script_creators", m_allowedScriptCreators);
m_allowedScriptEditors m_allowedScriptEditors
@ -206,6 +210,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia; m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia;
m_scene.Permissions.OnInteractWithPrimMedia += CanInteractWithPrimMedia; m_scene.Permissions.OnInteractWithPrimMedia += CanInteractWithPrimMedia;
if (m_SimpleBuildPermissions)
m_scene.Permissions.OnSendLandProperties += GenerateLandProperties;
m_scene.AddCommand("Users", this, "bypass permissions", m_scene.AddCommand("Users", this, "bypass permissions",
"bypass permissions <true / false>", "bypass permissions <true / false>",
"Bypass permission checks", "Bypass permission checks",
@ -824,6 +831,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions
permission = true; permission = true;
} }
if (m_SimpleBuildPermissions &&
(parcel.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && parcel.IsAllowedInLand(user))
permission = true;
return permission; return permission;
} }
@ -1966,5 +1977,24 @@ namespace OpenSim.Region.CoreModules.World.Permissions
return false; 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 TeleportHandler(UUID userID, Scene scene);
public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face); public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face);
public delegate bool InteractWithPrimMediaHandler(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 #endregion
public class ScenePermissions public class ScenePermissions
@ -157,6 +158,7 @@ namespace OpenSim.Region.Framework.Scenes
public event TeleportHandler OnTeleport; public event TeleportHandler OnTeleport;
public event ControlPrimMediaHandler OnControlPrimMedia; public event ControlPrimMediaHandler OnControlPrimMedia;
public event InteractWithPrimMediaHandler OnInteractWithPrimMedia; public event InteractWithPrimMediaHandler OnInteractWithPrimMedia;
public event SendLandPropertiesHandler OnSendLandProperties;
#endregion #endregion
#region Object Permission Checks #region Object Permission Checks
@ -1098,5 +1100,20 @@ namespace OpenSim.Region.Framework.Scenes
} }
return true; 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 ; region_manager_is_god = false
; parcel_owner_is_god = true ; 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 ;; Default script engine to use. Currently, we only have XEngine
; DefaultScriptEngine = "XEngine" ; DefaultScriptEngine = "XEngine"

View File

@ -260,6 +260,13 @@
; Default value is all ; Default value is all
; allowed_script_editors = 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 ; ## SCRIPT ENGINE
; ## ; ##