nice catch by chi11ken that I was setting the wrong property

afrisby
Sean Dague 2007-10-22 15:39:02 +00:00
parent 6acaabefc3
commit c5ea70bf93
6 changed files with 815 additions and 815 deletions

View File

@ -1,257 +1,257 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Framework.PolicyManager namespace OpenSim.Framework.PolicyManager
{ {
// ACL Class // ACL Class
// Modelled after the structure of the Zend ACL Framework Library // Modelled after the structure of the Zend ACL Framework Library
// with one key difference - the tree will search for all matching // with one key difference - the tree will search for all matching
// permissions rather than just the first. Deny permissions will // permissions rather than just the first. Deny permissions will
// override all others. // override all others.
#region ACL Core Class #region ACL Core Class
/// <summary> /// <summary>
/// Access Control List Engine /// Access Control List Engine
/// </summary> /// </summary>
public class ACL public class ACL
{ {
Dictionary<string, Role> Roles = new Dictionary<string, Role>(); Dictionary<string, Role> Roles = new Dictionary<string, Role>();
Dictionary<string, Resource> Resources = new Dictionary<string, Resource>(); Dictionary<string, Resource> Resources = new Dictionary<string, Resource>();
public ACL AddRole(Role role) public ACL AddRole(Role role)
{ {
if (Roles.ContainsKey(role.Name)) if (Roles.ContainsKey(role.Name))
throw new AlreadyContainsRoleException(role); throw new AlreadyContainsRoleException(role);
Roles.Add(role.Name, role); Roles.Add(role.Name, role);
return this; return this;
} }
public ACL AddResource(Resource resource) public ACL AddResource(Resource resource)
{ {
Resources.Add(resource.Name, resource); Resources.Add(resource.Name, resource);
return this; return this;
} }
public Permission HasPermission(string role, string resource) public Permission HasPermission(string role, string resource)
{ {
if (!Roles.ContainsKey(role)) if (!Roles.ContainsKey(role))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
if (!Resources.ContainsKey(resource)) if (!Resources.ContainsKey(resource))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
return Roles[role].RequestPermission(resource); return Roles[role].RequestPermission(resource);
} }
public ACL GrantPermission(string role, string resource) public ACL GrantPermission(string role, string resource)
{ {
if (!Roles.ContainsKey(role)) if (!Roles.ContainsKey(role))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
if (!Resources.ContainsKey(resource)) if (!Resources.ContainsKey(resource))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
Roles[role].GivePermission(resource, Permission.Allow); Roles[role].GivePermission(resource, Permission.Allow);
return this; return this;
} }
public ACL DenyPermission(string role, string resource) public ACL DenyPermission(string role, string resource)
{ {
if (!Roles.ContainsKey(role)) if (!Roles.ContainsKey(role))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
if (!Resources.ContainsKey(resource)) if (!Resources.ContainsKey(resource))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
Roles[role].GivePermission(resource, Permission.Deny); Roles[role].GivePermission(resource, Permission.Deny);
return this; return this;
} }
public ACL ResetPermission(string role, string resource) public ACL ResetPermission(string role, string resource)
{ {
if (!Roles.ContainsKey(role)) if (!Roles.ContainsKey(role))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
if (!Resources.ContainsKey(resource)) if (!Resources.ContainsKey(resource))
throw new KeyNotFoundException(); throw new KeyNotFoundException();
Roles[role].GivePermission(resource, Permission.None); Roles[role].GivePermission(resource, Permission.None);
return this; return this;
} }
} }
#endregion #endregion
#region Exceptions #region Exceptions
/// <summary> /// <summary>
/// Thrown when an ACL attempts to add a duplicate role. /// Thrown when an ACL attempts to add a duplicate role.
/// </summary> /// </summary>
public class AlreadyContainsRoleException : Exception public class AlreadyContainsRoleException : Exception
{ {
protected Role m_role; protected Role m_role;
public Role ErrorRole public Role ErrorRole
{ {
get { return m_role; } get { return m_role; }
} }
public AlreadyContainsRoleException(Role role) public AlreadyContainsRoleException(Role role)
{ {
m_role = role; m_role = role;
} }
public override string ToString() public override string ToString()
{ {
return "This ACL already contains a role called '" + m_role.Name + "'."; return "This ACL already contains a role called '" + m_role.Name + "'.";
} }
} }
#endregion #endregion
#region Roles and Resources #region Roles and Resources
/// <summary> /// <summary>
/// Does this Role have permission to access a specified Resource? /// Does this Role have permission to access a specified Resource?
/// </summary> /// </summary>
public enum Permission { Deny, None, Allow }; public enum Permission { Deny, None, Allow };
/// <summary> /// <summary>
/// A role class, for use with Users or Groups /// A role class, for use with Users or Groups
/// </summary> /// </summary>
public class Role public class Role
{ {
private string m_name; private string m_name;
private Role[] m_parents; private Role[] m_parents;
private Dictionary<string, Permission> m_resources = new Dictionary<string, Permission>(); private Dictionary<string, Permission> m_resources = new Dictionary<string, Permission>();
public string Name public string Name
{ {
get { return m_name; } get { return m_name; }
} }
public Permission RequestPermission(string resource) public Permission RequestPermission(string resource)
{ {
return RequestPermission(resource, Permission.None); return RequestPermission(resource, Permission.None);
} }
public Permission RequestPermission(string resource, Permission current) public Permission RequestPermission(string resource, Permission current)
{ {
// Deny permissions always override any others // Deny permissions always override any others
if (current == Permission.Deny) if (current == Permission.Deny)
return current; return current;
Permission temp = Permission.None; Permission temp = Permission.None;
// Pickup non-None permissions // Pickup non-None permissions
if (m_resources.ContainsKey(resource) && m_resources[resource] != Permission.None) if (m_resources.ContainsKey(resource) && m_resources[resource] != Permission.None)
temp = m_resources[resource]; temp = m_resources[resource];
if (m_parents != null) if (m_parents != null)
{ {
foreach (Role parent in m_parents) foreach (Role parent in m_parents)
{ {
temp = parent.RequestPermission(resource, temp); temp = parent.RequestPermission(resource, temp);
} }
} }
return temp; return temp;
} }
public void GivePermission(string resource, Permission perm) public void GivePermission(string resource, Permission perm)
{ {
m_resources[resource] = perm; m_resources[resource] = perm;
} }
public Role(string name) public Role(string name)
{ {
m_name = name; m_name = name;
m_parents = null; m_parents = null;
} }
public Role(string name, Role[] parents) public Role(string name, Role[] parents)
{ {
m_name = name; m_name = name;
m_parents = parents; m_parents = parents;
} }
} }
public class Resource public class Resource
{ {
private string m_name; private string m_name;
public string Name public string Name
{ {
get { return m_name; } get { return m_name; }
} }
public Resource(string name) public Resource(string name)
{ {
m_name = name; m_name = name;
} }
} }
#endregion #endregion
#region Tests #region Tests
class ACLTester class ACLTester
{ {
public ACLTester() public ACLTester()
{ {
ACL acl = new ACL(); ACL acl = new ACL();
Role Guests = new Role("Guests"); Role Guests = new Role("Guests");
acl.AddRole(Guests); acl.AddRole(Guests);
Role[] parents = new Role[0]; Role[] parents = new Role[0];
parents[0] = Guests; parents[0] = Guests;
Role JoeGuest = new Role("JoeGuest", parents); Role JoeGuest = new Role("JoeGuest", parents);
acl.AddRole(JoeGuest); acl.AddRole(JoeGuest);
Resource CanBuild = new Resource("CanBuild"); Resource CanBuild = new Resource("CanBuild");
acl.AddResource(CanBuild); acl.AddResource(CanBuild);
acl.GrantPermission("Guests", "CanBuild"); acl.GrantPermission("Guests", "CanBuild");
acl.HasPermission("JoeGuest", "CanBuild"); acl.HasPermission("JoeGuest", "CanBuild");
} }
} }
#endregion #endregion
} }

