/* * 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(); System.Console.WriteLine("adding inventory to response"); Hashtable TempHash; foreach (InventoryFolder InvFolder in TheUser.Inventory.InventoryFolders.Values) { TempHash = new Hashtable(); System.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) { System.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 System.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); } } }