aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenGridServices/OpenGridServices.UserServer
diff options
context:
space:
mode:
authorMW2007-06-19 10:40:20 +0000
committerMW2007-06-19 10:40:20 +0000
commit320fbcb7b4179968994100d0819da2e0732451ef (patch)
tree7babe0b5a0b7d3c4a46cd3f7a6198565d5e31e76 /OpenGridServices/OpenGridServices.UserServer
parent* Cleaning up unused zircon branch. (diff)
downloadopensim-SC-320fbcb7b4179968994100d0819da2e0732451ef.zip
opensim-SC-320fbcb7b4179968994100d0819da2e0732451ef.tar.gz
opensim-SC-320fbcb7b4179968994100d0819da2e0732451ef.tar.bz2
opensim-SC-320fbcb7b4179968994100d0819da2e0732451ef.tar.xz
Made a base class from the Grid mode UserServer.UserManager and included that in the OpenSim solution.
Included OpenGrid.Framework.Data in the OpenSim solution (and OpenGrid.Framework.Data.DB4O). Changed OpenSim.LocalCommunications.LocalUserServices so that it inherits from the UserManagement Base class. (still not finished implementing the CustomiseResponse() method)
Diffstat (limited to 'OpenGridServices/OpenGridServices.UserServer')
-rw-r--r--OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj6
-rw-r--r--OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build1
-rw-r--r--OpenGridServices/OpenGridServices.UserServer/UserManager.cs668
3 files changed, 11 insertions, 664 deletions
diff --git a/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj b/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
index b3d318c..ad0080a 100644
--- a/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
+++ b/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
@@ -66,6 +66,10 @@
66 <HintPath>..\..\bin\libsecondlife.dll</HintPath> 66 <HintPath>..\..\bin\libsecondlife.dll</HintPath>
67 <Private>False</Private> 67 <Private>False</Private>
68 </Reference> 68 </Reference>
69 <Reference Include="OpenGrid.Framework.UserManager" >
70 <HintPath>OpenGrid.Framework.UserManager.dll</HintPath>
71 <Private>False</Private>
72 </Reference>
69 <Reference Include="OpenSim.Framework" > 73 <Reference Include="OpenSim.Framework" >
70 <HintPath>OpenSim.Framework.dll</HintPath> 74 <HintPath>OpenSim.Framework.dll</HintPath>
71 <Private>False</Private> 75 <Private>False</Private>
@@ -100,7 +104,7 @@
100 </Reference> 104 </Reference>
101 </ItemGroup> 105 </ItemGroup>
102 <ItemGroup> 106 <ItemGroup>
103 <ProjectReference Include="..\OpenGrid.Framework.Data\OpenGrid.Framework.Data.csproj"> 107 <ProjectReference Include="..\..\Common\OpenGrid.Framework.Data\OpenGrid.Framework.Data.csproj">
104 <Name>OpenGrid.Framework.Data</Name> 108 <Name>OpenGrid.Framework.Data</Name>
105 <Project>{62CDF671-0000-0000-0000-000000000000}</Project> 109 <Project>{62CDF671-0000-0000-0000-000000000000}</Project>
106 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> 110 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
diff --git a/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build b/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build
index 68cbef7..a24003f 100644
--- a/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build
+++ b/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build
@@ -23,6 +23,7 @@
23 <include name="../../bin/Db4objects.Db4o.dll" /> 23 <include name="../../bin/Db4objects.Db4o.dll" />
24 <include name="../../bin/libsecondlife.dll" /> 24 <include name="../../bin/libsecondlife.dll" />
25 <include name="../../bin/OpenGrid.Framework.Data.dll" /> 25 <include name="../../bin/OpenGrid.Framework.Data.dll" />
26 <include name="../../bin/OpenGrid.Framework.UserManager.dll" />
26 <include name="../../bin/OpenSim.Framework.dll" /> 27 <include name="../../bin/OpenSim.Framework.dll" />
27 <include name="../../bin/OpenSim.Framework.Console.dll" /> 28 <include name="../../bin/OpenSim.Framework.Console.dll" />
28 <include name="../../bin/OpenSim.GenericConfig.Xml.dll" /> 29 <include name="../../bin/OpenSim.GenericConfig.Xml.dll" />
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}