diff options
author | MW | 2007-06-19 10:40:20 +0000 |
---|---|---|
committer | MW | 2007-06-19 10:40:20 +0000 |
commit | 320fbcb7b4179968994100d0819da2e0732451ef (patch) | |
tree | 7babe0b5a0b7d3c4a46cd3f7a6198565d5e31e76 /OpenGridServices/OpenGridServices.UserServer | |
parent | * Cleaning up unused zircon branch. (diff) | |
download | opensim-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')
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; | |||
38 | using OpenSim.Framework.Sims; | 38 | using OpenSim.Framework.Sims; |
39 | using OpenSim.Framework.Inventory; | 39 | using OpenSim.Framework.Inventory; |
40 | using OpenSim.Framework.Utilities; | 40 | using OpenSim.Framework.Utilities; |
41 | using OpenGrid.Framework.UserManagement; | ||
41 | 42 | ||
42 | using System.Security.Cryptography; | 43 | using System.Security.Cryptography; |
43 | 44 | ||
44 | namespace OpenGridServices.UserServer | 45 | namespace 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 | } |