aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/LLLoginService/LLLoginService.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Services/LLLoginService/LLLoginService.cs166
1 files changed, 124 insertions, 42 deletions
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs
index 59fb559..0b38738 100644
--- a/OpenSim/Services/LLLoginService/LLLoginService.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -50,12 +50,15 @@ namespace OpenSim.Services.LLLoginService
50 public class LLLoginService : ILoginService 50 public class LLLoginService : ILoginService
51 { 51 {
52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
53 private static readonly string LogHeader = "[LLOGIN SERVICE]";
54
53 private static bool Initialized = false; 55 private static bool Initialized = false;
54 56
55 protected IUserAccountService m_UserAccountService; 57 protected IUserAccountService m_UserAccountService;
56 protected IGridUserService m_GridUserService; 58 protected IGridUserService m_GridUserService;
57 protected IAuthenticationService m_AuthenticationService; 59 protected IAuthenticationService m_AuthenticationService;
58 protected IInventoryService m_InventoryService; 60 protected IInventoryService m_InventoryService;
61 protected IInventoryService m_HGInventoryService;
59 protected IGridService m_GridService; 62 protected IGridService m_GridService;
60 protected IPresenceService m_PresenceService; 63 protected IPresenceService m_PresenceService;
61 protected ISimulationService m_LocalSimulationService; 64 protected ISimulationService m_LocalSimulationService;
@@ -74,14 +77,15 @@ namespace OpenSim.Services.LLLoginService
74 protected string m_GatekeeperURL; 77 protected string m_GatekeeperURL;
75 protected bool m_AllowRemoteSetLoginLevel; 78 protected bool m_AllowRemoteSetLoginLevel;
76 protected string m_MapTileURL; 79 protected string m_MapTileURL;
77 protected string m_ProfileURL;
78 protected string m_OpenIDURL;
79 protected string m_SearchURL; 80 protected string m_SearchURL;
80 protected string m_Currency; 81 protected string m_Currency;
81 82 protected string m_ClassifiedFee;
83 protected int m_MaxAgentGroups;
84 protected string m_DestinationGuide;
85 protected string m_AvatarPicker;
82 protected string m_AllowedClients; 86 protected string m_AllowedClients;
83 protected string m_DeniedClients; 87 protected string m_DeniedClients;
84 88 protected string m_MessageUrl;
85 protected string m_DSTZone; 89 protected string m_DSTZone;
86 90
87 IConfig m_LoginServerConfig; 91 IConfig m_LoginServerConfig;
@@ -110,18 +114,29 @@ namespace OpenSim.Services.LLLoginService
110 m_RequireInventory = m_LoginServerConfig.GetBoolean("RequireInventory", true); 114 m_RequireInventory = m_LoginServerConfig.GetBoolean("RequireInventory", true);
111 m_AllowRemoteSetLoginLevel = m_LoginServerConfig.GetBoolean("AllowRemoteSetLoginLevel", false); 115 m_AllowRemoteSetLoginLevel = m_LoginServerConfig.GetBoolean("AllowRemoteSetLoginLevel", false);
112 m_MinLoginLevel = m_LoginServerConfig.GetInt("MinLoginLevel", 0); 116 m_MinLoginLevel = m_LoginServerConfig.GetInt("MinLoginLevel", 0);
113 m_GatekeeperURL = m_LoginServerConfig.GetString("GatekeeperURI", string.Empty); 117 m_GatekeeperURL = Util.GetConfigVarFromSections<string>(config, "GatekeeperURI",
118 new string[] { "Startup", "Hypergrid", "LoginService" }, String.Empty);
114 m_MapTileURL = m_LoginServerConfig.GetString("MapTileURL", string.Empty); 119 m_MapTileURL = m_LoginServerConfig.GetString("MapTileURL", string.Empty);
115 m_ProfileURL = m_LoginServerConfig.GetString("ProfileServerURL", string.Empty);
116 m_OpenIDURL = m_LoginServerConfig.GetString("OpenIDServerURL", String.Empty);
117 m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty); 120 m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty);
118 m_Currency = m_LoginServerConfig.GetString("Currency", string.Empty); 121 m_Currency = m_LoginServerConfig.GetString("Currency", string.Empty);
122 m_ClassifiedFee = m_LoginServerConfig.GetString("ClassifiedFee", string.Empty);
123 m_DestinationGuide = m_LoginServerConfig.GetString ("DestinationGuide", string.Empty);
124 m_AvatarPicker = m_LoginServerConfig.GetString ("AvatarPicker", string.Empty);
119 125
120 m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty); 126 string[] possibleAccessControlConfigSections = new string[] { "AccessControl", "LoginService" };
121 m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty); 127 m_AllowedClients = Util.GetConfigVarFromSections<string>(
128 config, "AllowedClients", possibleAccessControlConfigSections, string.Empty);
129 m_DeniedClients = Util.GetConfigVarFromSections<string>(
130 config, "DeniedClients", possibleAccessControlConfigSections, string.Empty);
122 131
132 m_MessageUrl = m_LoginServerConfig.GetString("MessageUrl", string.Empty);
123 m_DSTZone = m_LoginServerConfig.GetString("DSTZone", "America/Los_Angeles;Pacific Standard Time"); 133 m_DSTZone = m_LoginServerConfig.GetString("DSTZone", "America/Los_Angeles;Pacific Standard Time");
124 134
135 IConfig groupConfig = config.Configs["Groups"];
136 if (groupConfig != null)
137 m_MaxAgentGroups = groupConfig.GetInt("MaxAgentGroups", 42);
138
139
125 // Clean up some of these vars 140 // Clean up some of these vars
126 if (m_MapTileURL != String.Empty) 141 if (m_MapTileURL != String.Empty)
127 { 142 {
@@ -156,6 +171,15 @@ namespace OpenSim.Services.LLLoginService
156 if (agentService != string.Empty) 171 if (agentService != string.Empty)
157 m_UserAgentService = ServerUtils.LoadPlugin<IUserAgentService>(agentService, args); 172 m_UserAgentService = ServerUtils.LoadPlugin<IUserAgentService>(agentService, args);
158 173
174 // Get the Hypergrid inventory service (exists only if Hypergrid is enabled)
175 string hgInvServicePlugin = m_LoginServerConfig.GetString("HGInventoryServicePlugin", String.Empty);
176 if (hgInvServicePlugin != string.Empty)
177 {
178 string hgInvServiceArg = m_LoginServerConfig.GetString("HGInventoryServiceConstructorArg", String.Empty);
179 Object[] args2 = new Object[] { config, hgInvServiceArg };
180 m_HGInventoryService = ServerUtils.LoadPlugin<IInventoryService>(hgInvServicePlugin, args2);
181 }
182
159 // 183 //
160 // deal with the services given as argument 184 // deal with the services given as argument
161 // 185 //
@@ -241,6 +265,7 @@ namespace OpenSim.Services.LLLoginService
241 { 265 {
242 bool success = false; 266 bool success = false;
243 UUID session = UUID.Random(); 267 UUID session = UUID.Random();
268 string processedMessage;
244 269
245 m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} at {2} using viewer {3}, channel {4}, IP {5}, Mac {6}, Id0 {7}", 270 m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} at {2} using viewer {3}, channel {4}, IP {5}, Mac {6}, Id0 {7}",
246 firstName, lastName, startLocation, clientVersion, channel, clientIP.Address.ToString(), mac, id0); 271 firstName, lastName, startLocation, clientVersion, channel, clientIP.Address.ToString(), mac, id0);
@@ -341,6 +366,13 @@ namespace OpenSim.Services.LLLoginService
341 return LLFailedLoginResponse.InventoryProblem; 366 return LLFailedLoginResponse.InventoryProblem;
342 } 367 }
343 368
369 if (m_HGInventoryService != null)
370 {
371 // Give the Suitcase service a chance to create the suitcase folder.
372 // (If we're not using the Suitcase inventory service then this won't do anything.)
373 m_HGInventoryService.GetRootFolder(account.PrincipalID);
374 }
375
344 List<InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); 376 List<InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID);
345 if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) 377 if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0)))
346 { 378 {
@@ -375,13 +407,33 @@ namespace OpenSim.Services.LLLoginService
375 // 407 //
376 GridRegion home = null; 408 GridRegion home = null;
377 GridUserInfo guinfo = m_GridUserService.LoggedIn(account.PrincipalID.ToString()); 409 GridUserInfo guinfo = m_GridUserService.LoggedIn(account.PrincipalID.ToString());
378 if (guinfo != null && (guinfo.HomeRegionID != UUID.Zero) && m_GridService != null) 410
411 // We are only going to complain about no home if the user actually tries to login there, to avoid
412 // spamming the console.
413 if (guinfo != null)
379 { 414 {
380 home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID); 415 if (guinfo.HomeRegionID == UUID.Zero && startLocation == "home")
416 {
417 m_log.WarnFormat(
418 "[LLOGIN SERVICE]: User {0} tried to login to a 'home' start location but they have none set",
419 account.Name);
420 }
421 else if (m_GridService != null)
422 {
423 home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID);
424
425 if (home == null && startLocation == "home")
426 {
427 m_log.WarnFormat(
428 "[LLOGIN SERVICE]: User {0} tried to login to a 'home' start location with ID {1} but this was not found.",
429 account.Name, guinfo.HomeRegionID);
430 }
431 }
381 } 432 }
382 if (guinfo == null) 433 else
383 { 434 {
384 // something went wrong, make something up, so that we don't have to test this anywhere else 435 // something went wrong, make something up, so that we don't have to test this anywhere else
436 m_log.DebugFormat("{0} Failed to fetch GridUserInfo. Creating empty GridUserInfo as home", LogHeader);
385 guinfo = new GridUserInfo(); 437 guinfo = new GridUserInfo();
386 guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); 438 guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30);
387 } 439 }
@@ -448,16 +500,28 @@ namespace OpenSim.Services.LLLoginService
448 // 500 //
449 // Finally, fill out the response and return it 501 // Finally, fill out the response and return it
450 // 502 //
503 if (m_MessageUrl != String.Empty)
504 {
505 WebClient client = new WebClient();
506 processedMessage = client.DownloadString(m_MessageUrl);
507 }
508 else
509 {
510 processedMessage = m_WelcomeMessage;
511 }
512 processedMessage = processedMessage.Replace("\\n", "\n").Replace("<USERNAME>", firstName + " " + lastName);
513
451 LLLoginResponse response 514 LLLoginResponse response
452 = new LLLoginResponse( 515 = new LLLoginResponse(
453 account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, 516 account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService,
454 where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, 517 where, startLocation, position, lookAt, gestures, processedMessage, home, clientIP,
455 m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone); 518 m_MapTileURL, m_SearchURL, m_Currency, m_DSTZone,
519 m_DestinationGuide, m_AvatarPicker, m_ClassifiedFee, m_MaxAgentGroups);
456 520
457 m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to {0} {1}", firstName, lastName); 521 m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to {0} {1}", firstName, lastName);
458 522
459 return response; 523 return response;
460 } 524 }
461 catch (Exception e) 525 catch (Exception e)
462 { 526 {
463 m_log.WarnFormat("[LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString(), e.StackTrace); 527 m_log.WarnFormat("[LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString(), e.StackTrace);
@@ -498,10 +562,6 @@ namespace OpenSim.Services.LLLoginService
498 562
499 if (home == null) 563 if (home == null)
500 { 564 {
501 m_log.WarnFormat(
502 "[LLOGIN SERVICE]: User {0} {1} tried to login to a 'home' start location but they have none set",
503 account.FirstName, account.LastName);
504
505 tryDefaults = true; 565 tryDefaults = true;
506 } 566 }
507 else 567 else
@@ -576,7 +636,7 @@ namespace OpenSim.Services.LLLoginService
576 // e.g. New Moon&135&46 New Moon@osgrid.org:8002&153&34 636 // e.g. New Moon&135&46 New Moon@osgrid.org:8002&153&34
577 where = "url"; 637 where = "url";
578 GridRegion region = null; 638 GridRegion region = null;
579 Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$"); 639 Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+[.]?\d*)&(?<y>\d+[.]?\d*)&(?<z>\d+[.]?\d*)$");
580 Match uriMatch = reURI.Match(startLocation); 640 Match uriMatch = reURI.Match(startLocation);
581 if (uriMatch == null) 641 if (uriMatch == null)
582 { 642 {
@@ -645,8 +705,7 @@ namespace OpenSim.Services.LLLoginService
645 if (parts.Length > 1) 705 if (parts.Length > 1)
646 UInt32.TryParse(parts[1], out port); 706 UInt32.TryParse(parts[1], out port);
647 707
648// GridRegion region = FindForeignRegion(domainName, port, regionName, out gatekeeper); 708 region = FindForeignRegion(domainName, port, regionName, account, out gatekeeper);
649 region = FindForeignRegion(domainName, port, regionName, out gatekeeper);
650 return region; 709 return region;
651 } 710 }
652 } 711 }
@@ -673,7 +732,7 @@ namespace OpenSim.Services.LLLoginService
673 private GridRegion FindAlternativeRegion(UUID scopeID) 732 private GridRegion FindAlternativeRegion(UUID scopeID)
674 { 733 {
675 List<GridRegion> hyperlinks = null; 734 List<GridRegion> hyperlinks = null;
676 List<GridRegion> regions = m_GridService.GetFallbackRegions(scopeID, 1000 * (int)Constants.RegionSize, 1000 * (int)Constants.RegionSize); 735 List<GridRegion> regions = m_GridService.GetFallbackRegions(scopeID, (int)Util.RegionToWorldLoc(1000), (int)Util.RegionToWorldLoc(1000));
677 if (regions != null && regions.Count > 0) 736 if (regions != null && regions.Count > 0)
678 { 737 {
679 hyperlinks = m_GridService.GetHyperlinks(scopeID); 738 hyperlinks = m_GridService.GetHyperlinks(scopeID);
@@ -695,7 +754,7 @@ namespace OpenSim.Services.LLLoginService
695 return null; 754 return null;
696 } 755 }
697 756
698 private GridRegion FindForeignRegion(string domainName, uint port, string regionName, out GridRegion gatekeeper) 757 private GridRegion FindForeignRegion(string domainName, uint port, string regionName, UserAccount account, out GridRegion gatekeeper)
699 { 758 {
700 m_log.Debug("[LLLOGIN SERVICE]: attempting to findforeignregion " + domainName + ":" + port.ToString() + ":" + regionName); 759 m_log.Debug("[LLLOGIN SERVICE]: attempting to findforeignregion " + domainName + ":" + port.ToString() + ":" + regionName);
701 gatekeeper = new GridRegion(); 760 gatekeeper = new GridRegion();
@@ -707,9 +766,14 @@ namespace OpenSim.Services.LLLoginService
707 UUID regionID; 766 UUID regionID;
708 ulong handle; 767 ulong handle;
709 string imageURL = string.Empty, reason = string.Empty; 768 string imageURL = string.Empty, reason = string.Empty;
769 string message;
710 if (m_GatekeeperConnector.LinkRegion(gatekeeper, out regionID, out handle, out domainName, out imageURL, out reason)) 770 if (m_GatekeeperConnector.LinkRegion(gatekeeper, out regionID, out handle, out domainName, out imageURL, out reason))
711 { 771 {
712 GridRegion destination = m_GatekeeperConnector.GetHyperlinkRegion(gatekeeper, regionID); 772 string homeURI = null;
773 if (account.ServiceURLs != null && account.ServiceURLs.ContainsKey("HomeURI"))
774 homeURI = (string)account.ServiceURLs["HomeURI"];
775
776 GridRegion destination = m_GatekeeperConnector.GetHyperlinkRegion(gatekeeper, regionID, account.PrincipalID, homeURI, out message);
713 return destination; 777 return destination;
714 } 778 }
715 779
@@ -858,13 +922,6 @@ namespace OpenSim.Services.LLLoginService
858 SetServiceURLs(aCircuit, account); 922 SetServiceURLs(aCircuit, account);
859 923
860 return aCircuit; 924 return aCircuit;
861
862 //m_UserAgentService.LoginAgentToGrid(aCircuit, GatekeeperServiceConnector, region, out reason);
863 //if (simConnector.CreateAgent(region, aCircuit, 0, out reason))
864 // return aCircuit;
865
866 //return null;
867
868 } 925 }
869 926
870 private void SetServiceURLs(AgentCircuitData aCircuit, UserAccount account) 927 private void SetServiceURLs(AgentCircuitData aCircuit, UserAccount account)
@@ -899,7 +956,7 @@ namespace OpenSim.Services.LLLoginService
899 if (!keyValue.EndsWith("/")) 956 if (!keyValue.EndsWith("/"))
900 keyValue = keyValue + "/"; 957 keyValue = keyValue + "/";
901 958
902 if (!account.ServiceURLs.ContainsKey(keyName) || (account.ServiceURLs.ContainsKey(keyName) && account.ServiceURLs[keyName] != keyValue)) 959 if (!account.ServiceURLs.ContainsKey(keyName) || (account.ServiceURLs.ContainsKey(keyName) && (string)account.ServiceURLs[keyName] != keyValue))
903 { 960 {
904 account.ServiceURLs[keyName] = keyValue; 961 account.ServiceURLs[keyName] = keyValue;
905 newUrls = true; 962 newUrls = true;
@@ -909,6 +966,13 @@ namespace OpenSim.Services.LLLoginService
909 m_log.DebugFormat("[LLLOGIN SERVICE]: found new key {0} {1}", keyName, aCircuit.ServiceURLs[keyName]); 966 m_log.DebugFormat("[LLLOGIN SERVICE]: found new key {0} {1}", keyName, aCircuit.ServiceURLs[keyName]);
910 } 967 }
911 968
969 if (!account.ServiceURLs.ContainsKey("GatekeeperURI") && !string.IsNullOrEmpty(m_GatekeeperURL))
970 {
971 m_log.DebugFormat("[LLLOGIN SERVICE]: adding gatekeeper uri {0}", m_GatekeeperURL);
972 account.ServiceURLs["GatekeeperURI"] = m_GatekeeperURL;
973 newUrls = true;
974 }
975
912 // The grid operator decided to override the defaults in the 976 // The grid operator decided to override the defaults in the
913 // [LoginService] configuration. Let's store the correct ones. 977 // [LoginService] configuration. Let's store the correct ones.
914 if (newUrls) 978 if (newUrls)
@@ -919,13 +983,20 @@ namespace OpenSim.Services.LLLoginService
919 983
920 private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) 984 private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason)
921 { 985 {
922 return simConnector.CreateAgent(region, aCircuit, (uint)flags, out reason); 986 EntityTransferContext ctx = new EntityTransferContext();
987
988 if (!simConnector.QueryAccess(
989 region, aCircuit.AgentID, null, true, aCircuit.startpos, new List<UUID>(), ctx, out reason))
990 return false;
991
992 return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason);
923 } 993 }
924 994
925 private bool LaunchAgentIndirectly(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, IPEndPoint clientIP, out string reason) 995 private bool LaunchAgentIndirectly(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, IPEndPoint clientIP, out string reason)
926 { 996 {
927 m_log.Debug("[LLOGIN SERVICE] Launching agent at " + destination.RegionName); 997 m_log.Debug("[LLOGIN SERVICE]: Launching agent at " + destination.RegionName);
928 if (m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, clientIP, out reason)) 998
999 if (m_UserAgentService.LoginAgentToGrid(null, aCircuit, gatekeeper, destination, true, out reason))
929 return true; 1000 return true;
930 return false; 1001 return false;
931 } 1002 }
@@ -961,14 +1032,25 @@ namespace OpenSim.Services.LLLoginService
961 // or fixing critical issues 1032 // or fixing critical issues
962 // 1033 //
963 if (cmd.Length > 2) 1034 if (cmd.Length > 2)
964 Int32.TryParse(cmd[2], out m_MinLoginLevel); 1035 {
1036 if (Int32.TryParse(cmd[2], out m_MinLoginLevel))
1037 MainConsole.Instance.OutputFormat("Set minimum login level to {0}", m_MinLoginLevel);
1038 else
1039 MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid login level", cmd[2]);
1040 }
965 break; 1041 break;
966 case "reset": 1042
1043 case "reset":
967 m_MinLoginLevel = 0; 1044 m_MinLoginLevel = 0;
1045 MainConsole.Instance.OutputFormat("Reset min login level to {0}", m_MinLoginLevel);
968 break; 1046 break;
1047
969 case "text": 1048 case "text":
970 if (cmd.Length > 2) 1049 if (cmd.Length > 2)
1050 {
971 m_WelcomeMessage = cmd[2]; 1051 m_WelcomeMessage = cmd[2];
1052 MainConsole.Instance.OutputFormat("Login welcome message set to '{0}'", m_WelcomeMessage);
1053 }
972 break; 1054 break;
973 } 1055 }
974 } 1056 }