To avoid viewers (particularly on the Hypergrid) from permanently caching a UUID -> "Unknown User" binding, drop the binding request rather than replying with "Unknown User"

By not binding UUID -> "Unknown User", we leave open the possibility that the binding may be correctly resolved at a later time, which can still happen in some Hypergrid situations.
Observed behaviour of LL viewer 3.3.4 is that a dropped bind request is not retried until the next session.
0.7.6-extended
Justin Clark-Casey (justincc) 2013-09-16 19:45:42 +01:00
parent 068f22a52c
commit 86c39d618e
1 changed files with 42 additions and 35 deletions

View File

@ -178,17 +178,20 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
m_ServiceThrottle.Enqueue("name", uuid.ToString(), delegate m_ServiceThrottle.Enqueue("name", uuid.ToString(), delegate
{ {
//m_log.DebugFormat("[YYY]: Name request {0}", uuid); //m_log.DebugFormat("[YYY]: Name request {0}", uuid);
bool foundRealName = TryGetUserNames(uuid, names);
if (names.Length == 2)
{
if (!foundRealName)
m_log.DebugFormat("[USER MANAGEMENT MODULE]: Sending {0} {1} for {2} to {3} since no bound name found", names[0], names[1], uuid, client.Name);
// As least upto September 2013, clients permanently cache UUID -> Name bindings. Some clients
// appear to clear this when the user asks it to clear the cache, but others may not.
//
// So to avoid clients
// (particularly Hypergrid clients) permanently binding "Unknown User" to a given UUID, we will
// instead drop the request entirely.
if (TryGetUserNames(uuid, names))
client.SendNameReply(uuid, names[0], names[1]); client.SendNameReply(uuid, names[0], names[1]);
} // else
// m_log.DebugFormat(
// "[USER MANAGEMENT MODULE]: No bound name for {0} found, ignoring request from {1}",
// uuid, client.Name);
}); });
} }
} }
@ -391,7 +394,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
} }
names[0] = "Unknown"; names[0] = "Unknown";
names[1] = "UserUMMTGUN8"; names[1] = "UserUMMTGUN9";
return false; return false;
} }
@ -549,24 +552,24 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
if (oldUser != null) if (oldUser != null)
{ {
if (creatorData == null || creatorData == String.Empty) // if (creatorData == null || creatorData == String.Empty)
{ // {
//ignore updates without creator data // //ignore updates without creator data
return; // return;
} // }
//
//try update unknown users, but don't update anyone else // //try update unknown users, but don't update anyone else
if (oldUser.FirstName == "Unknown" && !creatorData.Contains("Unknown")) // if (oldUser.FirstName == "Unknown" && !creatorData.Contains("Unknown"))
{ // {
lock (m_UserCache) // lock (m_UserCache)
m_UserCache.Remove(id); // m_UserCache.Remove(id);
m_log.DebugFormat("[USER MANAGEMENT MODULE]: Re-adding user with id {0}, creatorData [{1}] and old HomeURL {2}", id, creatorData, oldUser.HomeURL); // m_log.DebugFormat("[USER MANAGEMENT MODULE]: Re-adding user with id {0}, creatorData [{1}] and old HomeURL {2}", id, creatorData, oldUser.HomeURL);
} // }
else // else
{ // {
//we have already a valid user within the cache //we have already a valid user within the cache
return; return;
} // }
} }
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id); UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id);
@ -602,15 +605,19 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
if (parts.Length >= 2) if (parts.Length >= 2)
user.FirstName = parts[1].Replace(' ', '.'); user.FirstName = parts[1].Replace(' ', '.');
} }
else
{ // To avoid issues with clients, particularly Hypergrid ones, permanently caching
// Temporarily add unknown user entries of this type into the cache so that we can distinguish // UUID -> "Unknown User" name bindings, elsewhere we will drop such requests rather than replying.
// this source from other recent (hopefully resolved) bugs that fail to retrieve a user name binding // This also means that we cannot add an unknown user binding to the cache here.
// TODO: Can be removed when GUN* unknown users have definitely dropped significantly or // else
// disappeared. // {
user.FirstName = "Unknown"; // // Temporarily add unknown user entries of this type into the cache so that we can distinguish
user.LastName = "UserUMMAU4"; // // this source from other recent (hopefully resolved) bugs that fail to retrieve a user name binding
} // // TODO: Can be removed when GUN* unknown users have definitely dropped significantly or
// // disappeared.
// user.FirstName = "Unknown";
// user.LastName = "UserUMMAU4";
// }
AddUserInternal(user); AddUserInternal(user);
} }