Compare commits
2 Commits
master
...
tourmaline
Author | SHA1 | Date |
---|---|---|
lbsa71 | 934ae00051 | |
lbsa71 | 7d04714690 |
|
@ -84,18 +84,18 @@ namespace OpenGridServices.GridServer
|
|||
|
||||
public void Startup()
|
||||
{
|
||||
m_console.WriteLine("Main.cs:Startup() - Please press enter to retain default settings");
|
||||
m_console.WriteLine("Main.cs:Startup() - Please press enter for default settings");
|
||||
|
||||
this.GridOwner = m_console.CmdPrompt("Grid owner [OGS development team]: ", "OGS development team");
|
||||
this.DefaultStartupMsg = m_console.CmdPrompt("Default startup message for clients [Welcome to OGS!]: ", "Welcome to OGS!");
|
||||
this.GridOwner = m_console.CmdPrompt("Grid owner", "OGS development team");
|
||||
this.DefaultStartupMsg = m_console.CmdPrompt("Default startup message for clients", "Welcome to OGS!");
|
||||
|
||||
this.DefaultAssetServer = m_console.CmdPrompt("Default asset server [no default]: ");
|
||||
this.AssetSendKey = m_console.CmdPrompt("Key to send to asset server: ");
|
||||
this.AssetRecvKey = m_console.CmdPrompt("Key to expect from asset server: ");
|
||||
this.DefaultAssetServer = m_console.CmdPrompt("Default asset server");
|
||||
this.AssetSendKey = m_console.CmdPrompt("Key to send to asset server");
|
||||
this.AssetRecvKey = m_console.CmdPrompt("Key to expect from asset server");
|
||||
|
||||
this.DefaultUserServer = m_console.CmdPrompt("Default user server [no default]: ");
|
||||
this.UserSendKey = m_console.CmdPrompt("Key to send to user server: ");
|
||||
this.UserRecvKey = m_console.CmdPrompt("Key to expect from user server: ");
|
||||
this.DefaultUserServer = m_console.CmdPrompt("Default user server", "http://localhost:8002/userserver");
|
||||
this.UserSendKey = m_console.CmdPrompt("Key to send to user server");
|
||||
this.UserRecvKey = m_console.CmdPrompt("Key to expect from user server");
|
||||
|
||||
m_console.WriteLine("Main.cs:Startup() - Starting HTTP process");
|
||||
_httpd = new GridHTTPServer();
|
||||
|
|
|
@ -87,11 +87,11 @@ namespace OpenGridServices.UserServer
|
|||
}
|
||||
|
||||
public void Startup() {
|
||||
MainConsole.Instance.WriteLine("Main.cs:Startup() - Please press enter to retain default settings");
|
||||
MainConsole.Instance.WriteLine("Main.cs:Startup() - Please press enter for default settings");
|
||||
|
||||
this.GridURL=MainConsole.Instance.CmdPrompt("Grid URL: ");
|
||||
this.GridSendKey=MainConsole.Instance.CmdPrompt("Key to send to grid: ");
|
||||
this.GridRecvKey=MainConsole.Instance.CmdPrompt("Key to expect from grid: ");
|
||||
this.GridURL = MainConsole.Instance.CmdPrompt("Grid URL", "http://localhost:8001/gridserver");
|
||||
this.GridSendKey=MainConsole.Instance.CmdPrompt("Key to send to grid");
|
||||
this.GridRecvKey=MainConsole.Instance.CmdPrompt("Key to expect from grid");
|
||||
|
||||
this.DefaultStartupMsg=MainConsole.Instance.CmdPrompt("Default startup message for clients [Welcome to OGS!] :","Welcome to OGS!");
|
||||
|
||||
|
@ -105,9 +105,9 @@ namespace OpenGridServices.UserServer
|
|||
string templastname;
|
||||
string tempMD5Passwd;
|
||||
MainConsole.Instance.WriteLine("Main.cs:Startup() - Please configure the grid god user:");
|
||||
tempfirstname=MainConsole.Instance.CmdPrompt("First name: ");
|
||||
templastname=MainConsole.Instance.CmdPrompt("Last name: ");
|
||||
tempMD5Passwd=MainConsole.Instance.PasswdPrompt("Password: ");
|
||||
tempfirstname=MainConsole.Instance.CmdPrompt("First name", "God");
|
||||
templastname=MainConsole.Instance.CmdPrompt("Last name", "User");
|
||||
tempMD5Passwd=MainConsole.Instance.PasswdPrompt("Password");
|
||||
|
||||
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
|
||||
byte[] bs = System.Text.Encoding.UTF8.GetBytes(tempMD5Passwd);
|
||||
|
|
|
@ -52,22 +52,22 @@ namespace OpenSim.Config.SimConfigDb4o
|
|||
public void LoadDefaults() {
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadDefaults() - Please press enter to retain default or enter new settings");
|
||||
|
||||
this.RegionName=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Name [OpenSim test]: ","OpenSim test");
|
||||
this.RegionLocX=(uint)Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid Location X [997]: ","997"));
|
||||
this.RegionLocY=(uint)Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid Location Y [996]: ","996"));
|
||||
this.IPListenPort=Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("UDP port for client connections [9000]: ","9000"));
|
||||
this.IPListenAddr=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("IP Address to listen on for client connections [127.0.0.1]: ","127.0.0.1");
|
||||
this.RegionName=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Name","OpenSim test");
|
||||
this.RegionLocX=(uint)Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid Location X","997"));
|
||||
this.RegionLocY=(uint)Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid Location Y","996"));
|
||||
this.IPListenPort=Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("UDP port for client connections","9000"));
|
||||
this.IPListenAddr=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("IP Address to listen on for client connections","127.0.0.1");
|
||||
|
||||
if(!isSandbox)
|
||||
{
|
||||
this.AssetURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server URL: ");
|
||||
this.AssetSendKey=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server key: ");
|
||||
this.GridURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid server URL: ");
|
||||
this.GridSendKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to send to grid server: ");
|
||||
this.GridRecvKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to expect from grid server: ");
|
||||
this.UserURL = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("User server URL: ");
|
||||
this.UserSendKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to send to user server: ");
|
||||
this.UserRecvKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to expect from user server: ");
|
||||
this.AssetURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server URL");
|
||||
this.AssetSendKey=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server key");
|
||||
this.GridURL = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid server URL", "http://localhost:8002/userserver");
|
||||
this.GridSendKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to send to grid server");
|
||||
this.GridRecvKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to expect from grid server");
|
||||
this.UserURL = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("User server URL", "http://localhost:8001/gridserver");
|
||||
this.UserSendKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to send to user server");
|
||||
this.UserRecvKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to expect from user server");
|
||||
}
|
||||
this.RegionHandle = Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
|
||||
}
|
||||
|
|
|
@ -84,14 +84,14 @@ namespace OpenSim.Framework.Console
|
|||
// Displays a command prompt and waits for the user to enter a string, then returns that string
|
||||
public string CmdPrompt(string prompt)
|
||||
{
|
||||
this.Write(prompt);
|
||||
this.Write("{0}: ", prompt);
|
||||
return this.ReadLine();
|
||||
}
|
||||
|
||||
// Displays a command prompt and returns a default value if the user simply presses enter
|
||||
public string CmdPrompt(string prompt, string defaultresponse)
|
||||
{
|
||||
string temp = CmdPrompt(prompt);
|
||||
{
|
||||
string temp = CmdPrompt( String.Format("{0} [{1}]", prompt, defaultresponse ));
|
||||
if (temp == "")
|
||||
{
|
||||
return defaultresponse;
|
||||
|
|
|
@ -34,62 +34,63 @@ namespace OpenSim.Framework.User
|
|||
|
||||
public virtual string ParseXMLRPC(string requestBody)
|
||||
{
|
||||
|
||||
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
||||
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
|
||||
switch (request.MethodName)
|
||||
{
|
||||
case "login_to_simulator":
|
||||
bool GoodXML = (requestData.Contains("first") && requestData.Contains("last") && requestData.Contains("passwd"));
|
||||
bool GoodLogin = false;
|
||||
string firstname = "";
|
||||
string lastname = "";
|
||||
string passwd = "";
|
||||
XmlRpcResponse response = XmlRpcLoginMethod(request);
|
||||
|
||||
if (GoodXML)
|
||||
{
|
||||
firstname = (string)requestData["first"];
|
||||
lastname = (string)requestData["last"];
|
||||
passwd = (string)requestData["passwd"];
|
||||
GoodLogin = AuthenticateUser(firstname, lastname, passwd);
|
||||
}
|
||||
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(response), "utf-16", "utf-8"));
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
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))
|
||||
{
|
||||
XmlRpcResponse LoginErrorResp = 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";
|
||||
LoginErrorResp.Value = ErrorRespData;
|
||||
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(LoginErrorResp), " encoding=\"utf-16\"", ""));
|
||||
}
|
||||
|
||||
UserProfile TheUser = GetProfileByName(firstname, lastname);
|
||||
|
||||
/*
|
||||
if (!((TheUser.CurrentSessionID == null) && (TheUser.CurrentSecureSessionID == null)))
|
||||
{
|
||||
XmlRpcResponse PresenceErrorResp = 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";
|
||||
PresenceErrorResp.Value = PresenceErrorRespData;
|
||||
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", ""));
|
||||
|
||||
}*/
|
||||
if (!(GoodXML && GoodLogin))
|
||||
{
|
||||
response = CreateErrorConnectingToGridResponse();
|
||||
}
|
||||
else
|
||||
{
|
||||
UserProfile TheUser = GetProfileByName(firstname, lastname);
|
||||
|
||||
if (!((TheUser.CurrentSessionID == null) && (TheUser.CurrentSecureSessionID == null)))
|
||||
{
|
||||
response = CreateAlreadyLoggedInResponse();
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
Hashtable responseData = new Hashtable();
|
||||
|
||||
LLUUID AgentID = TheUser.UUID;
|
||||
TheUser.InitSessionData();
|
||||
// SimProfile SimInfo = new SimProfile();
|
||||
// SimInfo = SimInfo.LoadFromGrid(TheUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
||||
// SimProfile SimInfo = new SimProfile();
|
||||
// SimInfo = SimInfo.LoadFromGrid(TheUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
||||
|
||||
XmlRpcResponse LoginGoodResp = new XmlRpcResponse();
|
||||
Hashtable LoginGoodData = new Hashtable();
|
||||
|
||||
Hashtable GlobalT = new Hashtable();
|
||||
GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
|
||||
|
@ -117,7 +118,6 @@ namespace OpenSim.Framework.User
|
|||
ArrayList ClassifiedCategories = new ArrayList();
|
||||
ClassifiedCategories.Add(ClassifiedCategoriesHash);
|
||||
|
||||
Console.WriteLine("copying inventory data to response");
|
||||
ArrayList AgentInventory = new ArrayList();
|
||||
foreach (InventoryFolder InvFolder in TheUser.Inventory.InventoryFolders.Values)
|
||||
{
|
||||
|
@ -144,52 +144,73 @@ namespace OpenSim.Framework.User
|
|||
uint circode = (uint)(Util.RandomClass.Next());
|
||||
//TheUser.AddSimCircuit(circode, SimInfo.UUID);
|
||||
|
||||
LoginGoodData["last_name"] = "\"" + TheUser.lastname + "\"";
|
||||
LoginGoodData["ui-config"] = ui_config;
|
||||
LoginGoodData["sim_ip"] = "127.0.0.1"; //SimInfo.sim_ip.ToString();
|
||||
LoginGoodData["login-flags"] = LoginFlags;
|
||||
LoginGoodData["global-textures"] = GlobalTextures;
|
||||
LoginGoodData["classified_categories"] = ClassifiedCategories;
|
||||
LoginGoodData["event_categories"] = new ArrayList();
|
||||
LoginGoodData["inventory-skeleton"] = AgentInventory;
|
||||
LoginGoodData["inventory-skel-lib"] = new ArrayList();
|
||||
LoginGoodData["inventory-root"] = InventoryRoot;
|
||||
LoginGoodData["event_notifications"] = new ArrayList();
|
||||
LoginGoodData["gestures"] = new ArrayList();
|
||||
LoginGoodData["inventory-lib-owner"] = new ArrayList();
|
||||
LoginGoodData["initial-outfit"] = InitialOutfit;
|
||||
LoginGoodData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
LoginGoodData["start_location"] = "last";
|
||||
LoginGoodData["home"] = "{'region_handle':[r" + (997 * 256).ToString() + ",r" + (996 * 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() + "]}";
|
||||
LoginGoodData["message"] = DefaultStartupMsg;
|
||||
LoginGoodData["first_name"] = "\"" + TheUser.firstname + "\"";
|
||||
LoginGoodData["circuit_code"] = (Int32)circode;
|
||||
LoginGoodData["sim_port"] = 9000; //(Int32)SimInfo.sim_port;
|
||||
LoginGoodData["secure_session_id"] = TheUser.CurrentSecureSessionID.ToStringHyphenated();
|
||||
LoginGoodData["look_at"] = "\n[r" + TheUser.homelookat.X.ToString() + ",r" + TheUser.homelookat.Y.ToString() + ",r" + TheUser.homelookat.Z.ToString() + "]\n";
|
||||
LoginGoodData["agent_id"] = AgentID.ToStringHyphenated();
|
||||
LoginGoodData["region_y"] = (Int32) 996 * 256; // (Int32)SimInfo.RegionLocY * 256;
|
||||
LoginGoodData["region_x"] = (Int32) 997 * 256; //SimInfo.RegionLocX * 256;
|
||||
LoginGoodData["seed_capability"] = null;
|
||||
LoginGoodData["agent_access"] = "M";
|
||||
LoginGoodData["session_id"] = TheUser.CurrentSessionID.ToStringHyphenated();
|
||||
LoginGoodData["login"] = "true";
|
||||
responseData["last_name"] = "\"" + TheUser.firstname + "\"";
|
||||
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" + (997 * 256).ToString() + ",r" + (996 * 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"] = "\"" + firstname + "\"";
|
||||
responseData["circuit_code"] = (Int32)circode;
|
||||
responseData["sim_port"] = 9000; //(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)996 * 256; // (Int32)SimInfo.RegionLocY * 256;
|
||||
responseData["region_x"] = (Int32)997 * 256; //SimInfo.RegionLocX * 256;
|
||||
responseData["seed_capability"] = null;
|
||||
responseData["agent_access"] = "M";
|
||||
responseData["session_id"] = TheUser.CurrentSessionID.ToStringHyphenated();
|
||||
responseData["login"] = "true";
|
||||
|
||||
this.CustomiseResponse(ref LoginGoodData, TheUser);
|
||||
LoginGoodResp.Value = LoginGoodData;
|
||||
this.CustomiseResponse(ref responseData, TheUser);
|
||||
response.Value = responseData;
|
||||
//TheUser.SendDataToSim(SimInfo);
|
||||
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(LoginGoodResp), "utf-16", "utf-8"));
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
Console.WriteLine(E.ToString());
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
return "";
|
||||
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)
|
||||
|
@ -198,8 +219,8 @@ namespace OpenSim.Framework.User
|
|||
SimProfile SimInfo = new SimProfile();
|
||||
//get siminfo from grid server
|
||||
SimInfo = SimInfo.LoadFromGrid(theUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
||||
Int32 circode = (Int32)response["circuit_code"];
|
||||
theUser.AddSimCircuit((uint)circode, SimInfo.UUID);
|
||||
uint circode = (uint)response["circuit_code"];
|
||||
theUser.AddSimCircuit(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.ToString();
|
||||
response["sim_port"] = (Int32)SimInfo.sim_port;
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenSim.CAPS
|
||||
{
|
||||
public interface IXmlRPCHandler
|
||||
{
|
||||
string HandleRPC(string requestBody);
|
||||
}
|
||||
}
|
|
@ -1,241 +0,0 @@
|
|||
/*
|
||||
Copyright (c) OpenSimCAPS project, http://osgrid.org/
|
||||
|
||||
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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.Text;
|
||||
using Nwc.XmlRpc;
|
||||
using System.Threading;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using libsecondlife;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Framework.Interfaces;
|
||||
using OpenSim.Servers;
|
||||
|
||||
namespace OpenSim.CAPS
|
||||
{
|
||||
// Dummy HTTP server, does nothing useful for now
|
||||
|
||||
public class SimCAPSHTTPServer : BaseHttpServer
|
||||
{
|
||||
private Thread m_workerThread;
|
||||
private HttpListener m_httpListener;
|
||||
private Dictionary<string, IRestHandler> m_restHandlers = new Dictionary<string, IRestHandler>();
|
||||
private Dictionary<string, IXmlRPCHandler> RPCHandlers = new Dictionary<string, IXmlRPCHandler>();
|
||||
private IGridServer m_gridServer;
|
||||
private int m_port;
|
||||
|
||||
public SimCAPSHTTPServer(IGridServer gridServer, int port)
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Starting up HTTP Server");
|
||||
m_workerThread = new Thread(new ThreadStart(StartHTTP));
|
||||
m_workerThread.Start();
|
||||
m_gridServer = gridServer;
|
||||
m_port = port;
|
||||
}
|
||||
|
||||
public void StartHTTP()
|
||||
{
|
||||
try
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("SimHttp.cs:StartHTTP() - Spawned main thread OK");
|
||||
m_httpListener = new HttpListener();
|
||||
|
||||
m_httpListener.Prefixes.Add("http://+:" + m_port + "/");
|
||||
m_httpListener.Start();
|
||||
|
||||
HttpListenerContext context;
|
||||
while (true)
|
||||
{
|
||||
context = m_httpListener.GetContext();
|
||||
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public bool AddRestHandler(string path, IRestHandler handler)
|
||||
{
|
||||
if (!this.m_restHandlers.ContainsKey(path))
|
||||
{
|
||||
this.m_restHandlers.Add(path, handler);
|
||||
return true;
|
||||
}
|
||||
|
||||
//must already have a handler for that path so return false
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool AddXmlRPCHandler(string method, IXmlRPCHandler handler)
|
||||
{
|
||||
if (!this.RPCHandlers.ContainsKey(method))
|
||||
{
|
||||
this.RPCHandlers.Add(method, handler);
|
||||
return true;
|
||||
}
|
||||
|
||||
//must already have a handler for that path so return false
|
||||
return false;
|
||||
}
|
||||
|
||||
protected virtual string ParseXMLRPC(string requestBody)
|
||||
{
|
||||
string responseString = "";
|
||||
try
|
||||
{
|
||||
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
||||
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
switch (request.MethodName)
|
||||
{
|
||||
case "expect_user":
|
||||
AgentCircuitData agent_data = new AgentCircuitData();
|
||||
agent_data.SessionID = new LLUUID((string)requestData["session_id"]);
|
||||
agent_data.SecureSessionID = new LLUUID((string)requestData["secure_session_id"]);
|
||||
agent_data.firstname = (string)requestData["firstname"];
|
||||
agent_data.lastname = (string)requestData["lastname"];
|
||||
agent_data.AgentID = new LLUUID((string)requestData["agent_id"]);
|
||||
agent_data.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
|
||||
if (m_gridServer.GetName() == "Remote")
|
||||
{
|
||||
((RemoteGridBase) m_gridServer).agentcircuits.Add((uint)agent_data.circuitcode, agent_data);
|
||||
}
|
||||
responseString = "<?xml version=\"1.0\"?><methodResponse><params /></methodResponse>";
|
||||
break;
|
||||
default:
|
||||
if (this.RPCHandlers.ContainsKey(request.MethodName))
|
||||
{
|
||||
//responseString = this.RPCHandlers[request.MethodName]
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
return responseString;
|
||||
}
|
||||
|
||||
protected virtual string ParseREST(string requestBody, string requestURL, string requestMethod)
|
||||
{
|
||||
string[] path;
|
||||
string pathDelimStr = "/";
|
||||
char[] pathDelimiter = pathDelimStr.ToCharArray();
|
||||
path = requestURL.Split(pathDelimiter);
|
||||
|
||||
string responseString = "";
|
||||
|
||||
//path[0] should be empty so we are interested in path[1]
|
||||
if (path.Length > 1)
|
||||
{
|
||||
if ((path[1] != "") && (this.m_restHandlers.ContainsKey(path[1])))
|
||||
{
|
||||
responseString = this.m_restHandlers[path[1]].HandleREST(requestBody, requestURL, requestMethod);
|
||||
}
|
||||
}
|
||||
|
||||
return responseString;
|
||||
}
|
||||
|
||||
protected virtual string ParseLLSDXML(string requestBody)
|
||||
{
|
||||
// dummy function for now - IMPLEMENT ME!
|
||||
return "";
|
||||
}
|
||||
|
||||
public virtual void HandleRequest(Object stateinfo)
|
||||
{
|
||||
// Console.WriteLine("new http incoming");
|
||||
HttpListenerContext context = (HttpListenerContext)stateinfo;
|
||||
|
||||
HttpListenerRequest request = context.Request;
|
||||
HttpListenerResponse response = context.Response;
|
||||
|
||||
response.KeepAlive = false;
|
||||
response.SendChunked = false;
|
||||
|
||||
System.IO.Stream body = request.InputStream;
|
||||
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
|
||||
System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
|
||||
|
||||
string requestBody = reader.ReadToEnd();
|
||||
body.Close();
|
||||
reader.Close();
|
||||
|
||||
//Console.WriteLine(request.HttpMethod + " " + request.RawUrl + " Http/" + request.ProtocolVersion.ToString() + " content type: " + request.ContentType);
|
||||
//Console.WriteLine(requestBody);
|
||||
|
||||
string responseString = "";
|
||||
switch (request.ContentType)
|
||||
{
|
||||
case "text/xml":
|
||||
// must be XML-RPC, so pass to the XML-RPC parser
|
||||
|
||||
responseString = ParseXMLRPC(requestBody);
|
||||
response.AddHeader("Content-type", "text/xml");
|
||||
break;
|
||||
|
||||
case "application/xml":
|
||||
// probably LLSD we hope, otherwise it should be ignored by the parser
|
||||
responseString = ParseLLSDXML(requestBody);
|
||||
response.AddHeader("Content-type", "application/xml");
|
||||
break;
|
||||
|
||||
case "application/x-www-form-urlencoded":
|
||||
// a form data POST so send to the REST parser
|
||||
responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod);
|
||||
response.AddHeader("Content-type", "text/html");
|
||||
break;
|
||||
|
||||
case null:
|
||||
// must be REST or invalid crap, so pass to the REST parser
|
||||
responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod);
|
||||
response.AddHeader("Content-type", "text/html");
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
|
||||
System.IO.Stream output = response.OutputStream;
|
||||
response.SendChunked = false;
|
||||
response.ContentLength64 = buffer.Length;
|
||||
output.Write(buffer, 0, buffer.Length);
|
||||
output.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -117,7 +117,6 @@
|
|||
<Compile Include="AgentAssetUpload.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CAPS\IXmlRPCHandler.cs" />
|
||||
<Compile Include="ConsoleCmds.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
|
@ -151,9 +150,6 @@
|
|||
<Compile Include="CAPS\AdminWebFront.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CAPS\IRestHandler.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CAPS\SimHttp.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
|
|
|
@ -45,6 +45,8 @@ using OpenSim.Assets;
|
|||
using OpenSim.CAPS;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Physics.Manager;
|
||||
using Nwc.XmlRpc;
|
||||
using OpenSim.Servers;
|
||||
|
||||
namespace OpenSim
|
||||
{
|
||||
|
@ -54,7 +56,7 @@ namespace OpenSim
|
|||
private World LocalWorld;
|
||||
private Grid GridServers;
|
||||
private SimConfig Cfg;
|
||||
private SimCAPSHTTPServer HttpServer;
|
||||
private BaseHttpServer HttpServer;
|
||||
private AssetCache AssetCache;
|
||||
private InventoryCache InventoryCache;
|
||||
//public Dictionary<EndPoint, SimClient> ClientThreads = new Dictionary<EndPoint, SimClient>();
|
||||
|
@ -75,16 +77,15 @@ namespace OpenSim
|
|||
public string m_physicsEngine;
|
||||
public bool m_sandbox = false;
|
||||
public bool m_loginserver;
|
||||
public bool user_accounts = false;
|
||||
|
||||
protected ConsoleBase m_console;
|
||||
|
||||
public OpenSimMain( bool sandBoxMode, bool startLoginServer, string physicsEngine )
|
||||
|
||||
public OpenSimMain(bool sandBoxMode, bool startLoginServer, string physicsEngine)
|
||||
{
|
||||
m_sandbox = sandBoxMode;
|
||||
m_loginserver = startLoginServer;
|
||||
m_physicsEngine = physicsEngine;
|
||||
|
||||
|
||||
m_console = new ConsoleBase("region-console.log", "Region", this);
|
||||
OpenSim.Framework.Console.MainConsole.Instance = m_console;
|
||||
}
|
||||
|
@ -92,11 +93,11 @@ namespace OpenSim
|
|||
public virtual void StartUp()
|
||||
{
|
||||
GridServers = new Grid();
|
||||
if ( m_sandbox )
|
||||
if (m_sandbox)
|
||||
{
|
||||
GridServers.AssetDll = "OpenSim.GridInterfaces.Local.dll";
|
||||
GridServers.GridDll = "OpenSim.GridInterfaces.Local.dll";
|
||||
|
||||
|
||||
m_console.WriteLine("Starting in Sandbox mode");
|
||||
}
|
||||
else
|
||||
|
@ -108,7 +109,7 @@ namespace OpenSim
|
|||
}
|
||||
|
||||
GridServers.Initialise();
|
||||
|
||||
|
||||
startuptime = DateTime.Now;
|
||||
|
||||
AssetCache = new AssetCache(GridServers.AssetServer);
|
||||
|
@ -134,36 +135,61 @@ namespace OpenSim
|
|||
LocalWorld.PhysScene.SetTerrain(LocalWorld.LandMap);
|
||||
|
||||
GridServers.AssetServer.SetServerInfo(Cfg.AssetURL, Cfg.AssetSendKey);
|
||||
GridServers.GridServer.SetServerInfo(Cfg.GridURL, Cfg.GridSendKey, Cfg.GridRecvKey);
|
||||
IGridServer gridServer = GridServers.GridServer;
|
||||
gridServer.SetServerInfo(Cfg.GridURL, Cfg.GridSendKey, Cfg.GridRecvKey);
|
||||
|
||||
LocalWorld.LoadStorageDLL("OpenSim.Storage.LocalStorageDb4o.dll"); //all these dll names shouldn't be hard coded.
|
||||
LocalWorld.LoadPrimsFromStorage();
|
||||
|
||||
if ( m_sandbox)
|
||||
if (m_sandbox)
|
||||
{
|
||||
AssetCache.LoadDefaultTextureSet();
|
||||
}
|
||||
|
||||
m_console.WriteLine("Main.cs:Startup() - Starting CAPS HTTP server");
|
||||
HttpServer = new SimCAPSHTTPServer(GridServers.GridServer, Cfg.IPListenPort);
|
||||
|
||||
LoginServer loginServer = null;
|
||||
HttpServer = new BaseHttpServer( Cfg.IPListenPort );
|
||||
|
||||
if (gridServer.GetName() == "Remote")
|
||||
{
|
||||
HttpServer.AddXmlRPCHandler("expect_user",
|
||||
delegate(XmlRpcRequest request)
|
||||
{
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
AgentCircuitData agent_data = new AgentCircuitData();
|
||||
agent_data.SessionID = new LLUUID((string)requestData["session_id"]);
|
||||
agent_data.SecureSessionID = new LLUUID((string)requestData["secure_session_id"]);
|
||||
agent_data.firstname = (string)requestData["firstname"];
|
||||
agent_data.lastname = (string)requestData["lastname"];
|
||||
agent_data.AgentID = new LLUUID((string)requestData["agent_id"]);
|
||||
agent_data.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
|
||||
|
||||
((RemoteGridBase)gridServer).agentcircuits.Add((uint)agent_data.circuitcode, agent_data);
|
||||
|
||||
return new XmlRpcResponse();
|
||||
});
|
||||
}
|
||||
|
||||
HttpServer.AddRestHandler("Admin", new AdminWebFront("Admin", LocalWorld));
|
||||
HttpServer.Start();
|
||||
|
||||
if (m_loginserver && m_sandbox)
|
||||
{
|
||||
loginServer = new LoginServer(GridServers.GridServer, Cfg.IPListenAddr, Cfg.IPListenPort, this.user_accounts);
|
||||
LoginServer loginServer = new LoginServer(gridServer, Cfg.IPListenAddr, Cfg.IPListenPort);
|
||||
loginServer.Startup();
|
||||
|
||||
}
|
||||
if((m_loginserver) && (m_sandbox) && (user_accounts))
|
||||
{
|
||||
this.GridServers.UserServer = loginServer;
|
||||
HttpServer.AddRestHandler("Admin", new AdminWebFront("Admin", LocalWorld, loginServer));
|
||||
}
|
||||
else
|
||||
{
|
||||
HttpServer.AddRestHandler("Admin", new AdminWebFront("Admin", LocalWorld, null));
|
||||
}
|
||||
|
||||
if (loginServer.userAccounts)
|
||||
{
|
||||
// Actually, this is never tru as of now, but if it were, we'd do something like
|
||||
|
||||
HttpServer.AddXmlRPCHandler("login_to_simulator", loginServer.LocalUserManager.XmlRpcLoginMethod);
|
||||
}
|
||||
else
|
||||
{
|
||||
HttpServer.AddXmlRPCHandler("login_to_simulator", loginServer.XmlRpcLoginMethod);
|
||||
}
|
||||
}
|
||||
|
||||
MainServerListener();
|
||||
|
||||
timer1.Enabled = true;
|
||||
|
@ -207,12 +233,12 @@ namespace OpenSim
|
|||
int numBytes = Server.EndReceiveFrom(result, ref epSender);
|
||||
int packetEnd = numBytes - 1;
|
||||
packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
|
||||
|
||||
|
||||
// This is either a new client or a packet to send to an old one
|
||||
// if (OpenSimRoot.Instance.ClientThreads.ContainsKey(epSender))
|
||||
// if (OpenSimRoot.Instance.ClientThreads.ContainsKey(epSender))
|
||||
|
||||
// do we already have a circuit for this endpoint
|
||||
if(this.clientCircuits.ContainsKey(epSender))
|
||||
if (this.clientCircuits.ContainsKey(epSender))
|
||||
{
|
||||
ClientThreads[this.clientCircuits[epSender]].InPacket(packet);
|
||||
}
|
||||
|
@ -221,11 +247,6 @@ namespace OpenSim
|
|||
UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet;
|
||||
this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
|
||||
SimClient newuser = new SimClient(epSender, useCircuit, LocalWorld, ClientThreads, AssetCache, GridServers.GridServer, this, InventoryCache, m_sandbox);
|
||||
if ((this.GridServers.UserServer != null) && (user_accounts))
|
||||
{
|
||||
Console.WriteLine("setting userserver");
|
||||
newuser.UserServer = this.GridServers.UserServer;
|
||||
}
|
||||
//OpenSimRoot.Instance.ClientThreads.Add(epSender, newuser);
|
||||
ClientThreads.Add(useCircuit.CircuitCode.Code, newuser);
|
||||
}
|
||||
|
@ -256,11 +277,11 @@ namespace OpenSim
|
|||
|
||||
}
|
||||
|
||||
public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode )//EndPoint packetSender)
|
||||
public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)//EndPoint packetSender)
|
||||
{
|
||||
// find the endpoint for this circuit
|
||||
EndPoint sendto = null;
|
||||
foreach(KeyValuePair<EndPoint, uint> p in this.clientCircuits)
|
||||
foreach (KeyValuePair<EndPoint, uint> p in this.clientCircuits)
|
||||
{
|
||||
if (p.Value == circuitcode)
|
||||
{
|
||||
|
@ -304,7 +325,7 @@ namespace OpenSim
|
|||
{
|
||||
LocalWorld.Update();
|
||||
}
|
||||
|
||||
|
||||
public void RunCmd(string command, string[] cmdparams)
|
||||
{
|
||||
switch (command)
|
||||
|
@ -353,5 +374,5 @@ namespace OpenSim
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ using libsecondlife;
|
|||
|
||||
namespace OpenSim.UserServer
|
||||
{
|
||||
class LocalUserProfileManager : UserProfileManager
|
||||
public class LocalUserProfileManager : UserProfileManager
|
||||
{
|
||||
private IGridServer m_gridServer;
|
||||
private int m_port;
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace OpenSim.UserServer
|
|||
/// <summary>
|
||||
/// When running in local (default) mode , handles client logins.
|
||||
/// </summary>
|
||||
public class LoginServer : LoginService , IUserServer
|
||||
public class LoginServer : LoginService, IUserServer
|
||||
{
|
||||
private IGridServer m_gridServer;
|
||||
private ushort _loginPort = 8080;
|
||||
|
@ -59,19 +59,34 @@ namespace OpenSim.UserServer
|
|||
private Socket loginServer;
|
||||
private int NumClients;
|
||||
private string _defaultResponse;
|
||||
private bool userAccounts = false;
|
||||
public bool userAccounts = false;
|
||||
private string _mpasswd;
|
||||
private bool _needPasswd = false;
|
||||
private LocalUserProfileManager userManager;
|
||||
private LocalUserProfileManager m_localUserManager;
|
||||
private int m_simPort;
|
||||
private string m_simAddr;
|
||||
|
||||
public LoginServer(IGridServer gridServer, string simAddr, int simPort , bool useAccounts)
|
||||
public LocalUserProfileManager LocalUserManager
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_localUserManager;
|
||||
}
|
||||
}
|
||||
|
||||
public LoginServer(IGridServer gridServer, string simAddr, int simPort)
|
||||
{
|
||||
m_gridServer = gridServer;
|
||||
m_simPort = simPort;
|
||||
m_simAddr = simAddr;
|
||||
this.userAccounts = useAccounts;
|
||||
}
|
||||
|
||||
public void Startup()
|
||||
{
|
||||
this.InitializeLogin();
|
||||
//Thread runLoginProxy = new Thread(new ThreadStart(RunLogin));
|
||||
//runLoginProxy.IsBackground = true;
|
||||
//runLoginProxy.Start();
|
||||
}
|
||||
|
||||
// InitializeLogin: initialize the login
|
||||
|
@ -94,128 +109,132 @@ namespace OpenSim.UserServer
|
|||
SR.Close();
|
||||
this._mpasswd = EncodePassword("testpass");
|
||||
|
||||
userManager = new LocalUserProfileManager(this.m_gridServer, m_simPort, m_simAddr );
|
||||
userManager.InitUserProfiles();
|
||||
userManager.SetKeys("", "", "", "Welcome to OpenSim");
|
||||
m_localUserManager = new LocalUserProfileManager(this.m_gridServer, m_simPort, m_simAddr);
|
||||
m_localUserManager.InitUserProfiles();
|
||||
m_localUserManager.SetKeys("", "", "", "Welcome to OpenSim");
|
||||
|
||||
loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort));
|
||||
loginServer.Listen(1);
|
||||
//loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
//loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort));
|
||||
//loginServer.Listen(1);
|
||||
}
|
||||
|
||||
public void Startup()
|
||||
{
|
||||
this.InitializeLogin();
|
||||
Thread runLoginProxy = new Thread(new ThreadStart(RunLogin));
|
||||
runLoginProxy.IsBackground = true;
|
||||
runLoginProxy.Start();
|
||||
}
|
||||
|
||||
private void RunLogin()
|
||||
{
|
||||
Console.WriteLine("Starting Login Server");
|
||||
try
|
||||
{
|
||||
for (; ; )
|
||||
{
|
||||
Socket client = loginServer.Accept();
|
||||
IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint;
|
||||
//private void RunLogin()
|
||||
//{
|
||||
// Console.WriteLine("Starting Login Server");
|
||||
// try
|
||||
// {
|
||||
// for (; ; )
|
||||
// {
|
||||
// Socket client = loginServer.Accept();
|
||||
// IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint;
|
||||
|
||||
|
||||
NetworkStream networkStream = new NetworkStream(client);
|
||||
StreamReader networkReader = new StreamReader(networkStream);
|
||||
StreamWriter networkWriter = new StreamWriter(networkStream);
|
||||
// NetworkStream networkStream = new NetworkStream(client);
|
||||
// StreamReader networkReader = new StreamReader(networkStream);
|
||||
// StreamWriter networkWriter = new StreamWriter(networkStream);
|
||||
|
||||
try
|
||||
{
|
||||
LoginRequest(networkReader, networkWriter);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
}
|
||||
// try
|
||||
// {
|
||||
// LoginRequest(networkReader, networkWriter);
|
||||
// }
|
||||
// catch (Exception e)
|
||||
// {
|
||||
// Console.WriteLine(e.Message);
|
||||
// }
|
||||
|
||||
networkWriter.Close();
|
||||
networkReader.Close();
|
||||
networkStream.Close();
|
||||
// networkWriter.Close();
|
||||
// networkReader.Close();
|
||||
// networkStream.Close();
|
||||
|
||||
client.Close();
|
||||
// client.Close();
|
||||
|
||||
// send any packets queued for injection
|
||||
// // send any packets queued for injection
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
Console.WriteLine(e.StackTrace);
|
||||
}
|
||||
}
|
||||
// }
|
||||
// }
|
||||
// catch (Exception e)
|
||||
// {
|
||||
// Console.WriteLine(e.Message);
|
||||
// Console.WriteLine(e.StackTrace);
|
||||
// }
|
||||
//}
|
||||
|
||||
// ProxyLogin: proxy a login request
|
||||
private void LoginRequest(StreamReader reader, StreamWriter writer)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
string line;
|
||||
int contentLength = 0;
|
||||
// read HTTP header
|
||||
do
|
||||
{
|
||||
// read one line of the header
|
||||
line = reader.ReadLine();
|
||||
//private void LoginRequest(StreamReader reader, StreamWriter writer)
|
||||
//{
|
||||
// lock (this)
|
||||
// {
|
||||
// string line;
|
||||
// int contentLength = 0;
|
||||
// // read HTTP header
|
||||
// do
|
||||
// {
|
||||
// // read one line of the header
|
||||
// line = reader.ReadLine();
|
||||
|
||||
// check for premature EOF
|
||||
if (line == null)
|
||||
throw new Exception("EOF in client HTTP header");
|
||||
// // check for premature EOF
|
||||
// if (line == null)
|
||||
// throw new Exception("EOF in client HTTP header");
|
||||
|
||||
// look for Content-Length
|
||||
Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line);
|
||||
if (match.Success)
|
||||
contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString());
|
||||
} while (line != "");
|
||||
// // look for Content-Length
|
||||
// Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line);
|
||||
// if (match.Success)
|
||||
// contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString());
|
||||
// } while (line != "");
|
||||
|
||||
// read the HTTP body into a buffer
|
||||
char[] content = new char[contentLength];
|
||||
reader.Read(content, 0, contentLength);
|
||||
// // read the HTTP body into a buffer
|
||||
// char[] content = new char[contentLength];
|
||||
// reader.Read(content, 0, contentLength);
|
||||
|
||||
if (this.userAccounts)
|
||||
{
|
||||
//ask the UserProfile Manager to process the request
|
||||
string reply = this.userManager.ParseXMLRPC(new String(content));
|
||||
// forward the XML-RPC response to the client
|
||||
writer.WriteLine("HTTP/1.0 200 OK");
|
||||
writer.WriteLine("Content-type: text/xml");
|
||||
writer.WriteLine();
|
||||
writer.WriteLine(reply);
|
||||
}
|
||||
else
|
||||
{
|
||||
//handle ourselves
|
||||
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content));
|
||||
if (request.MethodName == "login_to_simulator")
|
||||
{
|
||||
this.ProcessXmlRequest(request, writer);
|
||||
}
|
||||
else
|
||||
{
|
||||
XmlRpcResponse PresenceErrorResp = new XmlRpcResponse();
|
||||
Hashtable PresenceErrorRespData = new Hashtable();
|
||||
PresenceErrorRespData["reason"] = "XmlRequest"; ;
|
||||
PresenceErrorRespData["message"] = "Unknown Rpc request";
|
||||
PresenceErrorRespData["login"] = "false";
|
||||
PresenceErrorResp.Value = PresenceErrorRespData;
|
||||
string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", "");
|
||||
writer.WriteLine("HTTP/1.0 200 OK");
|
||||
writer.WriteLine("Content-type: text/xml");
|
||||
writer.WriteLine();
|
||||
writer.WriteLine(reply);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// if (this.userAccounts)
|
||||
// {
|
||||
// //ask the UserProfile Manager to process the request
|
||||
// string reply = this.userManager.ParseXMLRPC(new String(content));
|
||||
// // forward the XML-RPC response to the client
|
||||
// writer.WriteLine("HTTP/1.0 200 OK");
|
||||
// writer.WriteLine("Content-type: text/xml");
|
||||
// writer.WriteLine();
|
||||
// writer.WriteLine(reply);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //handle ourselves
|
||||
// XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content));
|
||||
// if (request.MethodName == "login_to_simulator")
|
||||
// {
|
||||
// this.ProcessXmlRequest(request, writer);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
|
||||
public bool ProcessXmlRequest(XmlRpcRequest request, StreamWriter writer)
|
||||
// string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", "");
|
||||
// writer.WriteLine("HTTP/1.0 200 OK");
|
||||
// writer.WriteLine("Content-type: text/xml");
|
||||
// writer.WriteLine();
|
||||
// writer.WriteLine(reply);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//public bool ProcessXmlRequest(XmlRpcRequest request, StreamWriter writer)
|
||||
//{
|
||||
// XmlRpcResponse response = XmlRpcLoginMethod(request);
|
||||
|
||||
// // forward the XML-RPC response to the client
|
||||
// writer.WriteLine("HTTP/1.0 200 OK");
|
||||
// writer.WriteLine("Content-type: text/xml");
|
||||
// writer.WriteLine();
|
||||
|
||||
// XmlTextWriter responseWriter = new XmlTextWriter(writer);
|
||||
// XmlRpcResponseSerializer.Singleton.Serialize(responseWriter, response);
|
||||
// responseWriter.Close();
|
||||
|
||||
// return true;
|
||||
//}
|
||||
|
||||
public XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request)
|
||||
{
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
string first;
|
||||
|
@ -224,6 +243,8 @@ namespace OpenSim.UserServer
|
|||
LLUUID Agent;
|
||||
LLUUID Session;
|
||||
|
||||
XmlRpcResponse response = new XmlRpcResponse();
|
||||
|
||||
//get login name
|
||||
if (requestData.Contains("first"))
|
||||
{
|
||||
|
@ -254,99 +275,84 @@ namespace OpenSim.UserServer
|
|||
|
||||
if (!Authenticate(first, last, passwd))
|
||||
{
|
||||
XmlRpcResponse PresenceErrorResp = new XmlRpcResponse();
|
||||
Hashtable PresenceErrorRespData = new Hashtable();
|
||||
PresenceErrorRespData["reason"] = "key"; ;
|
||||
PresenceErrorRespData["message"] = "You have entered an invalid name/password combination. Check Caps/lock.";
|
||||
PresenceErrorRespData["login"] = "false";
|
||||
PresenceErrorResp.Value = PresenceErrorRespData;
|
||||
string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", "");
|
||||
writer.WriteLine("HTTP/1.0 200 OK");
|
||||
writer.WriteLine("Content-type: text/xml");
|
||||
writer.WriteLine();
|
||||
writer.WriteLine(reply);
|
||||
return false;
|
||||
Hashtable loginError = new Hashtable();
|
||||
loginError["reason"] = "key"; ;
|
||||
loginError["message"] = "You have entered an invalid name/password combination. Check Caps/lock.";
|
||||
loginError["login"] = "false";
|
||||
response.Value = loginError;
|
||||
}
|
||||
|
||||
NumClients++;
|
||||
|
||||
//create a agent and session LLUUID
|
||||
Agent = GetAgentId(first, last);
|
||||
int SessionRand = Util.RandomClass.Next(1, 999);
|
||||
Session = new LLUUID("aaaabbbb-0200-" + SessionRand.ToString("0000") + "-8664-58f53e442797");
|
||||
LLUUID secureSess = LLUUID.Random();
|
||||
//create some login info
|
||||
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 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);
|
||||
|
||||
XmlRpcResponse response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
|
||||
Hashtable responseData = (Hashtable)response.Value;
|
||||
|
||||
responseData["sim_port"] = m_simPort;
|
||||
responseData["sim_ip"] = m_simAddr;
|
||||
responseData["agent_id"] = Agent.ToStringHyphenated();
|
||||
responseData["session_id"] = Session.ToStringHyphenated();
|
||||
responseData["secure_session_id"]= secureSess.ToStringHyphenated();
|
||||
responseData["circuit_code"] = (Int32)(Util.RandomClass.Next());
|
||||
responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
responseData["login-flags"] = LoginFlags;
|
||||
responseData["global-textures"] = GlobalTextures;
|
||||
|
||||
//inventory
|
||||
ArrayList InventoryList = (ArrayList)responseData["inventory-skeleton"];
|
||||
Hashtable Inventory1 = (Hashtable)InventoryList[0];
|
||||
Hashtable Inventory2 = (Hashtable)InventoryList[1];
|
||||
LLUUID BaseFolderID = LLUUID.Random();
|
||||
LLUUID InventoryFolderID = LLUUID.Random();
|
||||
Inventory2["name"] = "Textures";
|
||||
Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated();
|
||||
Inventory2["type_default"] = 0;
|
||||
Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||
|
||||
ArrayList InventoryRoot = (ArrayList)responseData["inventory-root"];
|
||||
Hashtable Inventoryroot = (Hashtable)InventoryRoot[0];
|
||||
Inventoryroot["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||
|
||||
CustomiseLoginResponse(responseData, first, last);
|
||||
|
||||
Login _login = new Login();
|
||||
//copy data to login object
|
||||
_login.First = first;
|
||||
_login.Last = last;
|
||||
_login.Agent = Agent;
|
||||
_login.Session = Session;
|
||||
_login.SecureSession = secureSess;
|
||||
_login.BaseFolder = BaseFolderID;
|
||||
_login.InventoryFolder = InventoryFolderID;
|
||||
|
||||
//working on local computer if so lets add to the gridserver's list of sessions?
|
||||
if (m_gridServer.GetName() == "Local")
|
||||
else
|
||||
{
|
||||
((LocalGridBase)m_gridServer).AddNewSession(_login);
|
||||
NumClients++;
|
||||
|
||||
//create a agent and session LLUUID
|
||||
Agent = GetAgentId(first, last);
|
||||
int SessionRand = Util.RandomClass.Next(1, 999);
|
||||
Session = new LLUUID("aaaabbbb-0200-" + SessionRand.ToString("0000") + "-8664-58f53e442797");
|
||||
LLUUID secureSess = LLUUID.Random();
|
||||
//create some login info
|
||||
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 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);
|
||||
|
||||
response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
|
||||
Hashtable responseData = (Hashtable)response.Value;
|
||||
|
||||
responseData["sim_port"] = m_simPort;
|
||||
responseData["sim_ip"] = m_simAddr;
|
||||
responseData["agent_id"] = Agent.ToStringHyphenated();
|
||||
responseData["session_id"] = Session.ToStringHyphenated();
|
||||
responseData["secure_session_id"] = secureSess.ToStringHyphenated();
|
||||
responseData["circuit_code"] = (Int32)(Util.RandomClass.Next());
|
||||
responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
responseData["login-flags"] = LoginFlags;
|
||||
responseData["global-textures"] = GlobalTextures;
|
||||
|
||||
//inventory
|
||||
ArrayList InventoryList = (ArrayList)responseData["inventory-skeleton"];
|
||||
Hashtable Inventory1 = (Hashtable)InventoryList[0];
|
||||
Hashtable Inventory2 = (Hashtable)InventoryList[1];
|
||||
LLUUID BaseFolderID = LLUUID.Random();
|
||||
LLUUID InventoryFolderID = LLUUID.Random();
|
||||
Inventory2["name"] = "Textures";
|
||||
Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated();
|
||||
Inventory2["type_default"] = 0;
|
||||
Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||
|
||||
ArrayList InventoryRoot = (ArrayList)responseData["inventory-root"];
|
||||
Hashtable Inventoryroot = (Hashtable)InventoryRoot[0];
|
||||
Inventoryroot["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||
|
||||
CustomiseLoginResponse(responseData, first, last);
|
||||
|
||||
Login _login = new Login();
|
||||
//copy data to login object
|
||||
_login.First = first;
|
||||
_login.Last = last;
|
||||
_login.Agent = Agent;
|
||||
_login.Session = Session;
|
||||
_login.SecureSession = secureSess;
|
||||
_login.BaseFolder = BaseFolderID;
|
||||
_login.InventoryFolder = InventoryFolderID;
|
||||
|
||||
//working on local computer if so lets add to the gridserver's list of sessions?
|
||||
if (m_gridServer.GetName() == "Local")
|
||||
{
|
||||
((LocalGridBase)m_gridServer).AddNewSession(_login);
|
||||
}
|
||||
}
|
||||
|
||||
// forward the XML-RPC response to the client
|
||||
writer.WriteLine("HTTP/1.0 200 OK");
|
||||
writer.WriteLine("Content-type: text/xml");
|
||||
writer.WriteLine();
|
||||
|
||||
XmlTextWriter responseWriter = new XmlTextWriter(writer);
|
||||
XmlRpcResponseSerializer.Singleton.Serialize(responseWriter, response);
|
||||
responseWriter.Close();
|
||||
|
||||
return true;
|
||||
return response;
|
||||
}
|
||||
|
||||
protected virtual void CustomiseLoginResponse(Hashtable responseData, string first, string last)
|
||||
|
@ -396,32 +402,18 @@ namespace OpenSim.UserServer
|
|||
return Regex.Replace(BitConverter.ToString(encodedBytes), "-", "").ToLower();
|
||||
}
|
||||
|
||||
public bool CreateUserAccount(string firstName, string lastName, string password)
|
||||
{
|
||||
Console.WriteLine("creating new user account");
|
||||
string mdPassword = EncodePassword(password);
|
||||
Console.WriteLine("with password: " + mdPassword);
|
||||
this.userManager.CreateNewProfile(firstName, lastName, mdPassword);
|
||||
return true;
|
||||
}
|
||||
|
||||
//IUserServer implementation
|
||||
public AgentInventory RequestAgentsInventory(LLUUID agentID)
|
||||
{
|
||||
AgentInventory aInventory = null;
|
||||
if (this.userAccounts)
|
||||
{
|
||||
aInventory = this.userManager.GetUsersInventory(agentID);
|
||||
aInventory = this.m_localUserManager.GetUsersInventory(agentID);
|
||||
}
|
||||
|
||||
return aInventory;
|
||||
}
|
||||
|
||||
public bool UpdateAgentsInventory(LLUUID agentID, AgentInventory inventory)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public void SetServerInfo(string ServerUrl, string SendKey, string RecvKey)
|
||||
{
|
||||
|
||||
|
|
16
README.txt
16
README.txt
|
@ -54,3 +54,19 @@ nant - to generate new nant build scripts
|
|||
|
||||
Remember to run prebuild whenever you've added or removed files as well.
|
||||
|
||||
|
||||
=== Local Set up of OGS config ===
|
||||
|
||||
**NOTE: At the moment OGS is non-functionable, so this won't work **NOTE
|
||||
|
||||
* start up bin/OpenGridServices.GridServer.exe (listens on http://localhost:8001/gridserver)
|
||||
* just press enter to keep the defaults
|
||||
|
||||
* start up bin/OpenGridServices.UserServer.exe (listens on http://localhost:8002/userserver)
|
||||
* just press enter to keep the defaults
|
||||
|
||||
* start up bin/OpenSim.exe ( listens for udp on port 9000 )
|
||||
* just press enter to keep the defaults
|
||||
|
||||
* start the secondlife viewer with -loginuri http://localhost:8080/
|
||||
|
||||
|
|
|
@ -1,10 +1,212 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using OpenSim.CAPS;
|
||||
using Nwc.XmlRpc;
|
||||
using System.Collections;
|
||||
|
||||
namespace OpenSim.Servers
|
||||
{
|
||||
public class BaseHttpServer
|
||||
{
|
||||
protected Thread m_workerThread;
|
||||
protected HttpListener m_httpListener;
|
||||
protected Dictionary<string, IRestHandler> m_restHandlers = new Dictionary<string, IRestHandler>();
|
||||
protected Dictionary<string, XmlRpcMethod> m_rpcHandlers = new Dictionary<string, XmlRpcMethod>();
|
||||
protected int m_port;
|
||||
|
||||
public BaseHttpServer(int port)
|
||||
{
|
||||
m_port = port;
|
||||
}
|
||||
|
||||
public bool AddRestHandler(string path, IRestHandler handler)
|
||||
{
|
||||
if (!this.m_restHandlers.ContainsKey(path))
|
||||
{
|
||||
this.m_restHandlers.Add(path, handler);
|
||||
return true;
|
||||
}
|
||||
|
||||
//must already have a handler for that path so return false
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool AddXmlRPCHandler(string method, XmlRpcMethod handler)
|
||||
{
|
||||
if (!this.m_rpcHandlers.ContainsKey(method))
|
||||
{
|
||||
this.m_rpcHandlers.Add(method, handler);
|
||||
return true;
|
||||
}
|
||||
|
||||
//must already have a handler for that path so return false
|
||||
return false;
|
||||
}
|
||||
|
||||
protected virtual string ProcessXMLRPCMethod(string methodName, XmlRpcRequest request)
|
||||
{
|
||||
XmlRpcResponse response;
|
||||
|
||||
XmlRpcMethod method;
|
||||
if( this.m_rpcHandlers.TryGetValue( methodName, out method ) )
|
||||
{
|
||||
response = method(request);
|
||||
}
|
||||
else
|
||||
{
|
||||
response = new XmlRpcResponse();
|
||||
Hashtable unknownMethodError = new Hashtable();
|
||||
unknownMethodError["reason"] = "XmlRequest"; ;
|
||||
unknownMethodError["message"] = "Unknown Rpc request";
|
||||
unknownMethodError["login"] = "false";
|
||||
response.Value = unknownMethodError;
|
||||
}
|
||||
|
||||
return XmlRpcResponseSerializer.Singleton.Serialize(response);
|
||||
}
|
||||
|
||||
protected virtual string ParseREST(string requestBody, string requestURL, string requestMethod)
|
||||
{
|
||||
string[] path;
|
||||
string pathDelimStr = "/";
|
||||
char[] pathDelimiter = pathDelimStr.ToCharArray();
|
||||
path = requestURL.Split(pathDelimiter);
|
||||
|
||||
string responseString = "";
|
||||
|
||||
//path[0] should be empty so we are interested in path[1]
|
||||
if (path.Length > 1)
|
||||
{
|
||||
if ((path[1] != "") && (this.m_restHandlers.ContainsKey(path[1])))
|
||||
{
|
||||
responseString = this.m_restHandlers[path[1]].HandleREST(requestBody, requestURL, requestMethod);
|
||||
}
|
||||
}
|
||||
|
||||
return responseString;
|
||||
}
|
||||
|
||||
protected virtual string ParseLLSDXML(string requestBody)
|
||||
{
|
||||
// dummy function for now - IMPLEMENT ME!
|
||||
return "";
|
||||
}
|
||||
|
||||
protected virtual string ParseXMLRPC(string requestBody)
|
||||
{
|
||||
string responseString = String.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
||||
|
||||
string methodName = request.MethodName;
|
||||
|
||||
responseString = ProcessXMLRPCMethod(methodName, request );
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
return responseString;
|
||||
}
|
||||
|
||||
public virtual void HandleRequest(Object stateinfo)
|
||||
{
|
||||
// Console.WriteLine("new http incoming");
|
||||
HttpListenerContext context = (HttpListenerContext)stateinfo;
|
||||
|
||||
HttpListenerRequest request = context.Request;
|
||||
HttpListenerResponse response = context.Response;
|
||||
|
||||
response.KeepAlive = false;
|
||||
response.SendChunked = false;
|
||||
|
||||
System.IO.Stream body = request.InputStream;
|
||||
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
|
||||
System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
|
||||
|
||||
string requestBody = reader.ReadToEnd();
|
||||
body.Close();
|
||||
reader.Close();
|
||||
|
||||
//Console.WriteLine(request.HttpMethod + " " + request.RawUrl + " Http/" + request.ProtocolVersion.ToString() + " content type: " + request.ContentType);
|
||||
//Console.WriteLine(requestBody);
|
||||
|
||||
string responseString = "";
|
||||
switch (request.ContentType)
|
||||
{
|
||||
case "text/xml":
|
||||
// must be XML-RPC, so pass to the XML-RPC parser
|
||||
|
||||
responseString = ParseXMLRPC(requestBody);
|
||||
|
||||
// If you wanna do voodoo like this, this is the place... but this example is rotten.
|
||||
// (Regex.Replace(responseString, "utf-16", "utf-8"));
|
||||
|
||||
response.AddHeader("Content-type", "text/xml");
|
||||
break;
|
||||
|
||||
case "application/xml":
|
||||
// probably LLSD we hope, otherwise it should be ignored by the parser
|
||||
responseString = ParseLLSDXML(requestBody);
|
||||
response.AddHeader("Content-type", "application/xml");
|
||||
break;
|
||||
|
||||
case "application/x-www-form-urlencoded":
|
||||
// a form data POST so send to the REST parser
|
||||
responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod);
|
||||
response.AddHeader("Content-type", "text/html");
|
||||
break;
|
||||
|
||||
case null:
|
||||
// must be REST or invalid crap, so pass to the REST parser
|
||||
responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod);
|
||||
response.AddHeader("Content-type", "text/html");
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
|
||||
System.IO.Stream output = response.OutputStream;
|
||||
response.SendChunked = false;
|
||||
response.ContentLength64 = buffer.Length;
|
||||
output.Write(buffer, 0, buffer.Length);
|
||||
output.Close();
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Starting up HTTP Server");
|
||||
|
||||
m_workerThread = new Thread(new ThreadStart(StartHTTP));
|
||||
m_workerThread.Start();
|
||||
}
|
||||
|
||||
private void StartHTTP()
|
||||
{
|
||||
try
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("SimHttp.cs:StartHTTP() - Spawned main thread OK");
|
||||
m_httpListener = new HttpListener();
|
||||
|
||||
m_httpListener.Prefixes.Add("http://+:" + m_port + "/");
|
||||
m_httpListener.Start();
|
||||
|
||||
HttpListenerContext context;
|
||||
while (true)
|
||||
{
|
||||
context = m_httpListener.GetContext();
|
||||
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -96,6 +96,8 @@
|
|||
<Compile Include="BaseHttpServer.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="IRestHandler.cs" />
|
||||
<Compile Include="XmlRpcMethod.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
|
||||
<PropertyGroup>
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
using System;
|
||||
using Nwc.XmlRpc;
|
||||
|
||||
namespace OpenSim.Servers
|
||||
{
|
||||
public delegate XmlRpcResponse XmlRpcMethod( XmlRpcRequest request );
|
||||
}
|
Loading…
Reference in New Issue