aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenGridServices/OpenGridServices.UserServer/UserManager.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenGridServices/OpenGridServices.UserServer/UserManager.cs668
1 files changed, 5 insertions, 663 deletions
diff --git a/OpenGridServices/OpenGridServices.UserServer/UserManager.cs b/OpenGridServices/OpenGridServices.UserServer/UserManager.cs
index f512b15..6f5f054 100644
--- a/OpenGridServices/OpenGridServices.UserServer/UserManager.cs
+++ b/OpenGridServices/OpenGridServices.UserServer/UserManager.cs
@@ -38,284 +38,16 @@ using Nwc.XmlRpc;
38using OpenSim.Framework.Sims; 38using OpenSim.Framework.Sims;
39using OpenSim.Framework.Inventory; 39using OpenSim.Framework.Inventory;
40using OpenSim.Framework.Utilities; 40using OpenSim.Framework.Utilities;
41using OpenGrid.Framework.UserManagement;
41 42
42using System.Security.Cryptography; 43using System.Security.Cryptography;
43 44
44namespace OpenGridServices.UserServer 45namespace OpenGridServices.UserServer
45{ 46{
46 public class UserManager 47 public class UserManager : UserManagerBase
47 { 48 {
48 public OpenSim.Framework.Interfaces.UserConfig _config; 49 public UserManager()
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 { 50 {
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 } 51 }
320 52
321 /// <summary> 53 /// <summary>
@@ -323,7 +55,7 @@ namespace OpenGridServices.UserServer
323 /// </summary> 55 /// </summary>
324 /// <param name="response">The existing response</param> 56 /// <param name="response">The existing response</param>
325 /// <param name="theUser">The user profile</param> 57 /// <param name="theUser">The user profile</param>
326 public virtual void CustomiseResponse(ref Hashtable response, ref UserProfileData theUser) 58 public override void CustomiseResponse(ref Hashtable response, ref UserProfileData theUser)
327 { 59 {
328 // Load information from the gridserver 60 // Load information from the gridserver
329 SimProfile SimInfo = new SimProfile(); 61 SimProfile SimInfo = new SimProfile();
@@ -331,7 +63,7 @@ namespace OpenGridServices.UserServer
331 63
332 // Customise the response 64 // Customise the response
333 // Home Location 65 // Home Location
334 response["home"] = "{'region_handle':[r" + (SimInfo.RegionLocX * 256).ToString() + ",r" + (SimInfo.RegionLocY * 256).ToString() + "], " + 66 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() + "], " + 67 "'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() + "]}"; 68 "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}";
337 69
@@ -366,395 +98,5 @@ namespace OpenGridServices.UserServer
366 XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams); 98 XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams);
367 XmlRpcResponse GridResp = GridReq.Send(SimInfo.caps_url, 3000); 99 XmlRpcResponse GridResp = GridReq.Send(SimInfo.caps_url, 3000);
368 } 100 }
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 /// <summary>
659 /// Returns an error message that the user could not be found in the database
660 /// </summary>
661 /// <returns>XML string consisting of a error element containing individual error(s)</returns>
662 public string CreateUnknownUserErrorResponse()
663 {
664 System.IO.StringWriter sw = new System.IO.StringWriter();
665 XmlTextWriter xw = new XmlTextWriter(sw);
666
667 // Header
668 xw.Formatting = Formatting.Indented;
669 xw.WriteStartDocument();
670 xw.WriteDocType("error", null, null, null);
671 xw.WriteComment("An error occured");
672 xw.WriteStartElement("error");
673
674 // User
675 xw.WriteElementString("unknownuser", "Unable to find a user with that name");
676
677 // Footer
678 xw.WriteEndElement();
679 xw.Flush();
680 xw.Close();
681
682 return sw.ToString();
683 }
684
685 /// <summary>
686 /// Converts a user profile to an XML element which can be returned
687 /// </summary>
688 /// <param name="profile">The user profile</param>
689 /// <returns>A string containing an XML Document of the user profile</returns>
690 public string ProfileToXml(UserProfileData profile)
691 {
692 System.IO.StringWriter sw = new System.IO.StringWriter();
693 XmlTextWriter xw = new XmlTextWriter(sw);
694
695 // Header
696 xw.Formatting = Formatting.Indented;
697 xw.WriteStartDocument();
698 xw.WriteDocType("userprofile", null, null, null);
699 xw.WriteComment("Found user profiles matching the request");
700 xw.WriteStartElement("users");
701
702 // User
703 xw.WriteStartElement("user");
704 // Account information
705 xw.WriteAttributeString("firstname", profile.username);
706 xw.WriteAttributeString("lastname", profile.surname);
707 xw.WriteAttributeString("uuid", profile.UUID.ToStringHyphenated());
708 // Server Information
709 xw.WriteAttributeString("server_inventory", profile.userInventoryURI);
710 xw.WriteAttributeString("server_asset", profile.userAssetURI);
711 // Profile Information
712 xw.WriteAttributeString("profile_about", profile.profileAboutText);
713 xw.WriteAttributeString("profile_firstlife_about", profile.profileFirstText);
714 xw.WriteAttributeString("profile_firstlife_image", profile.profileFirstImage.ToStringHyphenated());
715 xw.WriteAttributeString("profile_can_do", profile.profileCanDoMask.ToString());
716 xw.WriteAttributeString("profile_want_do", profile.profileWantDoMask.ToString());
717 xw.WriteAttributeString("profile_image", profile.profileImage.ToStringHyphenated());
718 xw.WriteAttributeString("profile_created",profile.created.ToString());
719 xw.WriteAttributeString("profile_lastlogin",profile.lastLogin.ToString());
720 // Home region information
721 xw.WriteAttributeString("home_coordinates", profile.homeLocation.ToString());
722 xw.WriteAttributeString("home_region", profile.homeRegion.ToString());
723 xw.WriteAttributeString("home_look", profile.homeLookAt.ToString());
724
725 xw.WriteEndElement();
726
727 // Footer
728 xw.WriteEndElement();
729 xw.Flush();
730 xw.Close();
731
732 return sw.ToString();
733 }
734
735 public string RestGetUserMethodName(string request, string path, string param)
736 {
737 UserProfileData userProfile = getUserProfile(param.Trim());
738
739 if (userProfile == null)
740 {
741 return CreateUnknownUserErrorResponse();
742 }
743
744 return ProfileToXml(userProfile);
745 }
746
747 public string RestGetUserMethodUUID(string request, string path, string param)
748 {
749 UserProfileData userProfile = getUserProfile(new LLUUID(param));
750
751 if (userProfile == null)
752 {
753 return CreateUnknownUserErrorResponse();
754 }
755
756 return ProfileToXml(userProfile);
757 }
758
759 } 101 }
760} 102}