From 5fb7b485b211bbf19f4531a051b78dde92da4ba3 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 19 Sep 2008 17:41:21 +0000 Subject: [PATCH] * Only allow logins on standalone when the sim has completed it's initial startup (script startup doesn't count here) * There was a small window where region logins were allowed before modules were loaded - avatars logins that hit this window could have caused bad things to happen. * A similar change will follow for grid mode sometime soon --- .../Cache/UserProfileCacheService.cs | 22 +++++-- .../Communications/CommunicationsManager.cs | 9 ++- .../Framework/Communications/IGridServices.cs | 7 +- .../Framework/Communications/LoginService.cs | 4 +- OpenSim/Region/Application/OpenSimBase.cs | 38 ++++++----- .../ClientStack/LindenUDP/LLClientView.cs | 2 +- .../ClientStack/RegionApplicationBase.cs | 2 - .../Local/CommunicationsLocal.cs | 4 +- .../Local/LocalBackEndServices.cs | 13 ++-- .../Communications/Local/LocalLoginService.cs | 64 ++++++++++++------- .../Communications/OGS1/CommunicationsOGS1.cs | 6 +- .../Communications/OGS1/OGS1GridServices.cs | 15 ++++- .../Environment/Scenes/Scene.Inventory.cs | 6 +- 13 files changed, 121 insertions(+), 71 deletions(-) diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs index 3675053b87..cf6a74d19f 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs @@ -51,12 +51,20 @@ namespace OpenSim.Framework.Communications.Cache /// private readonly Dictionary m_userProfiles = new Dictionary(); - public readonly LibraryRootFolder libraryRoot = new LibraryRootFolder(); + /// + /// The root library folder. + /// + public readonly LibraryRootFolder LibraryRoot; - // Methods - public UserProfileCacheService(CommunicationsManager commsManager) + /// + /// Constructor + /// + /// + /// + public UserProfileCacheService(CommunicationsManager commsManager, LibraryRootFolder libraryRootFolder) { m_commsManager = commsManager; + LibraryRoot = libraryRootFolder; } /// @@ -293,10 +301,10 @@ namespace OpenSim.Framework.Communications.Cache // FIXME MAYBE: We're not handling sortOrder! InventoryFolderImpl fold = null; - if ((fold = libraryRoot.FindFolder(folderID)) != null) + if ((fold = LibraryRoot.FindFolder(folderID)) != null) { remoteClient.SendInventoryFolderDetails( - libraryRoot.Owner, folderID, fold.RequestListOfItems(), + LibraryRoot.Owner, folderID, fold.RequestListOfItems(), fold.RequestListOfFolders(), fetchFolders, fetchItems); return; @@ -337,7 +345,7 @@ namespace OpenSim.Framework.Communications.Cache // FIXME MAYBE: We're not handling sortOrder! InventoryFolderImpl fold; - if ((fold = libraryRoot.FindFolder(folderID)) != null) + if ((fold = LibraryRoot.FindFolder(folderID)) != null) { return fold.RequestListOfItems(); } @@ -428,7 +436,7 @@ namespace OpenSim.Framework.Communications.Cache public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID) { - if (ownerID == libraryRoot.Owner) + if (ownerID == LibraryRoot.Owner) { //Console.WriteLine("request info for library item"); diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs index 5bed28264c..198bd83290 100644 --- a/OpenSim/Framework/Communications/CommunicationsManager.cs +++ b/OpenSim/Framework/Communications/CommunicationsManager.cs @@ -112,11 +112,11 @@ namespace OpenSim.Framework.Communications /// /// public CommunicationsManager(NetworkServersInfo serversInfo, BaseHttpServer httpServer, AssetCache assetCache, - bool dumpAssetsToFile) + bool dumpAssetsToFile, LibraryRootFolder libraryRootFolder) { m_networkServersInfo = serversInfo; m_assetCache = assetCache; - m_userProfileCacheService = new UserProfileCacheService(this); + m_userProfileCacheService = new UserProfileCacheService(this, libraryRootFolder); // m_transactionsManager = new AgentAssetTransactionsManager(this, dumpAssetsToFile); } @@ -356,7 +356,7 @@ namespace OpenSim.Framework.Communications public void HandleUUIDNameRequest(UUID uuid, IClientAPI remote_client) { - if (uuid == m_userProfileCacheService.libraryRoot.Owner) + if (uuid == m_userProfileCacheService.LibraryRoot.Owner) { remote_client.SendNameReply(uuid, "Mr", "OpenSim"); } @@ -376,7 +376,6 @@ namespace OpenSim.Framework.Communications string[] returnstring = new string[0]; bool doLookup = false; - lock (m_nameRequestCache) { if (m_nameRequestCache.ContainsKey(uuid)) @@ -405,8 +404,8 @@ namespace OpenSim.Framework.Communications } } } + return returnstring; - } public bool UUIDNameCachedTest(UUID uuid) diff --git a/OpenSim/Framework/Communications/IGridServices.cs b/OpenSim/Framework/Communications/IGridServices.cs index 6c5d2e2948..f6a28852df 100644 --- a/OpenSim/Framework/Communications/IGridServices.cs +++ b/OpenSim/Framework/Communications/IGridServices.cs @@ -33,6 +33,11 @@ namespace OpenSim.Framework.Communications public interface IGridServices { string gdebugRegionName { get; set; } + + /// + /// If true, then regions will accept logins from the user service. If false, then they will not. + /// + bool RegionLoginsEnabled { get; set; } /// /// Register a region with the grid service. @@ -42,7 +47,7 @@ namespace OpenSim.Framework.Communications /// Thrown if region registration failed RegionCommsListener RegisterRegion(RegionInfo regionInfos); - bool DeregisterRegion(RegionInfo regionInfo); + bool DeregisterRegion(RegionInfo regionInfo); /// /// Get information about the regions neighbouring the given co-ordinates. diff --git a/OpenSim/Framework/Communications/LoginService.cs b/OpenSim/Framework/Communications/LoginService.cs index f4c43effad..8d27a23315 100644 --- a/OpenSim/Framework/Communications/LoginService.cs +++ b/OpenSim/Framework/Communications/LoginService.cs @@ -239,8 +239,8 @@ namespace OpenSim.Framework.Communications catch (Exception e) { m_log.ErrorFormat( - "[LOGIN END]: XMLRPC Error retrieving inventory skeleton of agent {0}, {1} - {2}", - agentID, e.GetType(), e.Message); + "[LOGIN END]: Error retrieving inventory skeleton of agent {0} - {1}", + agentID, e); return logResponse.CreateLoginInventoryFailedResponse(); } diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index e5cf07a98f..d4fa3144ed 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -84,7 +84,6 @@ namespace OpenSim public bool m_gridLocalAsset; public bool m_see_into_region_from_neighbor; - protected LocalLoginService m_loginService; protected GridInfoService m_gridInfoService; protected string m_storageDll; @@ -368,6 +367,8 @@ namespace OpenSim base.Startup(); m_stats = StatsManager.StartCollectingSimExtraStats(); + + LibraryRootFolder libraryRootFolder = new LibraryRootFolder(); // StandAlone mode? m_sandbox is determined by !startupConfig.GetBoolean("gridmode", false) if (m_sandbox) @@ -378,28 +379,28 @@ namespace OpenSim LocalUserServices userService = new LocalUserServices(m_networkServersInfo, m_networkServersInfo.DefaultHomeLocX, m_networkServersInfo.DefaultHomeLocY, inventoryService); - userService.AddPlugin(m_standaloneUserPlugin, m_standaloneUserSource); + userService.AddPlugin(m_standaloneUserPlugin, m_standaloneUserSource); LocalBackEndServices backendService = new LocalBackEndServices(); - - CommunicationsLocal localComms = - new CommunicationsLocal(m_networkServersInfo, m_httpServer, m_assetCache, userService, userService, - inventoryService, backendService, backendService, m_dumpAssetsToFile); - m_commsManager = localComms; - - m_loginService = - new LocalLoginService(userService, m_standaloneWelcomeMessage, localComms, m_networkServersInfo, - m_standaloneAuthenticate); - m_loginService.OnLoginToRegion += backendService.AddNewSession; + + LocalLoginService loginService = + new LocalLoginService( + userService, m_standaloneWelcomeMessage, inventoryService, backendService, m_networkServersInfo, + m_standaloneAuthenticate, libraryRootFolder); + + m_commsManager + = new CommunicationsLocal( + m_networkServersInfo, m_httpServer, m_assetCache, userService, userService, + inventoryService, backendService, backendService, libraryRootFolder, m_dumpAssetsToFile); // set up XMLRPC handler for client's initial login request message - m_httpServer.AddXmlRPCHandler("login_to_simulator", m_loginService.XmlRpcLoginMethod); + m_httpServer.AddXmlRPCHandler("login_to_simulator", loginService.XmlRpcLoginMethod); // provides the web form login - m_httpServer.AddHTTPHandler("login", m_loginService.ProcessHTMLLogin); + m_httpServer.AddHTTPHandler("login", loginService.ProcessHTMLLogin); // Provides the LLSD login - m_httpServer.SetDefaultLLSDHandler(m_loginService.LLSDLoginMethod); + m_httpServer.SetDefaultLLSDHandler(loginService.LLSDLoginMethod); // provide grid info // m_gridInfoService = new GridInfoService(m_config.Source.Configs["Startup"].GetString("inifile", Path.Combine(Util.configDir(), "OpenSim.ini"))); @@ -410,7 +411,9 @@ namespace OpenSim else { // We are in grid mode - m_commsManager = new CommunicationsOGS1(m_networkServersInfo, m_httpServer, m_assetCache); + m_commsManager + = new CommunicationsOGS1(m_networkServersInfo, m_httpServer, m_assetCache, libraryRootFolder); + m_httpServer.AddStreamHandler(new SimStatusHandler()); } @@ -421,6 +424,9 @@ namespace OpenSim m_moduleLoader = new ModuleLoader(m_config.Source); LoadPlugins(); + + // Only enable logins to the regions once we have completely finished starting up + m_commsManager.GridService.RegionLoginsEnabled = true; } protected override void Initialize() diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 3b5e7988c2..a55ce1c36d 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -4884,7 +4884,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(itemID); if (assetRequestItem == null) { - assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.libraryRoot.FindItem(itemID); + assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); if (assetRequestItem == null) return; } diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 469c0848f9..4c6d51fdd2 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -87,9 +87,7 @@ namespace OpenSim.Region.ClientStack m_log.Error("[HTTP]: HTTP Server config failed. HTTP Server and HTTPS server must be on different ports"); } - m_log.Info("[REGION]: Starting HTTP server"); - m_httpServer.Start(); } diff --git a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs index c79979c152..71c44e5d4e 100644 --- a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs +++ b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs @@ -42,8 +42,8 @@ namespace OpenSim.Region.Communications.Local IUserServiceAdmin userServiceAdmin, LocalInventoryService inventoryService, IInterRegionCommunications interRegionService, - IGridServices gridService, bool dumpAssetsToFile) - : base(serversInfo, httpServer, assetCache, dumpAssetsToFile) + IGridServices gridService, LibraryRootFolder libraryRootFolder, bool dumpAssetsToFile) + : base(serversInfo, httpServer, assetCache, dumpAssetsToFile, libraryRootFolder) { AddInventoryService(inventoryService); m_defaultInventoryHost = inventoryService.Host; diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs index aabddc6ae2..a861ceba7f 100644 --- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs @@ -39,7 +39,7 @@ namespace OpenSim.Region.Communications.Local public class LocalBackEndServices : IGridServices, IInterRegionCommunications { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - + protected Dictionary m_regions = new Dictionary(); protected Dictionary m_regionListeners = @@ -50,6 +50,13 @@ namespace OpenSim.Region.Communications.Local private Dictionary m_queuedGridSettings = new Dictionary(); public string _gdebugRegionName = String.Empty; + + public bool RegionLoginsEnabled + { + get { return m_regionLoginsEnabled; } + set { m_regionLoginsEnabled = value; } + } + private bool m_regionLoginsEnabled; public bool CheckRegion(string address, uint port) { @@ -70,10 +77,6 @@ namespace OpenSim.Region.Communications.Local set { _rdebugRegionName = value; } } - public LocalBackEndServices() - { - } - /// /// Register a region method with the BackEnd Services. /// diff --git a/OpenSim/Region/Communications/Local/LocalLoginService.cs b/OpenSim/Region/Communications/Local/LocalLoginService.cs index 41093c1472..ded2d5617f 100644 --- a/OpenSim/Region/Communications/Local/LocalLoginService.cs +++ b/OpenSim/Region/Communications/Local/LocalLoginService.cs @@ -34,6 +34,7 @@ using OpenMetaverse; using log4net; using OpenSim.Framework; using OpenSim.Framework.Communications; +using OpenSim.Framework.Communications.Cache; namespace OpenSim.Region.Communications.Local { @@ -43,27 +44,41 @@ namespace OpenSim.Region.Communications.Local { protected static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected CommunicationsLocal m_Parent; - protected NetworkServersInfo serversInfo; protected uint defaultHomeX; protected uint defaultHomeY; protected bool authUsers = false; + + /// + /// Used by the login service to make requests to the inventory service. + /// + protected IInterServiceInventoryServices m_interServiceInventoryService; + + /// + /// Used to make requests to the local regions. + /// + protected IGridServices m_gridService; public event LoginToRegionEvent OnLoginToRegion; protected LoginToRegionEvent handlerLoginToRegion = null; // OnLoginToRegion; - public LocalLoginService(UserManagerBase userManager, string welcomeMess, - CommunicationsLocal parent, NetworkServersInfo serversInfo, - bool authenticate) - : base(userManager, parent.UserProfileCacheService.libraryRoot, welcomeMess) + public LocalLoginService( + UserManagerBase userManager, string welcomeMess, + IInterServiceInventoryServices interServiceInventoryService, LocalBackEndServices gridService, + NetworkServersInfo serversInfo, + bool authenticate, LibraryRootFolder libraryRootFolder) + : base(userManager, libraryRootFolder, welcomeMess) { - m_Parent = parent; this.serversInfo = serversInfo; defaultHomeX = this.serversInfo.DefaultHomeLocX; defaultHomeY = this.serversInfo.DefaultHomeLocY; authUsers = authenticate; + + m_interServiceInventoryService = interServiceInventoryService; + m_gridService = gridService; + + OnLoginToRegion += gridService.AddNewSession; } public override UserProfileData GetTheUser(string firstname, string lastname) @@ -84,7 +99,7 @@ namespace OpenSim.Region.Communications.Local profile = m_userManager.GetUserProfile(firstname, lastname); if (profile != null) { - m_Parent.InterServiceInventoryService.CreateNewUserInventory(profile.ID); + m_interServiceInventoryService.CreateNewUserInventory(profile.ID); } return profile; @@ -129,11 +144,12 @@ namespace OpenSim.Region.Communications.Local { // HomeLocation RegionInfo homeInfo = null; + // use the homeRegionID if it is stored already. If not, use the regionHandle as before if (theUser.HomeRegionID != UUID.Zero) - homeInfo = m_Parent.GridService.RequestNeighbourInfo(theUser.HomeRegionID); + homeInfo = m_gridService.RequestNeighbourInfo(theUser.HomeRegionID); else - homeInfo = m_Parent.GridService.RequestNeighbourInfo(theUser.HomeRegion); + homeInfo = m_gridService.RequestNeighbourInfo(theUser.HomeRegion); if (homeInfo != null) { response.Home = @@ -172,7 +188,7 @@ namespace OpenSim.Region.Communications.Local } else if (startLocationRequest == "last") { - regionInfo = m_Parent.GridService.RequestNeighbourInfo(theUser.CurrentAgent.Region); + regionInfo = m_gridService.RequestNeighbourInfo(theUser.CurrentAgent.Region); response.LookAt = "[r" + theUser.CurrentAgent.LookAt.X.ToString() + ",r" + theUser.CurrentAgent.LookAt.Y.ToString() + ",r" + theUser.CurrentAgent.LookAt.Z.ToString() + "]"; } else @@ -186,7 +202,7 @@ namespace OpenSim.Region.Communications.Local else { string region = uriMatch.Groups["region"].ToString(); - regionInfo = m_Parent.GridService.RequestClosestRegion(region); + regionInfo = m_gridService.RequestClosestRegion(region); if (regionInfo == null) { m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, can't locate region {1}", startLocationRequest, region); @@ -208,7 +224,7 @@ namespace OpenSim.Region.Communications.Local } // StartLocation not available, send him to a nearby region instead - // regionInfo = m_Parent.GridService.RequestClosestRegion(""); + // regionInfo = m_gridService.RequestClosestRegion(""); //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName); // Send him to default region instead @@ -222,7 +238,7 @@ namespace OpenSim.Region.Communications.Local } m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead"); - regionInfo = m_Parent.GridService.RequestNeighbourInfo(defaultHandle); + regionInfo = m_gridService.RequestNeighbourInfo(defaultHandle); // Customise the response //response.Home = @@ -274,24 +290,26 @@ namespace OpenSim.Region.Communications.Local loginParams.StartPos = user.CurrentAgent.Position; loginParams.CapsPath = capsPath; - handlerLoginToRegion = OnLoginToRegion; - if (handlerLoginToRegion == null) - return false; - - handlerLoginToRegion(user.CurrentAgent.Handle, loginParams); - return true; + if (m_gridService.RegionLoginsEnabled) + { + handlerLoginToRegion = OnLoginToRegion; + handlerLoginToRegion(user.CurrentAgent.Handle, loginParams); + return true; + } + + return false; } // See LoginService protected override InventoryData GetInventorySkeleton(UUID userID) { - List folders = m_Parent.InterServiceInventoryService.GetInventorySkeleton(userID); + List folders = m_interServiceInventoryService.GetInventorySkeleton(userID); // If we have user auth but no inventory folders for some reason, create a new set of folders. if (null == folders || 0 == folders.Count) { - m_Parent.InterServiceInventoryService.CreateNewUserInventory(userID); - folders = m_Parent.InterServiceInventoryService.GetInventorySkeleton(userID); + m_interServiceInventoryService.CreateNewUserInventory(userID); + folders = m_interServiceInventoryService.GetInventorySkeleton(userID); } UUID rootID = UUID.Zero; diff --git a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs index 1926e79fdf..d76f076007 100644 --- a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs +++ b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs @@ -34,8 +34,10 @@ namespace OpenSim.Region.Communications.OGS1 { public class CommunicationsOGS1 : CommunicationsManager { - public CommunicationsOGS1(NetworkServersInfo serversInfo, BaseHttpServer httpServer, AssetCache assetCache) - : base(serversInfo, httpServer, assetCache, false) + public CommunicationsOGS1( + NetworkServersInfo serversInfo, BaseHttpServer httpServer, + AssetCache assetCache, LibraryRootFolder libraryRootFolder) + : base(serversInfo, httpServer, assetCache, false, libraryRootFolder) { OGS1GridServices gridInterComms = new OGS1GridServices(serversInfo, httpServer); m_gridService = gridInterComms; diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index 3bd57cdb93..2e91157818 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -51,15 +51,16 @@ namespace OpenSim.Region.Communications.OGS1 { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + // FIXME: LocalBackEndServices should to be refactored into a separate common parent class rather than + // encapsulated. private LocalBackEndServices m_localBackend = new LocalBackEndServices(); + private Dictionary m_remoteRegionInfoCache = new Dictionary(); // private List m_knownRegions = new List(); private Dictionary m_deadRegionCache = new Dictionary(); private Dictionary m_queuedGridSettings = new Dictionary(); private List m_regionsOnInstance = new List(); - - public BaseHttpServer httpListener; public NetworkServersInfo serversInfo; public BaseHttpServer httpServer; @@ -79,6 +80,16 @@ namespace OpenSim.Region.Communications.OGS1 get { return _rdebugRegionName; } set { _rdebugRegionName = value; } } + + /// + /// Doesn't have any effect yet! + /// + public bool RegionLoginsEnabled + { + get { return m_regionLoginsEnabled; } + set { m_regionLoginsEnabled = value; } + } + private bool m_regionLoginsEnabled; /// /// Contructor. Adds "expect_user" and "check" xmlrpc method handlers diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 36f86eb96d..5d55075dac 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -500,7 +500,7 @@ namespace OpenSim.Region.Environment.Scenes "[AGENT INVENTORY]: CopyInventoryItem received by {0} with oldAgentID {1}, oldItemID {2}, new FolderID {3}, newName {4}", remoteClient.AgentId, oldAgentID, oldItemID, newFolderID, newName); - InventoryItemBase item = CommsManager.UserProfileCacheService.libraryRoot.FindItem(oldItemID); + InventoryItemBase item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(oldItemID); if (item == null) { @@ -1207,7 +1207,7 @@ namespace OpenSim.Region.Environment.Scenes // XXX clumsy, possibly should be one call if (null == item) { - item = CommsManager.UserProfileCacheService.libraryRoot.FindItem(itemID); + item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); } if (item != null) @@ -1272,7 +1272,7 @@ namespace OpenSim.Region.Environment.Scenes // XXX clumsy, possibly should be one call if (null == item) { - item = CommsManager.UserProfileCacheService.libraryRoot.FindItem(itemID); + item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); } if (item != null)