View File

@ -137,7 +137,7 @@ namespace OpenSim.Region.Communications.Local
_login.Agent = response.AgentID; _login.Agent = response.AgentID;
_login.Session = response.SessionID; _login.Session = response.SessionID;
_login.SecureSession = response.SecureSessionID; _login.SecureSession = response.SecureSessionID;
_login.CircuitCode = (uint)response.CircuitCode; _login.CircuitCode = (uint)response.CircuitCode;
_login.StartPos = new LLVector3(128, 128, 70); _login.StartPos = new LLVector3(128, 128, 70);
_login.CapsPath = capsPath; _login.CapsPath = capsPath;

View File

@ -1,214 +1,214 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules; using OpenSim.Region.Environment.Modules;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using Nini.Config; using Nini.Config;
namespace OpenSim.Region.Environment namespace OpenSim.Region.Environment
{ {
public class ModuleLoader public class ModuleLoader
{ {
public Dictionary<string, Assembly> LoadedAssemblys = new Dictionary<string, Assembly>(); public Dictionary<string, Assembly> LoadedAssemblys = new Dictionary<string, Assembly>();
public List<IRegionModule> LoadedModules = new List<IRegionModule>(); public List<IRegionModule> LoadedModules = new List<IRegionModule>();
public Dictionary<string, IRegionModule> LoadedSharedModules = new Dictionary<string, IRegionModule>(); public Dictionary<string, IRegionModule> LoadedSharedModules = new Dictionary<string, IRegionModule>();
private readonly LogBase m_log; private readonly LogBase m_log;
private IConfigSource m_config; private IConfigSource m_config;
public ModuleLoader(LogBase log, IConfigSource config) public ModuleLoader(LogBase log, IConfigSource config)
{ {
m_log = log; m_log = log;
m_config = config; m_config = config;
} }
public void PickupModules(Scene scene, string moduleDir) public void PickupModules(Scene scene, string moduleDir)
{ {
DirectoryInfo dir = new DirectoryInfo(moduleDir); DirectoryInfo dir = new DirectoryInfo(moduleDir);
foreach (FileInfo fileInfo in dir.GetFiles("*.dll")) foreach (FileInfo fileInfo in dir.GetFiles("*.dll"))
{ {
LoadRegionModules(fileInfo.FullName, scene); LoadRegionModules(fileInfo.FullName, scene);
} }
} }
public void LoadDefaultSharedModules() public void LoadDefaultSharedModules()
{ {
DynamicTextureModule dynamicModule = new DynamicTextureModule(); DynamicTextureModule dynamicModule = new DynamicTextureModule();
LoadedSharedModules.Add(dynamicModule.Name, dynamicModule); LoadedSharedModules.Add(dynamicModule.Name, dynamicModule);
ChatModule chat = new ChatModule(); ChatModule chat = new ChatModule();
LoadedSharedModules.Add(chat.Name, chat); LoadedSharedModules.Add(chat.Name, chat);
InstantMessageModule imMod = new InstantMessageModule(); InstantMessageModule imMod = new InstantMessageModule();
LoadedSharedModules.Add(imMod.Name, imMod); LoadedSharedModules.Add(imMod.Name, imMod);
LoadImageURLModule loadMod = new LoadImageURLModule(); LoadImageURLModule loadMod = new LoadImageURLModule();
LoadedSharedModules.Add(loadMod.Name, loadMod); LoadedSharedModules.Add(loadMod.Name, loadMod);
} }
public void InitialiseSharedModules(Scene scene) public void InitialiseSharedModules(Scene scene)
{ {
foreach (IRegionModule module in LoadedSharedModules.Values) foreach (IRegionModule module in LoadedSharedModules.Values)
{ {
module.Initialise(scene, m_config); module.Initialise(scene, m_config);
scene.AddModule(module.Name, module); //should be doing this? scene.AddModule(module.Name, module); //should be doing this?
} }
} }
public void InitializeModule(IRegionModule module, Scene scene) public void InitializeModule(IRegionModule module, Scene scene)
{ {
module.Initialise(scene, m_config); module.Initialise(scene, m_config);
scene.AddModule(module.Name, module); scene.AddModule(module.Name, module);
LoadedModules.Add(module); LoadedModules.Add(module);
} }
/// <summary> /// <summary>
/// Loads/initialises a Module instance that can be used by mutliple Regions /// Loads/initialises a Module instance that can be used by mutliple Regions
/// </summary> /// </summary>
/// <param name="dllName"></param> /// <param name="dllName"></param>
/// <param name="moduleName"></param> /// <param name="moduleName"></param>
/// <param name="scene"></param> /// <param name="scene"></param>
public void LoadSharedModule(string dllName, string moduleName) public void LoadSharedModule(string dllName, string moduleName)
{ {
IRegionModule module = LoadModule(dllName, moduleName); IRegionModule module = LoadModule(dllName, moduleName);
if (module != null) if (module != null)
{ {
LoadedSharedModules.Add(module.Name, module); LoadedSharedModules.Add(module.Name, module);
} }
} }
public void LoadRegionModules(string dllName, Scene scene) public void LoadRegionModules(string dllName, Scene scene)
{ {
IRegionModule[] modules = LoadModules(dllName); IRegionModule[] modules = LoadModules(dllName);
if (modules.Length > 0) if (modules.Length > 0)
{ {
m_log.Verbose("MODULES", "Found Module Library [{0}]", dllName ); m_log.Verbose("MODULES", "Found Module Library [{0}]", dllName );
foreach (IRegionModule module in modules) foreach (IRegionModule module in modules)
{ {
if (!module.IsSharedModule) if (!module.IsSharedModule)
{ {
m_log.Verbose("MODULES", " [{0}]: Initializing.", module.Name); m_log.Verbose("MODULES", " [{0}]: Initializing.", module.Name);
InitializeModule(module, scene); InitializeModule(module, scene);
} }
} }
} }
} }
public void LoadRegionModule(string dllName, string moduleName, Scene scene) public void LoadRegionModule(string dllName, string moduleName, Scene scene)
{ {
IRegionModule module = LoadModule(dllName, moduleName); IRegionModule module = LoadModule(dllName, moduleName);
if (module != null) if (module != null)
{ {
InitializeModule(module, scene); InitializeModule(module, scene);
} }
} }
/// <summary> /// <summary>
/// Loads a external Module (if not already loaded) and creates a new instance of it. /// Loads a external Module (if not already loaded) and creates a new instance of it.
/// </summary> /// </summary>
/// <param name="dllName"></param> /// <param name="dllName"></param>
/// <param name="moduleName"></param> /// <param name="moduleName"></param>
/// <param name="scene"></param> /// <param name="scene"></param>
public IRegionModule LoadModule(string dllName, string moduleName) public IRegionModule LoadModule(string dllName, string moduleName)
{ {
IRegionModule[] modules = LoadModules(dllName); IRegionModule[] modules = LoadModules(dllName);
foreach (IRegionModule module in modules) foreach (IRegionModule module in modules)
{ {
if ((module != null) && (module.Name == moduleName)) if ((module != null) && (module.Name == moduleName))
{ {
return module; return module;
} }
} }
return null; return null;
} }
public IRegionModule[] LoadModules(string dllName) public IRegionModule[] LoadModules(string dllName)
{ {
List<IRegionModule> modules = new List<IRegionModule>(); List<IRegionModule> modules = new List<IRegionModule>();
Assembly pluginAssembly; Assembly pluginAssembly;
if (!LoadedAssemblys.TryGetValue(dllName, out pluginAssembly )) if (!LoadedAssemblys.TryGetValue(dllName, out pluginAssembly ))
{ {
try try
{ {
pluginAssembly = Assembly.LoadFrom(dllName); pluginAssembly = Assembly.LoadFrom(dllName);
LoadedAssemblys.Add(dllName, pluginAssembly); LoadedAssemblys.Add(dllName, pluginAssembly);
} }
catch( BadImageFormatException e ) catch( BadImageFormatException e )
{ {
m_log.Warn( "MODULES", "The file [{0}] is not a module assembly.", e.FileName ); m_log.Warn( "MODULES", "The file [{0}] is not a module assembly.", e.FileName );
} }
} }
if (pluginAssembly != null) if (pluginAssembly != null)
{ {
foreach (Type pluginType in pluginAssembly.GetTypes()) foreach (Type pluginType in pluginAssembly.GetTypes())
{ {
if (pluginType.IsPublic) if (pluginType.IsPublic)
{ {
if (!pluginType.IsAbstract) if (!pluginType.IsAbstract)
{ {
if( pluginType.GetInterface("IRegionModule") != null ) if( pluginType.GetInterface("IRegionModule") != null )
{ {
modules.Add((IRegionModule) Activator.CreateInstance(pluginType)); modules.Add((IRegionModule) Activator.CreateInstance(pluginType));
} }
} }
} }
} }
} }
return modules.ToArray(); return modules.ToArray();
} }
public void PostInitialise() public void PostInitialise()
{ {
foreach (IRegionModule module in LoadedSharedModules.Values) foreach (IRegionModule module in LoadedSharedModules.Values)
{ {
module.PostInitialise(); module.PostInitialise();
} }
foreach (IRegionModule module in LoadedModules) foreach (IRegionModule module in LoadedModules)
{ {
module.PostInitialise(); module.PostInitialise();
} }
} }
public void ClearCache() public void ClearCache()
{ {
LoadedAssemblys.Clear(); LoadedAssemblys.Clear();
} }
} }
} }

