diff --git a/OpenSim/Framework/NetworkUtil.cs b/OpenSim/Framework/NetworkUtil.cs index 831ff70e77..2e94b0d5b4 100644 --- a/OpenSim/Framework/NetworkUtil.cs +++ b/OpenSim/Framework/NetworkUtil.cs @@ -181,16 +181,8 @@ namespace OpenSim.Framework throw new ArgumentException("[NetworkUtil] Unable to resolve defaultHostname to an IPv4 address for an IPv4 client"); } - static IPAddress externalIPAddress; - static NetworkUtil() { - try - { - externalIPAddress = GetExternalIP(); - } - catch { /* ignore */ } - try { foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) @@ -254,79 +246,5 @@ namespace OpenSim.Framework return defaultHostname; } - public static IPAddress GetExternalIPOf(IPAddress user) - { - if (externalIPAddress == null) - return user; - - if (user.ToString() == "127.0.0.1") - { - m_log.Info("[NetworkUtil] 127.0.0.1 user detected, sending '" + externalIPAddress + "' instead of '" + user + "'"); - return externalIPAddress; - } - // Check if we're accessing localhost. - foreach (IPAddress host in Dns.GetHostAddresses(Dns.GetHostName())) - { - if (host.Equals(user) && host.AddressFamily == AddressFamily.InterNetwork) - { - m_log.Info("[NetworkUtil] Localhost user detected, sending '" + externalIPAddress + "' instead of '" + user + "'"); - return externalIPAddress; - } - } - - // Check for same LAN segment - foreach (KeyValuePair subnet in m_subnets) - { - byte[] subnetBytes = subnet.Value.GetAddressBytes(); - byte[] localBytes = subnet.Key.GetAddressBytes(); - byte[] destBytes = user.GetAddressBytes(); - - if (subnetBytes.Length != destBytes.Length || subnetBytes.Length != localBytes.Length) - return user; - - bool valid = true; - - for (int i = 0; i < subnetBytes.Length; i++) - { - if ((localBytes[i] & subnetBytes[i]) != (destBytes[i] & subnetBytes[i])) - { - valid = false; - break; - } - } - - if (subnet.Key.AddressFamily != AddressFamily.InterNetwork) - valid = false; - - if (valid) - { - m_log.Info("[NetworkUtil] Local LAN user detected, sending '" + externalIPAddress + "' instead of '" + user + "'"); - return externalIPAddress; - } - } - - // Otherwise, return user address - return user; - } - - private static IPAddress GetExternalIP() - { - string whatIsMyIp = "http://www.whatismyip.com/automation/n09230945.asp"; - WebClient wc = new WebClient(); - UTF8Encoding utf8 = new UTF8Encoding(); - string requestHtml = ""; - try - { - requestHtml = utf8.GetString(wc.DownloadData(whatIsMyIp)); - } - catch (WebException we) - { - m_log.Info("[NetworkUtil]: Exception in GetExternalIP: " + we.ToString()); - return null; - } - - IPAddress externalIp = IPAddress.Parse(requestHtml); - return externalIp; - } } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 18705a8121..e742b55145 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2507,26 +2507,26 @@ namespace OpenSim.Region.Framework.Scenes { AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); - // Do the verification here - System.Net.IPEndPoint ep = (System.Net.IPEndPoint)client.GetClientEP(); - if (aCircuit != null) - { - if (!VerifyClient(aCircuit, ep, out vialogin)) - { - // uh-oh, this is fishy - m_log.WarnFormat("[SCENE]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.", - client.AgentId, client.SessionId, ep.ToString()); - try - { - client.Close(); - } - catch (Exception e) - { - m_log.DebugFormat("[SCENE]: Exception while closing aborted client: {0}", e.StackTrace); - } - return; - } - } + //// Do the verification here -- No, really don't do this here. This is UDP address, let it go. + //System.Net.IPEndPoint ep = (System.Net.IPEndPoint)client.GetClientEP(); + //if (aCircuit != null) + //{ + // if (!VerifyClient(aCircuit, ep, out vialogin)) + // { + // // uh-oh, this is fishy + // m_log.WarnFormat("[SCENE]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.", + // client.AgentId, client.SessionId, ep.ToString()); + // try + // { + // client.Close(); + // } + // catch (Exception e) + // { + // m_log.DebugFormat("[SCENE]: Exception while closing aborted client: {0}", e.StackTrace); + // } + // return; + // } + //} m_log.Debug("[SCENE]: Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); @@ -2555,16 +2555,14 @@ namespace OpenSim.Region.Framework.Scenes vialogin = false; // Do the verification here - if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0) + if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0) { - m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via Login", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); + m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via HG login", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); vialogin = true; IUserAgentVerificationModule userVerification = RequestModuleInterface(); if (userVerification != null && ep != null) { - System.Net.IPAddress addr = NetworkUtil.GetExternalIPOf(ep.Address); - - if (!userVerification.VerifyClient(aCircuit, /*ep.Address.ToString() */ addr.ToString())) + if (!userVerification.VerifyClient(aCircuit, ep.Address.ToString())) { // uh-oh, this is fishy m_log.DebugFormat("[SCENE]: User Client Verification for {0} {1} in {2} returned false", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); @@ -2575,6 +2573,10 @@ namespace OpenSim.Region.Framework.Scenes } } + else if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0) + m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via regular login. Client IP verification not performed.", + aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); + return true; } diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index 6f041dae21..3f5c4f1400 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -225,17 +225,23 @@ namespace OpenSim.Services.HypergridService // May want to authorize + bool isFirstLogin = false; // - // Login the presence + // Login the presence, if it's not there yet (by the login service) // - if (!m_PresenceService.LoginAgent(aCircuit.AgentID.ToString(), aCircuit.SessionID, aCircuit.SecureSessionID)) - { - reason = "Unable to login presence"; - m_log.InfoFormat("[GATEKEEPER SERVICE]: Presence login failed for foreign agent {0} {1}. Refusing service.", - aCircuit.firstname, aCircuit.lastname); - return false; - } - m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence ok"); + PresenceInfo presence = m_PresenceService.GetAgent(aCircuit.SessionID); + if (presence != null) // it has been placed there by the login service + isFirstLogin = true; + + else + if (!m_PresenceService.LoginAgent(aCircuit.AgentID.ToString(), aCircuit.SessionID, aCircuit.SecureSessionID)) + { + reason = "Unable to login presence"; + m_log.InfoFormat("[GATEKEEPER SERVICE]: Presence login failed for foreign agent {0} {1}. Refusing service.", + aCircuit.firstname, aCircuit.lastname); + return false; + } + m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence ok"); // // Get the region @@ -274,7 +280,9 @@ namespace OpenSim.Services.HypergridService // // Finally launch the agent at the destination // - return m_SimulationService.CreateAgent(destination, aCircuit, (uint)Constants.TeleportFlags.ViaLogin, out reason); + Constants.TeleportFlags loginFlag = isFirstLogin ? Constants.TeleportFlags.ViaLogin : Constants.TeleportFlags.ViaHGLogin; + m_log.DebugFormat("[GATEKEEPER SERVICE]: launching agent {0}", loginFlag); + return m_SimulationService.CreateAgent(destination, aCircuit, (uint)loginFlag, out reason); } protected bool Authenticate(AgentCircuitData aCircuit) diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index 6b14e2115f..8c3be7023b 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -134,7 +134,7 @@ namespace OpenSim.Services.HypergridService public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, IPEndPoint clientIP, out string reason) { m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}", - agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "(stored IP)" : clientIP.ToString()), + agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "stored IP" : clientIP.Address.ToString()), gatekeeper.ExternalHostName +":"+ gatekeeper.HttpPort); // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination @@ -169,9 +169,10 @@ namespace OpenSim.Services.HypergridService return false; } + m_log.DebugFormat("[USER AGENT SERVICE]: Gatekeeper sees me as {0}", myExternalIP); // else set the IP addresses associated with this client if (clientIP != null) - m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress = clientIP.ToString(); + m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress = clientIP.Address.ToString(); m_TravelingAgents[agentCircuit.SessionID].MyIpAddress = myExternalIP; return true; }