From 1955b797598d61548521c444ea8d3721fd5435ba Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 19 Aug 2010 18:55:30 -0700
Subject: Partial rewrite of client IP verification. Not completely finished
 yet, and untested. Committing to move to my other computer.

---
 OpenSim/Framework/Constants.cs                     |  4 +-
 .../Server/Handlers/Simulation/AgentHandlers.cs    | 20 ++++++
 .../Hypergrid/GatekeeperServiceConnector.cs        | 44 ++++++++++++
 .../Hypergrid/UserAgentServiceConnector.cs         |  7 ++
 .../Simulation/SimulationServiceConnector.cs       | 83 +++++++++++++++-------
 .../Services/HypergridService/UserAgentService.cs  | 44 ++++++++----
 OpenSim/Services/Interfaces/IGatekeeperService.cs  |  6 +-
 OpenSim/Services/LLLoginService/LLLoginService.cs  |  6 +-
 8 files changed, 167 insertions(+), 47 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs
index 5757061..1b1aaf2 100644
--- a/OpenSim/Framework/Constants.cs
+++ b/OpenSim/Framework/Constants.cs
@@ -83,7 +83,9 @@ namespace OpenSim.Framework
             /// <summary>Finished, Sim Changed</summary>
             FinishedViaNewSim = 1 << 28,
             /// <summary>Finished, Same Sim</summary>
-            FinishedViaSameSim = 1 << 29
+            FinishedViaSameSim = 1 << 29,
+            /// <summary>Agent coming into the grid from another grid</summary>
+            ViaHGLogin = 1 << 30
         }
 
     }
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
index d261678..392927a 100644
--- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
@@ -178,6 +178,8 @@ namespace OpenSim.Server.Handlers.Simulation
 
             resp["reason"] = OSD.FromString(reason);
             resp["success"] = OSD.FromBoolean(result);
+            // Let's also send out the IP address of the caller back to the caller (HG 1.5)
+            resp["your_ip"] = OSD.FromString(GetCallerIP(request));
 
             // TODO: add reason if not String.Empty?
             responsedata["int_response_code"] = HttpStatusCode.OK;
@@ -352,6 +354,24 @@ namespace OpenSim.Server.Handlers.Simulation
         {
             m_SimulationService.ReleaseAgent(regionID, id, "");
         }
+
+        private string GetCallerIP(Hashtable req)
+        {
+            if (req.ContainsKey("headers"))
+            {
+                try
+                {
+                    Hashtable headers = (Hashtable)req["headers"];
+                    if (headers.ContainsKey("remote_addr") && headers["remote_addr"] != null)
+                        return headers["remote_addr"].ToString();
+                }
+                catch (Exception e)
+                {
+                    m_log.WarnFormat("[AGENT HANDLER]: exception in GetCallerIP: {0}", e.Message);
+                }
+            }
+            return string.Empty;
+        }
     }
 
 }
diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
index c426bba..291dd73 100644
--- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
@@ -38,6 +38,7 @@ using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 
 using OpenMetaverse;
 using OpenMetaverse.Imaging;
+using OpenMetaverse.StructuredData;
 using Nwc.XmlRpc;
 using log4net;
 
@@ -268,5 +269,48 @@ namespace OpenSim.Services.Connectors.Hypergrid
             return null;
         }
 
+        public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason)
+        {
+            HttpWebRequest AgentCreateRequest = null;
+            myipaddress = String.Empty;
+            reason = String.Empty;
+
+            if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest))
+            {
+                string response = GetResponse(AgentCreateRequest, out reason);
+                bool success = true;
+                UnpackResponse(response, out success, out reason, out myipaddress);
+                return success;
+            }
+
+            return false;
+        }
+
+        protected void UnpackResponse(string response, out bool result, out string reason, out string ipaddress)
+        {
+            result = true;
+            reason = string.Empty;
+            ipaddress = string.Empty;
+
+            if (!String.IsNullOrEmpty(response))
+            {
+                try
+                {
+                    // we assume we got an OSDMap back
+                    OSDMap r = Util.GetOSDMap(response);
+                    result = r["success"].AsBoolean();
+                    reason = r["reason"].AsString();
+                    ipaddress = r["your_ip"].AsString();
+                }
+                catch (NullReferenceException e)
+                {
+                    m_log.InfoFormat("[GATEKEEPER SERVICE CONNECTOR]: exception on UnpackResponse of DoCreateChildAgentCall {0}", e.Message);
+                    reason = "Internal error";
+                    result = false;
+                }
+            }
+        }
+
+
     }
 }
diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
index 69dff3c..c1e5949 100644
--- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
@@ -73,6 +73,13 @@ namespace OpenSim.Services.Connectors.Hypergrid
         {
         }
 
+        public bool LoginAgentToGrid(AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, IPEndPoint ipaddress, out string reason)
+        {
+            // not available over remote calls
+            reason = "Method not available over remote calls";
+            return false;
+        }
+
         public bool LoginAgentToGrid(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, out string reason)
         {
             reason = String.Empty;
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index 6244565..2b96b96 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -77,8 +77,26 @@ namespace OpenSim.Services.Connectors.Simulation
 
         public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
         {
+            HttpWebRequest AgentCreateRequest = null;
             reason = String.Empty;
 
+            if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest))
+            {
+                string response = GetResponse(AgentCreateRequest, out reason);
+                bool success = true;
+                UnpackResponse(response, out success, out reason);
+                return success;
+            }
+
+            return false;
+        }
+
+
+        protected bool SendRequest(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason, out HttpWebRequest AgentCreateRequest)
+        {
+            reason = String.Empty;
+            AgentCreateRequest = null;
+
             if (destination == null)
             {
                 reason = "Destination is null";
@@ -101,7 +119,7 @@ namespace OpenSim.Services.Connectors.Simulation
 
             //Console.WriteLine("   >>> DoCreateChildAgentCall <<< " + uri);
 
-            HttpWebRequest AgentCreateRequest = (HttpWebRequest)WebRequest.Create(uri);
+            AgentCreateRequest = (HttpWebRequest)WebRequest.Create(uri);
             AgentCreateRequest.Method = "POST";
             AgentCreateRequest.ContentType = "application/json";
             AgentCreateRequest.Timeout = 10000;
@@ -134,7 +152,7 @@ namespace OpenSim.Services.Connectors.Simulation
                 AgentCreateRequest.ContentLength = buffer.Length;   //Count bytes to send
                 os = AgentCreateRequest.GetRequestStream();
                 os.Write(buffer, 0, strBuffer.Length);         //Send it
-                m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateAgent request to remote sim {0}, region {1}, x={2} y={3}", 
+                m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateAgent request to remote sim {0}, region {1}, x={2} y={3}",
                     uri, destination.RegionName, destination.RegionLocX, destination.RegionLocY);
             }
             //catch (WebException ex)
@@ -150,11 +168,18 @@ namespace OpenSim.Services.Connectors.Simulation
                     os.Close();
             }
 
+            return true;
+        }
+
+        protected string GetResponse(HttpWebRequest AgentCreateRequest, out string reason)
+        {
             // Let's wait for the response
             //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall");
+            reason = string.Empty;
 
             WebResponse webResponse = null;
             StreamReader sr = null;
+            string response = string.Empty;
             try
             {
                 webResponse = AgentCreateRequest.GetResponse();
@@ -166,37 +191,15 @@ namespace OpenSim.Services.Connectors.Simulation
                 {
 
                     sr = new StreamReader(webResponse.GetResponseStream());
-                    string response = sr.ReadToEnd().Trim();
+                    response = sr.ReadToEnd().Trim();
                     m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", response);
-
-                    if (!String.IsNullOrEmpty(response))
-                    {
-                        try
-                        {
-                            // we assume we got an OSDMap back
-                            OSDMap r = Util.GetOSDMap(response);
-                            bool success = r["success"].AsBoolean();
-                            reason = r["reason"].AsString();
-                            return success;
-                        }
-                        catch (NullReferenceException e)
-                        {
-                            m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", e.Message);
-
-                            // check for old style response
-                            if (response.ToLower().StartsWith("true"))
-                                return true;
-
-                            return false;
-                        }
-                    }
                 }
             }
             catch (WebException ex)
             {
                 m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", ex.Message);
                 reason = "Destination did not reply";
-                return false;
+                return string.Empty;
             }
             finally
             {
@@ -204,7 +207,33 @@ namespace OpenSim.Services.Connectors.Simulation
                     sr.Close();
             }
 
-            return true;
+            return response;
+        }
+
+        protected void UnpackResponse(string response, out bool result, out string reason)
+        {
+            result = true;
+            reason = string.Empty;
+            if (!String.IsNullOrEmpty(response))
+            {
+                try
+                {
+                    // we assume we got an OSDMap back
+                    OSDMap r = Util.GetOSDMap(response);
+                    result = r["success"].AsBoolean();
+                    reason = r["reason"].AsString();
+                }
+                catch (NullReferenceException e)
+                {
+                    m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", e.Message);
+
+                    // check for old style response
+                    if (response.ToLower().StartsWith("true"))
+                        result = true;
+
+                    result = false;
+                }
+            }
         }
 
         protected virtual OSDMap PackCreateAgentArguments(AgentCircuitData aCircuit, GridRegion destination, uint flags)
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs
index 181d7f2..6b14e21 100644
--- a/OpenSim/Services/HypergridService/UserAgentService.cs
+++ b/OpenSim/Services/HypergridService/UserAgentService.cs
@@ -131,10 +131,11 @@ namespace OpenSim.Services.HypergridService
             return home;
         }
 
