From f276ba57bf5bd732fbc6a255213c9bb7f5f5f148 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 17 Jan 2010 11:33:47 -0800 Subject: HG agent transfers are starting to work. Gatekeeper handlers are missing. --- .../Hypergrid/HypergridServiceConnector.cs | 7 +++- .../Services/HypergridService/GatekeeperService.cs | 34 ++++++++++++++- .../Services/HypergridService/HypergridService.cs | 8 ++-- OpenSim/Services/Interfaces/IHypergridService.cs | 2 +- OpenSim/Services/LLLoginService/LLLoginService.cs | 49 +++++++++++++++------- 5 files changed, 80 insertions(+), 20 deletions(-) (limited to 'OpenSim/Services') diff --git a/OpenSim/Services/Connectors/Hypergrid/HypergridServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HypergridServiceConnector.cs index 0bb1c0e..953c7bd 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HypergridServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HypergridServiceConnector.cs @@ -50,6 +50,8 @@ namespace OpenSim.Services.Connectors.Hypergrid private IAssetService m_AssetService; + public HypergridServiceConnector() : this(null) { } + public HypergridServiceConnector(IAssetService assService) { m_AssetService = assService; @@ -197,21 +199,24 @@ namespace OpenSim.Services.Connectors.Hypergrid GridRegion region = new GridRegion(); UUID.TryParse((string)hash["uuid"], out region.RegionID); - //m_log.Debug(">> HERE, uuid: " + uuid); + //m_log.Debug(">> HERE, uuid: " + region.RegionID); int n = 0; if (hash["x"] != null) { Int32.TryParse((string)hash["x"], out n); region.RegionLocX = n; + //m_log.Debug(">> HERE, x: " + region.RegionLocX); } if (hash["y"] != null) { Int32.TryParse((string)hash["y"], out n); region.RegionLocY = n; + //m_log.Debug(">> HERE, y: " + region.RegionLocY); } if (hash["region_name"] != null) { region.RegionName = (string)hash["region_name"]; + //m_log.Debug(">> HERE, name: " + region.RegionName); } if (hash["hostname"] != null) region.ExternalHostName = (string)hash["hostname"]; diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index ec7ef1d..a5bd881 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -112,6 +112,10 @@ namespace OpenSim.Services.HypergridService m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to link to {0}", regionName); if (!m_AllowTeleportsToAnyRegion) { + List defs = m_GridService.GetDefaultRegions(m_ScopeID); + if (defs != null && defs.Count > 0) + m_DefaultGatewayRegion = defs[0]; + try { regionID = m_DefaultGatewayRegion.RegionID; @@ -150,6 +154,8 @@ namespace OpenSim.Services.HypergridService public GridRegion GetHyperlinkRegion(UUID regionID) { + m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to get hyperlink region {0}", regionID); + if (!m_AllowTeleportsToAnyRegion) // Don't even check the given regionID return m_DefaultGatewayRegion; @@ -160,23 +166,43 @@ namespace OpenSim.Services.HypergridService public bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination) { + string authURL = string.Empty; + if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) + authURL = aCircuit.ServiceURLs["HomeURI"].ToString(); + + m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to login foreign agent {0} {1} @ {2} ({3}) at destination {4}", + aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName); + if (!Authenticate(aCircuit)) + { + m_log.InfoFormat("[GATEKEEPER SERVICE]: Unable to verify identity of agent {0} {1}. Refusing service.", aCircuit.firstname, aCircuit.lastname); return false; + } // Check to see if we have a local user with that UUID UserAccount account = m_UserAccountService.GetUserAccount(m_ScopeID, aCircuit.AgentID); if (account != null) + { // No, sorry; go away + m_log.InfoFormat("[GATEKEEPER SERVICE]: Foreign agent {0} {1} has UUID of local user {3}. Refusing service.", + aCircuit.firstname, aCircuit.lastname, aCircuit.AgentID); return false; + } // May want to authorize // Login the presence if (!m_PresenceService.LoginAgent(aCircuit.AgentID.ToString(), aCircuit.SessionID, aCircuit.SecureSessionID)) + { + m_log.InfoFormat("[GATEKEEPER SERVICE]: Presence login failed for foreign agent {0} {1}. Refusing service.", + aCircuit.firstname, aCircuit.lastname); return false; + } // Finally launch the agent at the destination string reason = string.Empty; + aCircuit.firstname = aCircuit.firstname + "." + aCircuit.lastname; + aCircuit.lastname = "@" + aCircuit.ServiceURLs["HomeURI"].ToString(); return m_SimulationService.CreateAgent(destination, aCircuit, 0, out reason); } @@ -188,9 +214,15 @@ namespace OpenSim.Services.HypergridService protected bool Authenticate(AgentCircuitData aCircuit) { - string authURL = string.Empty; // GetAuthURL(aCircuit); + string authURL = string.Empty; + if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) + authURL = aCircuit.ServiceURLs["HomeURI"].ToString(); + if (authURL == string.Empty) + { + m_log.DebugFormat("[GATEKEEPER SERVICE]: Agent did not provide an authentication server URL"); return false; + } Object[] args = new Object[] { authURL }; IAuthenticationService authService = ServerUtils.LoadPlugin(m_AuthDll, args); diff --git a/OpenSim/Services/HypergridService/HypergridService.cs b/OpenSim/Services/HypergridService/HypergridService.cs index 747b98a..734931d 100644 --- a/OpenSim/Services/HypergridService/HypergridService.cs +++ b/OpenSim/Services/HypergridService/HypergridService.cs @@ -347,10 +347,12 @@ namespace OpenSim.Services.HypergridService #region Get Hyperlinks - public GridRegion GetHyperlinkRegion(UUID regionID) + public GridRegion GetHyperlinkRegion(GridRegion gatekeeper, UUID regionID) { - //GridRegion region = m_HypergridConnector. - return null; + if (m_HyperlinkRegions.ContainsKey(regionID)) + return m_HypergridConnector.GetHyperlinkRegion(gatekeeper, regionID); + else + return gatekeeper; } #endregion diff --git a/OpenSim/Services/Interfaces/IHypergridService.cs b/OpenSim/Services/Interfaces/IHypergridService.cs index b49657a..f2a1983 100644 --- a/OpenSim/Services/Interfaces/IHypergridService.cs +++ b/OpenSim/Services/Interfaces/IHypergridService.cs @@ -36,7 +36,7 @@ namespace OpenSim.Services.Interfaces public interface IHypergridService { bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string imageURL, out string reason); - GridRegion GetHyperlinkRegion(UUID regionID); + GridRegion GetHyperlinkRegion(GridRegion gateway, UUID regionID); GridRegion GetRegionByUUID(UUID regionID); GridRegion GetRegionByPosition(int x, int y); diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 6f92388..d4f89d9 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -37,24 +37,26 @@ namespace OpenSim.Services.LLLoginService private bool m_RequireInventory; private int m_MinLoginLevel; + IConfig m_LoginServerConfig; + public LLLoginService(IConfigSource config, ISimulationService simService, ILibraryService libraryService) { - IConfig serverConfig = config.Configs["LoginService"]; - if (serverConfig == null) + m_LoginServerConfig = config.Configs["LoginService"]; + if (m_LoginServerConfig == null) throw new Exception(String.Format("No section LoginService in config file")); - string accountService = serverConfig.GetString("UserAccountService", String.Empty); - string authService = serverConfig.GetString("AuthenticationService", String.Empty); - string invService = serverConfig.GetString("InventoryService", String.Empty); - string gridService = serverConfig.GetString("GridService", String.Empty); - string presenceService = serverConfig.GetString("PresenceService", String.Empty); - string libService = serverConfig.GetString("LibraryService", String.Empty); - string avatarService = serverConfig.GetString("AvatarService", String.Empty); - string simulationService = serverConfig.GetString("SimulationService", String.Empty); + string accountService = m_LoginServerConfig.GetString("UserAccountService", String.Empty); + string authService = m_LoginServerConfig.GetString("AuthenticationService", String.Empty); + string invService = m_LoginServerConfig.GetString("InventoryService", String.Empty); + string gridService = m_LoginServerConfig.GetString("GridService", String.Empty); + string presenceService = m_LoginServerConfig.GetString("PresenceService", String.Empty); + string libService = m_LoginServerConfig.GetString("LibraryService", String.Empty); + string avatarService = m_LoginServerConfig.GetString("AvatarService", String.Empty); + string simulationService = m_LoginServerConfig.GetString("SimulationService", String.Empty); - m_DefaultRegionName = serverConfig.GetString("DefaultRegion", String.Empty); - m_WelcomeMessage = serverConfig.GetString("WelcomeMessage", "Welcome to OpenSim!"); - m_RequireInventory = serverConfig.GetBoolean("RequireInventory", true); + m_DefaultRegionName = m_LoginServerConfig.GetString("DefaultRegion", String.Empty); + m_WelcomeMessage = m_LoginServerConfig.GetString("WelcomeMessage", "Welcome to OpenSim!"); + m_RequireInventory = m_LoginServerConfig.GetBoolean("RequireInventory", true); // These are required; the others aren't if (accountService == string.Empty || authService == string.Empty) @@ -438,7 +440,7 @@ namespace OpenSim.Services.LLLoginService aCircuit.SecureSessionID = secureSession; aCircuit.SessionID = session; aCircuit.startpos = position; - aCircuit.ServiceURLs = account.ServiceURLs; + SetServiceURLs(aCircuit, account); if (simConnector.CreateAgent(region, aCircuit, 0, out reason)) return aCircuit; @@ -447,6 +449,25 @@ namespace OpenSim.Services.LLLoginService } + private void SetServiceURLs(AgentCircuitData aCircuit, UserAccount account) + { + aCircuit.ServiceURLs = new Dictionary(); + if (account.ServiceURLs == null) + return; + + foreach (KeyValuePair kvp in account.ServiceURLs) + { + if (kvp.Value == null || (kvp.Value != null && kvp.Value.ToString() == string.Empty)) + { + aCircuit.ServiceURLs[kvp.Key] = m_LoginServerConfig.GetString(kvp.Key, string.Empty); + } + else + { + aCircuit.ServiceURLs[kvp.Key] = kvp.Value; + } + } + } + #region Console Commands private void RegisterCommands() { -- cgit v1.1