aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
diff options
context:
space:
mode:
authorlbsa712009-03-12 10:50:59 +0000
committerlbsa712009-03-12 10:50:59 +0000
commit33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a (patch)
treeeb1bb1db8b93b4038d8f12d4d7abee2e5071b9fe /OpenSim/Grid/UserServer.Modules/UserLoginService.cs
parentMove ArchiveConstants to OpenSim.Framework.Archive (diff)
downloadopensim-SC_OLD-33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a.zip
opensim-SC_OLD-33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a.tar.gz
opensim-SC_OLD-33f511ee4b5b4e1f8fe4fbb47d3b5b51e1d0104a.tar.bz2
opensim-SC_OLD-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/UserLoginService.cs')
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserLoginService.cs196
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}