-        public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason)
+        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} to grid {2}", 
-                agentCircuit.firstname, agentCircuit.lastname, gatekeeper.ExternalHostName +":"+ gatekeeper.HttpPort);
+            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()), 
+                gatekeeper.ExternalHostName +":"+ gatekeeper.HttpPort);
 
             // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
             GridRegion region = new GridRegion(gatekeeper);
@@ -149,11 +150,12 @@ namespace OpenSim.Services.HypergridService
 
             //bool success = m_GatekeeperConnector.CreateAgent(region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out reason);
             bool success = false;
+            string myExternalIP = string.Empty;
             string gridName = "http://" + gatekeeper.ExternalHostName + ":" + gatekeeper.HttpPort;
             if (m_GridName == gridName)
                 success = m_GatekeeperService.LoginAgent(agentCircuit, finalDestination, out reason);
             else
-                success = m_GatekeeperConnector.CreateAgent(region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out reason);
+                success = m_GatekeeperConnector.CreateAgent(region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out myExternalIP, out reason);
 
             if (!success)
             {
@@ -167,15 +169,25 @@ namespace OpenSim.Services.HypergridService
                 return false;
             }
 
+            // else set the IP addresses associated with this client
+            if (clientIP != null)
+                m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress = clientIP.ToString();
+            m_TravelingAgents[agentCircuit.SessionID].MyIpAddress = myExternalIP;
             return true;
         }
 
-        public void SetClientToken(UUID sessionID, string token)
+        public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason)
+        {
+            reason = string.Empty;
+            return LoginAgentToGrid(agentCircuit, gatekeeper, finalDestination, null, out reason);
+        }
+
+        private void SetClientIP(UUID sessionID, string ip)
         {
             if (m_TravelingAgents.ContainsKey(sessionID))
             {
-                m_log.DebugFormat("[USER AGENT SERVICE]: Setting token {0} for session {1}", token, sessionID);
-                m_TravelingAgents[sessionID].ClientToken = token;
+                m_log.DebugFormat("[USER AGENT SERVICE]: Setting IP {0} for session {1}", ip, sessionID);
+                m_TravelingAgents[sessionID].ClientIPAddress = ip;
             }
         }
 
@@ -196,7 +208,7 @@ namespace OpenSim.Services.HypergridService
             travel.GridExternalName = "http://" + region.ExternalHostName + ":" + region.HttpPort;
             travel.ServiceToken = agentCircuit.ServiceSessionID;
             if (old != null)
-                travel.ClientToken = old.ClientToken;
+                travel.ClientIPAddress = old.ClientIPAddress;
 
             return old;
         }
@@ -233,15 +245,22 @@ namespace OpenSim.Services.HypergridService
             return travel.GridExternalName == thisGridExternalName;
         }
 
