One more go at GetExternalIpOf(user). Addresses mantis #4955 and #4943.

(Files .xml and .txt also want to be committed)
prebuild-update
Diva Canto 2010-08-18 16:22:50 -07:00
parent 8c12f22140
commit e47608fc62
3 changed files with 367 additions and 355 deletions

View File

@ -274,37 +274,49 @@ namespace OpenSim.Framework
}
}
// Check for same LAN segment
foreach (KeyValuePair<IPAddress, IPAddress> subnet in m_subnets)
// Check for private networks
if (user.ToString().StartsWith("192.168"))
{
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;
}
m_log.Info("[NetworkUtil] Private network user detected, sending '" + externalIPAddress + "' instead of '" + user + "'");
return externalIPAddress;
}
// We may need to do more fancy configuration-based checks... I'm not entirely sure there is
// a 100% algorithmic manner of dealing with all the network setups out there. This code
// will evolve as people bump into problems.
//// Check for same LAN segment -- I don't think we want to do this in general. Leaving it here
//// for now as a reminder
//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;
}