123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- /*
- * Copyright (c) Contributors, http://www.openmetaverse.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the OpenSim Project nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
- using System;
- using System.Collections.Generic;
- using System.Collections;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Xml;
- using libsecondlife;
- using Nwc.XmlRpc;
- using OpenSim.Framework.Sims;
- using OpenSim.Framework.Inventory;
- using OpenSim.Framework.Utilities;
- namespace OpenSim.Framework.User
- {
- public class UserProfileManager : UserProfileManagerBase
- {
- public string GridURL;
- public string GridSendKey;
- public string GridRecvKey;
- public string DefaultStartupMsg;
- public UserProfileManager()
- {
- }
- public void SetKeys(string sendKey, string recvKey, string url, string message)
- {
- GridRecvKey = recvKey;
- GridSendKey = sendKey;
- GridURL = url;
- DefaultStartupMsg = message;
- }
- public virtual string ParseXMLRPC(string requestBody)
- {
- XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
- switch (request.MethodName)
- {
- case "login_to_simulator":
- XmlRpcResponse response = XmlRpcLoginMethod(request);
- return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(response), "utf-16", "utf-8"));
- }
- return "";
- }
- public string RestDeleteUserSessionMethod( string request, string path, string param )
- {
- LLUUID sessionid = new LLUUID(param); // get usersessions/sessionid
- foreach (libsecondlife.LLUUID UUID in UserProfiles.Keys)
- {
- if ( UserProfiles[UUID].CurrentSessionID == sessionid)
- {
- UserProfiles[UUID].CurrentSessionID = null;
- UserProfiles[UUID].CurrentSecureSessionID = null;
- UserProfiles[UUID].Circuits.Clear();
- }
- }
- return "OK";
- }
- public XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request)
- {
- XmlRpcResponse response = new XmlRpcResponse();
- Hashtable requestData = (Hashtable)request.Params[0];
- bool GoodXML = (requestData.Contains("first") && requestData.Contains("last") && requestData.Contains("passwd"));
- bool GoodLogin = false;
- string firstname = "";
- string lastname = "";
- string passwd = "";
- if (GoodXML)
- {
- firstname = (string)requestData["first"];
- lastname = (string)requestData["last"];
- passwd = (string)requestData["passwd"];
- GoodLogin = AuthenticateUser(firstname, lastname, passwd);
- }
- if (!(GoodXML && GoodLogin))
- {
- response = CreateErrorConnectingToGridResponse();
- }
- else
- {
- UserProfile TheUser = GetProfileByName(firstname, lastname);
- //we need to sort out how sessions are logged out , currently the sim tells the gridserver
- //but if as this suggests the userserver handles it then please have the sim telling the userserver instead
- //as it really makes things messy for sandbox mode
- //if (!((TheUser.CurrentSessionID == null) && (TheUser.CurrentSecureSessionID == null)))
- // {
- // response = CreateAlreadyLoggedInResponse();
- // }
- //else
- //{
- try
- {
- Hashtable responseData = new Hashtable();
- LLUUID AgentID = TheUser.UUID;
- TheUser.InitSessionData();
- //for loading data from a grid server, make any changes in CustomiseResponse() (or create a sub class of this and override that method)
- //SimProfile SimInfo = new SimProfile();
- //SimInfo = SimInfo.LoadFromGrid(TheUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
- Hashtable GlobalT = new Hashtable();
- GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
- GlobalT["cloud_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
- GlobalT["moon_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
- ArrayList GlobalTextures = new ArrayList();
- GlobalTextures.Add(GlobalT);
- Hashtable LoginFlagsHash = new Hashtable();
- LoginFlagsHash["daylight_savings"] = "N";
- LoginFlagsHash["stipend_since_login"] = "N";
- LoginFlagsHash["gendered"] = "Y";
- LoginFlagsHash["ever_logged_in"] = "Y";
- ArrayList LoginFlags = new ArrayList();
- LoginFlags.Add(LoginFlagsHash);
- Hashtable uiconfig = new Hashtable();
- uiconfig["allow_first_life"] = "Y";
- ArrayList ui_config = new ArrayList();
- ui_config.Add(uiconfig);
- Hashtable ClassifiedCategoriesHash = new Hashtable();
- ClassifiedCategoriesHash["category_name"] = "bla bla";
- ClassifiedCategoriesHash["category_id"] = (Int32)1;
- ArrayList ClassifiedCategories = new ArrayList();
- ClassifiedCategories.Add(ClassifiedCategoriesHash);
- ArrayList AgentInventory = new ArrayList();
- Console.WriteLine("adding inventory to response");
- Hashtable TempHash;
- foreach (InventoryFolder InvFolder in TheUser.Inventory.InventoryFolders.Values)
- {
- TempHash = new Hashtable();
- Console.WriteLine("adding folder " + InvFolder.FolderName + ", ID: " + InvFolder.FolderID.ToStringHyphenated() + " with parent: " + InvFolder.ParentID.ToStringHyphenated());
- TempHash["name"] = InvFolder.FolderName;
- TempHash["parent_id"] = InvFolder.ParentID.ToStringHyphenated();
- TempHash["version"] = (Int32)InvFolder.Version;
- TempHash["type_default"] = (Int32)InvFolder.DefaultType;
- TempHash["folder_id"] = InvFolder.FolderID.ToStringHyphenated();
- AgentInventory.Add(TempHash);
- }
- Hashtable InventoryRootHash = new Hashtable();
- InventoryRootHash["folder_id"] = TheUser.Inventory.InventoryRoot.FolderID.ToStringHyphenated();
- ArrayList InventoryRoot = new ArrayList();
- InventoryRoot.Add(InventoryRootHash);
- Hashtable InitialOutfitHash = new Hashtable();
- InitialOutfitHash["folder_name"] = "Nightclub Female";
- InitialOutfitHash["gender"] = "female";
- ArrayList InitialOutfit = new ArrayList();
- InitialOutfit.Add(InitialOutfitHash);
- uint circode = (uint)(Util.RandomClass.Next());
- //TheUser.AddSimCircuit(circode, SimInfo.UUID);
- responseData["last_name"] = TheUser.lastname;
- responseData["ui-config"] = ui_config;
- responseData["sim_ip"] = "127.0.0.1"; //SimInfo.sim_ip.ToString();
- responseData["login-flags"] = LoginFlags;
- responseData["global-textures"] = GlobalTextures;
- responseData["classified_categories"] = ClassifiedCategories;
- responseData["event_categories"] = new ArrayList();
- responseData["inventory-skeleton"] = AgentInventory;
- responseData["inventory-skel-lib"] = new ArrayList();
- responseData["inventory-root"] = InventoryRoot;
- responseData["event_notifications"] = new ArrayList();
- responseData["gestures"] = new ArrayList();
- responseData["inventory-lib-owner"] = new ArrayList();
- responseData["initial-outfit"] = InitialOutfit;
- responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
- responseData["start_location"] = "last";
- responseData["home"] = "{'region_handle':[r" + (0 * 256).ToString() + ",r" + (0 * 256).ToString() + "], 'position':[r" + TheUser.homepos.X.ToString() + ",r" + TheUser.homepos.Y.ToString() + ",r" + TheUser.homepos.Z.ToString() + "], 'look_at':[r" + TheUser.homelookat.X.ToString() + ",r" + TheUser.homelookat.Y.ToString() + ",r" + TheUser.homelookat.Z.ToString() + "]}";
- responseData["message"] = DefaultStartupMsg;
- responseData["first_name"] = TheUser.firstname;
- responseData["circuit_code"] = (Int32)circode;
- responseData["sim_port"] = 0; //(Int32)SimInfo.sim_port;
- responseData["secure_session_id"] = TheUser.CurrentSecureSessionID.ToStringHyphenated();
- responseData["look_at"] = "\n[r" + TheUser.homelookat.X.ToString() + ",r" + TheUser.homelookat.Y.ToString() + ",r" + TheUser.homelookat.Z.ToString() + "]\n";
- responseData["agent_id"] = AgentID.ToStringHyphenated();
- responseData["region_y"] = (Int32)0 * 256; // (Int32)SimInfo.RegionLocY * 256;
- responseData["region_x"] = (Int32)0 * 256; //SimInfo.RegionLocX * 256;
- responseData["seed_capability"] = "";
- responseData["agent_access"] = "M";
- responseData["session_id"] = TheUser.CurrentSessionID.ToStringHyphenated();
- responseData["login"] = "true";
- this.CustomiseResponse(ref responseData, TheUser);
- response.Value = responseData;
- // TheUser.SendDataToSim(SimInfo);
- return response;
- }
- catch (Exception E)
- {
- Console.WriteLine(E.ToString());
- }
- //}
- }
- return response;
- }
- private static XmlRpcResponse CreateErrorConnectingToGridResponse()
- {
- XmlRpcResponse response = new XmlRpcResponse();
- Hashtable ErrorRespData = new Hashtable();
- ErrorRespData["reason"] = "key";
- ErrorRespData["message"] = "Error connecting to grid. Please double check your login details and check with the grid owner if you are sure these are correct";
- ErrorRespData["login"] = "false";
- response.Value = ErrorRespData;
- return response;
- }
- private static XmlRpcResponse CreateAlreadyLoggedInResponse()
- {
- XmlRpcResponse response = new XmlRpcResponse();
- Hashtable PresenceErrorRespData = new Hashtable();
- PresenceErrorRespData["reason"] = "presence";
- 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";
- PresenceErrorRespData["login"] = "false";
- response.Value = PresenceErrorRespData;
- return response;
- }
- public virtual void CustomiseResponse(ref Hashtable response, UserProfile theUser)
- {
- //default method set up to act as ogs user server
- SimProfile SimInfo= new SimProfile();
- //get siminfo from grid server
- SimInfo = SimInfo.LoadFromGrid(theUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
- Int32 circode = (Int32)Convert.ToUInt32(response["circuit_code"]);
- theUser.AddSimCircuit((uint)circode, SimInfo.UUID);
- response["home"] = "{'region_handle':[r" + (SimInfo.RegionLocX * 256).ToString() + ",r" + (SimInfo.RegionLocY * 256).ToString() + "], 'position':[r" + theUser.homepos.X.ToString() + ",r" + theUser.homepos.Y.ToString() + ",r" + theUser.homepos.Z.ToString() + "], 'look_at':[r" + theUser.homelookat.X.ToString() + ",r" + theUser.homelookat.Y.ToString() + ",r" + theUser.homelookat.Z.ToString() + "]}";
- response["sim_ip"] = SimInfo.sim_ip;
- response["sim_port"] = (Int32)SimInfo.sim_port;
- response["region_y"] = (Int32)SimInfo.RegionLocY * 256;
- response["region_x"] = (Int32)SimInfo.RegionLocX * 256;
- //default is ogs user server, so let the sim know about the user via a XmlRpcRequest
- Console.WriteLine(SimInfo.caps_url);
- Hashtable SimParams = new Hashtable();
- SimParams["session_id"] = theUser.CurrentSessionID.ToString();
- SimParams["secure_session_id"] = theUser.CurrentSecureSessionID.ToString();
- SimParams["firstname"] = theUser.firstname;
- SimParams["lastname"] = theUser.lastname;
- SimParams["agent_id"] = theUser.UUID.ToString();
- SimParams["circuit_code"] = (Int32)circode;
- SimParams["startpos_x"] = theUser.homepos.X.ToString();
- SimParams["startpos_y"] = theUser.homepos.Y.ToString();
- SimParams["startpos_z"] = theUser.homepos.Z.ToString();
- ArrayList SendParams = new ArrayList();
- SendParams.Add(SimParams);
- XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams);
- XmlRpcResponse GridResp = GridReq.Send(SimInfo.caps_url, 3000);
- }
- }
- }
|