diff options
author | lbsa71 | 2009-03-12 10:50:59 +0000 |
---|---|---|
committer | lbsa71 | 2009-03-12 10:50:59 +0000 |
commit | 33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a (patch) | |
tree | eb1bb1db8b93b4038d8f12d4d7abee2e5071b9fe /OpenSim/Grid/UserServer.Modules | |
parent | Move ArchiveConstants to OpenSim.Framework.Archive (diff) | |
download | opensim-SC-33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a.zip opensim-SC-33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a.tar.gz opensim-SC-33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a.tar.bz2 opensim-SC-33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a.tar.xz |
* Another stab at refactoring up the CustomiseResponse function. Two fixes:
* Sometimes, null is a valid return value to indicate 'none found'. doh.
* Sometimes, the Grid server does not send simURI - this you need to reconstruct yourself. Euw.
(I believe) this solves mantis issue #3287
Diffstat (limited to 'OpenSim/Grid/UserServer.Modules')
-rw-r--r-- | OpenSim/Grid/UserServer.Modules/UserLoginService.cs | 196 |
1 files changed, 47 insertions, 149 deletions
diff --git a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs index 4e672f6..f7ee8ef 100644 --- a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs +++ b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs | |||
@@ -99,11 +99,11 @@ namespace OpenSim.Grid.UserServer.Modules | |||
99 | m_httpServer.AddStreamHandler(new OpenIdStreamHandler("GET", "/openid/server/", this)); | 99 | m_httpServer.AddStreamHandler(new OpenIdStreamHandler("GET", "/openid/server/", this)); |
100 | } | 100 | } |
101 | } | 101 | } |
102 | 102 | ||
103 | public void setloginlevel(int level) | 103 | public void setloginlevel(int level) |
104 | { | 104 | { |
105 | m_minLoginLevel = level; | 105 | m_minLoginLevel = level; |
106 | m_log.InfoFormat("[GRID]: Login Level set to {0} ", level); | 106 | m_log.InfoFormat("[GRID]: Login Level set to {0} ", level); |
107 | } | 107 | } |
108 | public void setwelcometext(string text) | 108 | public void setwelcometext(string text) |
109 | { | 109 | { |
@@ -199,155 +199,49 @@ namespace OpenSim.Grid.UserServer.Modules | |||
199 | //base.LogOffUser(theUser); | 199 | //base.LogOffUser(theUser); |
200 | } | 200 | } |
201 | 201 | ||
202 | /// <summary> | 202 | protected override RegionInfo RequestClosestRegion(string region) |
203 | /// Customises the login response and fills in missing values. | ||
204 | /// </summary> | ||
205 | /// <param name="response">The existing response</param> | ||
206 | /// <param name="theUser">The user profile</param> | ||
207 | /// <param name="startLocationRequest">The requested start location</param> | ||
208 | public override bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest) | ||
209 | { | 203 | { |
210 | // add active gestures to login-response | 204 | RegionProfileData profileData = m_regionProfileService.RequestSimProfileData(region, |
211 | AddActiveGestures(response, theUser); | 205 | m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey); |
212 | |||
213 | // HomeLocation | ||
214 | RegionProfileData homeInfo = null; | ||
215 | // use the homeRegionID if it is stored already. If not, use the regionHandle as before | ||
216 | UUID homeRegionId = theUser.HomeRegionID; | ||
217 | ulong homeRegionHandle = theUser.HomeRegion; | ||
218 | if (homeRegionId != UUID.Zero) | ||
219 | { | ||
220 | homeInfo = GetRegionInfo(homeRegionId); | ||
221 | } | ||
222 | else | ||
223 | { | ||
224 | homeInfo = GetRegionInfo(homeRegionHandle); | ||
225 | } | ||
226 | 206 | ||
227 | if (homeInfo != null) | 207 | if (profileData != null) |
228 | { | 208 | { |
229 | response.Home = | 209 | return profileData.ToRegionInfo(); |
230 | string.Format( | ||
231 | "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}", | ||
232 | (homeInfo.regionLocX*Constants.RegionSize), | ||
233 | (homeInfo.regionLocY*Constants.RegionSize), | ||
234 | theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z, | ||
235 | theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z); | ||
236 | } | 210 | } |
237 | else | 211 | else |
238 | { | 212 | { |
239 | // Emergency mode: Home-region isn't available, so we can't request the region info. | 213 | return null; |
240 | // Use the stored home regionHandle instead. | ||
241 | // NOTE: If the home-region moves, this will be wrong until the users update their user-profile again | ||
242 | ulong regionX = homeRegionHandle >> 32; | ||
243 | ulong regionY = homeRegionHandle & 0xffffffff; | ||
244 | response.Home = | ||
245 | string.Format( | ||
246 | "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}", | ||
247 | regionX, regionY, | ||
248 | theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z, | ||
249 | theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z); | ||
250 | m_log.InfoFormat("[LOGIN] Home region of user {0} {1} is not available; using computed region position {2} {3}", | ||
251 | theUser.FirstName, theUser.SurName, | ||
252 | regionX, regionY); | ||
253 | } | 214 | } |
215 | } | ||
254 | 216 | ||
255 | // StartLocation | 217 | protected override RegionInfo GetRegionInfo(ulong homeRegionHandle) |
256 | RegionProfileData regionInfo = null; | 218 | { |
257 | if (startLocationRequest == "home") | 219 | RegionProfileData profileData = m_regionProfileService.RequestSimProfileData(homeRegionHandle, |
258 | { | 220 | m_config.GridServerURL, m_config.GridSendKey, |
259 | regionInfo = homeInfo; | 221 | m_config.GridRecvKey); |
260 | theUser.CurrentAgent.Position = theUser.HomeLocation; | 222 | if (profileData != null) |
261 | response.LookAt = "[r" + theUser.HomeLookAt.X.ToString() + ",r" + theUser.HomeLookAt.Y.ToString() + ",r" + theUser.HomeLookAt.Z.ToString() + "]"; | ||
262 | } | ||
263 | else if (startLocationRequest == "last") | ||
264 | { | 223 | { |
265 | UUID lastRegion = theUser.CurrentAgent.Region; | 224 | return profileData.ToRegionInfo(); |
266 | regionInfo = GetRegionInfo(lastRegion); | ||
267 | response.LookAt = "[r" + theUser.CurrentAgent.LookAt.X.ToString() + ",r" + theUser.CurrentAgent.LookAt.Y.ToString() + ",r" + theUser.CurrentAgent.LookAt.Z.ToString() + "]"; | ||
268 | } | 225 | } |
269 | else | 226 | else |
270 | { | 227 | { |
271 | Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$"); | 228 | return null; |
272 | Match uriMatch = reURI.Match(startLocationRequest); | ||
273 | if (uriMatch == null) | ||
274 | { | ||
275 | m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, but can't process it", startLocationRequest); | ||
276 | } | ||
277 | else | ||
278 | { | ||
279 | string region = uriMatch.Groups["region"].ToString(); | ||
280 | regionInfo = RequestClosestRegion(region); | ||
281 | if (regionInfo == null) | ||
282 | { | ||
283 | m_log.InfoFormat("[LOGIN]: Got Custom Login URL {0}, can't locate region {1}", startLocationRequest, region); | ||
284 | } | ||
285 | else | ||
286 | { | ||
287 | theUser.CurrentAgent.Position = new Vector3(float.Parse(uriMatch.Groups["x"].Value), | ||
288 | float.Parse(uriMatch.Groups["y"].Value), float.Parse(uriMatch.Groups["z"].Value)); | ||
289 | } | ||
290 | } | ||
291 | response.LookAt = "[r0,r1,r0]"; | ||
292 | // can be: last, home, safe, url | ||
293 | response.StartLocation = "url"; | ||
294 | } | 229 | } |
230 | } | ||
295 | 231 | ||
296 | if ((regionInfo != null) && (PrepareLoginToRegion(regionInfo, theUser, response))) | 232 | protected override RegionInfo GetRegionInfo(UUID homeRegionId) |
233 | { | ||
234 | RegionProfileData profileData = m_regionProfileService.RequestSimProfileData(homeRegionId, | ||
235 | m_config.GridServerURL, m_config.GridSendKey, | ||
236 | m_config.GridRecvKey); | ||
237 | if (profileData != null) | ||
297 | { | 238 | { |
298 | return true; | 239 | return profileData.ToRegionInfo(); |
299 | } | 240 | } |
300 | 241 | else | |
301 | // StartLocation not available, send him to a nearby region instead | ||
302 | //regionInfo = RegionProfileData.RequestSimProfileData("", m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey); | ||
303 | //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName); | ||
304 | |||
305 | // Send him to default region instead | ||
306 | // Load information from the gridserver | ||
307 | ulong defaultHandle = (((ulong) m_defaultHomeX * Constants.RegionSize) << 32) | | ||
308 | ((ulong) m_defaultHomeY * Constants.RegionSize); | ||
309 | |||
310 | if ((regionInfo != null) && (defaultHandle == regionInfo.regionHandle)) | ||
311 | { | 242 | { |
312 | m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region"); | 243 | return null; |
313 | return false; | ||
314 | } | 244 | } |
315 | |||
316 | m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead"); | ||
317 | regionInfo = GetRegionInfo(defaultHandle); | ||
318 | |||
319 | // Customise the response | ||
320 | //response.Home = | ||
321 | // string.Format( | ||
322 | // "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}", | ||
323 | // (SimInfo.regionLocX * Constants.RegionSize), | ||
324 | // (SimInfo.regionLocY*Constants.RegionSize), | ||
325 | // theUser.HomeLocation.X, theUser.HomeLocation.Y, theUser.HomeLocation.Z, | ||
326 | // theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z); | ||
327 | theUser.CurrentAgent.Position = new Vector3(128,128,0); | ||
328 | response.StartLocation = "safe"; | ||
329 | |||
330 | return PrepareLoginToRegion(regionInfo, theUser, response); | ||
331 | } | ||
332 | |||
333 | protected RegionProfileData RequestClosestRegion(string region) | ||
334 | { | ||
335 | return m_regionProfileService.RequestSimProfileData(region, | ||
336 | m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey); | ||
337 | } | ||
338 | |||
339 | protected RegionProfileData GetRegionInfo(ulong homeRegionHandle) | ||
340 | { | ||
341 | return m_regionProfileService.RequestSimProfileData(homeRegionHandle, | ||
342 | m_config.GridServerURL, m_config.GridSendKey, | ||
343 | m_config.GridRecvKey); | ||
344 | } | ||
345 | |||
346 | protected RegionProfileData GetRegionInfo(UUID homeRegionId) | ||
347 | { | ||
348 | return m_regionProfileService.RequestSimProfileData(homeRegionId, | ||
349 | m_config.GridServerURL, m_config.GridSendKey, | ||
350 | m_config.GridRecvKey); | ||
351 | } | 245 | } |
352 | 246 | ||
353 | /// <summary> | 247 | /// <summary> |
@@ -359,7 +253,7 @@ namespace OpenSim.Grid.UserServer.Modules | |||
359 | /// <param name="theUser"> | 253 | /// <param name="theUser"> |
360 | /// A <see cref="UserProfileData"/> | 254 | /// A <see cref="UserProfileData"/> |
361 | /// </param> | 255 | /// </param> |
362 | private void AddActiveGestures(LoginResponse response, UserProfileData theUser) | 256 | protected override void AddActiveGestures(LoginResponse response, UserProfileData theUser) |
363 | { | 257 | { |
364 | List<InventoryItemBase> gestures = m_inventoryService.GetActiveGestures(theUser.ID); | 258 | List<InventoryItemBase> gestures = m_inventoryService.GetActiveGestures(theUser.ID); |
365 | //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count); | 259 | //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count); |
@@ -377,18 +271,23 @@ namespace OpenSim.Grid.UserServer.Modules | |||
377 | response.ActiveGestures = list; | 271 | response.ActiveGestures = list; |
378 | } | 272 | } |
379 | 273 | ||
274 | protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response) | ||
275 | { | ||
276 | return PrepareLoginToRegion(RegionProfileData.FromRegionInfo(regionInfo), user, response); | ||
277 | } | ||
278 | |||
380 | /// <summary> | 279 | /// <summary> |
381 | /// Prepare a login to the given region. This involves both telling the region to expect a connection | 280 | /// Prepare a login to the given region. This involves both telling the region to expect a connection |
382 | /// and appropriately customising the response to the user. | 281 | /// and appropriately customising the response to the user. |
383 | /// </summary> | 282 | /// </summary> |
384 | /// <param name="sim"></param> | 283 | /// <param name="regionInfo"></param> |
385 | /// <param name="user"></param> | 284 | /// <param name="user"></param> |
386 | /// <param name="response"></param> | 285 | /// <param name="response"></param> |
387 | /// <returns>true if the region was successfully contacted, false otherwise</returns> | 286 | /// <returns>true if the region was successfully contacted, false otherwise</returns> |
388 | private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response) | 287 | private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response) |
389 | { | 288 | { |
390 | try | 289 | try |
391 | { | 290 | { |
392 | response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString(); | 291 | response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString(); |
393 | response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]); | 292 | response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]); |
394 | response.RegionX = regionInfo.regionLocX; | 293 | response.RegionX = regionInfo.regionLocX; |
@@ -405,11 +304,11 @@ namespace OpenSim.Grid.UserServer.Modules | |||
405 | m_log.InfoFormat( | 304 | m_log.InfoFormat( |
406 | "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", | 305 | "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", |
407 | regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI); | 306 | regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI); |
408 | 307 | ||
409 | // Update agent with target sim | 308 | // Update agent with target sim |
410 | user.CurrentAgent.Region = regionInfo.UUID; | 309 | user.CurrentAgent.Region = regionInfo.UUID; |
411 | user.CurrentAgent.Handle = regionInfo.regionHandle; | 310 | user.CurrentAgent.Handle = regionInfo.regionHandle; |
412 | 311 | ||
413 | // Prepare notification | 312 | // Prepare notification |
414 | Hashtable loginParams = new Hashtable(); | 313 | Hashtable loginParams = new Hashtable(); |
415 | loginParams["session_id"] = user.CurrentAgent.SessionID.ToString(); | 314 | loginParams["session_id"] = user.CurrentAgent.SessionID.ToString(); |
@@ -417,7 +316,7 @@ namespace OpenSim.Grid.UserServer.Modules | |||
417 | loginParams["firstname"] = user.FirstName; | 316 | loginParams["firstname"] = user.FirstName; |
418 | loginParams["lastname"] = user.SurName; | 317 | loginParams["lastname"] = user.SurName; |
419 | loginParams["agent_id"] = user.ID.ToString(); | 318 | loginParams["agent_id"] = user.ID.ToString(); |
420 | loginParams["circuit_code"] = (Int32) Convert.ToUInt32(response.CircuitCode); | 319 | loginParams["circuit_code"] = (Int32)Convert.ToUInt32(response.CircuitCode); |
421 | loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString(); | 320 | loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString(); |
422 | loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString(); | 321 | loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString(); |
423 | loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString(); | 322 | loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString(); |
@@ -450,10 +349,10 @@ namespace OpenSim.Grid.UserServer.Modules | |||
450 | 349 | ||
451 | if (GridResp.Value != null) | 350 | if (GridResp.Value != null) |
452 | { | 351 | { |
453 | Hashtable resp = (Hashtable) GridResp.Value; | 352 | Hashtable resp = (Hashtable)GridResp.Value; |
454 | if (resp.ContainsKey("success")) | 353 | if (resp.ContainsKey("success")) |
455 | { | 354 | { |
456 | if ((string) resp["success"] == "FALSE") | 355 | if ((string)resp["success"] == "FALSE") |
457 | { | 356 | { |
458 | responseSuccess = false; | 357 | responseSuccess = false; |
459 | } | 358 | } |
@@ -533,7 +432,7 @@ namespace OpenSim.Grid.UserServer.Modules | |||
533 | 432 | ||
534 | foreach (InventoryFolderBase InvFolder in folders) | 433 | foreach (InventoryFolderBase InvFolder in folders) |
535 | { | 434 | { |
536 | // m_log.DebugFormat("[LOGIN]: Received agent inventory folder {0}", InvFolder.name); | 435 | // m_log.DebugFormat("[LOGIN]: Received agent inventory folder {0}", InvFolder.name); |
537 | 436 | ||
538 | if (InvFolder.ParentID == UUID.Zero) | 437 | if (InvFolder.ParentID == UUID.Zero) |
539 | { | 438 | { |
@@ -542,8 +441,8 @@ namespace OpenSim.Grid.UserServer.Modules | |||
542 | TempHash = new Hashtable(); | 441 | TempHash = new Hashtable(); |
543 | TempHash["name"] = InvFolder.Name; | 442 | TempHash["name"] = InvFolder.Name; |
544 | TempHash["parent_id"] = InvFolder.ParentID.ToString(); | 443 | TempHash["parent_id"] = InvFolder.ParentID.ToString(); |
545 | TempHash["version"] = (Int32) InvFolder.Version; | 444 | TempHash["version"] = (Int32)InvFolder.Version; |
546 | TempHash["type_default"] = (Int32) InvFolder.Type; | 445 | TempHash["type_default"] = (Int32)InvFolder.Type; |
547 | TempHash["folder_id"] = InvFolder.ID.ToString(); | 446 | TempHash["folder_id"] = InvFolder.ID.ToString(); |
548 | AgentInventoryArray.Add(TempHash); | 447 | AgentInventoryArray.Add(TempHash); |
549 | } | 448 | } |
@@ -559,14 +458,14 @@ namespace OpenSim.Grid.UserServer.Modules | |||
559 | public XmlRpcResponse XmlRPCSetLoginParams(XmlRpcRequest request) | 458 | public XmlRpcResponse XmlRPCSetLoginParams(XmlRpcRequest request) |
560 | { | 459 | { |
561 | XmlRpcResponse response = new XmlRpcResponse(); | 460 | XmlRpcResponse response = new XmlRpcResponse(); |
562 | Hashtable requestData = (Hashtable) request.Params[0]; | 461 | Hashtable requestData = (Hashtable)request.Params[0]; |
563 | UserProfileData userProfile; | 462 | UserProfileData userProfile; |
564 | Hashtable responseData = new Hashtable(); | 463 | Hashtable responseData = new Hashtable(); |
565 | 464 | ||
566 | UUID uid; | 465 | UUID uid; |
567 | string pass = requestData["password"].ToString(); | 466 | string pass = requestData["password"].ToString(); |
568 | 467 | ||
569 | if (!UUID.TryParse((string) requestData["avatar_uuid"], out uid)) | 468 | if (!UUID.TryParse((string)requestData["avatar_uuid"], out uid)) |
570 | { | 469 | { |
571 | responseData["error"] = "No authorization"; | 470 | responseData["error"] = "No authorization"; |
572 | response.Value = responseData; | 471 | response.Value = responseData; |
@@ -597,6 +496,5 @@ namespace OpenSim.Grid.UserServer.Modules | |||
597 | response.Value = responseData; | 496 | response.Value = responseData; |
598 | return response; | 497 | return response; |
599 | } | 498 | } |
600 | |||
601 | } | 499 | } |
602 | } | 500 | } |