-        public bool VerifyClient(UUID sessionID, string token)
+        public bool VerifyClient(UUID sessionID, string reportedIP)
         {
             if (m_BypassClientVerification)
                 return true;
 
-            m_log.DebugFormat("[USER AGENT SERVICE]: Verifying Client session {0} with token {1}", sessionID, token);
+            m_log.DebugFormat("[USER AGENT SERVICE]: Verifying Client session {0} with reported IP {1}.", 
+                sessionID, reportedIP);
 
             if (m_TravelingAgents.ContainsKey(sessionID))
-                return m_TravelingAgents[sessionID].ClientToken == token;
+            {
+                m_log.DebugFormat("[USER AGENT SERVICE]: Comparing with login IP {0} and MyIP {1}", 
+                    m_TravelingAgents[sessionID].ClientIPAddress, m_TravelingAgents[sessionID].MyIpAddress);
+
+                return m_TravelingAgents[sessionID].ClientIPAddress == reportedIP ||
+                    m_TravelingAgents[sessionID].MyIpAddress == reportedIP; // NATed
+            }
 
             return false;
         }
@@ -266,7 +285,8 @@ namespace OpenSim.Services.HypergridService
         public UUID UserID;
         public string GridExternalName = string.Empty;
         public string ServiceToken = string.Empty;
-        public string ClientToken = string.Empty;
+        public string ClientIPAddress = string.Empty; // as seen from this user agent service
+        public string MyIpAddress = string.Empty; // the user agent service's external IP, as seen from the next gatekeeper
     }
 
 }
diff --git a/OpenSim/Services/Interfaces/IGatekeeperService.cs b/OpenSim/Services/Interfaces/IGatekeeperService.cs
index 2d397bc..aac8293 100644
--- a/OpenSim/Services/Interfaces/IGatekeeperService.cs
+++ b/OpenSim/Services/Interfaces/IGatekeeperService.cs
@@ -48,13 +48,15 @@ namespace OpenSim.Services.Interfaces
     /// </summary>
     public interface IUserAgentService
     {
+        // called by login service only
+        bool LoginAgentToGrid(AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, IPEndPoint clientIP, out string reason);
+        // called by simulators
         bool LoginAgentToGrid(AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, out string reason);
-        void SetClientToken(UUID sessionID, string token);
         void LogoutAgent(UUID userID, UUID sessionID);
         GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt);
 
         bool AgentIsComingHome(UUID sessionID, string thisGridExternalName);
         bool VerifyAgent(UUID sessionID, string token);
-        bool VerifyClient(UUID sessionID, string token);
+        bool VerifyClient(UUID sessionID, string reportedIP);
     }
 }
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs
index 4b7cb5d..b740297 100644
--- a/OpenSim/Services/LLLoginService/LLLoginService.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -755,12 +755,8 @@ namespace OpenSim.Services.LLLoginService
         private bool LaunchAgentIndirectly(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, IPEndPoint clientIP, out string reason)
         {
             m_log.Debug("[LLOGIN SERVICE] Launching agent at " + destination.RegionName);
-            if (m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, out reason))
-            {
-                IPAddress addr = NetworkUtil.GetExternalIPOf(clientIP.Address);
-                m_UserAgentService.SetClientToken(aCircuit.SessionID, addr.ToString() /* clientIP.Address.ToString() */);
+            if (m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, clientIP, out reason))
                 return true;
-            }
             return false;
         }
 
-- 
cgit v1.1


From a39ea07158756a76757d4b616c60cbcedf06f268 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 19 Aug 2010 19:54:40 -0700
Subject: Finished implementing ViaLogin vs ViaHGLogin. Removed lookup on
 myipaddress.com. Also removed client IP verification upon UDP connection that
 had been left there -- we can't do that in general.

---
 OpenSim/Framework/NetworkUtil.cs                   | 82 ----------------------
 OpenSim/Region/Framework/Scenes/Scene.cs           | 52 +++++++-------
 .../Services/HypergridService/GatekeeperService.cs | 28 +++++---
 .../Services/HypergridService/UserAgentService.cs  |  5 +-
 4 files changed, 48 insertions(+), 119 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Framework/NetworkUtil.cs b/OpenSim/Framework/NetworkUtil.cs
index 831ff70..2e94b0d 100644
--- a/OpenSim/Framework/NetworkUtil.cs
+++ b/OpenSim/Framework/NetworkUtil.cs
@@ -181,18 +181,10 @@ 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())
                 {
                     foreach (UnicastIPAddressInformation address in ni.GetIPProperties().UnicastAddresses)
@@ -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<IPAddress, IPAddress> 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 18705a8..e742b55 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<IUserAgentVerificationModule>();
                 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 6f041da..3f5c4f1 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 6b14e21..8c3be70 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;
         }
-- 
cgit v1.1