From fe50f2e6b9a2f832c444c0790df0caccb0114b5f Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sat, 23 Feb 2008 03:34:31 +0000 Subject: [PATCH] * Rex merge, local communications -- LocalLoginService line 186 needs tweaking. --- .../Local/LocalBackEndServices.cs | 910 +++++++++--------- .../Local/LocalInventoryService.cs | 249 +++-- .../Communications/Local/LocalLoginService.cs | 535 +++++----- .../Communications/Local/LocalUserServices.cs | 201 ++-- .../Local/Properties/AssemblyInfo.cs | 104 +- 5 files changed, 1054 insertions(+), 945 deletions(-) diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs index 073bb19573..16f934d8e8 100644 --- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs @@ -1,443 +1,467 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* 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 -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System.Collections; -using System.Collections.Generic; -using libsecondlife; -using OpenSim.Framework; -using OpenSim.Framework.Communications; -using OpenSim.Framework.Console; - -namespace OpenSim.Region.Communications.Local -{ - public class LocalBackEndServices : IGridServices, IInterRegionCommunications - { - protected Dictionary m_regions = new Dictionary(); - - protected Dictionary m_regionListeners = - new Dictionary(); - - private Dictionary m_remoteRegionInfoCache = new Dictionary(); - - private Dictionary m_queuedGridSettings = new Dictionary(); - - public string _gdebugRegionName = ""; - - public string gdebugRegionName - { - get { return _gdebugRegionName; } - set { _gdebugRegionName = value; } - } - - public string _rdebugRegionName = ""; - - public string rdebugRegionName - { - get { return _rdebugRegionName; } - set { _rdebugRegionName = value; } - } - - public LocalBackEndServices() - { - } - - /// - /// Register a region method with the BackEnd Services. - /// - /// - /// - public RegionCommsListener RegisterRegion(RegionInfo regionInfo) - { - //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering"); - if (!m_regions.ContainsKey(regionInfo.RegionHandle)) - { - //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle ); - m_regions.Add(regionInfo.RegionHandle, regionInfo); - - RegionCommsListener regionHost = new RegionCommsListener(); - if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) - { - MainLog.Instance.Error("INTERREGION", - "Error:Region registered twice as an Events listener for Interregion Communications but not as a listed region. In Standalone mode this will cause BIG issues. In grid mode, it means a region went down and came back up."); - m_regionListeners.Remove(regionInfo.RegionHandle); - } - m_regionListeners.Add(regionInfo.RegionHandle, regionHost); - - return regionHost; - } - else - { - // Already in our list, so the region went dead and restarted. - m_regions.Remove(regionInfo.RegionHandle); - MainLog.Instance.Warn("INTERREGION", "Region registered twice. Region went down and came back up."); - - RegionCommsListener regionHost = new RegionCommsListener(); - if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) - { - m_regionListeners.Remove(regionInfo.RegionHandle); - } - m_regionListeners.Add(regionInfo.RegionHandle, regionHost); - - return regionHost; - } - } - - public bool DeregisterRegion(RegionInfo regionInfo) - { - if (m_regions.ContainsKey(regionInfo.RegionHandle)) - { - m_regions.Remove(regionInfo.RegionHandle); - if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) - { - m_regionListeners.Remove(regionInfo.RegionHandle); - } - return true; - } - return false; - } - - /// - /// - /// - /// - public List RequestNeighbours(uint x, uint y) - { - // Console.WriteLine("Finding Neighbours to " + regionInfo.RegionHandle); - List neighbours = new List(); - - foreach (RegionInfo reg in m_regions.Values) - { - // Console.WriteLine("CommsManager- RequestNeighbours() checking region " + reg.RegionLocX + " , "+ reg.RegionLocY); - if (reg.RegionLocX != x || reg.RegionLocY != y) - { - //Console.WriteLine("CommsManager- RequestNeighbours() - found a different region in list, checking location"); - if ((reg.RegionLocX > (x - 2)) && (reg.RegionLocX < (x + 2))) - { - if ((reg.RegionLocY > (y - 2)) && (reg.RegionLocY < (y + 2))) - { - neighbours.Add(reg); - } - } - } - } - return neighbours; - } - - /// - /// - /// - /// - /// - public RegionInfo RequestNeighbourInfo(ulong regionHandle) - { - if (m_regions.ContainsKey(regionHandle)) - { - return m_regions[regionHandle]; - } - return null; - } - - /// - /// - /// - /// - /// - /// - /// - /// - public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) - { - List mapBlocks = new List(); - foreach (RegionInfo regInfo in m_regions.Values) - { - if (((regInfo.RegionLocX >= minX) && (regInfo.RegionLocX <= maxX)) && - ((regInfo.RegionLocY >= minY) && (regInfo.RegionLocY <= maxY))) - { - MapBlockData map = new MapBlockData(); - map.Name = regInfo.RegionName; - map.X = (ushort) regInfo.RegionLocX; - map.Y = (ushort) regInfo.RegionLocY; - map.WaterHeight = (byte) regInfo.EstateSettings.waterHeight; - map.MapImageId = regInfo.EstateSettings.terrainImageID; - map.Agents = 1; - map.RegionFlags = 72458694; - map.Access = 13; - mapBlocks.Add(map); - } - } - return mapBlocks; - } - - - public virtual bool RegionUp(SearializableRegionInfo sregion, ulong regionhandle) - { - RegionInfo region = new RegionInfo(sregion); - if (m_regionListeners.ContainsKey(regionhandle)) - { - return m_regionListeners[regionhandle].TriggerRegionUp(region); - } - - return false; - } - - public virtual bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - // Console.WriteLine("CommsManager- Informing a region to expect child agent"); - m_regionListeners[regionHandle].TriggerChildAgentUpdate(regionHandle, cAgentData); - //MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Got Listener trigginering local event: " + agentData.firstname + " " + agentData.lastname); - - return true; - } - return false; - } - - // This function Is only here to keep this class in line with the Grid Interface. - // It never gets called. - public virtual Dictionary GetGridSettings() - { - Dictionary returnGridSettings = new Dictionary(); - lock (m_queuedGridSettings) - { - returnGridSettings = m_queuedGridSettings; - m_queuedGridSettings.Clear(); - } - - return returnGridSettings; - } - - public virtual void SetForcefulBanlistsDisallowed(ulong regionHandle) - { - m_queuedGridSettings.Add("allow_forceful_banlines", "FALSE"); - } - - public bool TriggerRegionUp(RegionInfo region, ulong regionhandle) - { - if (m_regionListeners.ContainsKey(regionhandle)) - { - return m_regionListeners[regionhandle].TriggerRegionUp(region); - } - - return false; - } - - public bool TriggerChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - return m_regionListeners[regionHandle].TriggerChildAgentUpdate(regionHandle, cAgentData); - } - return false; - } - - /// - /// - /// - /// - /// - /// - public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) - //should change from agentCircuitData - { - //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent"); - //MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Trying to inform region of child agent: " + agentData.firstname + " " + agentData.lastname); - - if (m_regionListeners.ContainsKey(regionHandle)) - { - // Console.WriteLine("CommsManager- Informing a region to expect child agent"); - m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agentData); - //MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Got Listener trigginering local event: " + agentData.firstname + " " + agentData.lastname); - - return true; - } - return false; - } - - public bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - m_regionListeners[regionHandle].TriggerExpectPrim(regionHandle, primID, objData); - return true; - } - return false; - } - - /// - /// - /// - /// - /// - /// - /// - public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - // Console.WriteLine("CommsManager- Informing a region to expect avatar crossing"); - m_regionListeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position, isFlying); - return true; - } - return false; - } - - public bool ExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - m_regionListeners[regionHandle].TriggerExpectPrimCrossing(regionHandle, primID, position, isPhysical); - return true; - } - return false; - } - - public void TellRegionToCloseChildConnection(ulong regionHandle, LLUUID agentID) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - m_regionListeners[regionHandle].TriggerCloseAgentConnection(regionHandle, agentID); - } - } - - public bool AcknowledgeAgentCrossed(ulong regionHandle, LLUUID agentId) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - return true; - } - return false; - } - - public bool AcknowledgePrimCrossed(ulong regionHandle, LLUUID primID) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - return true; - } - return false; - } - - /// - /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session - /// - /// - /// - /// - public void AddNewSession(ulong regionHandle, Login loginData) - { - AgentCircuitData agent = new AgentCircuitData(); - agent.AgentID = loginData.Agent; - agent.firstname = loginData.First; - agent.lastname = loginData.Last; - agent.SessionID = loginData.Session; - agent.SecureSessionID = loginData.SecureSession; - agent.circuitcode = loginData.CircuitCode; - agent.BaseFolder = loginData.BaseFolder; - agent.InventoryFolder = loginData.InventoryFolder; - agent.startpos = loginData.StartPos; - - agent.ClientVersion = loginData.ClientVersion; //rex - - agent.CapsPath = loginData.CapsPath; - - agent.authenticationAddr = loginData.AuthAddr; - agent.asAddress = loginData.asAddress; - - TriggerExpectUser(regionHandle, agent); - } - - public void TriggerExpectUser(ulong regionHandle, AgentCircuitData agent) - { - //MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Other region is sending child agent our way: " + agent.firstname + " " + agent.lastname); - - if (m_regionListeners.ContainsKey(regionHandle)) - { - //MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: FoundLocalRegion To send it to: " + agent.firstname + " " + agent.lastname); - - m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agent); - } - } - - public void TriggerExpectPrim(ulong regionHandle, LLUUID primID, string objData) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - m_regionListeners[regionHandle].TriggerExpectPrim(regionHandle, primID, objData); - } - } - - public void PingCheckReply(Hashtable respData) - { - foreach (ulong region in m_regions.Keys) - { - Hashtable regData = new Hashtable(); - RegionInfo reg = m_regions[region]; - regData["status"] = "active"; - regData["handle"] = region.ToString(); - - respData[reg.RegionID.ToString()] = regData; - } - } - - public bool TriggerExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - return m_regionListeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position, - isFlying); - } - - return false; - } - - public bool TriggerExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) - { - if (m_regionListeners.ContainsKey(regionHandle)) - { - return - m_regionListeners[regionHandle].TriggerExpectPrimCrossing(regionHandle, primID, position, isPhysical); - } - return false; - } - - public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) - { - // MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Other local region is sending child agent our way: " + agentData.firstname + " " + agentData.lastname); - - if (m_regionListeners.ContainsKey(regionHandle)) - { - //MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: found local region to trigger event on: " + agentData.firstname + " " + agentData.lastname); - - TriggerExpectUser(regionHandle, agentData); - return true; - } - - return false; - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* 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 +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections; +using System.Collections.Generic; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Console; + +namespace OpenSim.Region.Communications.Local +{ + public class LocalBackEndServices : IGridServices, IInterRegionCommunications + { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + protected Dictionary m_regions = new Dictionary(); + + protected Dictionary m_regionListeners = + new Dictionary(); + + private Dictionary m_remoteRegionInfoCache = new Dictionary(); + + private Dictionary m_queuedGridSettings = new Dictionary(); + + public string _gdebugRegionName = System.String.Empty; + + bool m_bAvailable=true; + + public void CheckRegion(string address, uint port) + { + m_bAvailable = true; + } + + public bool Available + { + get { return m_bAvailable; } + } + + public string gdebugRegionName + { + get { return _gdebugRegionName; } + set { _gdebugRegionName = value; } + } + + public string _rdebugRegionName = System.String.Empty; + + public string rdebugRegionName + { + get { return _rdebugRegionName; } + set { _rdebugRegionName = value; } + } + + public LocalBackEndServices() + { + } + + /// + /// Register a region method with the BackEnd Services. + /// + /// + /// + public RegionCommsListener RegisterRegion(RegionInfo regionInfo) + { + //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering"); + if (!m_regions.ContainsKey(regionInfo.RegionHandle)) + { + //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle ); + m_regions.Add(regionInfo.RegionHandle, regionInfo); + + RegionCommsListener regionHost = new RegionCommsListener(); + if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) + { + m_log.Error("[INTERREGION]: " + + "Error:Region registered twice as an Events listener for Interregion Communications but not as a listed region. " + + "In Standalone mode this will cause BIG issues. In grid mode, it means a region went down and came back up."); + m_regionListeners.Remove(regionInfo.RegionHandle); + } + m_regionListeners.Add(regionInfo.RegionHandle, regionHost); + + return regionHost; + } + else + { + // Already in our list, so the region went dead and restarted. + m_regions.Remove(regionInfo.RegionHandle); + m_log.Warn("[INTERREGION]: Region registered twice. Region went down and came back up."); + + RegionCommsListener regionHost = new RegionCommsListener(); + if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) + { + m_regionListeners.Remove(regionInfo.RegionHandle); + } + m_regionListeners.Add(regionInfo.RegionHandle, regionHost); + + return regionHost; + } + } + + public bool DeregisterRegion(RegionInfo regionInfo) + { + if (m_regions.ContainsKey(regionInfo.RegionHandle)) + { + m_regions.Remove(regionInfo.RegionHandle); + if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) + { + m_regionListeners.Remove(regionInfo.RegionHandle); + } + return true; + } + return false; + } + + /// + /// + /// + /// + public List RequestNeighbours(uint x, uint y) + { + // Console.WriteLine("Finding Neighbours to " + regionInfo.RegionHandle); + List neighbours = new List(); + + foreach (RegionInfo reg in m_regions.Values) + { + // Console.WriteLine("CommsManager- RequestNeighbours() checking region " + reg.RegionLocX + " , "+ reg.RegionLocY); + if (reg.RegionLocX != x || reg.RegionLocY != y) + { + //Console.WriteLine("CommsManager- RequestNeighbours() - found a different region in list, checking location"); + if ((reg.RegionLocX > (x - 2)) && (reg.RegionLocX < (x + 2))) + { + if ((reg.RegionLocY > (y - 2)) && (reg.RegionLocY < (y + 2))) + { + neighbours.Add(reg); + } + } + } + } + return neighbours; + } + + /// + /// + /// + /// + /// + public RegionInfo RequestNeighbourInfo(ulong regionHandle) + { + if (m_regions.ContainsKey(regionHandle)) + { + return m_regions[regionHandle]; + } + return null; + } + + /// + /// + /// + /// + /// + /// + /// + /// + public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) + { + List mapBlocks = new List(); + foreach (RegionInfo regInfo in m_regions.Values) + { + if (((regInfo.RegionLocX >= minX) && (regInfo.RegionLocX <= maxX)) && + ((regInfo.RegionLocY >= minY) && (regInfo.RegionLocY <= maxY))) + { + MapBlockData map = new MapBlockData(); + map.Name = regInfo.RegionName; + map.X = (ushort) regInfo.RegionLocX; + map.Y = (ushort) regInfo.RegionLocY; + map.WaterHeight = (byte) regInfo.EstateSettings.waterHeight; + map.MapImageId = regInfo.EstateSettings.terrainImageID; + map.Agents = 1; + map.RegionFlags = 72458694; + map.Access = 13; + mapBlocks.Add(map); + } + } + return mapBlocks; + } + public bool TellRegionToCloseChildConnection(ulong regionHandle, LLUUID agentID) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + return m_regionListeners[regionHandle].TriggerTellRegionToCloseChildConnection(regionHandle, agentID); + } + return false; + } + + public virtual bool RegionUp(SearializableRegionInfo sregion, ulong regionhandle) + { + RegionInfo region = new RegionInfo(sregion); + if (m_regionListeners.ContainsKey(regionhandle)) + { + return m_regionListeners[regionhandle].TriggerRegionUp(region); + } + + return false; + } + + public virtual bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + // Console.WriteLine("CommsManager- Informing a region to expect child agent"); + m_regionListeners[regionHandle].TriggerChildAgentUpdate(regionHandle, cAgentData); + //m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: Got Listener trigginering local event: " + agentData.firstname + " " + agentData.lastname); + + return true; + } + return false; + } + + // This function Is only here to keep this class in line with the Grid Interface. + // It never gets called. + public virtual Dictionary GetGridSettings() + { + Dictionary returnGridSettings = new Dictionary(); + lock (m_queuedGridSettings) + { + returnGridSettings = m_queuedGridSettings; + m_queuedGridSettings.Clear(); + } + + return returnGridSettings; + } + + public virtual void SetForcefulBanlistsDisallowed(ulong regionHandle) + { + m_queuedGridSettings.Add("allow_forceful_banlines", "FALSE"); + } + + public bool TriggerRegionUp(RegionInfo region, ulong regionhandle) + { + if (m_regionListeners.ContainsKey(regionhandle)) + { + return m_regionListeners[regionhandle].TriggerRegionUp(region); + } + + return false; + } + + public bool TriggerChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + return m_regionListeners[regionHandle].TriggerChildAgentUpdate(regionHandle, cAgentData); + } + return false; + } + + public bool TriggerTellRegionToCloseChildConnection(ulong regionHandle, LLUUID agentID) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + return m_regionListeners[regionHandle].TriggerTellRegionToCloseChildConnection(regionHandle, agentID); + } + return false; + } + /// + /// + /// + /// + /// + /// + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) + //should change from agentCircuitData + { + //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent"); + //m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: Trying to inform region of child agent: " + agentData.firstname + " " + agentData.lastname); + + if (m_regionListeners.ContainsKey(regionHandle)) + { + // Console.WriteLine("CommsManager- Informing a region to expect child agent"); + m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agentData); + //m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: Got Listener trigginering local event: " + agentData.firstname + " " + agentData.lastname); + + return true; + } + return false; + } + + public bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + m_regionListeners[regionHandle].TriggerExpectPrim(regionHandle, primID, objData); + return true; + } + return false; + } + + /// + /// + /// + /// + /// + /// + /// + public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + // Console.WriteLine("CommsManager- Informing a region to expect avatar crossing"); + m_regionListeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position, isFlying); + return true; + } + return false; + } + + public bool ExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + m_regionListeners[regionHandle].TriggerExpectPrimCrossing(regionHandle, primID, position, isPhysical); + return true; + } + return false; + } + + + + public bool AcknowledgeAgentCrossed(ulong regionHandle, LLUUID agentId) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + return true; + } + return false; + } + + public bool AcknowledgePrimCrossed(ulong regionHandle, LLUUID primID) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + return true; + } + return false; + } + + /// + /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session + /// + /// + /// + /// + public void AddNewSession(ulong regionHandle, Login loginData) + { + AgentCircuitData agent = new AgentCircuitData(); + agent.AgentID = loginData.Agent; + agent.firstname = loginData.First; + agent.lastname = loginData.Last; + agent.SessionID = loginData.Session; + agent.SecureSessionID = loginData.SecureSession; + agent.circuitcode = loginData.CircuitCode; + agent.BaseFolder = loginData.BaseFolder; + agent.InventoryFolder = loginData.InventoryFolder; + agent.startpos = loginData.StartPos; + + agent.ClientVersion = loginData.ClientVersion; //rex + + agent.CapsPath = loginData.CapsPath; + + agent.authenticationAddr = loginData.AuthAddr; + agent.asAddress = loginData.asAddress; + + TriggerExpectUser(regionHandle, agent); + } + + public void TriggerExpectUser(ulong regionHandle, AgentCircuitData agent) + { + //m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: Other region is sending child agent our way: " + agent.firstname + " " + agent.lastname); + + if (m_regionListeners.ContainsKey(regionHandle)) + { + //m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: FoundLocalRegion To send it to: " + agent.firstname + " " + agent.lastname); + + m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agent); + } + } + + public void TriggerExpectPrim(ulong regionHandle, LLUUID primID, string objData) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + m_regionListeners[regionHandle].TriggerExpectPrim(regionHandle, primID, objData); + } + } + + public void PingCheckReply(Hashtable respData) + { + foreach (ulong region in m_regions.Keys) + { + Hashtable regData = new Hashtable(); + RegionInfo reg = m_regions[region]; + regData["status"] = "active"; + regData["handle"] = region.ToString(); + + respData[reg.RegionID.ToString()] = regData; + } + } + + public bool TriggerExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + return m_regionListeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position, + isFlying); + } + + return false; + } + + public bool TriggerExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) + { + if (m_regionListeners.ContainsKey(regionHandle)) + { + return + m_regionListeners[regionHandle].TriggerExpectPrimCrossing(regionHandle, primID, position, isPhysical); + } + return false; + } + + public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + // m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: Other local region is sending child agent our way: " + agentData.firstname + " " + agentData.lastname); + + if (m_regionListeners.ContainsKey(regionHandle)) + { + //m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: found local region to trigger event on: " + agentData.firstname + " " + agentData.lastname); + + TriggerExpectUser(regionHandle, agentData); + return true; + } + + return false; + } + } +} diff --git a/OpenSim/Region/Communications/Local/LocalInventoryService.cs b/OpenSim/Region/Communications/Local/LocalInventoryService.cs index 4542950030..9fc836f522 100644 --- a/OpenSim/Region/Communications/Local/LocalInventoryService.cs +++ b/OpenSim/Region/Communications/Local/LocalInventoryService.cs @@ -1,107 +1,142 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* 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 -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -using System.Collections.Generic; -using libsecondlife; -using OpenSim.Framework; -using OpenSim.Framework.Communications; -using OpenSim.Framework.Communications.Cache; - -namespace OpenSim.Region.Communications.Local -{ - public class LocalInventoryService : InventoryServiceBase - { - public override void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, - InventoryItemInfo itemCallBack) - { - List folders = RequestFirstLevelFolders(userID); - InventoryFolderImpl rootFolder = null; - - //need to make sure we send root folder first - foreach (InventoryFolderBase folder in folders) - { - if (folder.parentID == LLUUID.Zero) - { - rootFolder = RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); - } - } - - if (rootFolder != null) - { - foreach (InventoryFolderBase folder in folders) - { - if (folder.folderID != rootFolder.folderID) - { - RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); - } - } - } - } - - public override void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder) - { - AddFolder(folder); - } - - public override void MoveExistingInventoryFolder(InventoryFolderBase folder) - { - MoveFolder(folder); - } - - public override void AddNewInventoryItem(LLUUID userID, InventoryItemBase item) - { - AddItem(item); - } - - public override void DeleteInventoryItem(LLUUID userID, InventoryItemBase item) - { - DeleteItem(item); - } - - /// - /// Send the given inventory folder and its item contents back to the requester. - /// - /// - /// - private InventoryFolderImpl RequestInventoryFolder(LLUUID userID, InventoryFolderBase folder, - InventoryFolderInfo folderCallBack, - InventoryItemInfo itemCallBack) - { - InventoryFolderImpl newFolder = new InventoryFolderImpl(folder); - folderCallBack(userID, newFolder); - - List items = RequestFolderItems(newFolder.folderID); - foreach (InventoryItemBase item in items) - { - itemCallBack(userID, item); - } - - return newFolder; - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* 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 +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System.Collections.Generic; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Communications.Cache; + +namespace OpenSim.Region.Communications.Local +{ + /// + /// An implementation of user inventory where the inventory is held locally (e.g. when OpenSim is + /// operating in standalone mode. + /// + public class LocalInventoryService : InventoryServiceBase + { + public override void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, + InventoryItemInfo itemCallBack) + { + List folders = RequestFirstLevelFolders(userID); + InventoryFolderImpl rootFolder = null; + + //need to make sure we send root folder first + foreach (InventoryFolderBase folder in folders) + { + if (folder.parentID == LLUUID.Zero) + { + rootFolder = RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); + } + } + + if (rootFolder != null) + { + foreach (InventoryFolderBase folder in folders) + { + if (folder.folderID != rootFolder.folderID) + { + RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); + } + } + } + } + + public override void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder) + { + AddFolder(folder); + } + + public override void MoveExistingInventoryFolder(InventoryFolderBase folder) + { + MoveFolder(folder); + } + + public override void AddNewInventoryItem(LLUUID userID, InventoryItemBase item) + { + AddItem(item); + } + + public override void DeleteInventoryItem(LLUUID userID, InventoryItemBase item) + { + DeleteItem(item); + } + + public override bool HasInventoryForUser(LLUUID userID) + { + InventoryFolderBase root = RequestUsersRoot(userID); + if (root == null) + { + return false; + } + else + { + return true; + } + } + + public override InventoryFolderBase RequestNamedFolder(LLUUID userID, string folderName) + { + List folders = RequestFirstLevelFolders(userID); + InventoryFolderBase requestedFolder = null; + + //need to make sure we send root folder first + foreach (InventoryFolderBase folder in folders) + { + if (folder.name == folderName) + { + requestedFolder = folder; + break; + } + } + + return requestedFolder; + } + + /// + /// Send the given inventory folder and its item contents back to the requester. + /// + /// + /// + private InventoryFolderImpl RequestInventoryFolder(LLUUID userID, InventoryFolderBase folder, + InventoryFolderInfo folderCallBack, + InventoryItemInfo itemCallBack) + { + InventoryFolderImpl newFolder = new InventoryFolderImpl(folder); + folderCallBack(userID, newFolder); + + List items = RequestFolderItems(newFolder.folderID); + foreach (InventoryItemBase item in items) + { + itemCallBack(userID, item); + } + + return newFolder; + } + } +} diff --git a/OpenSim/Region/Communications/Local/LocalLoginService.cs b/OpenSim/Region/Communications/Local/LocalLoginService.cs index a54ead481b..3955c28235 100644 --- a/OpenSim/Region/Communications/Local/LocalLoginService.cs +++ b/OpenSim/Region/Communications/Local/LocalLoginService.cs @@ -1,261 +1,274 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* 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 -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -using System; -using System.Collections; -using System.Collections.Generic; -using libsecondlife; - -using OpenSim.Framework; -using OpenSim.Framework.Communications.Cache; -using OpenSim.Framework.Console; -using OpenSim.Framework.UserManagement; -using InventoryFolder=OpenSim.Framework.InventoryFolder; - -namespace OpenSim.Region.Communications.Local -{ - public delegate void LoginToRegionEvent(ulong regionHandle, Login login); - - public class LocalLoginService : LoginService - { - private CommunicationsLocal m_Parent; - - private NetworkServersInfo serversInfo; - private uint defaultHomeX; - private uint defaultHomeY; - private bool authUsers = false; - - public event LoginToRegionEvent OnLoginToRegion; - - public LocalLoginService(UserManagerBase userManager, string welcomeMess, CommunicationsLocal parent, - NetworkServersInfo serversInfo, bool authenticate, bool rexMode) - : base(userManager, parent.UserProfileCacheService.libraryRoot, welcomeMess, rexMode) - { - m_Parent = parent; - this.serversInfo = serversInfo; - defaultHomeX = this.serversInfo.DefaultHomeLocX; - defaultHomeY = this.serversInfo.DefaultHomeLocY; - authUsers = authenticate; - } - - - public override UserProfileData GetTheUser(string firstname, string lastname, string authAddr) - { - UserProfileData profile = m_userManager.GetUserProfile(firstname, lastname, authAddr); - if (profile != null) - { - return profile; - } - - if (!authUsers) - { - //no current user account so make one - MainLog.Instance.Notice("LOGIN", "No user account found so creating a new one."); - - m_userManager.AddUserProfile(firstname, lastname, "test", defaultHomeX, defaultHomeY); - - profile = m_userManager.GetUserProfile(firstname, lastname, ""); - if (profile != null) - { - m_Parent.InventoryService.CreateNewUserInventory(profile.UUID); - } - - return profile; - } - return null; - } - - public override bool AuthenticateUser(UserProfileData profile, string password) - { - if (!authUsers) - { - //for now we will accept any password in sandbox mode - MainLog.Instance.Notice("LOGIN", "Authorising user (no actual password check)"); - - return true; - } - else - { - MainLog.Instance.Notice( - "LOGIN", "Authenticating " + profile.username + " " + profile.surname); - - password = password.Remove(0, 3); //remove $1$ - - string s = Util.Md5Hash(password + ":" + profile.passwordSalt); - - return profile.passwordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase); - } - } - - public override void CustomiseResponse(LoginResponse response, UserProfileData theUser, string ASaddress) - { - ulong currentRegion = theUser.currentAgent.currentHandle; - RegionInfo reg = m_Parent.GridService.RequestNeighbourInfo(currentRegion); - - if (reg != null) - { - // rex, start - LLVector3 StartLoc,StartLookAt; - bool bCustomStartLoc = true; - if (!RexScriptAccess.GetAvatarStartLocation(out StartLoc, out StartLookAt)) - { - StartLoc = theUser.homeLocation; - StartLookAt = theUser.homeLocation; - bCustomStartLoc = false; - } - - response.Home = "{'region_handle':[r" + (reg.RegionLocX*256).ToString() + ",r" + - (reg.RegionLocY*256).ToString() + "], " + - "'position':[r" + StartLoc.X.ToString() + ",r" + - StartLoc.Y.ToString() + ",r" + StartLoc.Z.ToString() + "], " + - "'look_at':[r" + StartLoc.X.ToString() + ",r" + - StartLoc.Y.ToString() + ",r" + StartLoc.Z.ToString() + "]}"; // rex end - string capsPath = Util.GetRandomCapsPath(); - response.SimAddress = reg.ExternalEndPoint.Address.ToString(); - response.SimPort = (uint) reg.ExternalEndPoint.Port; - response.RegionX = reg.RegionLocX; - response.RegionY = reg.RegionLocY; - - response.SeedCapability = "http://" + reg.ExternalHostName + ":" + - serversInfo.HttpListenerPort.ToString() + "/CAPS/" + capsPath + "0000/"; - // response.SeedCapability = "http://" + reg.ExternalHostName + ":" + this.serversInfo.HttpListenerPort.ToString() + "/CapsSeed/" + capsPath + "0000/"; - theUser.currentAgent.currentRegion = reg.RegionID; - theUser.currentAgent.currentHandle = reg.RegionHandle; - - LoginResponse.BuddyList buddyList = new LoginResponse.BuddyList(); - - response.BuddList = ConvertFriendListItem(m_userManager.GetUserFriendList(theUser.UUID)); - - Login _login = new Login(); - //copy data to login object - _login.First = response.Firstname; - _login.Last = response.Lastname; - _login.Agent = response.AgentID; - _login.Session = response.SessionID; - _login.SecureSession = response.SecureSessionID; - _login.CircuitCode = (uint) response.CircuitCode; - if(bCustomStartLoc) // rex - _login.StartPos = StartLoc; - else - _login.StartPos = theUser.currentAgent.currentPos; - _login.CapsPath = capsPath; - - _login.ClientVersion = response.ClientVersion; //rex - if (m_rexMode) - { - _login.AuthAddr = theUser.authenticationAddr; - _login.asAddress = ASaddress; - } - - if (OnLoginToRegion != null) - { - OnLoginToRegion(currentRegion, _login); - } - } - else - { - MainLog.Instance.Warn("LOGIN", "Not found region " + currentRegion); - } - } - private LoginResponse.BuddyList ConvertFriendListItem(List LFL) - { - LoginResponse.BuddyList buddylistreturn = new LoginResponse.BuddyList(); - foreach (FriendListItem fl in LFL) - { - LoginResponse.BuddyList.BuddyInfo buddyitem = new LoginResponse.BuddyList.BuddyInfo(fl.Friend); - buddyitem.BuddyID = fl.Friend; - buddyitem.BuddyRightsHave = (int)fl.FriendListOwnerPerms; - buddyitem.BuddyRightsGiven = (int)fl.FriendPerms; - buddylistreturn.AddNewBuddy(buddyitem); - - } - return buddylistreturn; - } - protected override InventoryData CreateInventoryData(LLUUID userID) - { - List folders = m_Parent.InventoryService.RequestFirstLevelFolders(userID); - if (folders.Count > 0) - { - return GetInventoryData(folders); - } - else { - if (!m_rexMode) - { - AgentInventory userInventory = new AgentInventory(); - userInventory.CreateRootFolder(userID, false); - - ArrayList AgentInventoryArray = new ArrayList(); - Hashtable TempHash; - foreach (InventoryFolder InvFolder in userInventory.InventoryFolders.Values) - { - TempHash = new Hashtable(); - TempHash["name"] = InvFolder.FolderName; - TempHash["parent_id"] = InvFolder.ParentID.ToString(); - TempHash["version"] = (Int32) InvFolder.Version; - TempHash["type_default"] = (Int32) InvFolder.DefaultType; - TempHash["folder_id"] = InvFolder.FolderID.ToString(); - AgentInventoryArray.Add(TempHash); - } - - return new InventoryData(AgentInventoryArray, userInventory.InventoryRoot.FolderID); - } - else { // in rex mode users are created at the authentication server and folders must be created at - // first login to db - m_Parent.InventoryService.CreateNewUserInventory(userID); - - folders = m_Parent.InventoryService.RequestFirstLevelFolders(userID); - return GetInventoryData(folders); - } - - - } - } - - private InventoryData GetInventoryData(List folders) - { - LLUUID rootID = LLUUID.Zero; - ArrayList AgentInventoryArray = new ArrayList(); - Hashtable TempHash; - foreach (InventoryFolderBase InvFolder in folders) - { - if (InvFolder.parentID == LLUUID.Zero) - { - rootID = InvFolder.folderID; - } - TempHash = new Hashtable(); - TempHash["name"] = InvFolder.name; - TempHash["parent_id"] = InvFolder.parentID.ToString(); - TempHash["version"] = (Int32)InvFolder.version; - TempHash["type_default"] = (Int32)InvFolder.type; - TempHash["folder_id"] = InvFolder.folderID.ToString(); - AgentInventoryArray.Add(TempHash); - } - return new InventoryData(AgentInventoryArray, rootID); - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* 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 +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using libsecondlife; + +using OpenSim.Framework; +using OpenSim.Framework.Communications.Cache; +using OpenSim.Framework.Console; +using OpenSim.Framework.Statistics; +using OpenSim.Framework.UserManagement; +using InventoryFolder=OpenSim.Framework.InventoryFolder; + +namespace OpenSim.Region.Communications.Local +{ + public delegate void LoginToRegionEvent(ulong regionHandle, Login login); + + public class LocalLoginService : LoginService + { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + private CommunicationsLocal m_Parent; + + private NetworkServersInfo serversInfo; + private uint defaultHomeX; + private uint defaultHomeY; + private bool authUsers = false; + + public event LoginToRegionEvent OnLoginToRegion; + + private LoginToRegionEvent handler001 = null; // OnLoginToRegion; + + public LocalLoginService(UserManagerBase userManager, string welcomeMess, + CommunicationsLocal parent, NetworkServersInfo serversInfo, + bool authenticate) + : base(userManager, parent.UserProfileCacheService.libraryRoot, welcomeMess) + { + m_Parent = parent; + this.serversInfo = serversInfo; + defaultHomeX = this.serversInfo.DefaultHomeLocX; + defaultHomeY = this.serversInfo.DefaultHomeLocY; + authUsers = authenticate; + } + + + public override UserProfileData GetTheUser(string firstname, string lastname, string authAddr) + { + UserProfileData profile = m_userManager.GetUserProfile(firstname, lastname, authAddr); + if (profile != null) + { + return profile; + } + + if (!authUsers) + { + //no current user account so make one + m_log.Info("[LOGIN]: No user account found so creating a new one."); + + m_userManager.AddUserProfile(firstname, lastname, "test", defaultHomeX, defaultHomeY); + + profile = m_userManager.GetUserProfile(firstname, lastname, ""); + if (profile != null) + { + m_Parent.InventoryService.CreateNewUserInventory(profile.UUID); + } + + return profile; + } + return null; + } + + public override bool AuthenticateUser(UserProfileData profile, string password) + { + if (!authUsers) + { + //for now we will accept any password in sandbox mode + m_log.Info("[LOGIN]: Authorising user (no actual password check)"); + + return true; + } + else + { + m_log.Info( + "[LOGIN]: Authenticating " + profile.username + " " + profile.surname); + + if (!password.StartsWith("$1$")) + password = "$1$" + Util.Md5Hash(password); + + password = password.Remove(0, 3); //remove $1$ + + string s = Util.Md5Hash(password + ":" + profile.passwordSalt); + + bool loginresult = (profile.passwordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase) + || profile.passwordHash.Equals(password, StringComparison.InvariantCultureIgnoreCase)); + return loginresult; + } + } + + public override void CustomiseResponse(LoginResponse response, UserProfileData theUser, string ASaddress) + { + ulong currentRegion = theUser.currentAgent.currentHandle; + RegionInfo reg = m_Parent.GridService.RequestNeighbourInfo(currentRegion); + + if (reg != null) + { + // rex, start + LLVector3 StartLoc,StartLookAt; + bool bCustomStartLoc = true; + if (!RexScriptAccess.GetAvatarStartLocation(out StartLoc, out StartLookAt)) + { + StartLoc = theUser.homeLocation; + StartLookAt = theUser.homeLocation; + bCustomStartLoc = false; + } + + response.Home = "{'region_handle':[r" + (reg.RegionLocX*256).ToString() + ",r" + + (reg.RegionLocY*256).ToString() + "], " + + "'position':[r" + StartLoc.X.ToString() + ",r" + + StartLoc.Y.ToString() + ",r" + StartLoc.Z.ToString() + "], " + + "'look_at':[r" + StartLoc.X.ToString() + ",r" + + StartLoc.Y.ToString() + ",r" + StartLoc.Z.ToString() + "]}"; // rex end + string capsPath = Util.GetRandomCapsPath(); + response.SimAddress = reg.ExternalEndPoint.Address.ToString(); + response.SimPort = (uint) reg.ExternalEndPoint.Port; + response.RegionX = reg.RegionLocX; + response.RegionY = reg.RegionLocY ; + + response.SeedCapability = "http://" + reg.ExternalHostName + ":" + + serversInfo.HttpListenerPort.ToString() + "/CAPS/" + capsPath + "0000/"; + // response.SeedCapability = "http://" + reg.ExternalHostName + ":" + this.serversInfo.HttpListenerPort.ToString() + "/CapsSeed/" + capsPath + "0000/"; + theUser.currentAgent.currentRegion = reg.RegionID; + theUser.currentAgent.currentHandle = reg.RegionHandle; + + LoginResponse.BuddyList buddyList = new LoginResponse.BuddyList(); + + response.BuddList = ConvertFriendListItem(m_userManager.GetUserFriendList(theUser.UUID)); + + Login _login = new Login(); + //copy data to login object + _login.First = response.Firstname; + _login.Last = response.Lastname; + _login.Agent = response.AgentID; + _login.Session = response.SessionID; + _login.SecureSession = response.SecureSessionID; + _login.CircuitCode = (uint) response.CircuitCode; + if(bCustomStartLoc) // rex + _login.StartPos = StartLoc; + else + _login.StartPos = theUser.currentAgent.currentPos; + _login.CapsPath = capsPath; + + _login.ClientVersion = response.ClientVersion; //rex + if (m_rexMode) + { + _login.AuthAddr = theUser.authenticationAddr; + _login.asAddress = ASaddress; + } + + if (OnLoginToRegion != null) + handler001 = OnLoginToRegion; + if (handler001 != null) + { + handler001(currentRegion, _login); + } + } + else + { + m_log.Warn("[LOGIN]: Not found region " + currentRegion); + } + } + private LoginResponse.BuddyList ConvertFriendListItem(List LFL) + { + LoginResponse.BuddyList buddylistreturn = new LoginResponse.BuddyList(); + foreach (FriendListItem fl in LFL) + { + LoginResponse.BuddyList.BuddyInfo buddyitem = new LoginResponse.BuddyList.BuddyInfo(fl.Friend); + buddyitem.BuddyID = fl.Friend; + buddyitem.BuddyRightsHave = (int)fl.FriendListOwnerPerms; + buddyitem.BuddyRightsGiven = (int)fl.FriendPerms; + buddylistreturn.AddNewBuddy(buddyitem); + + } + return buddylistreturn; + } + protected override InventoryData CreateInventoryData(LLUUID userID) + { + List folders = m_Parent.InventoryService.RequestFirstLevelFolders(userID); + if (folders.Count > 0) + { + return GetInventoryData(folders); + } + else { + if (!m_rexMode) + { + AgentInventory userInventory = new AgentInventory(); + userInventory.CreateRootFolder(userID, false); + + ArrayList AgentInventoryArray = new ArrayList(); + Hashtable TempHash; + foreach (InventoryFolder InvFolder in userInventory.InventoryFolders.Values) + { + TempHash = new Hashtable(); + TempHash["name"] = InvFolder.FolderName; + TempHash["parent_id"] = InvFolder.ParentID.ToString(); + TempHash["version"] = (Int32) InvFolder.Version; + TempHash["type_default"] = (Int32) InvFolder.DefaultType; + TempHash["folder_id"] = InvFolder.FolderID.ToString(); + AgentInventoryArray.Add(TempHash); + } + + return new InventoryData(AgentInventoryArray, userInventory.InventoryRoot.FolderID); + } + else { // in rex mode users are created at the authentication server and folders must be created at + // first login to db + m_Parent.InventoryService.CreateNewUserInventory(userID); + + folders = m_Parent.InventoryService.RequestFirstLevelFolders(userID); + return GetInventoryData(folders); + } + + + } + } + + private InventoryData GetInventoryData(List folders) + { + LLUUID rootID = LLUUID.Zero; + ArrayList AgentInventoryArray = new ArrayList(); + Hashtable TempHash; + foreach (InventoryFolderBase InvFolder in folders) + { + if (InvFolder.parentID == LLUUID.Zero) + { + rootID = InvFolder.folderID; + } + TempHash = new Hashtable(); + TempHash["name"] = InvFolder.name; + TempHash["parent_id"] = InvFolder.parentID.ToString(); + TempHash["version"] = (Int32)InvFolder.version; + TempHash["type_default"] = (Int32)InvFolder.type; + TempHash["folder_id"] = InvFolder.folderID.ToString(); + AgentInventoryArray.Add(TempHash); + } + return new InventoryData(AgentInventoryArray, rootID); + } + } +} diff --git a/OpenSim/Region/Communications/Local/LocalUserServices.cs b/OpenSim/Region/Communications/Local/LocalUserServices.cs index 65246a674d..ac2881c98b 100644 --- a/OpenSim/Region/Communications/Local/LocalUserServices.cs +++ b/OpenSim/Region/Communications/Local/LocalUserServices.cs @@ -1,96 +1,105 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* 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 -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -using System; -using libsecondlife; -using OpenSim.Framework; -using OpenSim.Framework.Communications; -using OpenSim.Framework.UserManagement; - -namespace OpenSim.Region.Communications.Local -{ - public class LocalUserServices : UserManagerBase - { - private readonly NetworkServersInfo m_serversInfo; - private readonly uint m_defaultHomeX; - private readonly uint m_defaultHomeY; - private IInventoryServices m_inventoryService; - - - public LocalUserServices(NetworkServersInfo serversInfo, uint defaultHomeLocX, uint defaultHomeLocY, - IInventoryServices inventoryService) - { - m_serversInfo = serversInfo; - - m_defaultHomeX = defaultHomeLocX; - m_defaultHomeY = defaultHomeLocY; - - m_inventoryService = inventoryService; - } - - public override UserProfileData SetupMasterUser(string firstName, string lastName) - { - return SetupMasterUser(firstName, lastName, ""); - } - - public override UserProfileData SetupMasterUser(string firstName, string lastName, string password) - { - UserProfileData profile = GetUserProfile(firstName, lastName, ""); - if (profile != null) - { - return profile; - } - - Console.WriteLine("Unknown Master User. Sandbox Mode: Creating Account"); - AddUserProfile(firstName, lastName, password, m_defaultHomeX, m_defaultHomeY); - - profile = GetUserProfile(firstName, lastName, ""); - - if (profile == null) - { - Console.WriteLine("Unknown Master User after creation attempt. No clue what to do here."); - } - else - { - m_inventoryService.CreateNewUserInventory(profile.UUID); - } - - return profile; - } - - public override UserProfileData SetupMasterUser(LLUUID uuid) - { - UserProfileData data = GetUserProfile(uuid, ""); - if (data == null) - { - throw new Exception("Unknown master user UUID"); - } - return data; - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* 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 +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Statistics; +using OpenSim.Framework.UserManagement; + +namespace OpenSim.Region.Communications.Local +{ + public class LocalUserServices : UserManagerBase + { + private readonly NetworkServersInfo m_serversInfo; + private readonly uint m_defaultHomeX; + private readonly uint m_defaultHomeY; + private IInventoryServices m_inventoryService; + + + /// + /// + /// + /// + /// + /// + /// + /// Can be null if stats collection is not required. + public LocalUserServices(NetworkServersInfo serversInfo, uint defaultHomeLocX, uint defaultHomeLocY, + IInventoryServices inventoryService) + { + m_serversInfo = serversInfo; + + m_defaultHomeX = defaultHomeLocX; + m_defaultHomeY = defaultHomeLocY; + + m_inventoryService = inventoryService; + } + + public override UserProfileData SetupMasterUser(string firstName, string lastName) + { + return SetupMasterUser(firstName, lastName, String.Empty); + } + + public override UserProfileData SetupMasterUser(string firstName, string lastName, string password) + { + UserProfileData profile = GetUserProfile(firstName, lastName, ""); + if (profile != null) + { + return profile; + } + + Console.WriteLine("Unknown Master User. Sandbox Mode: Creating Account"); + AddUserProfile(firstName, lastName, password, m_defaultHomeX, m_defaultHomeY); + + profile = GetUserProfile(firstName, lastName, ""); + + if (profile == null) + { + Console.WriteLine("Unknown Master User after creation attempt. No clue what to do here."); + } + else + { + m_inventoryService.CreateNewUserInventory(profile.UUID); + } + + return profile; + } + + public override UserProfileData SetupMasterUser(LLUUID uuid) + { + UserProfileData data = GetUserProfile(uuid, ""); + if (data == null) + { + throw new Exception("Unknown master user UUID. Possible reason: UserServer is not running."); + } + return data; + } + } +} diff --git a/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs index 3b68ef7a3c..ab67ebaa0f 100644 --- a/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs +++ b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs @@ -1,38 +1,66 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly : AssemblyTitle("OpenSim.Region.Communications.Local")] -[assembly : AssemblyDescription("")] -[assembly : AssemblyConfiguration("")] -[assembly : AssemblyCompany("")] -[assembly : AssemblyProduct("OpenSim.Region.Communications.Local")] -[assembly : AssemblyCopyright("Copyright © 2007")] -[assembly : AssemblyTrademark("")] -[assembly : AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly : ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly : Guid("fb173926-bd0a-4cd0-bb45-185b2f72ddfb")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly : AssemblyVersion("1.0.0.0")] -[assembly : AssemblyFileVersion("1.0.0.0")] \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* 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 +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly : AssemblyTitle("OpenSim.Region.Communications.Local")] +[assembly : AssemblyDescription("")] +[assembly : AssemblyConfiguration("")] +[assembly : AssemblyCompany("")] +[assembly : AssemblyProduct("OpenSim.Region.Communications.Local")] +[assembly : AssemblyCopyright("Copyright © OpenSimulator.org Developers 2007-2008")] +[assembly : AssemblyTrademark("")] +[assembly : AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly : ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly : Guid("fb173926-bd0a-4cd0-bb45-185b2f72ddfb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly : AssemblyVersion("1.0.0.0")] +[assembly : AssemblyFileVersion("1.0.0.0")]