* Added a unique and interesting WebSocket grid login processor by hijacking the LLSD login code. This sends the data through the normal login channels and spits out a JSON object back that mimics the login response. Feel free to comment on the best way to set this up as a config option.

varregion
teravus 2013-10-04 20:53:01 -05:00
parent 85593d8d25
commit 31246ecd04
2 changed files with 57 additions and 0 deletions

View File

@ -54,6 +54,7 @@ namespace OpenSim.Server.Handlers.Login
private ILoginService m_LocalService; private ILoginService m_LocalService;
private bool m_Proxy; private bool m_Proxy;
public LLLoginHandlers(ILoginService service, bool hasProxy) public LLLoginHandlers(ILoginService service, bool hasProxy)
{ {
m_LocalService = service; m_LocalService = service;
@ -213,6 +214,61 @@ namespace OpenSim.Server.Handlers.Login
return FailedOSDResponse(); return FailedOSDResponse();
} }
public void HandleWebSocketLoginEvents(string path, WebSocketHttpServerHandler sock)
{
sock.MaxPayloadSize = 16384; //16 kb payload
sock.InitialMsgTimeout = 5000; //5 second first message to trigger at least one of these events
sock.NoDelay_TCP_Nagle = true;
sock.OnData += delegate(object sender, WebsocketDataEventArgs data) { sock.Close("fail"); };
sock.OnPing += delegate(object sender, PingEventArgs pingdata) { sock.Close("fail"); };
sock.OnPong += delegate(object sender, PongEventArgs pongdata) { sock.Close("fail"); };
sock.OnText += delegate(object sender, WebsocketTextEventArgs text)
{
OSD request = null;
try
{
request = OSDParser.DeserializeJson(text.Data);
if (!(request is OSDMap))
{
sock.SendMessage(OSDParser.SerializeJsonString(FailedOSDResponse()));
}
else
{
OSDMap req = request as OSDMap;
string first = req["firstname"].AsString();
string last = req["lastname"].AsString();
string passwd = req["passwd"].AsString();
string start = req["startlocation"].AsString();
string version = req["version"].AsString();
string channel = req["channel"].AsString();
string mac = req["mac"].AsString();
string id0 = req["id0"].AsString();
UUID scope = UUID.Zero;
IPEndPoint endPoint =
(sender as WebSocketHttpServerHandler).GetRemoteIPEndpoint();
LoginResponse reply = null;
reply = m_LocalService.Login(first, last, passwd, start, scope, version,
channel, mac, id0, endPoint);
sock.SendMessage(OSDParser.SerializeJsonString(reply.ToOSDMap()));
}
}
catch (Exception)
{
sock.SendMessage(OSDParser.SerializeJsonString(FailedOSDResponse()));
}
finally
{
sock.Close("success");
}
};
sock.HandshakeAndUpgrade();
}
private XmlRpcResponse FailedXMLRPCResponse() private XmlRpcResponse FailedXMLRPCResponse()
{ {
Hashtable hash = new Hashtable(); Hashtable hash = new Hashtable();

View File

@ -98,6 +98,7 @@ namespace OpenSim.Server.Handlers.Login
server.AddXmlRPCHandler("login_to_simulator", loginHandlers.HandleXMLRPCLogin, false); server.AddXmlRPCHandler("login_to_simulator", loginHandlers.HandleXMLRPCLogin, false);
server.AddXmlRPCHandler("set_login_level", loginHandlers.HandleXMLRPCSetLoginLevel, false); server.AddXmlRPCHandler("set_login_level", loginHandlers.HandleXMLRPCSetLoginLevel, false);
server.SetDefaultLLSDHandler(loginHandlers.HandleLLSDLogin); server.SetDefaultLLSDHandler(loginHandlers.HandleLLSDLogin);
server.AddWebSocketHandler("/WebSocket/GridLogin", loginHandlers.HandleWebSocketLoginEvents);
} }
} }
} }