From a4efa939932f823af2affe0e97446a8d807004e0 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Wed, 14 May 2008 23:25:07 +0000 Subject: * Comitting 0001271: [PATCH] Refactor permissions to fully allow stacking permissions modules. From Melanie. Thanks Melanie! --- .../Environment/Interfaces/IScenePermissions.cs | 3 - .../Modules/World/Estate/EstateManagementModule.cs | 6 +- .../Modules/World/Permissions/PermissionsModule.cs | 29 ++++----- OpenSim/Region/Environment/Scenes/Scene.cs | 10 --- .../Environment/Scenes/SceneExternalChecks.cs | 74 +++++++++++++++++++++- OpenSim/Region/Environment/Scenes/SceneManager.cs | 2 +- .../Region/Environment/Scenes/SceneObjectGroup.cs | 2 +- OpenSim/Region/Environment/Scenes/ScenePresence.cs | 8 +-- 8 files changed, 92 insertions(+), 42 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs b/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs index bef6b44..f28b46c 100644 --- a/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs +++ b/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs @@ -31,8 +31,5 @@ namespace OpenSim.Region.Environment.Interfaces { public interface IScenePermissions { - bool BypassPermissions { get; set; } - bool BypassPermissionsValue { get; set; } - uint GenerateClientFlags(LLUUID user, LLUUID objID); } } diff --git a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs index 098175b..fcdec5d 100644 --- a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs @@ -205,7 +205,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate // This needs to be updated for SuperEstateOwnerUser.. a non existing user in the estatesettings.xml // So make sure you really trust your region owners. because they can add other estate manaagers to your other estates - if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.Permissions.BypassPermissions) + if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.ExternalChecks.ExternalChecksBypassPermissions()) { m_scene.RegionInfo.EstateSettings.AddEstateManager(user); remote_client.sendEstateManagersList(invoice, m_scene.RegionInfo.EstateSettings.estateManagers, m_scene.RegionInfo.EstateSettings.estateID); @@ -219,7 +219,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate case 512: // This needs to be updated for SuperEstateOwnerUser.. a non existing user in the estatesettings.xml // So make sure you really trust your region owners. because they can add other estate manaagers to your other estates - if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.Permissions.BypassPermissions) + if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.ExternalChecks.ExternalChecksBypassPermissions()) { m_scene.RegionInfo.EstateSettings.RemoveEstateManager(user); remote_client.sendEstateManagersList(invoice, m_scene.RegionInfo.EstateSettings.estateManagers, m_scene.RegionInfo.EstateSettings.estateID); @@ -438,4 +438,4 @@ namespace OpenSim.Region.Environment.Modules.World.Estate sendRegionHandshake(client); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs index bd21ca7..76f21f7 100644 --- a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs @@ -63,23 +63,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions private bool m_bypassPermissions = false; private bool m_bypassPermissionsValue = true; private bool m_debugPermissions = false; - public bool BypassPermissions - { - get { return m_bypassPermissions; } - set { m_bypassPermissions = value; } - } - - public bool BypassPermissionsValue - { - get { return m_bypassPermissionsValue; } - set { m_bypassPermissionsValue = value; } - } - public bool DebugPermissions - { - get { return m_debugPermissions; } - set { m_debugPermissions = value; } - } #endregion #region ICommandableModule Members @@ -157,7 +141,10 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions m_scene.RegisterModuleInterface(this); //Register functions with Scene External Checks! + m_scene.ExternalChecks.addBypassPermissions(BypassPermissions); //FULLY IMPLEMENTED + m_scene.ExternalChecks.addSetBypassPermissions(SetBypassPermissions); //FULLY IMPLEMENTED m_scene.ExternalChecks.addCheckAbandonParcel(CanAbandonParcel); //FULLY IMPLEMENTED + m_scene.ExternalChecks.addGenerateClientFlags(GenerateClientFlags); //NOT YET FULLY IMPLEMENTED m_scene.ExternalChecks.addCheckBeGodLike(CanBeGodLike); //FULLY IMPLEMENTED m_scene.ExternalChecks.addCheckDuplicateObject(CanDuplicateObject); //FULLY IMPLEMENTED m_scene.ExternalChecks.addCheckDeleteObject(CanDeleteObject); //MAYBE FULLY IMPLEMENTED @@ -260,6 +247,16 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions } #endregion + public bool BypassPermissions() + { + return m_bypassPermissions; + } + + public void SetBypassPermissions(bool value) + { + m_bypassPermissions=value; + } + #region Object Permissions public uint GenerateClientFlags(LLUUID user, LLUUID objID) diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 5b93ef9..51f2942 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -115,7 +115,6 @@ namespace OpenSim.Region.Environment.Scenes protected IXMLRPC m_xmlrpcModule; protected IWorldComm m_worldCommModule; protected IAvatarFactory m_AvatarFactory; - protected IScenePermissions m_permissions; protected IConfigSource m_config; // Central Update Loop @@ -173,14 +172,6 @@ namespace OpenSim.Region.Environment.Scenes get { return m_timedilation; } } - /// - /// The reference by which general permissions in the scene can be set and queried. - /// - public IScenePermissions Permissions - { - get { return m_permissions; } - } - public int TimePhase { get { return m_timePhase; } @@ -660,7 +651,6 @@ namespace OpenSim.Region.Environment.Scenes m_worldCommModule = RequestModuleInterface(); XferManager = RequestModuleInterface(); m_AvatarFactory = RequestModuleInterface(); - m_permissions = RequestModuleInterface(); } #endregion diff --git a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs index aa4e043..53c8fc3 100644 --- a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs +++ b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs @@ -45,6 +45,78 @@ namespace OpenSim.Region.Environment.Scenes #region Object Permission Checks + public delegate uint GenerateClientFlags(LLUUID userID, LLUUID objectIDID); + private List GenerateClientFlagsCheckFunctions = new List(); + + public void addGenerateClientFlags(GenerateClientFlags delegateFunc) + { + if (!GenerateClientFlagsCheckFunctions.Contains(delegateFunc)) + GenerateClientFlagsCheckFunctions.Add(delegateFunc); + } + public void removeGenerateClientFlags(GenerateClientFlags delegateFunc) + { + if (GenerateClientFlagsCheckFunctions.Contains(delegateFunc)) + GenerateClientFlagsCheckFunctions.Remove(delegateFunc); + } + + public uint ExternalChecksGenerateClientFlags(LLUUID userID, LLUUID objectID) + { + uint perms=(uint)2147483647; + foreach (GenerateClientFlags check in GenerateClientFlagsCheckFunctions) + { + perms &= check(userID, objectID); + } + return perms; + } + + public delegate void SetBypassPermissions(bool value); + private List SetBypassPermissionsCheckFunctions = new List(); + + public void addSetBypassPermissions(SetBypassPermissions delegateFunc) + { + if (!SetBypassPermissionsCheckFunctions.Contains(delegateFunc)) + SetBypassPermissionsCheckFunctions.Add(delegateFunc); + } + public void removeSetBypassPermissions(SetBypassPermissions delegateFunc) + { + if (SetBypassPermissionsCheckFunctions.Contains(delegateFunc)) + SetBypassPermissionsCheckFunctions.Remove(delegateFunc); + } + + public void ExternalChecksSetBypassPermissions(bool value) + { + foreach (SetBypassPermissions check in SetBypassPermissionsCheckFunctions) + { + check(value); + } + } + + public delegate bool BypassPermissions(); + private List BypassPermissionsCheckFunctions = new List(); + + public void addBypassPermissions(BypassPermissions delegateFunc) + { + if (!BypassPermissionsCheckFunctions.Contains(delegateFunc)) + BypassPermissionsCheckFunctions.Add(delegateFunc); + } + public void removeBypassPermissions(BypassPermissions delegateFunc) + { + if (BypassPermissionsCheckFunctions.Contains(delegateFunc)) + BypassPermissionsCheckFunctions.Remove(delegateFunc); + } + + public bool ExternalChecksBypassPermissions() + { + foreach (BypassPermissions check in BypassPermissionsCheckFunctions) + { + if (check() == false) + { + return false; + } + } + return true; + } + #region REZ OBJECT public delegate bool CanRezObject(int objectCount, LLUUID owner, LLVector3 objectPosition, Scene scene); private List CanRezObjectCheckFunctions = new List(); @@ -654,4 +726,4 @@ namespace OpenSim.Region.Environment.Scenes } } - \ No newline at end of file + diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index 1f1f39f..215ab75 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs @@ -191,7 +191,7 @@ namespace OpenSim.Region.Environment.Scenes public void SetBypassPermissionsOnCurrentScene(bool bypassPermissions) { - ForEachCurrentScene(delegate(Scene scene) { scene.Permissions.BypassPermissions = bypassPermissions; }); + ForEachCurrentScene(delegate(Scene scene) { scene.ExternalChecks.ExternalChecksSetBypassPermissions(bypassPermissions); }); } private void ForEachCurrentScene(Action func) diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 4a112ae..3ec6ed8 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -1351,7 +1351,7 @@ namespace OpenSim.Region.Environment.Scenes if (part.OwnerID != cAgentID) { // Apply Next Owner Permissions if we're not bypassing permissions - if (!m_scene.Permissions.BypassPermissions) + if (!m_scene.ExternalChecks.ExternalChecksBypassPermissions()) m_rootPart.ApplyNextOwnerPermissions(); } diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 4ef0d27..8ac1a77 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -476,13 +476,7 @@ namespace OpenSim.Region.Environment.Scenes public uint GenerateClientFlags(LLUUID ObjectID) { - if(m_scene.Permissions == null) - { - SceneObjectPart task=m_scene.GetSceneObjectPart(ObjectID); - - return task.GetEffectiveObjectFlags() | (uint)2147483647; - } - return m_scene.Permissions.GenerateClientFlags(m_uuid, ObjectID); + return m_scene.ExternalChecks.ExternalChecksGenerateClientFlags(m_uuid, ObjectID); } /// -- cgit v1.1