aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid
diff options
context:
space:
mode:
authorlbsa712009-03-10 12:11:19 +0000
committerlbsa712009-03-10 12:11:19 +0000
commit0df0258087e18757a77514ac4cba8a50e01b27d5 (patch)
tree7896a546e9782c105f7bcbfa07cd7df0d5407929 /OpenSim/Grid
parent* Re-aligned CustomiseResponse function for imminent up-pulling (diff)
downloadopensim-SC-0df0258087e18757a77514ac4cba8a50e01b27d5.zip
opensim-SC-0df0258087e18757a77514ac4cba8a50e01b27d5.tar.gz
opensim-SC-0df0258087e18757a77514ac4cba8a50e01b27d5.tar.bz2
opensim-SC-0df0258087e18757a77514ac4cba8a50e01b27d5.tar.xz
*** POTENTIAL BREAKAGE ***
* Finally got to the point where I could pull up the CustomiseResponse function. Major de-duplication. * Introduced FromRegionInfo on RegionProfileData * This revision needs both grid and standalone testing galore. Work in progress!
Diffstat (limited to 'OpenSim/Grid')
-rw-r--r--OpenSim/Grid/UserServer.Modules/UserLoginService.cs183
1 files changed, 28 insertions, 155 deletions
diff --git a/OpenSim/Grid/UserServer.Modules/UserLoginService.cs b/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
index 4e672f6..b695ff5 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,24 @@ 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 {
210 // add active gestures to login-response
211 AddActiveGestures(response, theUser);
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
227 if (homeInfo != null)
228 {
229 response.Home =
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 }
237 else
238 {
239 // Emergency mode: Home-region isn't available, so we can't request the region info.
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 }
254
255 // StartLocation
256 RegionProfileData regionInfo = null;
257 if (startLocationRequest == "home")
258 {
259 regionInfo = homeInfo;
260 theUser.CurrentAgent.Position = theUser.HomeLocation;
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 {
265 UUID lastRegion = theUser.CurrentAgent.Region;
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 }
269 else
270 {
271 Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$");
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 }
295
296 if ((regionInfo != null) && (PrepareLoginToRegion(regionInfo, theUser, response)))
297 {
298 return true;
299 }
300
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 {
312 m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region");
313 return false;
314 }
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 { 203 {
335 return m_regionProfileService.RequestSimProfileData(region, 204 return m_regionProfileService.RequestSimProfileData(region,
336 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey); 205 m_config.GridServerURL, m_config.GridSendKey, m_config.GridRecvKey).ToRegionInfo();
337 } 206 }
338 207
339 protected RegionProfileData GetRegionInfo(ulong homeRegionHandle) 208 protected override RegionInfo GetRegionInfo(ulong homeRegionHandle)
340 { 209 {
341 return m_regionProfileService.RequestSimProfileData(homeRegionHandle, 210 return m_regionProfileService.RequestSimProfileData(homeRegionHandle,
342 m_config.GridServerURL, m_config.GridSendKey, 211 m_config.GridServerURL, m_config.GridSendKey,
343 m_config.GridRecvKey); 212 m_config.GridRecvKey).ToRegionInfo();
344 } 213 }
345 214
346 protected RegionProfileData GetRegionInfo(UUID homeRegionId) 215 protected override RegionInfo GetRegionInfo(UUID homeRegionId)
347 { 216 {
348 return m_regionProfileService.RequestSimProfileData(homeRegionId, 217 return m_regionProfileService.RequestSimProfileData(homeRegionId,
349 m_config.GridServerURL, m_config.GridSendKey, 218 m_config.GridServerURL, m_config.GridSendKey,
350 m_config.GridRecvKey); 219 m_config.GridRecvKey).ToRegionInfo();
351 } 220 }
352 221
353 /// <summary> 222 /// <summary>
@@ -359,7 +228,7 @@ namespace OpenSim.Grid.UserServer.Modules
359 /// <param name="theUser"> 228 /// <param name="theUser">
360 /// A <see cref="UserProfileData"/> 229 /// A <see cref="UserProfileData"/>
361 /// </param> 230 /// </param>
362 private void AddActiveGestures(LoginResponse response, UserProfileData theUser) 231 protected override void AddActiveGestures(LoginResponse response, UserProfileData theUser)
363 { 232 {
364 List<InventoryItemBase> gestures = m_inventoryService.GetActiveGestures(theUser.ID); 233 List<InventoryItemBase> gestures = m_inventoryService.GetActiveGestures(theUser.ID);
365 //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count); 234 //m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count);
@@ -377,18 +246,23 @@ namespace OpenSim.Grid.UserServer.Modules
377 response.ActiveGestures = list; 246 response.ActiveGestures = list;
378 } 247 }
379 248
249 protected override bool PrepareLoginToRegion(RegionInfo regionInfo, UserProfileData user, LoginResponse response)
250 {
251 return PrepareLoginToRegion(RegionProfileData.FromRegionInfo(regionInfo), user, response);
252 }
253
380 /// <summary> 254 /// <summary>
381 /// Prepare a login to the given region. This involves both telling the region to expect a connection 255 /// 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. 256 /// and appropriately customising the response to the user.
383 /// </summary> 257 /// </summary>
384 /// <param name="sim"></param> 258 /// <param name="regionInfo"></param>
385 /// <param name="user"></param> 259 /// <param name="user"></param>
386 /// <param name="response"></param> 260 /// <param name="response"></param>
387 /// <returns>true if the region was successfully contacted, false otherwise</returns> 261 /// <returns>true if the region was successfully contacted, false otherwise</returns>
388 private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response) 262 private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response)
389 { 263 {
390 try 264 try
391 { 265 {
392 response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString(); 266 response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString();
393 response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]); 267 response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]);
394 response.RegionX = regionInfo.regionLocX; 268 response.RegionX = regionInfo.regionLocX;
@@ -405,11 +279,11 @@ namespace OpenSim.Grid.UserServer.Modules
405 m_log.InfoFormat( 279 m_log.InfoFormat(
406 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", 280 "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection",
407 regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI); 281 regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI);
408 282
409 // Update agent with target sim 283 // Update agent with target sim
410 user.CurrentAgent.Region = regionInfo.UUID; 284 user.CurrentAgent.Region = regionInfo.UUID;
411 user.CurrentAgent.Handle = regionInfo.regionHandle; 285 user.CurrentAgent.Handle = regionInfo.regionHandle;
412 286
413 // Prepare notification 287 // Prepare notification
414 Hashtable loginParams = new Hashtable(); 288 Hashtable loginParams = new Hashtable();
415 loginParams["session_id"] = user.CurrentAgent.SessionID.ToString(); 289 loginParams["session_id"] = user.CurrentAgent.SessionID.ToString();
@@ -417,7 +291,7 @@ namespace OpenSim.Grid.UserServer.Modules
417 loginParams["firstname"] = user.FirstName; 291 loginParams["firstname"] = user.FirstName;
418 loginParams["lastname"] = user.SurName; 292 loginParams["lastname"] = user.SurName;
419 loginParams["agent_id"] = user.ID.ToString(); 293 loginParams["agent_id"] = user.ID.ToString();
420 loginParams["circuit_code"] = (Int32) Convert.ToUInt32(response.CircuitCode); 294 loginParams["circuit_code"] = (Int32)Convert.ToUInt32(response.CircuitCode);
421 loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString(); 295 loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString();
422 loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString(); 296 loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString();
423 loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString(); 297 loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString();
@@ -450,10 +324,10 @@ namespace OpenSim.Grid.UserServer.Modules
450 324
451 if (GridResp.Value != null) 325 if (GridResp.Value != null)
452 { 326 {
453 Hashtable resp = (Hashtable) GridResp.Value; 327 Hashtable resp = (Hashtable)GridResp.Value;
454 if (resp.ContainsKey("success")) 328 if (resp.ContainsKey("success"))
455 { 329 {
456 if ((string) resp["success"] == "FALSE") 330 if ((string)resp["success"] == "FALSE")
457 { 331 {
458 responseSuccess = false; 332 responseSuccess = false;
459 } 333 }
@@ -533,7 +407,7 @@ namespace OpenSim.Grid.UserServer.Modules
533 407
534 foreach (InventoryFolderBase InvFolder in folders) 408 foreach (InventoryFolderBase InvFolder in folders)
535 { 409 {
536// m_log.DebugFormat("[LOGIN]: Received agent inventory folder {0}", InvFolder.name); 410 // m_log.DebugFormat("[LOGIN]: Received agent inventory folder {0}", InvFolder.name);
537 411
538 if (InvFolder.ParentID == UUID.Zero) 412 if (InvFolder.ParentID == UUID.Zero)
539 { 413 {
@@ -542,8 +416,8 @@ namespace OpenSim.Grid.UserServer.Modules
542 TempHash = new Hashtable(); 416 TempHash = new Hashtable();
543 TempHash["name"] = InvFolder.Name; 417 TempHash["name"] = InvFolder.Name;
544 TempHash["parent_id"] = InvFolder.ParentID.ToString(); 418 TempHash["parent_id"] = InvFolder.ParentID.ToString();
545 TempHash["version"] = (Int32) InvFolder.Version; 419 TempHash["version"] = (Int32)InvFolder.Version;
546 TempHash["type_default"] = (Int32) InvFolder.Type; 420 TempHash["type_default"] = (Int32)InvFolder.Type;
547 TempHash["folder_id"] = InvFolder.ID.ToString(); 421 TempHash["folder_id"] = InvFolder.ID.ToString();
548 AgentInventoryArray.Add(TempHash); 422 AgentInventoryArray.Add(TempHash);
549 } 423 }
@@ -559,14 +433,14 @@ namespace OpenSim.Grid.UserServer.Modules
559 public XmlRpcResponse XmlRPCSetLoginParams(XmlRpcRequest request) 433 public XmlRpcResponse XmlRPCSetLoginParams(XmlRpcRequest request)
560 { 434 {
561 XmlRpcResponse response = new XmlRpcResponse(); 435 XmlRpcResponse response = new XmlRpcResponse();
562 Hashtable requestData = (Hashtable) request.Params[0]; 436 Hashtable requestData = (Hashtable)request.Params[0];
563 UserProfileData userProfile; 437 UserProfileData userProfile;
564 Hashtable responseData = new Hashtable(); 438 Hashtable responseData = new Hashtable();
565 439
566 UUID uid; 440 UUID uid;
567 string pass = requestData["password"].ToString(); 441 string pass = requestData["password"].ToString();
568 442
569 if (!UUID.TryParse((string) requestData["avatar_uuid"], out uid)) 443 if (!UUID.TryParse((string)requestData["avatar_uuid"], out uid))
570 { 444 {
571 responseData["error"] = "No authorization"; 445 responseData["error"] = "No authorization";
572 response.Value = responseData; 446 response.Value = responseData;
@@ -597,6 +471,5 @@ namespace OpenSim.Grid.UserServer.Modules
597 response.Value = responseData; 471 response.Value = responseData;
598 return response; 472 return response;
599 } 473 }
600
601 } 474 }
602} 475}