From d2efa54826cccff07b8af09ffb7a4191f4941bd8 Mon Sep 17 00:00:00 2001 From: echicken <echicken@bbs.electronicchicken.com> Date: Wed, 16 Dec 2015 01:32:10 -0500 Subject: [PATCH] Cleanup --- mods/websocket-proxy.js | 288 ++++++++++++++++++++----------- mods/websocket-rlogin-service.js | 8 +- 2 files changed, 194 insertions(+), 102 deletions(-) diff --git a/mods/websocket-proxy.js b/mods/websocket-proxy.js index d68d017a5f..0d0d34e1ea 100644 --- a/mods/websocket-proxy.js +++ b/mods/websocket-proxy.js @@ -1,4 +1,4 @@ -load("sha1.js"); +load('sha1.js'); var WebSocketProxy = function(client) { @@ -20,10 +20,10 @@ var WebSocketProxy = function(client) { var ServerDataBuffer = []; // From server function CalculateWebSocketKey(InLine) { - var Digits = ""; + var Digits = ''; var Spaces = 0; for (var i = 0; i < InLine.length; i++) { - if (InLine.charAt(i) == " ") { + if (InLine.charAt(i) == ' ') { Spaces++; } else if (!isNaN(InLine.charAt(i))) { Digits += InLine.charAt(i); @@ -60,7 +60,8 @@ var WebSocketProxy = function(client) { } break; case WEBSOCKET_DATA: - // We're in a data packet, so check for 0xFF, which indicates the data packet is done + // We're in a data packet, so check for 0xFF, which + // indicates the data packet is done if (InByte == 0xFF) { FWebSocketState = WEBSOCKET_NEED_PACKET_START; } else { @@ -72,10 +73,13 @@ var WebSocketProxy = function(client) { InByte2 = client.socket.recvBin(1); Result.push(((InByte & 31) << 6) | (InByte2 & 63)); } else { - // Handle UTF-8 decode (should never need this, but included anyway) + // Handle UTF-8 decode (should never need this, but + // included anyway) InByte2 = client.socket.recvBin(1); InByte3 = client.socket.recvBin(1); - Result.push(((InByte & 15) << 12) | ((InByte2 & 63) << 6) | (InByte3 & 63)); + Result.push( + ((InByte&15)<<12)|((InByte2&63)<<6)|(InByte3&63) + ); } } break; @@ -95,7 +99,8 @@ var WebSocketProxy = function(client) { // Check what the client packet state is switch (FWebSocketState) { case WEBSOCKET_NEED_PACKET_START: - // Next byte will give us the opcode, and also tell is if the message is fragmented + // Next byte will give us the opcode, and also tell is if + // the message is fragmented FFrameMask = []; FFrameOpCode = client.socket.recvBin(1); FFramePayloadLength = 0; @@ -120,21 +125,31 @@ var WebSocketProxy = function(client) { FWebSocketState = WEBSOCKET_DATA; break; case WEBSOCKET_DATA: - InByte = (client.socket.recvBin(1) ^ FFrameMask[FFramePayloadReceived++ % 4]); + InByte = ( + client.socket.recvBin(1)^FFrameMask[ + FFramePayloadReceived++ % 4 + ] + ); // Check if the byte needs to be UTF-8 decoded if ((InByte & 0x80) === 0) { Result.push(InByte); } else if ((InByte & 0xE0) === 0xC0) { // Handle UTF-8 decode - InByte2 = (client.socket.recvBin(1) ^ FFrameMask[FFramePayloadReceived++ % 4]); + InByte2 = ( + client.socket.recvBin(1)^FFrameMask[ + FFramePayloadReceived++ % 4 + ] + ); Result.push(((InByte & 31) << 6) | (InByte2 & 63)); } else { - log(LOG_ERR, "Byte out of range: " + InByte); + log(LOG_NOTICE, 'Byte out of range: ' + InByte); } // Check if we've received the full payload - if (FFramePayloadReceived === FFramePayloadLength) FWebSocketState = WEBSOCKET_NEED_PACKET_START; + if (FFramePayloadReceived === FFramePayloadLength) { + FWebSocketState = WEBSOCKET_NEED_PACKET_START; + } break; } } @@ -168,7 +183,7 @@ var WebSocketProxy = function(client) { client.socket.sendBin((AData[i] >> 6) | 192, 1); client.socket.sendBin((AData[i] & 63) | 128, 1); } else { - log(LOG_ERR, "Byte out of range: " + AData[i]); + log(LOG_NOTICE, 'Byte out of range: ' + AData[i]); } } @@ -184,12 +199,14 @@ var WebSocketProxy = function(client) { // Check if the byte needs to be UTF-8 encoded if ((AData[i] & 0xFF) <= 127) { ToSend.push(AData[i]); - } else if (((AData[i] & 0xFF) >= 128) && ((AData[i] & 0xFF) <= 2047)) { + } else if ( + ((AData[i] & 0xFF) >= 128) && ((AData[i] & 0xFF) <= 2047) + ) { // Handle UTF-8 encode ToSend.push((AData[i] >> 6) | 192); ToSend.push((AData[i] & 63) | 128); } else { - log(LOG_ERR, "Byte out of range: " + AData[i]); + log(LOG_NOTICE, 'Byte out of range: ' + AData[i]); } } @@ -200,9 +217,10 @@ var WebSocketProxy = function(client) { client.socket.sendBin(126, 1); client.socket.sendBin(ToSend.length, 2); } else { - // NOTE: client.socket.sendBin(ToSend.length, 8); didn't work, so this - // modification limits the send to 2^32 bytes (probably not an issue) - // Probably should look into a proper fix at some point though + // NOTE: client.socket.sendBin(ToSend.length, 8); didn't work, + // so this modification limits the send to 2^32 bytes (probably + // not an issue). Probably should look into a proper fix at + // some point though client.socket.sendBin(127, 1); client.socket.sendBin(0, 4); client.socket.sendBin(ToSend.length, 4); @@ -220,17 +238,20 @@ var WebSocketProxy = function(client) { try { // Keep reading header data until we get all the data we want while (true) { - // Read another line, and abort if we don't get one within 5 seconds + // Read another line, abort if we don't get one in 5 seconds var InLine = client.socket.recvline(1024, 5); if (InLine === null) { - log(LOG_ERR, "Timeout exceeded while waiting for complete handshake"); + log(LOG_ERR, + 'Timeout exceeded while waiting for complete handshake' + ); return false; } - log(LOG_DEBUG, "Handshake Line: " + InLine); + log(LOG_DEBUG, 'Handshake Line: ' + InLine); - // Check for blank line (indicates we have most of the header, and only the last 8 bytes remain - if (InLine === "") { + // Check for blank line (indicates we have most of the header, + // and only the last 8 bytes remain + if (InLine === '') { switch (self.headers['Version']) { case 0: return ShakeHandsDraft0(); @@ -239,67 +260,88 @@ var WebSocketProxy = function(client) { case 13: return ShakeHandsVersion7(); default: - // TODO If this version does not - // match a version understood by the server, the server MUST - // abort the websocket handshake described in this section and - // instead send an appropriate HTTP error code (such as 426 - // Upgrade Required), and a |Sec-WebSocket-Version| header - // indicating the version(s) the server is capable of - // understanding. + // TODO If this version does not match a version + // understood by the server, the server MUST abort + // the websocket handshake described in this section + // and instead send an appropriate HTTP error code + // (such as 426 Upgrade Required), and a + // |Sec-WebSocket-Version| header indicating the + // version(s) the server is capable of + // understanding. break; } break; - } else if (InLine.indexOf("Connection:") === 0) { + } else if (InLine.indexOf('Connection:') === 0) { // Example: "Connection: Upgrade" - self.headers['Connection'] = InLine.replace(/Connection:\s?/i, ""); - } else if (InLine.indexOf("GET") === 0) { + self.headers['Connection'] = InLine.replace( + /Connection:\s?/i, + '' + ); + } else if (InLine.indexOf('GET') === 0) { // Example: "GET /demo HTTP/1.1" - var GET = InLine.split(" "); + var GET = InLine.split(' '); self.headers['Path'] = GET[1]; - } else if (InLine.indexOf("Host:") === 0) { + } else if (InLine.indexOf('Host:') === 0) { // Example: "Host: example.com" - self.headers['Host'] = InLine.replace(/Host:\s?/i, ""); - } else if (InLine.indexOf("Origin:") === 0) { + self.headers['Host'] = InLine.replace(/Host:\s?/i, ''); + } else if (InLine.indexOf('Origin:') === 0) { // Example: "Origin: http://example.com" - self.headers['Origin'] = InLine.replace(/Origin:\s?/i, ""); - } else if (InLine.indexOf("Sec-WebSocket-Key:") === 0) { + self.headers['Origin'] = InLine.replace(/Origin:\s?/i, ''); + } else if (InLine.indexOf('Sec-WebSocket-Key:') === 0) { // Example: "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" - self.headers['Key'] = InLine.replace(/Sec-WebSocket-Key:\s?/i, ""); - } else if (InLine.indexOf("Sec-WebSocket-Key1:") === 0) { + self.headers['Key'] = InLine.replace( + /Sec-WebSocket-Key:\s?/i, + '' + ); + } else if (InLine.indexOf('Sec-WebSocket-Key1:') === 0) { // Example: "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5" - self.headers['Key1'] = CalculateWebSocketKey(InLine.replace(/Sec-WebSocket-Key1:\s?/i, "")); - } else if (InLine.indexOf("Sec-WebSocket-Key2:") === 0) { + self.headers['Key1'] = CalculateWebSocketKey( + InLine.replace(/Sec-WebSocket-Key1:\s?/i, '') + ); + } else if (InLine.indexOf('Sec-WebSocket-Key2:') === 0) { // Example: "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00" - self.headers['Key2'] = CalculateWebSocketKey(InLine.replace(/Sec-WebSocket-Key2:\s?/i, "")); - } else if (InLine.indexOf("Sec-WebSocket-Origin:") === 0) { + self.headers['Key2'] = CalculateWebSocketKey( + InLine.replace(/Sec-WebSocket-Key2:\s?/i, '') + ); + } else if (InLine.indexOf('Sec-WebSocket-Origin:') === 0) { // Example: "Sec-WebSocket-Origin: http://example.com" - self.headers['Origin'] = InLine.replace(/Sec-WebSocket-Origin:\s?/i, ""); - } else if (InLine.indexOf("Sec-WebSocket-Protocol:") === 0) { + self.headers['Origin'] = InLine.replace( + /Sec-WebSocket-Origin:\s?/i, + '' + ); + } else if (InLine.indexOf('Sec-WebSocket-Protocol:') === 0) { // Example: "Sec-WebSocket-Protocol: sample" - self.headers['SubProtocol'] = InLine.replace(/Sec-WebSocket-Protocol:\s?/i, ""); - } else if (InLine.indexOf("Sec-WebSocket-Draft") === 0) { + self.headers['SubProtocol'] = InLine.replace( + /Sec-WebSocket-Protocol:\s?/i, + '' + ); + } else if (InLine.indexOf('Sec-WebSocket-Draft') === 0) { // Example: "Sec-WebSocket-Draft: 2" try { - self.headers['Version'] = parseInt(InLine.replace(/Sec-WebSocket-Draft:\s?/i, "")); + self.headers['Version'] = parseInt( + InLine.replace(/Sec-WebSocket-Draft:\s?/i, '') + ); } catch (err) { self.headers['Version'] = 0; } - } else if (InLine.indexOf("Sec-WebSocket-Version") === 0) { + } else if (InLine.indexOf('Sec-WebSocket-Version') === 0) { // Example: "Sec-WebSocket-Version: 8" try { - self.headers['Version'] = parseInt(InLine.replace(/Sec-WebSocket-Version:\s?/i, "")); + self.headers['Version'] = parseInt( + InLine.replace(/Sec-WebSocket-Version:\s?/i, '') + ); } catch (err) { self.headers['Version'] = 0; } - } else if (InLine.indexOf("Upgrade:") === 0) { + } else if (InLine.indexOf('Upgrade:') === 0) { // Example: "Upgrade: websocket" - self.headers['Upgrade'] = InLine.replace(/Upgrade:\s?/i, ""); - } else if (InLine.indexOf("Cookie:") === 0) { - self.headers['Cookie'] = InLine.replace(/Cookie:\s?/i, ""); + self.headers['Upgrade'] = InLine.replace(/Upgrade:\s?/i,''); + } else if (InLine.indexOf('Cookie:') === 0) { + self.headers['Cookie'] = InLine.replace(/Cookie:\s?/i, ''); } } } catch (err) { - log(LOG_ERR, "ShakeHands() error: " + err.toString()); + log(LOG_ERR, 'ShakeHands() error: ' + err.toString()); } return false; @@ -307,17 +349,39 @@ var WebSocketProxy = function(client) { function ShakeHandsDraft0() { // Ensure we have all the data we need - if (('Key1' in self.headers) && ('Key2' in self.headers) && ('Host' in self.headers) && ('Origin' in self.headers !== "") && ('Path' in self.headers)) { - // Combine Key1, Key2, and the last 8 bytes into a string that we will later hash - var ToHash = "" - ToHash += String.fromCharCode((self.headers['Key1'] & 0xFF000000) >> 24); - ToHash += String.fromCharCode((self.headers['Key1'] & 0x00FF0000) >> 16); - ToHash += String.fromCharCode((self.headers['Key1'] & 0x0000FF00) >> 8); - ToHash += String.fromCharCode((self.headers['Key1'] & 0x000000FF) >> 0); - ToHash += String.fromCharCode((self.headers['Key2'] & 0xFF000000) >> 24); - ToHash += String.fromCharCode((self.headers['Key2'] & 0x00FF0000) >> 16); - ToHash += String.fromCharCode((self.headers['Key2'] & 0x0000FF00) >> 8); - ToHash += String.fromCharCode((self.headers['Key2'] & 0x000000FF) >> 0); + if (('Key1' in self.headers) && + ('Key2' in self.headers) && + ('Host' in self.headers) && + ('Origin' in self.headers !== '') && + ('Path' in self.headers) + ) { + // Combine Key1, Key2, and the last 8 bytes into a string that we + // will later hash + var ToHash = '' + ToHash += String.fromCharCode( + (self.headers['Key1'] & 0xFF000000) >> 24 + ); + ToHash += String.fromCharCode( + (self.headers['Key1'] & 0x00FF0000) >> 16 + ); + ToHash += String.fromCharCode( + (self.headers['Key1'] & 0x0000FF00) >> 8 + ); + ToHash += String.fromCharCode( + (self.headers['Key1'] & 0x000000FF) >> 0 + ); + ToHash += String.fromCharCode( + (self.headers['Key2'] & 0xFF000000) >> 24 + ); + ToHash += String.fromCharCode( + (self.headers['Key2'] & 0x00FF0000) >> 16 + ); + ToHash += String.fromCharCode( + (self.headers['Key2'] & 0x0000FF00) >> 8 + ); + ToHash += String.fromCharCode( + (self.headers['Key2'] & 0x000000FF) >> 0 + ); for (var i = 0; i < 8; i++) { ToHash += String.fromCharCode(client.socket.recvBin(1)); } @@ -326,17 +390,29 @@ var WebSocketProxy = function(client) { var Hashed = md5_calc(ToHash, true); // Setup the handshake response - var Response = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + - "Upgrade: WebSocket\r\n" + - "Connection: Upgrade\r\n" + - "Sec-WebSocket-Origin: " + self.headers['Origin'] + "\r\n" + - "Sec-WebSocket-Location: ws://" + self.headers['Host'] + self.headers['Path'] + "\r\n"; - if ('SubProtocol' in self.headers) Response += "Sec-WebSocket-Protocol: " + self.headers['SubProtocol'] + "\r\n"; - Response += "\r\n"; + var Response = 'HTTP/1.1 101 Web Socket Protocol Handshake\r\n' + + 'Upgrade: WebSocket\r\n' + + 'Connection: Upgrade\r\n' + + 'Sec-WebSocket-Origin: ' + self.headers['Origin'] + + '\r\n' + + 'Sec-WebSocket-Location: ws://' + + self.headers['Host'] + + self.headers['Path'] + + '\r\n'; + if ('SubProtocol' in self.headers) { + Response += + 'Sec-WebSocket-Protocol: ' + + self.headers['SubProtocol'] + + '\r\n'; + } + Response += '\r\n'; - // Loop through the hash string (which is hex encoded) and append the individual bytes to the response + // Loop through the hash string (which is hex encoded) and append + // the individual bytes to the response for (var i = 0; i < Hashed.length; i += 2) { - Response += String.fromCharCode(parseInt(Hashed.charAt(i) + Hashed.charAt(i + 1), 16)); + Response += String.fromCharCode( + parseInt(Hashed.charAt(i) + Hashed.charAt(i + 1), 16) + ); } // Send the response and return @@ -344,9 +420,11 @@ var WebSocketProxy = function(client) { return true; } else { // We're missing some pice of data, log what we do have - log(LOG_ERR, "Missing some piece of handshake data. Here's what we have:"); + log(LOG_ERR, + 'Missing some piece of handshake data. Here\'s what we have:' + ); for(var x in self.headers) { - log(LOG_ERR, x + " => " + self.headers[x]); + log(LOG_ERR, x + ' => ' + self.headers[x]); } return false; } @@ -354,8 +432,12 @@ var WebSocketProxy = function(client) { function ShakeHandsVersion7() { // Ensure we have all the data we need - if (('Key' in self.headers) && ('Host' in self.headers) && ('Origin' in self.headers !== "") && ('Path' in self.headers)) { - var AcceptGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + if (('Key' in self.headers) && + ('Host' in self.headers) && + ('Origin' in self.headers !== '') && + ('Path' in self.headers) + ) { + var AcceptGUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; // Combine Key and GUID var ToHash = self.headers['Key'] + AcceptGUID; @@ -366,42 +448,48 @@ var WebSocketProxy = function(client) { // Encode the hash var ToEncode = ''; for (var i = 0; i <= 38; i += 2) { - ToEncode += String.fromCharCode(parseInt(Hashed.substr(i, 2), 16)); + ToEncode += String.fromCharCode( + parseInt(Hashed.substr(i, 2), 16) + ); } var Encoded = base64_encode(ToEncode); // Setup the handshake response - var Response = "HTTP/1.1 101 Switching Protocols\r\n" + - "Upgrade: websocket\r\n" + - "Connection: Upgrade\r\n" + - "Sec-WebSocket-Accept: " + Encoded + "\r\n"; - if ('SubProtocol' in self.headers) Response += "Sec-WebSocket-Protocol: plain\r\n"; // Only sub-protocol we support - Response += "\r\n"; + var Response = 'HTTP/1.1 101 Switching Protocols\r\n' + + 'Upgrade: websocket\r\n' + + 'Connection: Upgrade\r\n' + + 'Sec-WebSocket-Accept: ' + Encoded + '\r\n'; + if ('SubProtocol' in self.headers) { + // Only sub-protocol we support + Response += 'Sec-WebSocket-Protocol: plain\r\n'; + } + Response += '\r\n'; // Send the response and return client.socket.send(Response); return true; } else { - // We're missing some pice of data, log what we do have - log(LOG_ERR, "Missing some piece of handshake data. Here's what we have:"); + log(LOG_ERR, + 'Missing some piece of handshake data. Here\'s what we have:' + ); for(var x in self.headers) { - log(LOG_ERR, x + " => " + self.headers[x]); + log(LOG_ERR, x + ' => ' + self.headers[x]); } return false; } } this.__defineGetter__( - "data_waiting", + 'data_waiting', function() { return (ClientDataBuffer.length > 0); } ); this.send = function(data) { - if(typeof data == "string") { - data = data.split("").map( - function(d) { + if (typeof data === 'string') { + data = data.split('').map( + function (d) { return ascii(d); } ); @@ -410,15 +498,18 @@ var WebSocketProxy = function(client) { } this.receive = function() { - var data = ""; - while(ClientDataBuffer.length > 0) { + var data = ''; + while (ClientDataBuffer.length > 0) { data += ascii(ClientDataBuffer.shift()); } return data; } this.receiveArray = function(len) { - return ClientDataBuffer.splice(0, (typeof len == "number" ? len : ClientDataBuffer.length)); + return ClientDataBuffer.splice( + 0, + (typeof len === 'number' ? len : ClientDataBuffer.length) + ); } this.cycle = function() { @@ -426,7 +517,6 @@ var WebSocketProxy = function(client) { SendToWebSocketClient(ServerDataBuffer.splice(0, 4096)); } - if(!ShakeHands()) - throw "ShakeHands() failed"; + if(!ShakeHands()) throw 'ShakeHands() failed'; } \ No newline at end of file diff --git a/mods/websocket-rlogin-service.js b/mods/websocket-rlogin-service.js index d14db81a7b..9ba685899b 100644 --- a/mods/websocket-rlogin-service.js +++ b/mods/websocket-rlogin-service.js @@ -17,8 +17,9 @@ function getSession(un) { return session; } -// Obfuscated lazy port of an unfinished node.js rlogin client I made quite some time ago. -// It does what it needs to do. Unless it doesn't - in which case, replace it with something better. +// Obfuscated lazy port of an unfinished rlogin client I made quite some time +// ago. It does what it needs to do. Unless it doesn't - in which case, +// replace it with something better. var RLogin=function(e){var n=this;const t=24,i=13,s=17,o=19,c=10;var r=[],p=[],u={connected:!1,cooked:!0,suspendInput:!1,suspendOutput:!1,watchForClientEscape:!0,clientHasEscaped:!1},d={rows:24,columns:80,pixelsX:640,pixelsY:480,clientEscape:"~"},f={DOT:n.disconnect,EOT:n.disconnect,SUB:function(){u.suspendInput=u.suspendInput?!1:!0,u.suspendOutput=u.suspendInput},EOM:function(){u.suspendInput=u.suspendInput?!1:!0,u.suspendOutput=!1}};this.__defineGetter__("connected",function(){return u.connected}),this.__defineSetter__("connected",function(e){"boolean"!=typeof e||e||n.disconnect()}),this.__defineGetter__("rows",function(){return d.rows}),this.__defineSetter__("rows",function(e){if(!("number"==typeof e&&e>0))throw"RLogin: Invalid 'rows' setting "+e;d.rows=e}),this.__defineGetter__("columns",function(){return d.columns}),this.__defineSetter__("columns",function(e){if(!("number"==typeof e&&e>0))throw"RLogin: Invalid 'columns' setting "+e;d.columns=e}),this.__defineGetter__("pixelsX",function(){return d.pixelsX}),this.__defineSetter__("pixelsX",function(e){if(!("number"==typeof e&&e>0))throw"RLogin: Invalid 'pixelsX' setting "+e;d.pixelsX=e}),this.__defineGetter__("pixelsY",function(){return d.pixelsY}),this.__defineSetter__("pixelsY",function(e){if(!("number"==typeof e&&e>0))throw"RLogin: Invalid 'pixelsY' setting "+e;d.pixelsY=e}),this.__defineGetter__("clientEscape",function(){return d.clientEscape}),this.__defineSetter__("clientEscape",function(e){if("string"!=typeof e||1!=e.length)throw"RLogin: Invalid 'clientEscape' setting "+e;d.clientEscape=e});var a=new Socket,l=function(){if(!(a.nread<1)){for(var e=[];a.nread>0;)e.push(a.recvBin(1));if(!u.connected)if(0==e[0]){if(u.connected=!0,!(e.length>1))return;e=e.slice(1)}else n.disconnect();u.suspendOutput||(r=r.concat(e))}};this.send=function(e){if(!u.connected)throw"RLogin.send: not connected.";if(u.suspendInput)throw"RLogin.send: input has been suspended.";"string"==typeof e&&(e=e.split("").map(function(e){return ascii(e)}));for(var n=[],r=0;r<e.length;r++)u.watchForClientEscape&&e[r]==d.clientEscape.charCodeAt(0)?(u.watchForClientEscape=!1,u.clientHasEscaped=!0):u.clientHasEscaped?(u.clientHasEscaped=!1,"undefined"!=typeof f[e[r]]&&f[e[r]]()):!u.cooked||e[r]!=s&&e[r]!=o?((r>0&&e[r-1]==i&&e[r]==c||e[r]==t)&&(u.watchForClientEscape=!0),n.push(e[r])):u.suspendOutput==(e[r]==o);p=p.concat(n)},this.receive=function(){return r.splice(0,r.length)},this.addClientEscape=function(e,n){if("string"!=typeof e&&"number"!=typeof e||"string"==typeof e&&e.length>1||"function"!=typeof n)throw"RLogin.addClientEscape: invalid arguments.";f[e.charCodeAt(0)]=n},this.connect=function(){if("number"!=typeof e.port||"string"!=typeof e.host)throw"RLogin: invalid host or port argument.";if("string"!=typeof e.clientUsername)throw"RLogin: invalid clientUsername argument.";if("string"!=typeof e.serverUsername)throw"RLogin: invalid serverUsername argument.";if("string"!=typeof e.terminalType)throw"RLogin: invalid terminalType argument.";if("number"!=typeof e.terminalSpeed)throw"RLogin: invalid terminalSpeed argument.";if(!a.connect(e.host,e.port))throw"RLogin: Unable to connect to server.";for(a.sendBin(0,1),a.send(e.clientUsername),a.sendBin(0,1),a.send(e.serverUsername),a.sendBin(0,1),a.send(e.terminalType+"/"+e.terminalSpeed),a.sendBin(0,1);a.is_connected&&a.nread<1;)mswait(5);l()},this.cycle=function(){if(l(),!(u.suspendInput||p.length<1))for(;p.length>0;)a.sendBin(p.shift(),1)},this.disconnect=function(){a.close(),u.connected=!1}}; try { @@ -29,8 +30,9 @@ try { err('No cookie from WebSocket client.'); } + // Should probably search for the right cookie instead of assuming var cookie = wss.headers['Cookie'].split('='); - if (cookie[0] !== "synchronet" || cookie.length < 2) { + if (cookie[0] !== 'synchronet' || cookie.length < 2) { err('Invalid cookie from WebSocket client.'); } -- GitLab