* tourmaline
parent
7d04714690
commit
934ae00051
|
@ -84,18 +84,18 @@ namespace OpenGridServices.GridServer
|
||||||
|
|
||||||
public void Startup()
|
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.GridOwner = m_console.CmdPrompt("Grid owner", "OGS development team");
|
||||||
this.DefaultStartupMsg = m_console.CmdPrompt("Default startup message for clients [Welcome to OGS!]: ", "Welcome to OGS!");
|
this.DefaultStartupMsg = m_console.CmdPrompt("Default startup message for clients", "Welcome to OGS!");
|
||||||
|
|
||||||
this.DefaultAssetServer = m_console.CmdPrompt("Default asset server [no default]: ");
|
this.DefaultAssetServer = m_console.CmdPrompt("Default asset server");
|
||||||
this.AssetSendKey = m_console.CmdPrompt("Key to send to 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.AssetRecvKey = m_console.CmdPrompt("Key to expect from asset server");
|
||||||
|
|
||||||
this.DefaultUserServer = m_console.CmdPrompt("Default user server [no default]: ");
|
this.DefaultUserServer = m_console.CmdPrompt("Default user server", "http://localhost:8002/userserver");
|
||||||
this.UserSendKey = m_console.CmdPrompt("Key to send to user server: ");
|
this.UserSendKey = m_console.CmdPrompt("Key to send to user server");
|
||||||
this.UserRecvKey = m_console.CmdPrompt("Key to expect from user server: ");
|
this.UserRecvKey = m_console.CmdPrompt("Key to expect from user server");
|
||||||
|
|
||||||
m_console.WriteLine("Main.cs:Startup() - Starting HTTP process");
|
m_console.WriteLine("Main.cs:Startup() - Starting HTTP process");
|
||||||
_httpd = new GridHTTPServer();
|
_httpd = new GridHTTPServer();
|
||||||
|
|
|
@ -87,11 +87,11 @@ namespace OpenGridServices.UserServer
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Startup() {
|
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.GridURL = MainConsole.Instance.CmdPrompt("Grid URL", "http://localhost:8001/gridserver");
|
||||||
this.GridSendKey=MainConsole.Instance.CmdPrompt("Key to send to grid: ");
|
this.GridSendKey=MainConsole.Instance.CmdPrompt("Key to send to grid");
|
||||||
this.GridRecvKey=MainConsole.Instance.CmdPrompt("Key to expect from 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!");
|
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 templastname;
|
||||||
string tempMD5Passwd;
|
string tempMD5Passwd;
|
||||||
MainConsole.Instance.WriteLine("Main.cs:Startup() - Please configure the grid god user:");
|
MainConsole.Instance.WriteLine("Main.cs:Startup() - Please configure the grid god user:");
|
||||||
tempfirstname=MainConsole.Instance.CmdPrompt("First name: ");
|
tempfirstname=MainConsole.Instance.CmdPrompt("First name", "God");
|
||||||
templastname=MainConsole.Instance.CmdPrompt("Last name: ");
|
templastname=MainConsole.Instance.CmdPrompt("Last name", "User");
|
||||||
tempMD5Passwd=MainConsole.Instance.PasswdPrompt("Password: ");
|
tempMD5Passwd=MainConsole.Instance.PasswdPrompt("Password");
|
||||||
|
|
||||||
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
|
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
|
||||||
byte[] bs = System.Text.Encoding.UTF8.GetBytes(tempMD5Passwd);
|
byte[] bs = System.Text.Encoding.UTF8.GetBytes(tempMD5Passwd);
|
||||||
|
|
|
@ -52,22 +52,22 @@ namespace OpenSim.Config.SimConfigDb4o
|
||||||
public void LoadDefaults() {
|
public void LoadDefaults() {
|
||||||
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadDefaults() - Please press enter to retain default or enter new settings");
|
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.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]: ","997"));
|
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]: ","996"));
|
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]: ","9000"));
|
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]: ","127.0.0.1");
|
this.IPListenAddr=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("IP Address to listen on for client connections","127.0.0.1");
|
||||||
|
|
||||||
if(!isSandbox)
|
if(!isSandbox)
|
||||||
{
|
{
|
||||||
this.AssetURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server URL: ");
|
this.AssetURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server URL");
|
||||||
this.AssetSendKey=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server key: ");
|
this.AssetSendKey=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server key");
|
||||||
this.GridURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid server URL: ");
|
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.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.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.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.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.UserRecvKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to expect from user server");
|
||||||
}
|
}
|
||||||
this.RegionHandle = Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
|
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
|
// Displays a command prompt and waits for the user to enter a string, then returns that string
|
||||||
public string CmdPrompt(string prompt)
|
public string CmdPrompt(string prompt)
|
||||||
{
|
{
|
||||||
this.Write(prompt);
|
this.Write("{0}: ", prompt);
|
||||||
return this.ReadLine();
|
return this.ReadLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Displays a command prompt and returns a default value if the user simply presses enter
|
// Displays a command prompt and returns a default value if the user simply presses enter
|
||||||
public string CmdPrompt(string prompt, string defaultresponse)
|
public string CmdPrompt(string prompt, string defaultresponse)
|
||||||
{
|
{
|
||||||
string temp = CmdPrompt(prompt);
|
string temp = CmdPrompt( String.Format("{0} [{1}]", prompt, defaultresponse ));
|
||||||
if (temp == "")
|
if (temp == "")
|
||||||
{
|
{
|
||||||
return defaultresponse;
|
return defaultresponse;
|
||||||
|
|
|
@ -34,12 +34,25 @@ namespace OpenSim.Framework.User
|
||||||
|
|
||||||
public virtual string ParseXMLRPC(string requestBody)
|
public virtual string ParseXMLRPC(string requestBody)
|
||||||
{
|
{
|
||||||
|
|
||||||
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
||||||
|
|
||||||
Hashtable requestData = (Hashtable)request.Params[0];
|
|
||||||
switch (request.MethodName)
|
switch (request.MethodName)
|
||||||
{
|
{
|
||||||
case "login_to_simulator":
|
case "login_to_simulator":
|
||||||
|
XmlRpcResponse response = XmlRpcLoginMethod(request);
|
||||||
|
|
||||||
|
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 GoodXML = (requestData.Contains("first") && requestData.Contains("last") && requestData.Contains("passwd"));
|
||||||
bool GoodLogin = false;
|
bool GoodLogin = false;
|
||||||
string firstname = "";
|
string firstname = "";
|
||||||
|
@ -57,39 +70,27 @@ namespace OpenSim.Framework.User
|
||||||
|
|
||||||
if (!(GoodXML && GoodLogin))
|
if (!(GoodXML && GoodLogin))
|
||||||
{
|
{
|
||||||
XmlRpcResponse LoginErrorResp = new XmlRpcResponse();
|
response = CreateErrorConnectingToGridResponse();
|
||||||
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\"", ""));
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
UserProfile TheUser = GetProfileByName(firstname, lastname);
|
UserProfile TheUser = GetProfileByName(firstname, lastname);
|
||||||
|
|
||||||
/*
|
|
||||||
if (!((TheUser.CurrentSessionID == null) && (TheUser.CurrentSecureSessionID == null)))
|
if (!((TheUser.CurrentSessionID == null) && (TheUser.CurrentSecureSessionID == null)))
|
||||||
{
|
{
|
||||||
XmlRpcResponse PresenceErrorResp = new XmlRpcResponse();
|
response = CreateAlreadyLoggedInResponse();
|
||||||
Hashtable PresenceErrorRespData = new Hashtable();
|
}
|
||||||
PresenceErrorRespData["reason"] = "presence";
|
else
|
||||||
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\"", ""));
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Hashtable responseData = new Hashtable();
|
||||||
|
|
||||||
LLUUID AgentID = TheUser.UUID;
|
LLUUID AgentID = TheUser.UUID;
|
||||||
TheUser.InitSessionData();
|
TheUser.InitSessionData();
|
||||||
// SimProfile SimInfo = new SimProfile();
|
// SimProfile SimInfo = new SimProfile();
|
||||||
// SimInfo = SimInfo.LoadFromGrid(TheUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
// SimInfo = SimInfo.LoadFromGrid(TheUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
||||||
|
|
||||||
XmlRpcResponse LoginGoodResp = new XmlRpcResponse();
|
|
||||||
Hashtable LoginGoodData = new Hashtable();
|
|
||||||
|
|
||||||
Hashtable GlobalT = new Hashtable();
|
Hashtable GlobalT = new Hashtable();
|
||||||
GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
|
GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
|
||||||
|
@ -117,7 +118,6 @@ namespace OpenSim.Framework.User
|
||||||
ArrayList ClassifiedCategories = new ArrayList();
|
ArrayList ClassifiedCategories = new ArrayList();
|
||||||
ClassifiedCategories.Add(ClassifiedCategoriesHash);
|
ClassifiedCategories.Add(ClassifiedCategoriesHash);
|
||||||
|
|
||||||
Console.WriteLine("copying inventory data to response");
|
|
||||||
ArrayList AgentInventory = new ArrayList();
|
ArrayList AgentInventory = new ArrayList();
|
||||||
foreach (InventoryFolder InvFolder in TheUser.Inventory.InventoryFolders.Values)
|
foreach (InventoryFolder InvFolder in TheUser.Inventory.InventoryFolders.Values)
|
||||||
{
|
{
|
||||||
|
@ -144,52 +144,73 @@ namespace OpenSim.Framework.User
|
||||||
uint circode = (uint)(Util.RandomClass.Next());
|
uint circode = (uint)(Util.RandomClass.Next());
|
||||||
//TheUser.AddSimCircuit(circode, SimInfo.UUID);
|
//TheUser.AddSimCircuit(circode, SimInfo.UUID);
|
||||||
|
|
||||||
LoginGoodData["last_name"] = "\"" + TheUser.lastname + "\"";
|
responseData["last_name"] = "\"" + TheUser.firstname + "\"";
|
||||||
LoginGoodData["ui-config"] = ui_config;
|
responseData["ui-config"] = ui_config;
|
||||||
LoginGoodData["sim_ip"] = "127.0.0.1"; //SimInfo.sim_ip.ToString();
|
responseData["sim_ip"] = "127.0.0.1"; //SimInfo.sim_ip.ToString();
|
||||||
LoginGoodData["login-flags"] = LoginFlags;
|
responseData["login-flags"] = LoginFlags;
|
||||||
LoginGoodData["global-textures"] = GlobalTextures;
|
responseData["global-textures"] = GlobalTextures;
|
||||||
LoginGoodData["classified_categories"] = ClassifiedCategories;
|
responseData["classified_categories"] = ClassifiedCategories;
|
||||||
LoginGoodData["event_categories"] = new ArrayList();
|
responseData["event_categories"] = new ArrayList();
|
||||||
LoginGoodData["inventory-skeleton"] = AgentInventory;
|
responseData["inventory-skeleton"] = AgentInventory;
|
||||||
LoginGoodData["inventory-skel-lib"] = new ArrayList();
|
responseData["inventory-skel-lib"] = new ArrayList();
|
||||||
LoginGoodData["inventory-root"] = InventoryRoot;
|
responseData["inventory-root"] = InventoryRoot;
|
||||||
LoginGoodData["event_notifications"] = new ArrayList();
|
responseData["event_notifications"] = new ArrayList();
|
||||||
LoginGoodData["gestures"] = new ArrayList();
|
responseData["gestures"] = new ArrayList();
|
||||||
LoginGoodData["inventory-lib-owner"] = new ArrayList();
|
responseData["inventory-lib-owner"] = new ArrayList();
|
||||||
LoginGoodData["initial-outfit"] = InitialOutfit;
|
responseData["initial-outfit"] = InitialOutfit;
|
||||||
LoginGoodData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||||
LoginGoodData["start_location"] = "last";
|
responseData["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() + "]}";
|
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() + "]}";
|
||||||
LoginGoodData["message"] = DefaultStartupMsg;
|
responseData["message"] = DefaultStartupMsg;
|
||||||
LoginGoodData["first_name"] = "\"" + TheUser.firstname + "\"";
|
responseData["first_name"] = "\"" + firstname + "\"";
|
||||||
LoginGoodData["circuit_code"] = (Int32)circode;
|
responseData["circuit_code"] = (Int32)circode;
|
||||||
LoginGoodData["sim_port"] = 9000; //(Int32)SimInfo.sim_port;
|
responseData["sim_port"] = 9000; //(Int32)SimInfo.sim_port;
|
||||||
LoginGoodData["secure_session_id"] = TheUser.CurrentSecureSessionID.ToStringHyphenated();
|
responseData["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";
|
responseData["look_at"] = "\n[r" + TheUser.homelookat.X.ToString() + ",r" + TheUser.homelookat.Y.ToString() + ",r" + TheUser.homelookat.Z.ToString() + "]\n";
|
||||||
LoginGoodData["agent_id"] = AgentID.ToStringHyphenated();
|
responseData["agent_id"] = AgentID.ToStringHyphenated();
|
||||||
LoginGoodData["region_y"] = (Int32) 996 * 256; // (Int32)SimInfo.RegionLocY * 256;
|
responseData["region_y"] = (Int32)996 * 256; // (Int32)SimInfo.RegionLocY * 256;
|
||||||
LoginGoodData["region_x"] = (Int32) 997 * 256; //SimInfo.RegionLocX * 256;
|
responseData["region_x"] = (Int32)997 * 256; //SimInfo.RegionLocX * 256;
|
||||||
LoginGoodData["seed_capability"] = null;
|
responseData["seed_capability"] = null;
|
||||||
LoginGoodData["agent_access"] = "M";
|
responseData["agent_access"] = "M";
|
||||||
LoginGoodData["session_id"] = TheUser.CurrentSessionID.ToStringHyphenated();
|
responseData["session_id"] = TheUser.CurrentSessionID.ToStringHyphenated();
|
||||||
LoginGoodData["login"] = "true";
|
responseData["login"] = "true";
|
||||||
|
|
||||||
this.CustomiseResponse(ref LoginGoodData, TheUser);
|
this.CustomiseResponse(ref responseData, TheUser);
|
||||||
LoginGoodResp.Value = LoginGoodData;
|
response.Value = responseData;
|
||||||
//TheUser.SendDataToSim(SimInfo);
|
//TheUser.SendDataToSim(SimInfo);
|
||||||
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(LoginGoodResp), "utf-16", "utf-8"));
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception E)
|
catch (Exception E)
|
||||||
{
|
{
|
||||||
Console.WriteLine(E.ToString());
|
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)
|
public virtual void CustomiseResponse(ref Hashtable response, UserProfile theUser)
|
||||||
|
@ -198,8 +219,8 @@ namespace OpenSim.Framework.User
|
||||||
SimProfile SimInfo = new SimProfile();
|
SimProfile SimInfo = new SimProfile();
|
||||||
//get siminfo from grid server
|
//get siminfo from grid server
|
||||||
SimInfo = SimInfo.LoadFromGrid(theUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
SimInfo = SimInfo.LoadFromGrid(theUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
||||||
Int32 circode = (Int32)response["circuit_code"];
|
uint circode = (uint)response["circuit_code"];
|
||||||
theUser.AddSimCircuit((uint)circode, SimInfo.UUID);
|
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["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_ip"] = SimInfo.sim_ip.ToString();
|
||||||
response["sim_port"] = (Int32)SimInfo.sim_port;
|
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">
|
<Compile Include="AgentAssetUpload.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="CAPS\IXmlRPCHandler.cs" />
|
|
||||||
<Compile Include="ConsoleCmds.cs">
|
<Compile Include="ConsoleCmds.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
@ -151,9 +150,6 @@
|
||||||
<Compile Include="CAPS\AdminWebFront.cs">
|
<Compile Include="CAPS\AdminWebFront.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="CAPS\IRestHandler.cs">
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="CAPS\SimHttp.cs">
|
<Compile Include="CAPS\SimHttp.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|
|
@ -45,6 +45,8 @@ using OpenSim.Assets;
|
||||||
using OpenSim.CAPS;
|
using OpenSim.CAPS;
|
||||||
using OpenSim.Framework.Console;
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Physics.Manager;
|
using OpenSim.Physics.Manager;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using OpenSim.Servers;
|
||||||
|
|
||||||
namespace OpenSim
|
namespace OpenSim
|
||||||
{
|
{
|
||||||
|
@ -54,7 +56,7 @@ namespace OpenSim
|
||||||
private World LocalWorld;
|
private World LocalWorld;
|
||||||
private Grid GridServers;
|
private Grid GridServers;
|
||||||
private SimConfig Cfg;
|
private SimConfig Cfg;
|
||||||
private SimCAPSHTTPServer HttpServer;
|
private BaseHttpServer HttpServer;
|
||||||
private AssetCache AssetCache;
|
private AssetCache AssetCache;
|
||||||
private InventoryCache InventoryCache;
|
private InventoryCache InventoryCache;
|
||||||
//public Dictionary<EndPoint, SimClient> ClientThreads = new Dictionary<EndPoint, SimClient>();
|
//public Dictionary<EndPoint, SimClient> ClientThreads = new Dictionary<EndPoint, SimClient>();
|
||||||
|
@ -75,7 +77,6 @@ namespace OpenSim
|
||||||
public string m_physicsEngine;
|
public string m_physicsEngine;
|
||||||
public bool m_sandbox = false;
|
public bool m_sandbox = false;
|
||||||
public bool m_loginserver;
|
public bool m_loginserver;
|
||||||
public bool user_accounts = false;
|
|
||||||
|
|
||||||
protected ConsoleBase m_console;
|
protected ConsoleBase m_console;
|
||||||
|
|
||||||
|
@ -134,7 +135,8 @@ namespace OpenSim
|
||||||
LocalWorld.PhysScene.SetTerrain(LocalWorld.LandMap);
|
LocalWorld.PhysScene.SetTerrain(LocalWorld.LandMap);
|
||||||
|
|
||||||
GridServers.AssetServer.SetServerInfo(Cfg.AssetURL, Cfg.AssetSendKey);
|
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.LoadStorageDLL("OpenSim.Storage.LocalStorageDb4o.dll"); //all these dll names shouldn't be hard coded.
|
||||||
LocalWorld.LoadPrimsFromStorage();
|
LocalWorld.LoadPrimsFromStorage();
|
||||||
|
@ -145,23 +147,47 @@ namespace OpenSim
|
||||||
}
|
}
|
||||||
|
|
||||||
m_console.WriteLine("Main.cs:Startup() - Starting CAPS HTTP server");
|
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)
|
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();
|
loginServer.Startup();
|
||||||
|
|
||||||
}
|
if (loginServer.userAccounts)
|
||||||
if((m_loginserver) && (m_sandbox) && (user_accounts))
|
|
||||||
{
|
{
|
||||||
this.GridServers.UserServer = loginServer;
|
// Actually, this is never tru as of now, but if it were, we'd do something like
|
||||||
HttpServer.AddRestHandler("Admin", new AdminWebFront("Admin", LocalWorld, loginServer));
|
|
||||||
|
HttpServer.AddXmlRPCHandler("login_to_simulator", loginServer.LocalUserManager.XmlRpcLoginMethod);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HttpServer.AddRestHandler("Admin", new AdminWebFront("Admin", LocalWorld, null));
|
HttpServer.AddXmlRPCHandler("login_to_simulator", loginServer.XmlRpcLoginMethod);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MainServerListener();
|
MainServerListener();
|
||||||
|
@ -221,11 +247,6 @@ namespace OpenSim
|
||||||
UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet;
|
UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet;
|
||||||
this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
|
this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
|
||||||
SimClient newuser = new SimClient(epSender, useCircuit, LocalWorld, ClientThreads, AssetCache, GridServers.GridServer, this, InventoryCache, m_sandbox);
|
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);
|
//OpenSimRoot.Instance.ClientThreads.Add(epSender, newuser);
|
||||||
ClientThreads.Add(useCircuit.CircuitCode.Code, newuser);
|
ClientThreads.Add(useCircuit.CircuitCode.Code, newuser);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ using libsecondlife;
|
||||||
|
|
||||||
namespace OpenSim.UserServer
|
namespace OpenSim.UserServer
|
||||||
{
|
{
|
||||||
class LocalUserProfileManager : UserProfileManager
|
public class LocalUserProfileManager : UserProfileManager
|
||||||
{
|
{
|
||||||
private IGridServer m_gridServer;
|
private IGridServer m_gridServer;
|
||||||
private int m_port;
|
private int m_port;
|
||||||
|
|
|
@ -59,19 +59,34 @@ namespace OpenSim.UserServer
|
||||||
private Socket loginServer;
|
private Socket loginServer;
|
||||||
private int NumClients;
|
private int NumClients;
|
||||||
private string _defaultResponse;
|
private string _defaultResponse;
|
||||||
private bool userAccounts = false;
|
public bool userAccounts = false;
|
||||||
private string _mpasswd;
|
private string _mpasswd;
|
||||||
private bool _needPasswd = false;
|
private bool _needPasswd = false;
|
||||||
private LocalUserProfileManager userManager;
|
private LocalUserProfileManager m_localUserManager;
|
||||||
private int m_simPort;
|
private int m_simPort;
|
||||||
private string m_simAddr;
|
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_gridServer = gridServer;
|
||||||
m_simPort = simPort;
|
m_simPort = simPort;
|
||||||
m_simAddr = simAddr;
|
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
|
// InitializeLogin: initialize the login
|
||||||
|
@ -94,128 +109,132 @@ namespace OpenSim.UserServer
|
||||||
SR.Close();
|
SR.Close();
|
||||||
this._mpasswd = EncodePassword("testpass");
|
this._mpasswd = EncodePassword("testpass");
|
||||||
|
|
||||||
userManager = new LocalUserProfileManager(this.m_gridServer, m_simPort, m_simAddr );
|
m_localUserManager = new LocalUserProfileManager(this.m_gridServer, m_simPort, m_simAddr);
|
||||||
userManager.InitUserProfiles();
|
m_localUserManager.InitUserProfiles();
|
||||||
userManager.SetKeys("", "", "", "Welcome to OpenSim");
|
m_localUserManager.SetKeys("", "", "", "Welcome to OpenSim");
|
||||||
|
|
||||||
loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
//loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort));
|
//loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort));
|
||||||
loginServer.Listen(1);
|
//loginServer.Listen(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Startup()
|
|
||||||
{
|
|
||||||
this.InitializeLogin();
|
|
||||||
Thread runLoginProxy = new Thread(new ThreadStart(RunLogin));
|
|
||||||
runLoginProxy.IsBackground = true;
|
|
||||||
runLoginProxy.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RunLogin()
|
//private void RunLogin()
|
||||||
{
|
//{
|
||||||
Console.WriteLine("Starting Login Server");
|
// Console.WriteLine("Starting Login Server");
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
for (; ; )
|
// for (; ; )
|
||||||
{
|
// {
|
||||||
Socket client = loginServer.Accept();
|
// Socket client = loginServer.Accept();
|
||||||
IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint;
|
// IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint;
|
||||||
|
|
||||||
|
|
||||||
NetworkStream networkStream = new NetworkStream(client);
|
// NetworkStream networkStream = new NetworkStream(client);
|
||||||
StreamReader networkReader = new StreamReader(networkStream);
|
// StreamReader networkReader = new StreamReader(networkStream);
|
||||||
StreamWriter networkWriter = new StreamWriter(networkStream);
|
// StreamWriter networkWriter = new StreamWriter(networkStream);
|
||||||
|
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
LoginRequest(networkReader, networkWriter);
|
// LoginRequest(networkReader, networkWriter);
|
||||||
}
|
// }
|
||||||
catch (Exception e)
|
// catch (Exception e)
|
||||||
{
|
// {
|
||||||
Console.WriteLine(e.Message);
|
// Console.WriteLine(e.Message);
|
||||||
}
|
// }
|
||||||
|
|
||||||
networkWriter.Close();
|
// networkWriter.Close();
|
||||||
networkReader.Close();
|
// networkReader.Close();
|
||||||
networkStream.Close();
|
// networkStream.Close();
|
||||||
|
|
||||||
client.Close();
|
// client.Close();
|
||||||
|
|
||||||
// send any packets queued for injection
|
// // send any packets queued for injection
|
||||||
|
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
catch (Exception e)
|
// catch (Exception e)
|
||||||
{
|
// {
|
||||||
Console.WriteLine(e.Message);
|
// Console.WriteLine(e.Message);
|
||||||
Console.WriteLine(e.StackTrace);
|
// Console.WriteLine(e.StackTrace);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
// ProxyLogin: proxy a login request
|
// ProxyLogin: proxy a login request
|
||||||
private void LoginRequest(StreamReader reader, StreamWriter writer)
|
//private void LoginRequest(StreamReader reader, StreamWriter writer)
|
||||||
{
|
//{
|
||||||
lock (this)
|
// lock (this)
|
||||||
{
|
// {
|
||||||
string line;
|
// string line;
|
||||||
int contentLength = 0;
|
// int contentLength = 0;
|
||||||
// read HTTP header
|
// // read HTTP header
|
||||||
do
|
// do
|
||||||
{
|
// {
|
||||||
// read one line of the header
|
// // read one line of the header
|
||||||
line = reader.ReadLine();
|
// line = reader.ReadLine();
|
||||||
|
|
||||||
// check for premature EOF
|
// // check for premature EOF
|
||||||
if (line == null)
|
// if (line == null)
|
||||||
throw new Exception("EOF in client HTTP header");
|
// throw new Exception("EOF in client HTTP header");
|
||||||
|
|
||||||
// look for Content-Length
|
// // look for Content-Length
|
||||||
Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line);
|
// Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line);
|
||||||
if (match.Success)
|
// if (match.Success)
|
||||||
contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString());
|
// contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString());
|
||||||
} while (line != "");
|
// } while (line != "");
|
||||||
|
|
||||||
// read the HTTP body into a buffer
|
// // read the HTTP body into a buffer
|
||||||
char[] content = new char[contentLength];
|
// char[] content = new char[contentLength];
|
||||||
reader.Read(content, 0, contentLength);
|
// reader.Read(content, 0, contentLength);
|
||||||
|
|
||||||
if (this.userAccounts)
|
// if (this.userAccounts)
|
||||||
{
|
// {
|
||||||
//ask the UserProfile Manager to process the request
|
// //ask the UserProfile Manager to process the request
|
||||||
string reply = this.userManager.ParseXMLRPC(new String(content));
|
// string reply = this.userManager.ParseXMLRPC(new String(content));
|
||||||
// forward the XML-RPC response to the client
|
// // forward the XML-RPC response to the client
|
||||||
writer.WriteLine("HTTP/1.0 200 OK");
|
// writer.WriteLine("HTTP/1.0 200 OK");
|
||||||
writer.WriteLine("Content-type: text/xml");
|
// writer.WriteLine("Content-type: text/xml");
|
||||||
writer.WriteLine();
|
// writer.WriteLine();
|
||||||
writer.WriteLine(reply);
|
// writer.WriteLine(reply);
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
//handle ourselves
|
// //handle ourselves
|
||||||
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content));
|
// XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content));
|
||||||
if (request.MethodName == "login_to_simulator")
|
// if (request.MethodName == "login_to_simulator")
|
||||||
{
|
// {
|
||||||
this.ProcessXmlRequest(request, writer);
|
// this.ProcessXmlRequest(request, writer);
|
||||||
}
|
// }
|
||||||
else
|
// 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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];
|
Hashtable requestData = (Hashtable)request.Params[0];
|
||||||
string first;
|
string first;
|
||||||
|
@ -224,6 +243,8 @@ namespace OpenSim.UserServer
|
||||||
LLUUID Agent;
|
LLUUID Agent;
|
||||||
LLUUID Session;
|
LLUUID Session;
|
||||||
|
|
||||||
|
XmlRpcResponse response = new XmlRpcResponse();
|
||||||
|
|
||||||
//get login name
|
//get login name
|
||||||
if (requestData.Contains("first"))
|
if (requestData.Contains("first"))
|
||||||
{
|
{
|
||||||
|
@ -254,20 +275,14 @@ namespace OpenSim.UserServer
|
||||||
|
|
||||||
if (!Authenticate(first, last, passwd))
|
if (!Authenticate(first, last, passwd))
|
||||||
{
|
{
|
||||||
XmlRpcResponse PresenceErrorResp = new XmlRpcResponse();
|
Hashtable loginError = new Hashtable();
|
||||||
Hashtable PresenceErrorRespData = new Hashtable();
|
loginError["reason"] = "key"; ;
|
||||||
PresenceErrorRespData["reason"] = "key"; ;
|
loginError["message"] = "You have entered an invalid name/password combination. Check Caps/lock.";
|
||||||
PresenceErrorRespData["message"] = "You have entered an invalid name/password combination. Check Caps/lock.";
|
loginError["login"] = "false";
|
||||||
PresenceErrorRespData["login"] = "false";
|
response.Value = loginError;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
NumClients++;
|
NumClients++;
|
||||||
|
|
||||||
//create a agent and session LLUUID
|
//create a agent and session LLUUID
|
||||||
|
@ -291,7 +306,7 @@ namespace OpenSim.UserServer
|
||||||
ArrayList GlobalTextures = new ArrayList();
|
ArrayList GlobalTextures = new ArrayList();
|
||||||
GlobalTextures.Add(GlobalT);
|
GlobalTextures.Add(GlobalT);
|
||||||
|
|
||||||
XmlRpcResponse response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
|
response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
|
||||||
Hashtable responseData = (Hashtable)response.Value;
|
Hashtable responseData = (Hashtable)response.Value;
|
||||||
|
|
||||||
responseData["sim_port"] = m_simPort;
|
responseData["sim_port"] = m_simPort;
|
||||||
|
@ -336,17 +351,8 @@ namespace OpenSim.UserServer
|
||||||
{
|
{
|
||||||
((LocalGridBase)m_gridServer).AddNewSession(_login);
|
((LocalGridBase)m_gridServer).AddNewSession(_login);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// forward the XML-RPC response to the client
|
return response;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void CustomiseLoginResponse(Hashtable responseData, string first, string last)
|
protected virtual void CustomiseLoginResponse(Hashtable responseData, string first, string last)
|
||||||
|
@ -396,32 +402,18 @@ namespace OpenSim.UserServer
|
||||||
return Regex.Replace(BitConverter.ToString(encodedBytes), "-", "").ToLower();
|
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
|
//IUserServer implementation
|
||||||
public AgentInventory RequestAgentsInventory(LLUUID agentID)
|
public AgentInventory RequestAgentsInventory(LLUUID agentID)
|
||||||
{
|
{
|
||||||
AgentInventory aInventory = null;
|
AgentInventory aInventory = null;
|
||||||
if (this.userAccounts)
|
if (this.userAccounts)
|
||||||
{
|
{
|
||||||
aInventory = this.userManager.GetUsersInventory(agentID);
|
aInventory = this.m_localUserManager.GetUsersInventory(agentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
return aInventory;
|
return aInventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool UpdateAgentsInventory(LLUUID agentID, AgentInventory inventory)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetServerInfo(string ServerUrl, string SendKey, string RecvKey)
|
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.
|
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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using OpenSim.CAPS;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
namespace OpenSim.Servers
|
namespace OpenSim.Servers
|
||||||
{
|
{
|
||||||
public class BaseHttpServer
|
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">
|
<Compile Include="BaseHttpServer.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="IRestHandler.cs" />
|
||||||
|
<Compile Include="XmlRpcMethod.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
using System;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
|
||||||
|
namespace OpenSim.Servers
|
||||||
|
{
|
||||||
|
public delegate XmlRpcResponse XmlRpcMethod( XmlRpcRequest request );
|
||||||
|
}
|
Loading…
Reference in New Issue