aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorFreaky Tech2015-03-05 20:55:52 +0100
committerBlueWall2015-03-05 16:17:12 -0500
commit0ea69770139f4369b202362be054047a5086a220 (patch)
tree912a4130bc7b2a2a1b01cc2f24891cc714ea0429 /OpenSim/Region
parentMerge branch 'master' of /team/src/opensim (diff)
downloadopensim-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')
-rw-r--r--OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs556
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs23
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs17
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.");