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.
parent
05373de9df
commit
1e389438e2
|
@ -181,16 +181,8 @@ namespace OpenSim.Framework
|
||||||
throw new ArgumentException("[NetworkUtil] Unable to resolve defaultHostname to an IPv4 address for an IPv4 client");
|
throw new ArgumentException("[NetworkUtil] Unable to resolve defaultHostname to an IPv4 address for an IPv4 client");
|
||||||
}
|
}
|
||||||
|
|
||||||
static IPAddress externalIPAddress;
|
|
||||||
|
|
||||||
static NetworkUtil()
|
static NetworkUtil()
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
externalIPAddress = GetExternalIP();
|
|
||||||
}
|
|
||||||
catch { /* ignore */ }
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
|
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
|
||||||
|
@ -254,79 +246,5 @@ namespace OpenSim.Framework
|
||||||
return defaultHostname;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2673,26 +2673,26 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode);
|
AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode);
|
||||||
|
|
||||||
// Do the verification here
|
//// 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();
|
//System.Net.IPEndPoint ep = (System.Net.IPEndPoint)client.GetClientEP();
|
||||||
if (aCircuit != null)
|
//if (aCircuit != null)
|
||||||
{
|
//{
|
||||||
if (!VerifyClient(aCircuit, ep, out vialogin))
|
// if (!VerifyClient(aCircuit, ep, out vialogin))
|
||||||
{
|
// {
|
||||||
// uh-oh, this is fishy
|
// // uh-oh, this is fishy
|
||||||
m_log.WarnFormat("[Scene]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.",
|
// m_log.WarnFormat("[SCENE]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.",
|
||||||
client.AgentId, client.SessionId, ep.ToString());
|
// client.AgentId, client.SessionId, ep.ToString());
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
client.Close();
|
// client.Close();
|
||||||
}
|
// }
|
||||||
catch (Exception e)
|
// catch (Exception e)
|
||||||
{
|
// {
|
||||||
m_log.DebugFormat("[Scene]: Exception while closing aborted client: {0}", e.StackTrace);
|
// m_log.DebugFormat("[SCENE]: Exception while closing aborted client: {0}", e.StackTrace);
|
||||||
}
|
// }
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
m_log.Debug("[Scene] Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName);
|
m_log.Debug("[Scene] Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName);
|
||||||
|
|
||||||
|
@ -2721,16 +2721,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
vialogin = false;
|
vialogin = false;
|
||||||
|
|
||||||
// Do the verification here
|
// 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;
|
vialogin = true;
|
||||||
IUserAgentVerificationModule userVerification = RequestModuleInterface<IUserAgentVerificationModule>();
|
IUserAgentVerificationModule userVerification = RequestModuleInterface<IUserAgentVerificationModule>();
|
||||||
if (userVerification != null && ep != null)
|
if (userVerification != null && ep != null)
|
||||||
{
|
{
|
||||||
System.Net.IPAddress addr = NetworkUtil.GetExternalIPOf(ep.Address);
|
if (!userVerification.VerifyClient(aCircuit, ep.Address.ToString()))
|
||||||
|
|
||||||
if (!userVerification.VerifyClient(aCircuit, /*ep.Address.ToString() */ addr.ToString()))
|
|
||||||
{
|
{
|
||||||
// uh-oh, this is fishy
|
// 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);
|
m_log.DebugFormat("[Scene]: User Client Verification for {0} {1} in {2} returned false", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName);
|
||||||
|
@ -2741,6 +2739,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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -225,17 +225,23 @@ namespace OpenSim.Services.HypergridService
|
||||||
|
|
||||||
// May want to authorize
|
// 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))
|
PresenceInfo presence = m_PresenceService.GetAgent(aCircuit.SessionID);
|
||||||
{
|
if (presence != null) // it has been placed there by the login service
|
||||||
reason = "Unable to login presence";
|
isFirstLogin = true;
|
||||||
m_log.InfoFormat("[GATEKEEPER SERVICE]: Presence login failed for foreign agent {0} {1}. Refusing service.",
|
|
||||||
aCircuit.firstname, aCircuit.lastname);
|
else
|
||||||
return false;
|
if (!m_PresenceService.LoginAgent(aCircuit.AgentID.ToString(), aCircuit.SessionID, aCircuit.SecureSessionID))
|
||||||
}
|
{
|
||||||
m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence ok");
|
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
|
// Get the region
|
||||||
|
@ -274,7 +280,9 @@ namespace OpenSim.Services.HypergridService
|
||||||
//
|
//
|
||||||
// Finally launch the agent at the destination
|
// 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)
|
protected bool Authenticate(AgentCircuitData aCircuit)
|
||||||
|
|
|
@ -134,7 +134,7 @@ namespace OpenSim.Services.HypergridService
|
||||||
public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, IPEndPoint clientIP, 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} (@{2}) to grid {3}",
|
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);
|
gatekeeper.ExternalHostName +":"+ gatekeeper.HttpPort);
|
||||||
|
|
||||||
// Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
|
// Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
|
||||||
|
@ -169,9 +169,10 @@ namespace OpenSim.Services.HypergridService
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_log.DebugFormat("[USER AGENT SERVICE]: Gatekeeper sees me as {0}", myExternalIP);
|
||||||
// else set the IP addresses associated with this client
|
// else set the IP addresses associated with this client
|
||||||
if (clientIP != null)
|
if (clientIP != null)
|
||||||
m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress = clientIP.ToString();
|
m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress = clientIP.Address.ToString();
|
||||||
m_TravelingAgents[agentCircuit.SessionID].MyIpAddress = myExternalIP;
|
m_TravelingAgents[agentCircuit.SessionID].MyIpAddress = myExternalIP;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue