diff options
author | Freaky Tech | 2015-03-05 20:55:52 +0100 |
---|---|---|
committer | BlueWall | 2015-03-05 16:17:12 -0500 |
commit | 0ea69770139f4369b202362be054047a5086a220 (patch) | |
tree | 912a4130bc7b2a2a1b01cc2f24891cc714ea0429 /OpenSim/Region | |
parent | Merge branch 'master' of /team/src/opensim (diff) | |
download | opensim-SC-0ea69770139f4369b202362be054047a5086a220.zip opensim-SC-0ea69770139f4369b202362be054047a5086a220.tar.gz opensim-SC-0ea69770139f4369b202362be054047a5086a220.tar.bz2 opensim-SC-0ea69770139f4369b202362be054047a5086a220.tar.xz |
solving HG IM, HGFriends issues based on falsified GridUser data
it does not consider GridUser as a viable source for residents' data.
it does not consider Friends, Inventory Creators to be trusted at all. There are lots of broken entries in existence.
There are lots of broken creator data fields in assets.
The following issues arise from the broken data in the old User Management Module:
failing HG IM
failing HGFriends Requests
Signed-off-by: BlueWall <jamesh@bluewallgroup.com>
Diffstat (limited to 'OpenSim/Region')
3 files changed, 324 insertions, 272 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index 6479430..d3d1246 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs | |||
@@ -62,6 +62,8 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
62 | // The cache | 62 | // The cache |
63 | protected Dictionary<UUID, UserData> m_UserCache = new Dictionary<UUID, UserData>(); | 63 | protected Dictionary<UUID, UserData> m_UserCache = new Dictionary<UUID, UserData>(); |
64 | 64 | ||
65 | protected bool m_DisplayChangingHomeURI = false; | ||
66 | |||
65 | #region ISharedRegionModule | 67 | #region ISharedRegionModule |
66 | 68 | ||
67 | public void Initialise(IConfigSource config) | 69 | public void Initialise(IConfigSource config) |
@@ -73,6 +75,17 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
73 | Init(); | 75 | Init(); |
74 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name); | 76 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name); |
75 | } | 77 | } |
78 | |||
79 | if(!m_Enabled) | ||
80 | { | ||
81 | return; | ||
82 | } | ||
83 | |||
84 | IConfig userManagementConfig = config.Configs["UserManagement"]; | ||
85 | if (userManagementConfig == null) | ||
86 | return; | ||
87 | |||
88 | m_DisplayChangingHomeURI = userManagementConfig.GetBoolean("DisplayChangingHomeURI", false); | ||
76 | } | 89 | } |
77 | 90 | ||
78 | public bool IsSharedModule | 91 | public bool IsSharedModule |
@@ -94,7 +107,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
94 | { | 107 | { |
95 | if (m_Enabled) | 108 | if (m_Enabled) |
96 | { | 109 | { |
97 | m_Scenes.Add(scene); | 110 | lock (m_Scenes) |
111 | { | ||
112 | m_Scenes.Add(scene); | ||
113 | } | ||
98 | 114 | ||
99 | scene.RegisterModuleInterface<IUserManagement>(this); | 115 | scene.RegisterModuleInterface<IUserManagement>(this); |
100 | scene.RegisterModuleInterface<IPeople>(this); | 116 | scene.RegisterModuleInterface<IPeople>(this); |
@@ -108,7 +124,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
108 | if (m_Enabled) | 124 | if (m_Enabled) |
109 | { | 125 | { |
110 | scene.UnregisterModuleInterface<IUserManagement>(this); | 126 | scene.UnregisterModuleInterface<IUserManagement>(this); |
111 | m_Scenes.Remove(scene); | 127 | lock (m_Scenes) |
128 | { | ||
129 | m_Scenes.Remove(scene); | ||
130 | } | ||
112 | } | 131 | } |
113 | } | 132 | } |
114 | 133 | ||
@@ -124,7 +143,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
124 | 143 | ||
125 | public void Close() | 144 | public void Close() |
126 | { | 145 | { |
127 | m_Scenes.Clear(); | 146 | lock (m_Scenes) |
147 | { | ||
148 | m_Scenes.Clear(); | ||
149 | } | ||
128 | 150 | ||
129 | lock (m_UserCache) | 151 | lock (m_UserCache) |
130 | m_UserCache.Clear(); | 152 | m_UserCache.Clear(); |
@@ -167,11 +189,18 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
167 | } | 189 | } |
168 | else | 190 | else |
169 | { | 191 | { |
170 | string[] names = new string[2]; | 192 | UserData user; |
171 | if (TryGetUserNamesFromCache(uuid, names)) | 193 | /* bypass that continuation here when entry is already available */ |
194 | lock (m_UserCache) | ||
172 | { | 195 | { |
173 | client.SendNameReply(uuid, names[0], names[1]); | 196 | if (m_UserCache.TryGetValue(uuid, out user)) |
174 | return; | 197 | { |
198 | if (!user.IsUnknownUser && user.HasGridUserTried) | ||
199 | { | ||
200 | client.SendNameReply(uuid, user.FirstName, user.LastName); | ||
201 | return; | ||
202 | } | ||
203 | } | ||
175 | } | 204 | } |
176 | 205 | ||
177 | // Not found in cache, queue continuation | 206 | // Not found in cache, queue continuation |
@@ -185,8 +214,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
185 | // So to avoid clients | 214 | // So to avoid clients |
186 | // (particularly Hypergrid clients) permanently binding "Unknown User" to a given UUID, we will | 215 | // (particularly Hypergrid clients) permanently binding "Unknown User" to a given UUID, we will |
187 | // instead drop the request entirely. | 216 | // instead drop the request entirely. |
188 | if (TryGetUserNames(uuid, names)) | 217 | if (GetUser(uuid, out user)) |
189 | client.SendNameReply(uuid, names[0], names[1]); | 218 | { |
219 | client.SendNameReply(uuid, user.FirstName, user.LastName); | ||
220 | } | ||
190 | // else | 221 | // else |
191 | // m_log.DebugFormat( | 222 | // m_log.DebugFormat( |
192 | // "[USER MANAGEMENT MODULE]: No bound name for {0} found, ignoring request from {1}", | 223 | // "[USER MANAGEMENT MODULE]: No bound name for {0} found, ignoring request from {1}", |
@@ -269,20 +300,19 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
269 | ud.FirstName = acc.FirstName; | 300 | ud.FirstName = acc.FirstName; |
270 | ud.LastName = acc.LastName; | 301 | ud.LastName = acc.LastName; |
271 | ud.Id = acc.PrincipalID; | 302 | ud.Id = acc.PrincipalID; |
303 | ud.HasGridUserTried = true; | ||
304 | ud.IsUnknownUser = false; | ||
272 | users.Add(ud); | 305 | users.Add(ud); |
273 | } | 306 | } |
274 | } | 307 | } |
275 | 308 | ||
276 | // search the local cache | 309 | // search the local cache |
277 | lock (m_UserCache) | 310 | foreach (UserData data in m_UserCache.Values) |
278 | { | 311 | { |
279 | foreach (UserData data in m_UserCache.Values) | 312 | if (data.Id != UUID.Zero && !data.IsUnknownUser && |
280 | { | 313 | users.Find(delegate(UserData d) { return d.Id == data.Id; }) == null && |
281 | if (data.Id != UUID.Zero && | 314 | (data.FirstName.ToLower().StartsWith(query.ToLower()) || data.LastName.ToLower().StartsWith(query.ToLower()))) |
282 | users.Find(delegate(UserData d) { return d.Id == data.Id; }) == null && | 315 | users.Add(data); |
283 | (data.FirstName.ToLower().StartsWith(query.ToLower()) || data.LastName.ToLower().StartsWith(query.ToLower()))) | ||
284 | users.Add(data); | ||
285 | } | ||
286 | } | 316 | } |
287 | 317 | ||
288 | AddAdditionalUsers(query, users); | 318 | AddAdditionalUsers(query, users); |
@@ -306,101 +336,6 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
306 | } | 336 | } |
307 | } | 337 | } |
308 | 338 | ||
309 | /// <summary> | ||
310 | /// | ||
311 | /// </summary> | ||
312 | /// <param name="uuid"></param> | ||
313 | /// <param name="names">Caller please provide a properly instantiated array for names, string[2]</param> | ||
314 | /// <returns></returns> | ||
315 | private bool TryGetUserNames(UUID uuid, string[] names) | ||
316 | { | ||
317 | if (names == null) | ||
318 | names = new string[2]; | ||
319 | |||
320 | if (TryGetUserNamesFromCache(uuid, names)) | ||
321 | return true; | ||
322 | |||
323 | if (TryGetUserNamesFromServices(uuid, names)) | ||
324 | return true; | ||
325 | |||
326 | return false; | ||
327 | } | ||
328 | |||
329 | private bool TryGetUserNamesFromCache(UUID uuid, string[] names) | ||
330 | { | ||
331 | lock (m_UserCache) | ||
332 | { | ||
333 | if (m_UserCache.ContainsKey(uuid)) | ||
334 | { | ||
335 | names[0] = m_UserCache[uuid].FirstName; | ||
336 | names[1] = m_UserCache[uuid].LastName; | ||
337 | |||
338 | return true; | ||
339 | } | ||
340 | } | ||
341 | |||
342 | return false; | ||
343 | } | ||
344 | |||
345 | /// <summary> | ||
346 | /// Try to get the names bound to the given uuid, from the services. | ||
347 | /// </summary> | ||
348 | /// <returns>True if the name was found, false if not.</returns> | ||
349 | /// <param name='uuid'></param> | ||
350 | /// <param name='names'>The array of names if found. If not found, then names[0] = "Unknown" and names[1] = "User"</param> | ||
351 | private bool TryGetUserNamesFromServices(UUID uuid, string[] names) | ||
352 | { | ||
353 | UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(UUID.Zero, uuid); | ||
354 | |||
355 | if (account != null) | ||
356 | { | ||
357 | names[0] = account.FirstName; | ||
358 | names[1] = account.LastName; | ||
359 | |||
360 | UserData user = new UserData(); | ||
361 | user.FirstName = account.FirstName; | ||
362 | user.LastName = account.LastName; | ||
363 | |||
364 | lock (m_UserCache) | ||
365 | m_UserCache[uuid] = user; | ||
366 | |||
367 | return true; | ||
368 | } | ||
369 | else | ||
370 | { | ||
371 | // Let's try the GridUser service | ||
372 | GridUserInfo uInfo = m_Scenes[0].GridUserService.GetGridUserInfo(uuid.ToString()); | ||
373 | if (uInfo != null) | ||
374 | { | ||
375 | string url, first, last, tmp; | ||
376 | UUID u; | ||
377 | if (Util.ParseUniversalUserIdentifier(uInfo.UserID, out u, out url, out first, out last, out tmp)) | ||
378 | { | ||
379 | AddUser(uuid, first, last, url); | ||
380 | |||
381 | if (m_UserCache.ContainsKey(uuid)) | ||
382 | { | ||
383 | names[0] = m_UserCache[uuid].FirstName; | ||
384 | names[1] = m_UserCache[uuid].LastName; | ||
385 | |||
386 | return true; | ||
387 | } | ||
388 | } | ||
389 | else | ||
390 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: Unable to parse UUI {0}", uInfo.UserID); | ||
391 | } | ||
392 | else | ||
393 | { | ||
394 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: No grid user found for {0}", uuid); | ||
395 | } | ||
396 | |||
397 | names[0] = "Unknown"; | ||
398 | names[1] = "UserUMMTGUN9"; | ||
399 | |||
400 | return false; | ||
401 | } | ||
402 | } | ||
403 | |||
404 | #region IUserManagement | 339 | #region IUserManagement |
405 | 340 | ||
406 | public UUID GetUserIdByName(string name) | 341 | public UUID GetUserIdByName(string name) |
@@ -434,63 +369,56 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
434 | 369 | ||
435 | public string GetUserName(UUID uuid) | 370 | public string GetUserName(UUID uuid) |
436 | { | 371 | { |
437 | string[] names = new string[2]; | 372 | UserData user; |
438 | TryGetUserNames(uuid, names); | 373 | GetUser(uuid, out user); |
439 | 374 | return user.FirstName + " " + user.LastName; | |
440 | return names[0] + " " + names[1]; | ||
441 | |||
442 | } | 375 | } |
443 | 376 | ||
444 | public string GetUserHomeURL(UUID userID) | 377 | public string GetUserHomeURL(UUID userID) |
445 | { | 378 | { |
446 | lock (m_UserCache) | 379 | UserData user; |
380 | if(GetUser(userID, out user)) | ||
447 | { | 381 | { |
448 | if (m_UserCache.ContainsKey(userID)) | 382 | return user.HomeURL; |
449 | return m_UserCache[userID].HomeURL; | ||
450 | } | 383 | } |
451 | |||
452 | return string.Empty; | 384 | return string.Empty; |
453 | } | 385 | } |
454 | 386 | ||
455 | public string GetUserServerURL(UUID userID, string serverType) | 387 | public string GetUserServerURL(UUID userID, string serverType) |
456 | { | 388 | { |
457 | UserData userdata; | 389 | UserData userdata; |
458 | lock (m_UserCache) | 390 | if(!GetUser(userID, out userdata)) |
459 | m_UserCache.TryGetValue(userID, out userdata); | 391 | { |
392 | return string.Empty; | ||
393 | } | ||
460 | 394 | ||
461 | if (userdata != null) | 395 | if (userdata.ServerURLs != null && userdata.ServerURLs.ContainsKey(serverType) && userdata.ServerURLs[serverType] != null) |
396 | { | ||
397 | return userdata.ServerURLs[serverType].ToString(); | ||
398 | } | ||
399 | |||
400 | if (!string.IsNullOrEmpty(userdata.HomeURL)) | ||
462 | { | 401 | { |
463 | // m_log.DebugFormat("[USER MANAGEMENT MODULE]: Requested url type {0} for {1}", serverType, userID); | 402 | // m_log.DebugFormat("[USER MANAGEMENT MODULE]: Requested url type {0} for {1}", serverType, userID); |
464 | 403 | ||
465 | if (userdata.ServerURLs != null) | 404 | UserAgentServiceConnector uConn = new UserAgentServiceConnector(userdata.HomeURL); |
405 | try | ||
466 | { | 406 | { |
467 | object url; | 407 | userdata.ServerURLs = uConn.GetServerURLs(userID); |
468 | |||
469 | if (userdata.ServerURLs.TryGetValue(serverType, out url)) | ||
470 | return url.ToString(); | ||
471 | } | 408 | } |
472 | else if (!string.IsNullOrEmpty(userdata.HomeURL)) | 409 | catch(System.Net.WebException e) |
473 | { | 410 | { |
474 | //m_log.DebugFormat( | 411 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: GetServerURLs call failed {0}", e.Message); |
475 | // "[USER MANAGEMENT MODULE]: Did not find url type {0} so requesting urls from '{1}' for {2}", | 412 | userdata.ServerURLs = new Dictionary<string, object>(); |
476 | // serverType, userdata.HomeURL, userID); | ||
477 | |||
478 | UserAgentServiceConnector uConn = new UserAgentServiceConnector(userdata.HomeURL); | ||
479 | try | ||
480 | { | ||
481 | userdata.ServerURLs = uConn.GetServerURLs(userID); | ||
482 | } | ||
483 | catch (Exception e) | ||
484 | { | ||
485 | m_log.Debug("[USER MANAGEMENT MODULE]: GetServerURLs call failed ", e); | ||
486 | userdata.ServerURLs = new Dictionary<string, object>(); | ||
487 | } | ||
488 | |||
489 | object url; | ||
490 | |||
491 | if (userdata.ServerURLs.TryGetValue(serverType, out url)) | ||
492 | return url.ToString(); | ||
493 | } | 413 | } |
414 | catch (Exception e) | ||
415 | { | ||
416 | m_log.Debug("[USER MANAGEMENT MODULE]: GetServerURLs call failed ", e); | ||
417 | userdata.ServerURLs = new Dictionary<string, object>(); | ||
418 | } | ||
419 | |||
420 | if (userdata.ServerURLs != null && userdata.ServerURLs.ContainsKey(serverType) && userdata.ServerURLs[serverType] != null) | ||
421 | return userdata.ServerURLs[serverType].ToString(); | ||
494 | } | 422 | } |
495 | 423 | ||
496 | return string.Empty; | 424 | return string.Empty; |
@@ -498,19 +426,15 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
498 | 426 | ||
499 | public string GetUserUUI(UUID userID) | 427 | public string GetUserUUI(UUID userID) |
500 | { | 428 | { |
501 | UserData ud; | 429 | string uui; |
502 | lock (m_UserCache) | 430 | GetUserUUI(userID, out uui); |
503 | m_UserCache.TryGetValue(userID, out ud); | 431 | return uui; |
432 | } | ||
504 | 433 | ||
505 | if (ud == null) // It's not in the cache | 434 | public bool GetUserUUI(UUID userID, out string uui) |
506 | { | 435 | { |
507 | string[] names = new string[2]; | 436 | UserData ud; |
508 | // This will pull the data from either UserAccounts or GridUser | 437 | bool result = GetUser(userID, out ud); |
509 | // and stick it into the cache | ||
510 | TryGetUserNamesFromServices(userID, names); | ||
511 | lock (m_UserCache) | ||
512 | m_UserCache.TryGetValue(userID, out ud); | ||
513 | } | ||
514 | 438 | ||
515 | if (ud != null) | 439 | if (ud != null) |
516 | { | 440 | { |
@@ -524,129 +448,247 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
524 | first = parts[0]; | 448 | first = parts[0]; |
525 | last = parts[1]; | 449 | last = parts[1]; |
526 | } | 450 | } |
527 | return userID + ";" + homeURL + ";" + first + " " + last; | 451 | uui = userID + ";" + homeURL + ";" + first + " " + last; |
528 | } | 452 | } |
529 | } | 453 | } |
530 | 454 | ||
531 | return userID.ToString(); | 455 | uui = userID.ToString(); |
456 | return result; | ||
532 | } | 457 | } |
533 | 458 | ||
534 | public void AddUser(UUID uuid, string first, string last) | 459 | #region Cache Management |
460 | public bool GetUser(UUID uuid, out UserData userdata) | ||
535 | { | 461 | { |
536 | lock (m_UserCache) | 462 | lock (m_UserCache) |
537 | { | 463 | { |
538 | if (m_UserCache.ContainsKey(uuid)) | 464 | if (m_UserCache.TryGetValue(uuid, out userdata)) |
539 | return; | 465 | { |
466 | if (userdata.HasGridUserTried) | ||
467 | { | ||
468 | return true; | ||
469 | } | ||
470 | } | ||
471 | else | ||
472 | { | ||
473 | userdata = new UserData(); | ||
474 | userdata.HasGridUserTried = false; | ||
475 | userdata.Id = uuid; | ||
476 | userdata.FirstName = "Unknown"; | ||
477 | userdata.LastName = "UserUMMAU42"; | ||
478 | userdata.HomeURL = string.Empty; | ||
479 | userdata.IsUnknownUser = true; | ||
480 | userdata.HasGridUserTried = false; | ||
481 | } | ||
482 | } | ||
483 | |||
484 | /* BEGIN: do not wrap this code in any lock here | ||
485 | * There are HTTP calls in here. | ||
486 | */ | ||
487 | if (!userdata.HasGridUserTried) | ||
488 | { | ||
489 | /* rewrite here */ | ||
490 | UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, uuid); | ||
491 | if (account != null) | ||
492 | { | ||
493 | userdata.FirstName = account.FirstName; | ||
494 | userdata.LastName = account.LastName; | ||
495 | userdata.HomeURL = string.Empty; | ||
496 | userdata.IsUnknownUser = false; | ||
497 | userdata.HasGridUserTried = true; | ||
498 | } | ||
540 | } | 499 | } |
541 | 500 | ||
542 | UserData user = new UserData(); | 501 | if (!userdata.HasGridUserTried) |
543 | user.Id = uuid; | 502 | { |
544 | user.FirstName = first; | 503 | GridUserInfo uInfo = m_Scenes[0].GridUserService.GetGridUserInfo(uuid.ToString()); |
545 | user.LastName = last; | 504 | if (uInfo != null) |
505 | { | ||
506 | string url, first, last, tmp; | ||
507 | UUID u; | ||
508 | if(uInfo.UserID.Length <= 36) | ||
509 | { | ||
510 | /* not a UUI */ | ||
511 | } | ||
512 | else if (Util.ParseUniversalUserIdentifier(uInfo.UserID, out u, out url, out first, out last, out tmp)) | ||
513 | { | ||
514 | if (url != string.Empty) | ||
515 | { | ||
516 | userdata.FirstName = first.Replace(" ", ".") + "." + last.Replace(" ", "."); | ||
517 | userdata.HomeURL = url; | ||
518 | try | ||
519 | { | ||
520 | userdata.LastName = "@" + new Uri(url).Authority; | ||
521 | userdata.IsUnknownUser = false; | ||
522 | } | ||
523 | catch | ||
524 | { | ||
525 | userdata.LastName = "@unknown"; | ||
526 | } | ||
527 | userdata.HasGridUserTried = true; | ||
528 | } | ||
529 | } | ||
530 | else | ||
531 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: Unable to parse UUI {0}", uInfo.UserID); | ||
532 | } | ||
533 | } | ||
534 | /* END: do not wrap this code in any lock here */ | ||
546 | 535 | ||
547 | AddUserInternal(user); | 536 | lock (m_UserCache) |
537 | { | ||
538 | m_UserCache[uuid] = userdata; | ||
539 | } | ||
540 | return !userdata.IsUnknownUser; | ||
548 | } | 541 | } |
549 | 542 | ||
550 | public void AddUser(UUID uuid, string first, string last, string homeURL) | 543 | public void AddUser(UUID uuid, string first, string last) |
551 | { | 544 | { |
552 | //m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, first {1}, last {2}, url {3}", uuid, first, last, homeURL); | 545 | lock(m_UserCache) |
553 | if (homeURL == string.Empty) | 546 | { |
554 | return; | 547 | if(!m_UserCache.ContainsKey(uuid)) |
555 | 548 | { | |
556 | AddUser(uuid, homeURL + ";" + first + " " + last); | 549 | UserData user = new UserData(); |
550 | user.Id = uuid; | ||
551 | user.FirstName = first; | ||
552 | user.LastName = last; | ||
553 | user.IsUnknownUser = false; | ||
554 | user.HasGridUserTried = false; | ||
555 | m_UserCache.Add(uuid, user); | ||
556 | } | ||
557 | } | ||
557 | } | 558 | } |
558 | 559 | ||
559 | public void AddUser(UUID id, string creatorData) | 560 | public void AddUser(UUID uuid, string first, string last, string homeURL) |
560 | { | 561 | { |
561 | //m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, creatorData {1}", id, creatorData); | 562 | //m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, first {1}, last {2}, url {3}", uuid, first, last, homeURL); |
562 | 563 | ||
563 | UserData oldUser; | 564 | UserData oldUser; |
564 | lock (m_UserCache) | 565 | lock (m_UserCache) |
565 | m_UserCache.TryGetValue(id, out oldUser); | ||
566 | |||
567 | if (oldUser != null) | ||
568 | { | 566 | { |
569 | if (string.IsNullOrEmpty(creatorData)) | 567 | if (m_UserCache.TryGetValue(uuid, out oldUser)) |
570 | { | 568 | { |
571 | //ignore updates without creator data | 569 | if (!oldUser.IsUnknownUser) |
572 | return; | 570 | { |
573 | } | 571 | if (homeURL != oldUser.HomeURL && m_DisplayChangingHomeURI) |
574 | 572 | { | |
575 | //try update unknown users, but don't update anyone else | 573 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: Different HomeURI for {0} {1} ({2}): {3} and {4}", |
576 | if (oldUser.FirstName == "Unknown" && !creatorData.Contains("Unknown")) | 574 | first, last, uuid.ToString(), homeURL, oldUser.HomeURL); |
577 | { | 575 | } |
578 | lock (m_UserCache) | 576 | /* no update needed */ |
579 | m_UserCache.Remove(id); | 577 | return; |
580 | m_log.DebugFormat("[USER MANAGEMENT MODULE]: Re-adding user with id {0}, creatorData [{1}] and old HomeURL {2}", id, creatorData, oldUser.HomeURL); | 578 | } |
581 | } | 579 | } |
582 | else | 580 | else if(!m_UserCache.ContainsKey(uuid)) |
583 | { | 581 | { |
584 | //we have already a valid user within the cache | 582 | oldUser = new UserData(); |
585 | return; | 583 | oldUser.HasGridUserTried = false; |
584 | oldUser.IsUnknownUser = false; | ||
585 | if (homeURL != string.Empty) | ||
586 | { | ||
587 | oldUser.FirstName = first.Replace(" ", ".") + "." + last.Replace(" ", "."); | ||
588 | try | ||
589 | { | ||
590 | oldUser.LastName = "@" + new Uri(homeURL).Authority; | ||
591 | oldUser.IsUnknownUser = false; | ||
592 | } | ||
593 | catch | ||
594 | { | ||
595 | oldUser.LastName = "@unknown"; | ||
596 | } | ||
597 | } | ||
598 | else | ||
599 | { | ||
600 | oldUser.FirstName = first; | ||
601 | oldUser.LastName = last; | ||
602 | } | ||
603 | oldUser.HomeURL = homeURL; | ||
604 | oldUser.Id = uuid; | ||
605 | m_UserCache.Add(uuid, oldUser); | ||
586 | } | 606 | } |
587 | } | 607 | } |
608 | } | ||
588 | 609 | ||
589 | UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id); | 610 | public void AddUser(UUID id, string creatorData) |
611 | { | ||
612 | // m_log.InfoFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, creatorData {1}", id, creatorData); | ||
590 | 613 | ||
591 | if (account != null) | 614 | if(string.IsNullOrEmpty(creatorData)) |
592 | { | 615 | { |
593 | AddUser(id, account.FirstName, account.LastName); | 616 | AddUser(id, string.Empty, string.Empty, string.Empty); |
594 | } | 617 | } |
595 | else | 618 | else |
596 | { | 619 | { |
597 | UserData user = new UserData(); | 620 | string homeURL; |
598 | user.Id = id; | 621 | string firstname = string.Empty; |
599 | 622 | string lastname = string.Empty; | |
600 | if (!string.IsNullOrEmpty(creatorData)) | ||
601 | { | ||
602 | //creatorData = <endpoint>;<name> | ||
603 | 623 | ||
604 | string[] parts = creatorData.Split(';'); | 624 | //creatorData = <endpoint>;<name> |
605 | 625 | ||
606 | if (parts.Length >= 2) | 626 | string[] parts = creatorData.Split(';'); |
607 | user.FirstName = parts[1].Replace(' ', '.'); | 627 | if(parts.Length > 1) |
608 | 628 | { | |
609 | if (parts.Length >= 1) | 629 | string[] nameparts = parts[1].Split(' '); |
630 | firstname = nameparts[0]; | ||
631 | for(int xi = 1; xi < nameparts.Length; ++xi) | ||
610 | { | 632 | { |
611 | user.HomeURL = parts[0]; | 633 | if(xi != 1) |
612 | try | ||
613 | { | 634 | { |
614 | Uri uri = new Uri(parts[0]); | 635 | lastname += " "; |
615 | user.LastName = "@" + uri.Authority; | ||
616 | } | 636 | } |
617 | catch (UriFormatException) | 637 | lastname += nameparts[xi]; |
618 | { | 638 | } |
619 | m_log.DebugFormat( | 639 | } |
620 | "[USER MANAGEMENT MODULE]: Unable to parse home URL {0} for user name {1}, ID {2} from original creator data {3} when adding user info.", | 640 | else |
621 | parts[0], user.FirstName ?? "Unknown", id, creatorData); | 641 | { |
642 | firstname = "Unknown"; | ||
643 | lastname = "UserUMMAU5"; | ||
644 | } | ||
645 | if (parts.Length >= 1) | ||
646 | { | ||
647 | homeURL = parts[0]; | ||
648 | if(Uri.IsWellFormedUriString(homeURL, UriKind.Absolute)) | ||
649 | { | ||
650 | AddUser(id, firstname, lastname, homeURL); | ||
651 | } | ||
652 | else | ||
653 | { | ||
654 | m_log.DebugFormat("[SCENE]: Unable to parse Uri {0} for CreatorID {1}", parts[0], creatorData); | ||
622 | 655 | ||
623 | user.LastName = "@unknown"; | 656 | lock (m_UserCache) |
657 | { | ||
658 | if(!m_UserCache.ContainsKey(id)) | ||
659 | { | ||
660 | UserData newUser = new UserData(); | ||
661 | newUser.Id = id; | ||
662 | newUser.FirstName = firstname + "." + lastname.Replace(' ', '.'); | ||
663 | newUser.LastName = "@unknown"; | ||
664 | newUser.HomeURL = string.Empty; | ||
665 | newUser.HasGridUserTried = false; | ||
666 | newUser.IsUnknownUser = true; /* we mark those users as Unknown user so a re-retrieve may be activated */ | ||
667 | m_UserCache.Add(id, newUser); | ||
668 | } | ||
624 | } | 669 | } |
625 | } | 670 | } |
626 | } | 671 | } |
627 | else | 672 | else |
628 | { | 673 | { |
629 | // Temporarily add unknown user entries of this type into the cache so that we can distinguish | 674 | lock(m_UserCache) |
630 | // this source from other recent (hopefully resolved) bugs that fail to retrieve a user name binding | 675 | { |
631 | // TODO: Can be removed when GUN* unknown users have definitely dropped significantly or | 676 | if(!m_UserCache.ContainsKey(id)) |
632 | // disappeared. | 677 | { |
633 | user.FirstName = "Unknown"; | 678 | UserData newUser = new UserData(); |
634 | user.LastName = "UserUMMAU4"; | 679 | newUser.Id = id; |
680 | newUser.FirstName = "Unknown"; | ||
681 | newUser.LastName = "UserUMMAU4"; | ||
682 | newUser.HomeURL = string.Empty; | ||
683 | newUser.IsUnknownUser = true; | ||
684 | newUser.HasGridUserTried = false; | ||
685 | m_UserCache.Add(id, newUser); | ||
686 | } | ||
687 | } | ||
635 | } | 688 | } |
636 | |||
637 | AddUserInternal(user); | ||
638 | } | 689 | } |
639 | } | 690 | } |
640 | 691 | #endregion | |
641 | void AddUserInternal(UserData user) | ||
642 | { | ||
643 | lock (m_UserCache) | ||
644 | m_UserCache[user.Id] = user; | ||
645 | |||
646 | //m_log.DebugFormat( | ||
647 | // "[USER MANAGEMENT MODULE]: Added user {0} {1} {2} {3}", | ||
648 | // user.Id, user.FirstName, user.LastName, user.HomeURL); | ||
649 | } | ||
650 | 692 | ||
651 | public bool IsLocalGridUser(UUID uuid) | 693 | public bool IsLocalGridUser(UUID uuid) |
652 | { | 694 | { |
@@ -680,21 +722,6 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
680 | "Show the bindings between user UUIDs and user names", | 722 | "Show the bindings between user UUIDs and user names", |
681 | String.Empty, | 723 | String.Empty, |
682 | HandleShowUsers); | 724 | HandleShowUsers); |
683 | |||
684 | MainConsole.Instance.Commands.AddCommand("Users", true, | ||
685 | "reset user cache", | ||
686 | "reset user cache", | ||
687 | "reset user cache to allow changed settings to be applied", | ||
688 | String.Empty, | ||
689 | HandleResetUserCache); | ||
690 | } | ||
691 | |||
692 | private void HandleResetUserCache(string module, string[] cmd) | ||
693 | { | ||
694 | lock(m_UserCache) | ||
695 | { | ||
696 | m_UserCache.Clear(); | ||
697 | } | ||
698 | } | 725 | } |
699 | 726 | ||
700 | private void HandleShowUser(string module, string[] cmd) | 727 | private void HandleShowUser(string module, string[] cmd) |
@@ -711,13 +738,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
711 | 738 | ||
712 | UserData ud; | 739 | UserData ud; |
713 | 740 | ||
714 | lock (m_UserCache) | 741 | if(!GetUser(userId, out ud)) |
715 | { | 742 | { |
716 | if (!m_UserCache.TryGetValue(userId, out ud)) | 743 | MainConsole.Instance.OutputFormat("No name known for user with id {0}", userId); |
717 | { | 744 | return; |
718 | MainConsole.Instance.OutputFormat("No name known for user with id {0}", userId); | ||
719 | return; | ||
720 | } | ||
721 | } | 745 | } |
722 | 746 | ||
723 | ConsoleDisplayTable cdt = new ConsoleDisplayTable(); | 747 | ConsoleDisplayTable cdt = new ConsoleDisplayTable(); |
@@ -735,11 +759,17 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
735 | cdt.AddColumn("UUID", 36); | 759 | cdt.AddColumn("UUID", 36); |
736 | cdt.AddColumn("Name", 30); | 760 | cdt.AddColumn("Name", 30); |
737 | cdt.AddColumn("HomeURL", 40); | 761 | cdt.AddColumn("HomeURL", 40); |
762 | cdt.AddColumn("Checked", 10); | ||
738 | 763 | ||
739 | lock (m_UserCache) | 764 | Dictionary<UUID, UserData> copyDict; |
765 | lock(m_UserCache) | ||
766 | { | ||
767 | copyDict = new Dictionary<UUID, UserData>(m_UserCache); | ||
768 | } | ||
769 | |||
770 | foreach(KeyValuePair<UUID, UserData> kvp in copyDict) | ||
740 | { | 771 | { |
741 | foreach (KeyValuePair<UUID, UserData> kvp in m_UserCache) | 772 | cdt.AddRow(kvp.Key, string.Format("{0} {1}", kvp.Value.FirstName, kvp.Value.LastName), kvp.Value.HomeURL, kvp.Value.HasGridUserTried ? "yes" : "no"); |
742 | cdt.AddRow(kvp.Key, string.Format("{0} {1}", kvp.Value.FirstName, kvp.Value.LastName), kvp.Value.HomeURL); | ||
743 | } | 773 | } |
744 | 774 | ||
745 | MainConsole.Instance.Output(cdt.ToString()); | 775 | MainConsole.Instance.Output(cdt.ToString()); |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs index e05d186..2238c90 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs | |||
@@ -67,10 +67,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser | |||
67 | { | 67 | { |
68 | if (sp.PresenceType != PresenceType.Npc) | 68 | if (sp.PresenceType != PresenceType.Npc) |
69 | { | 69 | { |
70 | string userid = sp.Scene.UserManagementModule.GetUserUUI(sp.UUID); | 70 | string userid; |
71 | //m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected root presence {0} in {1}", userid, sp.Scene.RegionInfo.RegionName); | 71 | //m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected root presence {0} in {1}", userid, sp.Scene.RegionInfo.RegionName); |
72 | m_GridUserService.SetLastPosition( | 72 | if (sp.Scene.UserManagementModule.GetUserUUI(sp.UUID, out userid)) |
73 | userid, UUID.Zero, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); | 73 | { |
74 | /* we only setposition on known agents that have a valid lookup */ | ||
75 | m_GridUserService.SetLastPosition( | ||
76 | userid, UUID.Zero, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); | ||
77 | } | ||
74 | } | 78 | } |
75 | } | 79 | } |
76 | 80 | ||
@@ -89,17 +93,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser | |||
89 | if (client.SceneAgent.IsChildAgent) | 93 | if (client.SceneAgent.IsChildAgent) |
90 | return; | 94 | return; |
91 | 95 | ||
92 | string userId = client.AgentId.ToString(); | 96 | string userId; |
97 | /* without scene we cannot logout correctly at all since we do not know how to send the loggedout message then */ | ||
93 | if (client.Scene is Scene) | 98 | if (client.Scene is Scene) |
94 | { | 99 | { |
95 | Scene s = (Scene)client.Scene; | 100 | Scene s = (Scene)client.Scene; |
96 | userId = s.UserManagementModule.GetUserUUI(client.AgentId); | 101 | userId = s.UserManagementModule.GetUserUUI(client.AgentId); |
102 | if(s.UserManagementModule.GetUserUUI(client.AgentId, out userId)) | ||
103 | { | ||
104 | m_GridUserService.LoggedOut( | ||
105 | userId, client.SessionId, client.Scene.RegionInfo.RegionID, | ||
106 | client.SceneAgent.AbsolutePosition, client.SceneAgent.Lookat); | ||
107 | } | ||
97 | } | 108 | } |
98 | //m_log.DebugFormat("[ACTIVITY DETECTOR]: Detected client logout {0} in {1}", userId, client.Scene.RegionInfo.RegionName); | ||
99 | 109 | ||
100 | m_GridUserService.LoggedOut( | ||
101 | userId, client.SessionId, client.Scene.RegionInfo.RegionID, | ||
102 | client.SceneAgent.AbsolutePosition, client.SceneAgent.Lookat); | ||
103 | } | 110 | } |
104 | } | 111 | } |
105 | } | 112 | } |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 11b079f..13485bf 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -1994,11 +1994,26 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1994 | // (d) parcels with telehubs can be the home of anyone | 1994 | // (d) parcels with telehubs can be the home of anyone |
1995 | (telehub != null && land.ContainsPoint((int)telehub.AbsolutePosition.X, (int)telehub.AbsolutePosition.Y)))) | 1995 | (telehub != null && land.ContainsPoint((int)telehub.AbsolutePosition.X, (int)telehub.AbsolutePosition.Y)))) |
1996 | { | 1996 | { |
1997 | if (m_scene.GridUserService.SetHome(remoteClient.AgentId.ToString(), land.RegionUUID, position, lookAt)) | 1997 | string userId; |
1998 | UUID test; | ||
1999 | if (!m_scene.UserManagementModule.GetUserUUI(remoteClient.AgentId, out userId)) | ||
2000 | { | ||
2001 | /* Do not set a home position in this grid for a HG visitor */ | ||
2002 | m_Dialog.SendAlertToUser(remoteClient, "Set Home request failed. (User Lookup)"); | ||
2003 | } | ||
2004 | else if (!UUID.TryParse(userId, out test)) | ||
2005 | { | ||
2006 | m_Dialog.SendAlertToUser(remoteClient, "Set Home request failed. (HG visitor)"); | ||
2007 | } | ||
2008 | else if (m_scene.GridUserService.SetHome(userId, land.RegionUUID, position, lookAt)) | ||
2009 | { | ||
1998 | // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. | 2010 | // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. |
1999 | m_Dialog.SendAlertToUser(remoteClient, "Home position set."); | 2011 | m_Dialog.SendAlertToUser(remoteClient, "Home position set."); |
2012 | } | ||
2000 | else | 2013 | else |
2014 | { | ||
2001 | m_Dialog.SendAlertToUser(remoteClient, "Set Home request failed."); | 2015 | m_Dialog.SendAlertToUser(remoteClient, "Set Home request failed."); |
2016 | } | ||
2002 | } | 2017 | } |
2003 | else | 2018 | else |
2004 | m_Dialog.SendAlertToUser(remoteClient, "You are not allowed to set your home location in this parcel."); | 2019 | m_Dialog.SendAlertToUser(remoteClient, "You are not allowed to set your home location in this parcel."); |