diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Services/LLLoginService/LLLoginService.cs | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 269bb46..b0e36f1 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs | |||
@@ -108,7 +108,9 @@ namespace OpenSim.Services.LLLoginService | |||
108 | 108 | ||
109 | try | 109 | try |
110 | { | 110 | { |
111 | // | ||
111 | // Get the account and check that it exists | 112 | // Get the account and check that it exists |
113 | // | ||
112 | UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, firstName, lastName); | 114 | UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, firstName, lastName); |
113 | if (account == null) | 115 | if (account == null) |
114 | { | 116 | { |
@@ -122,7 +124,9 @@ namespace OpenSim.Services.LLLoginService | |||
122 | return LLFailedLoginResponse.LoginBlockedProblem; | 124 | return LLFailedLoginResponse.LoginBlockedProblem; |
123 | } | 125 | } |
124 | 126 | ||
127 | // | ||
125 | // Authenticate this user | 128 | // Authenticate this user |
129 | // | ||
126 | if (!passwd.StartsWith("$1$")) | 130 | if (!passwd.StartsWith("$1$")) |
127 | passwd = "$1$" + Util.Md5Hash(passwd); | 131 | passwd = "$1$" + Util.Md5Hash(passwd); |
128 | passwd = passwd.Remove(0, 3); //remove $1$ | 132 | passwd = passwd.Remove(0, 3); //remove $1$ |
@@ -134,7 +138,9 @@ namespace OpenSim.Services.LLLoginService | |||
134 | return LLFailedLoginResponse.UserProblem; | 138 | return LLFailedLoginResponse.UserProblem; |
135 | } | 139 | } |
136 | 140 | ||
141 | // | ||
137 | // Get the user's inventory | 142 | // Get the user's inventory |
143 | // | ||
138 | if (m_RequireInventory && m_InventoryService == null) | 144 | if (m_RequireInventory && m_InventoryService == null) |
139 | { | 145 | { |
140 | m_log.WarnFormat("[LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); | 146 | m_log.WarnFormat("[LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); |
@@ -147,9 +153,9 @@ namespace OpenSim.Services.LLLoginService | |||
147 | return LLFailedLoginResponse.InventoryProblem; | 153 | return LLFailedLoginResponse.InventoryProblem; |
148 | } | 154 | } |
149 | 155 | ||
156 | // | ||
150 | // Login the presence | 157 | // Login the presence |
151 | // We may want to check for user already logged in, to | 158 | // |
152 | // stay compatible with what people expect... | ||
153 | PresenceInfo presence = null; | 159 | PresenceInfo presence = null; |
154 | GridRegion home = null; | 160 | GridRegion home = null; |
155 | if (m_PresenceService != null) | 161 | if (m_PresenceService != null) |
@@ -171,7 +177,9 @@ namespace OpenSim.Services.LLLoginService | |||
171 | } | 177 | } |
172 | } | 178 | } |
173 | 179 | ||
180 | // | ||
174 | // Find the destination region/grid | 181 | // Find the destination region/grid |
182 | // | ||
175 | string where = string.Empty; | 183 | string where = string.Empty; |
176 | Vector3 position = Vector3.Zero; | 184 | Vector3 position = Vector3.Zero; |
177 | Vector3 lookAt = Vector3.Zero; | 185 | Vector3 lookAt = Vector3.Zero; |
@@ -183,14 +191,18 @@ namespace OpenSim.Services.LLLoginService | |||
183 | return LLFailedLoginResponse.GridProblem; | 191 | return LLFailedLoginResponse.GridProblem; |
184 | } | 192 | } |
185 | 193 | ||
194 | // | ||
186 | // Get the avatar | 195 | // Get the avatar |
196 | // | ||
187 | AvatarData avatar = null; | 197 | AvatarData avatar = null; |
188 | if (m_AvatarService != null) | 198 | if (m_AvatarService != null) |
189 | { | 199 | { |
190 | avatar = m_AvatarService.GetAvatar(account.PrincipalID); | 200 | avatar = m_AvatarService.GetAvatar(account.PrincipalID); |
191 | } | 201 | } |
192 | 202 | ||
203 | // | ||
193 | // Instantiate/get the simulation interface and launch an agent at the destination | 204 | // Instantiate/get the simulation interface and launch an agent at the destination |
205 | // | ||
194 | ISimulationService simConnector = null; | 206 | ISimulationService simConnector = null; |
195 | string reason = string.Empty; | 207 | string reason = string.Empty; |
196 | uint circuitCode = 0; | 208 | uint circuitCode = 0; |
@@ -210,14 +222,36 @@ namespace OpenSim.Services.LLLoginService | |||
210 | } | 222 | } |
211 | if (aCircuit == null) | 223 | if (aCircuit == null) |
212 | { | 224 | { |
213 | m_PresenceService.LogoutAgent(session, presence.Position, presence.LookAt); | 225 | // Try the fallback regions |
214 | m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: {0}", reason); | 226 | List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, destination.RegionLocX, destination.RegionLocY); |
215 | return LLFailedLoginResponse.AuthorizationProblem; | 227 | if (fallbacks != null) |
228 | { | ||
229 | foreach (GridRegion r in fallbacks) | ||
230 | { | ||
231 | aCircuit = LaunchAgent(simConnector, r, account, avatar, session, secureSession, circuitCode, position, out reason); | ||
232 | if (aCircuit != null) | ||
233 | { | ||
234 | where = "safe"; | ||
235 | destination = r; | ||
236 | break; | ||
237 | } | ||
238 | } | ||
239 | } | ||
240 | |||
241 | if (aCircuit == null) | ||
242 | { | ||
243 | // we tried... | ||
244 | m_PresenceService.LogoutAgent(session, presence.Position, presence.LookAt); | ||
245 | m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: {0}", reason); | ||
246 | return LLFailedLoginResponse.AuthorizationProblem; | ||
247 | } | ||
216 | } | 248 | } |
217 | 249 | ||
218 | // TODO: Get Friends list... | 250 | // TODO: Get Friends list... |
219 | 251 | ||
252 | // | ||
220 | // Finally, fill out the response and return it | 253 | // Finally, fill out the response and return it |
254 | // | ||
221 | LLLoginResponse response = new LLLoginResponse(account, aCircuit, presence, destination, inventorySkel, m_LibraryService, | 255 | LLLoginResponse response = new LLLoginResponse(account, aCircuit, presence, destination, inventorySkel, m_LibraryService, |
222 | where, startLocation, position, lookAt, m_WelcomeMessage, home, clientIP); | 256 | where, startLocation, position, lookAt, m_WelcomeMessage, home, clientIP); |
223 | 257 | ||
@@ -239,12 +273,13 @@ namespace OpenSim.Services.LLLoginService | |||
239 | where = "home"; | 273 | where = "home"; |
240 | position = new Vector3(128, 128, 0); | 274 | position = new Vector3(128, 128, 0); |
241 | lookAt = new Vector3(0, 1, 0); | 275 | lookAt = new Vector3(0, 1, 0); |
276 | |||
277 | if (m_GridService == null) | ||
278 | return null; | ||
279 | |||
242 | if (startLocation.Equals("home")) | 280 | if (startLocation.Equals("home")) |
243 | { | 281 | { |
244 | // logging into home region | 282 | // logging into home region |
245 | if (m_PresenceService == null || m_GridService == null) | ||
246 | return null; | ||
247 | |||
248 | if (pinfo == null) | 283 | if (pinfo == null) |
249 | return null; | 284 | return null; |
250 | 285 | ||
@@ -271,8 +306,6 @@ namespace OpenSim.Services.LLLoginService | |||
271 | { | 306 | { |
272 | // logging into last visited region | 307 | // logging into last visited region |
273 | where = "last"; | 308 | where = "last"; |
274 | if (m_PresenceService == null || m_GridService == null) | ||
275 | return null; | ||
276 | 309 | ||
277 | if (pinfo == null) | 310 | if (pinfo == null) |
278 | return null; | 311 | return null; |
@@ -320,8 +353,6 @@ namespace OpenSim.Services.LLLoginService | |||
320 | { | 353 | { |
321 | if (!regionName.Contains("@")) | 354 | if (!regionName.Contains("@")) |
322 | { | 355 | { |
323 | if (m_GridService == null) | ||
324 | return null; | ||
325 | 356 | ||
326 | List<GridRegion> regions = m_GridService.GetRegionsByName(account.ScopeID, regionName, 1); | 357 | List<GridRegion> regions = m_GridService.GetRegionsByName(account.ScopeID, regionName, 1); |
327 | if ((regions == null) || (regions != null && regions.Count == 0)) | 358 | if ((regions == null) || (regions != null && regions.Count == 0)) |
@@ -363,13 +394,9 @@ namespace OpenSim.Services.LLLoginService | |||
363 | region.RegionName = regionName; | 394 | region.RegionName = regionName; |
364 | return region; | 395 | return region; |
365 | } | 396 | } |
366 | |||
367 | } | 397 | } |
368 | else | 398 | else |
369 | { | 399 | { |
370 | if (m_PresenceService == null || m_GridService == null) | ||
371 | return null; | ||
372 | |||
373 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID); | 400 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.ScopeID); |
374 | if (defaults != null && defaults.Count > 0) | 401 | if (defaults != null && defaults.Count > 0) |
375 | { | 402 | { |