View File

@ -345,12 +345,12 @@ namespace OpenSim.Region.Environment.Modules
foreach (Scene m_scene in m_scenes) foreach (Scene m_scene in m_scenes)
{ {
m_scene.ForEachScenePresence(delegate(ScenePresence avatar) m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
{ {
if (!avatar.IsChildAgent) if (!avatar.IsChildAgent)
{ {
avatar.ControllingClient.SendChatMessage( avatar.ControllingClient.SendChatMessage(
Helpers.StringToField(mess), 255, pos, "IRC:", Helpers.StringToField(mess), 255, pos, "IRC:",
LLUUID.Zero); LLUUID.Zero);
} }
}); });
} }

View File

@ -1,328 +1,328 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
using libsecondlife; using libsecondlife;
using OpenSim.Region.Environment.LandManagement; using OpenSim.Region.Environment.LandManagement;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Framework.PolicyManager; using OpenSim.Framework.PolicyManager;
namespace OpenSim.Region.Environment namespace OpenSim.Region.Environment
{ {
public class PermissionManager public class PermissionManager
{ {
protected Scene m_scene; protected Scene m_scene;
// Bypasses the permissions engine (always returns OK) // Bypasses the permissions engine (always returns OK)
// disable in any production environment // disable in any production environment
// TODO: Change this to false when permissions are a desired default // TODO: Change this to false when permissions are a desired default
// TODO: Move to configuration option. // TODO: Move to configuration option.
private bool m_bypassPermissions = true; private bool m_bypassPermissions = true;
public bool BypassPermissions public bool BypassPermissions
{ {
get { return m_bypassPermissions; } get { return m_bypassPermissions; }
set { m_bypassPermissions = value; } set { m_bypassPermissions = value; }
} }
public PermissionManager(Scene scene) public PermissionManager(Scene scene)
{ {
m_scene = scene; m_scene = scene;
} }
protected virtual void SendPermissionError(LLUUID user, string reason) protected virtual void SendPermissionError(LLUUID user, string reason)
{ {
m_scene.EventManager.TriggerPermissionError(user, reason); m_scene.EventManager.TriggerPermissionError(user, reason);
} }
protected virtual bool IsAdministrator(LLUUID user) protected virtual bool IsAdministrator(LLUUID user)
{ {
if (m_bypassPermissions) if (m_bypassPermissions)
{ {
return true; return true;
} }
return m_scene.RegionInfo.MasterAvatarAssignedUUID == user; return m_scene.RegionInfo.MasterAvatarAssignedUUID == user;
} }
protected virtual bool IsEstateManager(LLUUID user) protected virtual bool IsEstateManager(LLUUID user)
{ {
if (m_bypassPermissions) if (m_bypassPermissions)
{ {
return true; return true;
} }
return false; return false;
} }
protected virtual bool IsGridUser(LLUUID user) protected virtual bool IsGridUser(LLUUID user)
{ {
return true; return true;
} }
protected virtual bool IsGuest(LLUUID user) protected virtual bool IsGuest(LLUUID user)
{ {
return false; return false;
} }
public virtual bool CanRezObject(LLUUID user, LLVector3 position) public virtual bool CanRezObject(LLUUID user, LLVector3 position)
{ {
bool permission = false; bool permission = false;
string reason = "Insufficient permission"; string reason = "Insufficient permission";
if (IsAdministrator(user)) if (IsAdministrator(user))
{ {
permission = true; permission = true;
} }
else else
{ {
reason = "Not an administrator"; reason = "Not an administrator";
} }
if (GenericParcelPermission(user, position)) if (GenericParcelPermission(user, position))
{ {
permission = true; permission = true;
} }
else else
{ {
reason = "Not the parcel owner"; reason = "Not the parcel owner";
} }
if (!permission) if (!permission)
SendPermissionError(user, reason); SendPermissionError(user, reason);
return permission; return permission;
} }
#region Object Permissions #region Object Permissions
protected virtual bool GenericObjectPermission(LLUUID user, LLUUID objId) protected virtual bool GenericObjectPermission(LLUUID user, LLUUID objId)
{ {
// Default: deny // Default: deny
bool permission = false; bool permission = false;
if (!m_scene.Entities.ContainsKey(objId)) if (!m_scene.Entities.ContainsKey(objId))
{ {
return false; return false;
} }
// If it's not an object, we cant edit it. // If it's not an object, we cant edit it.
if (!(m_scene.Entities[objId] is SceneObjectGroup)) if (!(m_scene.Entities[objId] is SceneObjectGroup))
{ {
return false; return false;
} }
SceneObjectGroup task = (SceneObjectGroup) m_scene.Entities[objId]; SceneObjectGroup task = (SceneObjectGroup) m_scene.Entities[objId];
LLUUID taskOwner = null; LLUUID taskOwner = null;
// Object owners should be able to edit their own content // Object owners should be able to edit their own content
if (user == taskOwner) if (user == taskOwner)
permission = true; permission = true;
// Users should be able to edit what is over their land. // Users should be able to edit what is over their land.
if (m_scene.LandManager.getLandObject(task.AbsolutePosition.X, task.AbsolutePosition.Y).landData.ownerID == if (m_scene.LandManager.getLandObject(task.AbsolutePosition.X, task.AbsolutePosition.Y).landData.ownerID ==
user) user)
permission = true; permission = true;
// Estate users should be able to edit anything in the sim // Estate users should be able to edit anything in the sim
if (IsEstateManager(user)) if (IsEstateManager(user))
permission = true; permission = true;
// Admin objects should not be editable by the above // Admin objects should not be editable by the above
if (IsAdministrator(taskOwner)) if (IsAdministrator(taskOwner))
permission = false; permission = false;
// Admin should be able to edit anything in the sim (including admin objects) // Admin should be able to edit anything in the sim (including admin objects)
if (IsAdministrator(user)) if (IsAdministrator(user))
permission = true; permission = true;
return permission; return permission;
} }
/// <summary> /// <summary>
/// Permissions check - can user delete an object? /// Permissions check - can user delete an object?
/// </summary> /// </summary>
/// <param name="user">User attempting the delete</param> /// <param name="user">User attempting the delete</param>
/// <param name="obj">Target object</param> /// <param name="obj">Target object</param>
/// <returns>Has permission?</returns> /// <returns>Has permission?</returns>
public virtual bool CanDeRezObject(LLUUID user, LLUUID obj) public virtual bool CanDeRezObject(LLUUID user, LLUUID obj)
{ {
return GenericObjectPermission(user, obj); return GenericObjectPermission(user, obj);
} }
public virtual bool CanEditObject(LLUUID user, LLUUID obj) public virtual bool CanEditObject(LLUUID user, LLUUID obj)
{ {
return GenericObjectPermission(user, obj); return GenericObjectPermission(user, obj);
} }
public virtual bool CanReturnObject(LLUUID user, LLUUID obj) public virtual bool CanReturnObject(LLUUID user, LLUUID obj)
{ {
return GenericObjectPermission(user, obj); return GenericObjectPermission(user, obj);
} }
#endregion #endregion
#region Communication Permissions #region Communication Permissions
public virtual bool GenericCommunicationPermission(LLUUID user, LLUUID target) public virtual bool GenericCommunicationPermission(LLUUID user, LLUUID target)
{ {
bool permission = false; bool permission = false;
string reason = "Only registered users may communicate with another account."; string reason = "Only registered users may communicate with another account.";
if (IsGridUser(user)) if (IsGridUser(user))
permission = true; permission = true;
if (!IsGridUser(user)) if (!IsGridUser(user))
{ {
permission = false; permission = false;
reason = "The person that you are messaging is not a registered user."; reason = "The person that you are messaging is not a registered user.";
} }
if (IsAdministrator(user)) if (IsAdministrator(user))
permission = true; permission = true;
if (IsEstateManager(user)) if (IsEstateManager(user))
permission = true; permission = true;
if (!permission) if (!permission)
SendPermissionError(user, reason); SendPermissionError(user, reason);
return permission; return permission;
} }
public virtual bool CanInstantMessage(LLUUID user, LLUUID target) public virtual bool CanInstantMessage(LLUUID user, LLUUID target)
{ {
return GenericCommunicationPermission(user, target); return GenericCommunicationPermission(user, target);
} }
public virtual bool CanInventoryTransfer(LLUUID user, LLUUID target) public virtual bool CanInventoryTransfer(LLUUID user, LLUUID target)
{ {
return GenericCommunicationPermission(user, target); return GenericCommunicationPermission(user, target);
} }
#endregion #endregion
public virtual bool CanEditScript(LLUUID user, LLUUID script) public virtual bool CanEditScript(LLUUID user, LLUUID script)
{ {
return IsAdministrator(user); return IsAdministrator(user);
} }
public virtual bool CanRunScript(LLUUID user, LLUUID script) public virtual bool CanRunScript(LLUUID user, LLUUID script)
{ {
return IsAdministrator(user); return IsAdministrator(user);
} }
public virtual bool CanTerraform(LLUUID user, LLVector3 position) public virtual bool CanTerraform(LLUUID user, LLVector3 position)
{ {
bool permission = false; bool permission = false;
// Estate override // Estate override
if (GenericEstatePermission(user)) if (GenericEstatePermission(user))
permission = true; permission = true;
// Land owner can terraform too // Land owner can terraform too
if (GenericParcelPermission(user, m_scene.LandManager.getLandObject(position.X, position.Y))) if (GenericParcelPermission(user, m_scene.LandManager.getLandObject(position.X, position.Y)))
permission = true; permission = true;
if (!permission) if (!permission)
SendPermissionError(user, "Not authorized to terraform at this location."); SendPermissionError(user, "Not authorized to terraform at this location.");
return permission; return permission;
} }
#region Estate Permissions #region Estate Permissions
protected virtual bool GenericEstatePermission(LLUUID user) protected virtual bool GenericEstatePermission(LLUUID user)
{ {
// Default: deny // Default: deny
bool permission = false; bool permission = false;
// Estate admins should be able to use estate tools // Estate admins should be able to use estate tools
if (IsEstateManager(user)) if (IsEstateManager(user))
permission = true; permission = true;
// Administrators always have permission // Administrators always have permission
if (IsAdministrator(user)) if (IsAdministrator(user))
permission = true; permission = true;
return permission; return permission;
} }
public virtual bool CanEditEstateTerrain(LLUUID user) public virtual bool CanEditEstateTerrain(LLUUID user)
{ {
return GenericEstatePermission(user); return GenericEstatePermission(user);
} }
#endregion #endregion
#region Parcel Permissions #region Parcel Permissions
protected virtual bool GenericParcelPermission(LLUUID user, Land parcel) protected virtual bool GenericParcelPermission(LLUUID user, Land parcel)
{ {
bool permission = false; bool permission = false;
if (parcel.landData.ownerID == user) if (parcel.landData.ownerID == user)
permission = true; permission = true;
if (parcel.landData.isGroupOwned) if (parcel.landData.isGroupOwned)
{ {
// TODO: Need to do some extra checks here. Requires group code. // TODO: Need to do some extra checks here. Requires group code.
} }
if (IsEstateManager(user)) if (IsEstateManager(user))
permission = true; permission = true;
if (IsAdministrator(user)) if (IsAdministrator(user))
permission = true; permission = true;
return permission; return permission;
} }
protected virtual bool GenericParcelPermission(LLUUID user, LLVector3 pos) protected virtual bool GenericParcelPermission(LLUUID user, LLVector3 pos)
{ {
return GenericParcelPermission(user, m_scene.LandManager.getLandObject(pos.X, pos.Y)); return GenericParcelPermission(user, m_scene.LandManager.getLandObject(pos.X, pos.Y));
} }
public virtual bool CanEditParcel(LLUUID user, Land parcel) public virtual bool CanEditParcel(LLUUID user, Land parcel)
{ {
return GenericParcelPermission(user, parcel); return GenericParcelPermission(user, parcel);
} }
public virtual bool CanSellParcel(LLUUID user, Land parcel) public virtual bool CanSellParcel(LLUUID user, Land parcel)
{ {
return GenericParcelPermission(user, parcel); return GenericParcelPermission(user, parcel);
} }
public virtual bool CanAbandonParcel(LLUUID user, Land parcel) public virtual bool CanAbandonParcel(LLUUID user, Land parcel)
{ {
return GenericParcelPermission(user, parcel); return GenericParcelPermission(user, parcel);
} }
#endregion #endregion
} }
} }

View File

@ -85,16 +85,16 @@ namespace OpenSim.Region.Environment.Scenes
public void LoadCurrentSceneFromXml(string filename) public void LoadCurrentSceneFromXml(string filename)
{ {
CurrentOrFirstScene.LoadPrimsFromXml(filename); CurrentOrFirstScene.LoadPrimsFromXml(filename);
} }
public void SaveCurrentSceneToXml2(string filename) public void SaveCurrentSceneToXml2(string filename)
{ {
CurrentOrFirstScene.SavePrimsToXml2(filename); CurrentOrFirstScene.SavePrimsToXml2(filename);
} }
public void LoadCurrentSceneFromXml2(string filename) public void LoadCurrentSceneFromXml2(string filename)
{ {
CurrentOrFirstScene.LoadPrimsFromXml2(filename); CurrentOrFirstScene.LoadPrimsFromXml2(filename);
} }
public bool RunTerrainCmdOnCurrentScene(string[] cmdparams, ref string result) public bool RunTerrainCmdOnCurrentScene(string[] cmdparams, ref string result)