aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenGridServices/OpenGridServices.UserServer/UserManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenGridServices/OpenGridServices.UserServer/UserManager.cs')
-rw-r--r--OpenGridServices/OpenGridServices.UserServer/UserManager.cs659
1 files changed, 659 insertions, 0 deletions
diff --git a/OpenGridServices/OpenGridServices.UserServer/UserManager.cs b/OpenGridServices/OpenGridServices.UserServer/UserManager.cs
new file mode 100644
index 0000000..913d0fc
--- /dev/null
+++ b/OpenGridServices/OpenGridServices.UserServer/UserManager.cs
@@ -0,0 +1,659 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Text;
32using OpenGrid.Framework.Data;
33using libsecondlife;
34using System.Reflection;
35
36using System.Xml;
37using Nwc.XmlRpc;
38using OpenSim.Framework.Sims;
39using OpenSim.Framework.Inventory;
40using OpenSim.Framework.Utilities;
41
42using System.Security.Cryptography;
43
44namespace OpenGridServices.UserServer
45{
46 public class UserManager
47 {
48 public OpenSim.Framework.Interfaces.UserConfig _config;
49 Dictionary<string, IUserData> _plugins = new Dictionary<string, IUserData>();
50
51 /// <summary>
52 /// Adds a new user server plugin - user servers will be requested in the order they were loaded.
53 /// </summary>
54 /// <param name="FileName">The filename to the user server plugin DLL</param>
55 public void AddPlugin(string FileName)
56 {
57 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Userstorage: Attempting to load " + FileName);
58 Assembly pluginAssembly = Assembly.LoadFrom(FileName);
59
60 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Userstorage: Found " + pluginAssembly.GetTypes().Length + " interfaces.");
61 foreach (Type pluginType in pluginAssembly.GetTypes())
62 {
63 if (!pluginType.IsAbstract)
64 {
65 Type typeInterface = pluginType.GetInterface("IUserData", true);
66
67 if (typeInterface != null)
68 {
69 IUserData plug = (IUserData)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
70 plug.Initialise();
71 this._plugins.Add(plug.getName(), plug);
72 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Userstorage: Added IUserData Interface");
73 }
74
75 typeInterface = null;
76 }
77 }
78
79 pluginAssembly = null;
80 }
81
82 /// <summary>
83 ///
84 /// </summary>
85 /// <param name="user"></param>
86 public void AddUserProfile(string firstName, string lastName, string pass, uint regX, uint regY)
87 {
88 UserProfileData user = new UserProfileData();
89 user.homeLocation = new LLVector3(128, 128, 100);
90 user.UUID = LLUUID.Random();
91 user.username = firstName;
92 user.surname = lastName;
93 user.passwordHash = pass;
94 user.passwordSalt = "";
95 user.created = Util.UnixTimeSinceEpoch();
96 user.homeLookAt = new LLVector3(100, 100, 100);
97 user.homeRegion = Util.UIntsToLong((regX * 256), (regY * 256));
98
99 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
100 {
101 try
102 {
103 plugin.Value.addNewUserProfile(user);
104
105 }
106 catch (Exception e)
107 {
108 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")");
109 }
110 }
111 }
112
113 /// <summary>
114 /// Loads a user profile from a database by UUID
115 /// </summary>
116 /// <param name="uuid">The target UUID</param>
117 /// <returns>A user profile</returns>
118 public UserProfileData getUserProfile(LLUUID uuid)
119 {
120 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
121 {
122 try
123 {
124 UserProfileData profile = plugin.Value.getUserByUUID(uuid);
125 profile.currentAgent = getUserAgent(profile.UUID);
126 return profile;
127 }
128 catch (Exception e)
129 {
130 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")");
131 }
132 }
133
134 return null;
135 }
136
137
138 /// <summary>
139 /// Loads a user profile by name
140 /// </summary>
141 /// <param name="name">The target name</param>
142 /// <returns>A user profile</returns>
143 public UserProfileData getUserProfile(string name)
144 {
145 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
146 {
147 try
148 {
149 UserProfileData profile = plugin.Value.getUserByName(name);
150 profile.currentAgent = getUserAgent(profile.UUID);
151 return profile;
152 }
153 catch (Exception e)
154 {
155 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")");
156 }
157 }
158
159 return null;
160 }
161
162 /// <summary>
163 /// Loads a user profile by name
164 /// </summary>
165 /// <param name="fname">First name</param>
166 /// <param name="lname">Last name</param>
167 /// <returns>A user profile</returns>
168 public UserProfileData getUserProfile(string fname, string lname)
169 {
170 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
171 {
172 try
173 {
174 UserProfileData profile = plugin.Value.getUserByName(fname,lname);
175 try
176 {
177 profile.currentAgent = getUserAgent(profile.UUID);
178 }
179 catch (Exception e)
180 {
181 // Ignore
182 }
183 return profile;
184 }
185 catch (Exception e)
186 {
187 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")");
188 }
189 }
190
191 return null;
192 }
193
194 /// <summary>
195 /// Loads a user agent by uuid (not called directly)
196 /// </summary>
197 /// <param name="uuid">The agents UUID</param>
198 /// <returns>Agent profiles</returns>
199 public UserAgentData getUserAgent(LLUUID uuid)
200 {
201 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
202 {
203 try
204 {
205 return plugin.Value.getAgentByUUID(uuid);
206 }
207 catch (Exception e)
208 {
209 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")");
210 }
211 }
212
213 return null;
214 }
215
216 /// <summary>
217 /// Loads a user agent by name (not called directly)
218 /// </summary>
219 /// <param name="name">The agents name</param>
220 /// <returns>A user agent</returns>
221 public UserAgentData getUserAgent(string name)
222 {
223 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
224 {
225 try
226 {
227 return plugin.Value.getAgentByName(name);
228 }
229 catch (Exception e)
230 {
231 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")");
232 }
233 }
234
235 return null;
236 }
237
238 /// <summary>
239 /// Loads a user agent by name (not called directly)
240 /// </summary>
241 /// <param name="fname">The agents firstname</param>
242 /// <param name="lname">The agents lastname</param>
243 /// <returns>A user agent</returns>
244 public UserAgentData getUserAgent(string fname, string lname)
245 {
246 foreach (KeyValuePair<string, IUserData> plugin in _plugins)
247 {
248 try
249 {
250 return plugin.Value.getAgentByName(fname,lname);
251 }
252 catch (Exception e)
253 {
254 OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")");
255 }
256 }
257
258 return null;
259 }
260
261 /// <summary>
262 /// Creates a error response caused by invalid XML
263 /// </summary>
264 /// <returns>An XMLRPC response</returns>
265 private static XmlRpcResponse CreateErrorConnectingToGridResponse()
266 {
267 XmlRpcResponse response = new XmlRpcResponse();
268 Hashtable ErrorRespData = new Hashtable();
269 ErrorRespData["reason"] = "key";
270 ErrorRespData["message"] = "Error connecting to grid. Could not percieve credentials from login XML.";
271 ErrorRespData["login"] = "false";
272 response.Value = ErrorRespData;
273 return response;
274 }
275
276 /// <summary>
277 /// Creates an error response caused by bad login credentials
278 /// </summary>
279 /// <returns>An XMLRPC response</returns>
280 private static XmlRpcResponse CreateLoginErrorResponse()
281 {
282 XmlRpcResponse response = new XmlRpcResponse();
283 Hashtable ErrorRespData = new Hashtable();
284 ErrorRespData["reason"] = "key";
285 ErrorRespData["message"] = "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.";
286 ErrorRespData["login"] = "false";
287 response.Value = ErrorRespData;
288 return response;
289 }
290
291 /// <summary>
292 /// Creates an error response caused by being logged in already
293 /// </summary>
294 /// <returns>An XMLRPC Response</returns>
295 private static XmlRpcResponse CreateAlreadyLoggedInResponse()
296 {
297 XmlRpcResponse response = new XmlRpcResponse();
298 Hashtable PresenceErrorRespData = new Hashtable();
299 PresenceErrorRespData["reason"] = "presence";
300 PresenceErrorRespData["message"] = "You appear to be already logged in, if this is not the case please wait for your session to timeout, if this takes longer than a few minutes please contact the grid owner";
301 PresenceErrorRespData["login"] = "false";
302 response.Value = PresenceErrorRespData;
303 return response;
304 }
305
306 /// <summary>
307 /// Creates an error response caused by target region being down
308 /// </summary>
309 /// <returns>An XMLRPC Response</returns>
310 private static XmlRpcResponse CreateDeadRegionResponse()
311 {
312 XmlRpcResponse response = new XmlRpcResponse();
313 Hashtable PresenceErrorRespData = new Hashtable();
314 PresenceErrorRespData["reason"] = "key";
315 PresenceErrorRespData["message"] = "The region you are attempting to log into is not responding. Please select another region and try again.";
316 PresenceErrorRespData["login"] = "false";
317 response.Value = PresenceErrorRespData;
318 return response;
319 }
320
321 /// <summary>
322 /// Customises the login response and fills in missing values.
323 /// </summary>
324 /// <param name="response">The existing response</param>
325 /// <param name="theUser">The user profile</param>
326 public virtual void CustomiseResponse(ref Hashtable response, ref UserProfileData theUser)
327 {
328 // Load information from the gridserver
329 SimProfile SimInfo = new SimProfile();
330 SimInfo = SimInfo.LoadFromGrid(theUser.currentAgent.currentHandle, _config.GridServerURL, _config.GridSendKey, _config.GridRecvKey);
331
332 // Customise the response
333 // Home Location
334 response["home"] = "{'region_handle':[r" + (SimInfo.RegionLocX * 256).ToString() + ",r" + (SimInfo.RegionLocY * 256).ToString() + "], " +
335 "'position':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "], " +
336 "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}";
337
338 // Destination
339 response["sim_ip"] = SimInfo.sim_ip;
340 response["sim_port"] = (Int32)SimInfo.sim_port;
341 response["region_y"] = (Int32)SimInfo.RegionLocY * 256;
342 response["region_x"] = (Int32)SimInfo.RegionLocX * 256;
343
344 // Notify the target of an incoming user
345 Console.WriteLine("Notifying " + SimInfo.regionname + " (" + SimInfo.caps_url + ")");
346
347 // Prepare notification
348 Hashtable SimParams = new Hashtable();
349 SimParams["session_id"] = theUser.currentAgent.sessionID.ToString();
350 SimParams["secure_session_id"] = theUser.currentAgent.secureSessionID.ToString();
351 SimParams["firstname"] = theUser.username;
352 SimParams["lastname"] = theUser.surname;
353 SimParams["agent_id"] = theUser.UUID.ToString();
354 SimParams["circuit_code"] = (Int32)Convert.ToUInt32(response["circuit_code"]);
355 SimParams["startpos_x"] = theUser.currentAgent.currentPos.X.ToString();
356 SimParams["startpos_y"] = theUser.currentAgent.currentPos.Y.ToString();
357 SimParams["startpos_z"] = theUser.currentAgent.currentPos.Z.ToString();
358 ArrayList SendParams = new ArrayList();
359 SendParams.Add(SimParams);
360
361 // Update agent with target sim
362 theUser.currentAgent.currentRegion = SimInfo.UUID;
363 theUser.currentAgent.currentHandle = SimInfo.regionhandle;
364
365 // Send
366 XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams);
367 XmlRpcResponse GridResp = GridReq.Send(SimInfo.caps_url, 3000);
368 }
369
370 /// <summary>
371 /// Checks a user against it's password hash
372 /// </summary>
373 /// <param name="profile">The users profile</param>
374 /// <param name="password">The supplied password</param>
375 /// <returns>Authenticated?</returns>
376 public bool AuthenticateUser(ref UserProfileData profile, string password)
377 {
378 OpenSim.Framework.Console.MainConsole.Instance.Verbose(
379 "Authenticating " + profile.username + " " + profile.surname);
380
381 password = password.Remove(0, 3); //remove $1$
382
383 string s = Util.Md5Hash(password + ":" + profile.passwordSalt);
384
385 return profile.passwordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase);
386 }
387
388 /// <summary>
389 /// Creates and initialises a new user agent - make sure to use CommitAgent when done to submit to the DB
390 /// </summary>
391 /// <param name="profile">The users profile</param>
392 /// <param name="request">The users loginrequest</param>
393 public void CreateAgent(ref UserProfileData profile, XmlRpcRequest request)
394 {
395 Hashtable requestData = (Hashtable)request.Params[0];
396
397 UserAgentData agent = new UserAgentData();
398
399 // User connection
400 agent.agentIP = "";
401 agent.agentOnline = true;
402 agent.agentPort = 0;
403
404 // Generate sessions
405 RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();
406 byte[] randDataS = new byte[16];
407 byte[] randDataSS = new byte[16];
408 rand.GetBytes(randDataS);
409 rand.GetBytes(randDataSS);
410
411 agent.secureSessionID = new LLUUID(randDataSS, 0);
412 agent.sessionID = new LLUUID(randDataS, 0);
413
414 // Profile UUID
415 agent.UUID = profile.UUID;
416
417 // Current position (from Home)
418 agent.currentHandle = profile.homeRegion;
419 agent.currentPos = profile.homeLocation;
420
421 // If user specified additional start, use that
422 if (requestData.ContainsKey("start"))
423 {
424 string startLoc = ((string)requestData["start"]).Trim();
425 if (!(startLoc == "last" || startLoc == "home"))
426 {
427 // Format: uri:Ahern&162&213&34
428 try
429 {
430 string[] parts = startLoc.Remove(0, 4).Split('&');
431 string region = parts[0];
432
433 ////////////////////////////////////////////////////
434 //SimProfile SimInfo = new SimProfile();
435 //SimInfo = SimInfo.LoadFromGrid(theUser.currentAgent.currentHandle, _config.GridServerURL, _config.GridSendKey, _config.GridRecvKey);
436 }
437 catch (Exception e)
438 {
439
440 }
441 }
442 }
443
444 // What time did the user login?
445 agent.loginTime = Util.UnixTimeSinceEpoch();
446 agent.logoutTime = 0;
447
448 // Current location
449 agent.regionID = new LLUUID(); // Fill in later
450 agent.currentRegion = new LLUUID(); // Fill in later
451
452 profile.currentAgent = agent;
453 }
454
455 /// <summary>
456 /// Saves a target agent to the database
457 /// </summary>
458 /// <param name="profile">The users profile</param>
459 /// <returns>Successful?</returns>
460 public bool CommitAgent(ref UserProfileData profile)
461 {
462 // Saves the agent to database
463 return true;
464 }
465
466 /// <summary>
467 /// Main user login function
468 /// </summary>
469 /// <param name="request">The XMLRPC request</param>
470 /// <returns>The response to send</returns>
471 public XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request)
472 {
473 XmlRpcResponse response = new XmlRpcResponse();
474 Hashtable requestData = (Hashtable)request.Params[0];
475
476 bool GoodXML = (requestData.Contains("first") && requestData.Contains("last") && requestData.Contains("passwd"));
477 bool GoodLogin = false;
478 string firstname = "";
479 string lastname = "";
480 string passwd = "";
481
482 UserProfileData TheUser;
483
484 if (GoodXML)
485 {
486 firstname = (string)requestData["first"];
487 lastname = (string)requestData["last"];
488 passwd = (string)requestData["passwd"];
489
490 TheUser = getUserProfile(firstname, lastname);
491 if (TheUser == null)
492 return CreateLoginErrorResponse();
493
494 GoodLogin = AuthenticateUser(ref TheUser, passwd);
495 }
496 else
497 {
498 return CreateErrorConnectingToGridResponse();
499 }
500
501 if (!GoodLogin)
502 {
503 return CreateLoginErrorResponse();
504 }
505 else
506 {
507 // If we already have a session...
508 if (TheUser.currentAgent != null && TheUser.currentAgent.agentOnline)
509 {
510 // Reject the login
511 return CreateAlreadyLoggedInResponse();
512 }
513 // Otherwise...
514 // Create a new agent session
515 CreateAgent(ref TheUser, request);
516
517 try
518 {
519 Hashtable responseData = new Hashtable();
520
521 LLUUID AgentID = TheUser.UUID;
522
523 // Global Texture Section
524 Hashtable GlobalT = new Hashtable();
525 GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
526 GlobalT["cloud_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
527 GlobalT["moon_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
528 ArrayList GlobalTextures = new ArrayList();
529 GlobalTextures.Add(GlobalT);
530
531 // Login Flags Section
532 Hashtable LoginFlagsHash = new Hashtable();
533 LoginFlagsHash["daylight_savings"] = "N";
534 LoginFlagsHash["stipend_since_login"] = "N";
535 LoginFlagsHash["gendered"] = "Y"; // Needs to be combined with below...
536 LoginFlagsHash["ever_logged_in"] = "Y"; // Should allow male/female av selection
537 ArrayList LoginFlags = new ArrayList();
538 LoginFlags.Add(LoginFlagsHash);
539
540 // UI Customisation Section
541 Hashtable uiconfig = new Hashtable();
542 uiconfig["allow_first_life"] = "Y";
543 ArrayList ui_config = new ArrayList();
544 ui_config.Add(uiconfig);
545
546 // Classified Categories Section
547 Hashtable ClassifiedCategoriesHash = new Hashtable();
548 ClassifiedCategoriesHash["category_name"] = "Generic";
549 ClassifiedCategoriesHash["category_id"] = (Int32)1;
550 ArrayList ClassifiedCategories = new ArrayList();
551 ClassifiedCategories.Add(ClassifiedCategoriesHash);
552
553 // Inventory Library Section
554 ArrayList AgentInventoryArray = new ArrayList();
555 Hashtable TempHash;
556
557 AgentInventory Library = new AgentInventory();
558 Library.CreateRootFolder(AgentID, true);
559
560 foreach (InventoryFolder InvFolder in Library.InventoryFolders.Values)
561 {
562 TempHash = new Hashtable();
563 TempHash["name"] = InvFolder.FolderName;
564 TempHash["parent_id"] = InvFolder.ParentID.ToStringHyphenated();
565 TempHash["version"] = (Int32)InvFolder.Version;
566 TempHash["type_default"] = (Int32)InvFolder.DefaultType;
567 TempHash["folder_id"] = InvFolder.FolderID.ToStringHyphenated();
568 AgentInventoryArray.Add(TempHash);
569 }
570
571 Hashtable InventoryRootHash = new Hashtable();
572 InventoryRootHash["folder_id"] = Library.InventoryRoot.FolderID.ToStringHyphenated();
573 ArrayList InventoryRoot = new ArrayList();
574 InventoryRoot.Add(InventoryRootHash);
575
576 Hashtable InitialOutfitHash = new Hashtable();
577 InitialOutfitHash["folder_name"] = "Nightclub Female";
578 InitialOutfitHash["gender"] = "female";
579 ArrayList InitialOutfit = new ArrayList();
580 InitialOutfit.Add(InitialOutfitHash);
581
582 // Circuit Code
583 uint circode = (uint)(Util.RandomClass.Next());
584
585 // Generics
586 responseData["last_name"] = TheUser.surname;
587 responseData["ui-config"] = ui_config;
588 responseData["sim_ip"] = "127.0.0.1"; //SimInfo.sim_ip.ToString();
589 responseData["login-flags"] = LoginFlags;
590 responseData["global-textures"] = GlobalTextures;
591 responseData["classified_categories"] = ClassifiedCategories;
592 responseData["event_categories"] = new ArrayList();
593 responseData["inventory-skeleton"] = AgentInventoryArray;
594 responseData["inventory-skel-lib"] = new ArrayList();
595 responseData["inventory-root"] = InventoryRoot;
596 responseData["event_notifications"] = new ArrayList();
597 responseData["gestures"] = new ArrayList();
598 responseData["inventory-lib-owner"] = new ArrayList();
599 responseData["initial-outfit"] = InitialOutfit;
600 responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
601 responseData["start_location"] = "last";
602 responseData["home"] = "!!null temporary value {home}!!"; // Overwritten
603 responseData["message"] = _config.DefaultStartupMsg;
604 responseData["first_name"] = TheUser.username;
605 responseData["circuit_code"] = (Int32)circode;
606 responseData["sim_port"] = 0; //(Int32)SimInfo.sim_port;
607 responseData["secure_session_id"] = TheUser.currentAgent.secureSessionID.ToStringHyphenated();
608 responseData["look_at"] = "\n[r" + TheUser.homeLookAt.X.ToString() + ",r" + TheUser.homeLookAt.Y.ToString() + ",r" + TheUser.homeLookAt.Z.ToString() + "]\n";
609 responseData["agent_id"] = AgentID.ToStringHyphenated();
610 responseData["region_y"] = (Int32)0; // Overwritten
611 responseData["region_x"] = (Int32)0; // Overwritten
612 responseData["seed_capability"] = "";
613 responseData["agent_access"] = "M";
614 responseData["session_id"] = TheUser.currentAgent.sessionID.ToStringHyphenated();
615 responseData["login"] = "true";
616
617 try
618 {
619 this.CustomiseResponse(ref responseData, ref TheUser);
620 }
621 catch (Exception e)
622 {
623 Console.WriteLine(e.ToString());
624 return CreateDeadRegionResponse();
625 }
626
627 CommitAgent(ref TheUser);
628
629 response.Value = responseData;
630 // TheUser.SendDataToSim(SimInfo);
631 return response;
632
633 }
634 catch (Exception E)
635 {
636 Console.WriteLine(E.ToString());
637 }
638 //}
639 }
640 return response;
641
642 }
643
644 /// <summary>
645 /// Deletes an active agent session
646 /// </summary>
647 /// <param name="request">The request</param>
648 /// <param name="path">The path (eg /bork/narf/test)</param>
649 /// <param name="param">Parameters sent</param>
650 /// <returns>Success "OK" else error</returns>
651 public string RestDeleteUserSessionMethod(string request, string path, string param)
652 {
653 // TODO! Important!
654
655 return "OK";
656 }
657
658 }
659}