Added relay peering support

Ylian Saint-Hilaire committed Sep 17, 2017 at 17:22 UTC 1031eca8533f834c0c01c52a20de3bef2ce6c1a8
5 files changed +172 -29
mesherrors.txt
+75
@@ -1942,3 +1942,78 @@ TypeError: Cannot read property 'send' of null
1942 at emitOne (events.js:96:13)
1943
1944
1945 +-------- 9/17/2017, 2:06:23 PM --------
1946 +
1947 +C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\multiserver.js:577
1948 + if (obj.ws.socket == null) return;
1949 + ^
1950 +
1951 +TypeError: Cannot read property 'socket' of undefined
1952 + at WebSocketClient.<anonymous> (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\multiserver.js:577:27)
1953 + at emitOne (events.js:96:13)
1954 + at WebSocketClient.emit (events.js:188:7)
1955 + at WebSocketClient.succeedHandshake (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\websocket\lib\WebSocketClient.js:335:10)
1956 + at WebSocketClient.validateHandshake (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\websocket\lib\WebSocketClient.js:319:10)
1957 + at ClientRequest.handleRequestUpgrade (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\websocket\lib\WebSocketClient.js:248:14)
1958 + at emitThree (events.js:116:13)
1959 + at ClientRequest.emit (events.js:194:7)
1960 + at TLSSocket.socketOnData (_http_client.js:391:11)
1961 + at emitOne (events.js:96:13)
1962 +
1963 +
1964 +-------- 9/17/2017, 4:34:12 PM --------
1965 +
1966 +C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\multiserver.js:517
1967 + obj.parent.createPeerRelay(rsession.peer1.ws, rsession.peer1.req, peerServerId, rsession.peer1.req.session.userid);
1968 + ^
1969 +
1970 +TypeError: obj.parent.createPeerRelay is not a function
1971 + at Object.obj.ProcessPeerServerMessage (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\multiserver.js:517:36)
1972 + at processServerData (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\multiserver.js:377:32)
1973 + at WebSocket.<anonymous> (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\multiserver.js:262:49)
1974 + at emitTwo (events.js:106:13)
1975 + at WebSocket.emit (events.js:191:7)
1976 + at Receiver.ontext (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\WebSocket.js:841:10)
1977 + at C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:536:18
1978 + at Receiver.applyExtensions (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:371:5)
1979 + at C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:508:14
1980 + at Receiver.flush (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:347:3)
1981 +
1982 +
1983 +-------- 9/17/2017, 4:37:53 PM --------
1984 +
1985 +C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\meshrelay.js:115
1986 + if (relayinfo.state == 2) {
1987 + ^
1988 +
1989 +TypeError: Cannot read property 'state' of undefined
1990 + at WebSocket.<anonymous> (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\meshrelay.js:115:26)
1991 + at emitTwo (events.js:111:20)
1992 + at WebSocket.emit (events.js:191:7)
1993 + at WebSocket.cleanupWebsocketResources (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\WebSocket.js:950:8)
1994 + at emitNone (events.js:91:20)
1995 + at TLSSocket.emit (events.js:185:7)
1996 + at endReadableNT (_stream_readable.js:926:12)
1997 + at _combinedTickCallback (internal/process/next_tick.js:74:11)
1998 + at process._tickCallback (internal/process/next_tick.js:98:9)
1999 +
2000 +
2001 +-------- 9/17/2017, 4:45:04 PM --------
2002 +
2003 +C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\WebSocket.js:144
2004 + if (this.readyState !== WebSocket.OPEN) throw new Error('not opened');
2005 + ^
2006 +
2007 +Error: not opened
2008 + at WebSocket.pauser [as pause] (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\WebSocket.js:144:49)
2009 + at WebSocket.<anonymous> (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\multiserver.js:630:74)
2010 + at emitTwo (events.js:111:20)
2011 + at WebSocket.emit (events.js:191:7)
2012 + at Receiver.onbinary (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\WebSocket.js:848:10)
2013 + at C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:628:18
2014 + at Receiver.applyExtensions (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:371:5)
2015 + at C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:604:14
2016 + at Receiver.flush (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:347:3)
2017 + at Receiver.opcodes.2.finish (C:\Users\Default.DESKTOP-M9I88C9\Desktop\AmtWebApp\meshcentral\node_modules\ws\lib\Receiver.js:633:12)
2018 +
2019 +
meshrelay.js
+36 -13
@@ -16,6 +16,7 @@ module.exports.CreateMeshRelayKey = function (parent, func) {
16 module.exports.CreateMeshRelay = function (parent, ws, req) {
17 var obj = {};
18 obj.ws = ws;
19 + obj.req = req;
20 obj.peer = null;
21 obj.parent = parent;
22 obj.id = req.query['id'];
@@ -24,8 +25,13 @@ module.exports.CreateMeshRelay = function (parent, ws, req) {
25
26 if (obj.id == undefined) { obj.ws.close(); obj.id = null; return null; } // Attempt to connect without id, drop this.
27
27 - // Check if this session is a logged in user, at least one of the two connections will need to be authenticated.
28 - try { if ((req.session) && (req.session.userid) || (req.session.domainid == getDomain(req).id)) { obj.authenticated = true; } } catch (e) { }
28 + if (req.query.auth == null) {
29 + // Use ExpressJS session, check if this session is a logged in user, at least one of the two connections will need to be authenticated.
30 + try { if ((req.session) && (req.session.userid) || (req.session.domainid == getDomain(req).id)) { obj.authenticated = true; } } catch (e) { }
31 + } else {
32 + // Get the session from the cookie
33 + if ((obj.parent.parent.multiServer != null) && (obj.parent.parent.multiServer.decodeCookie(req.query.auth) != null)) { obj.authenticated = true; }
34 + }
35
36 // Validate that the id is valid, we only need to do this on non-authenticated sessions.
37 // TODO: Figure out when this needs to be done.
@@ -60,6 +66,7 @@ module.exports.CreateMeshRelay = function (parent, ws, req) {
66 relayinfo.state = 2;
67 obj.ws.send('c'); // Send connect to both peers
68 relayinfo.peer1.ws.send('c');
69 + relayinfo.peer1.ws.resume(); // Release the traffic
70
71 relayinfo.peer1.ws.peer = relayinfo.peer2.ws;
72 relayinfo.peer2.ws.peer = relayinfo.peer1.ws;
@@ -73,9 +80,23 @@ module.exports.CreateMeshRelay = function (parent, ws, req) {
80 return null;
81 }
82 } else {
76 - // Setup the connection, wait for peer
83 + // Wait for other relay connection
84 + ws.pause(); // Hold traffic until the other connection
85 parent.wsrelays[obj.id] = { peer1: obj, state: 1 };
86 obj.parent.parent.debug(1, 'Relay holding: ' + obj.id + ' (' + obj.remoteaddr + ')');
87 +
88 + // Check if a peer server has this connection
89 + if (parent.parent.multiServer != null) {
90 + var rsession = obj.parent.wsPeerRelays[obj.id];
91 + if ((rsession != null) && (rsession.serverId > obj.parent.parent.serverId)) {
92 + // We must initiate the connection to the peer
93 + parent.parent.multiServer.createPeerRelay(ws, req, rsession.serverId, req.session.userid);
94 + delete parent.wsrelays[obj.id];
95 + } else {
96 + // Send message to other peers that we have this connection
97 + parent.parent.multiServer.DispatchMessage(JSON.stringify({ action: 'relay', id: obj.id }));
98 + }
99 + }
100 }
101 }
102
@@ -95,17 +116,19 @@ module.exports.CreateMeshRelay = function (parent, ws, req) {
116 ws.on('close', function (req) {
117 if (obj.id != null) {
118 var relayinfo = parent.wsrelays[obj.id];
98 - if (relayinfo.state == 2) {
99 - // Disconnect the peer
100 - var peer = (relayinfo.peer1 == obj) ? relayinfo.peer2 : relayinfo.peer1;
101 - obj.parent.parent.debug(1, 'Relay disconnect: ' + obj.id + ' (' + obj.remoteaddr + ' --> ' + peer.remoteaddr + ')');
102 - peer.id = null;
103 - try { peer.ws.close(); } catch (e) { } // Soft disconnect
104 - try { peer.ws._socket._parent.end(); } catch (e) { } // Hard disconnect
105 - } else {
106 - obj.parent.parent.debug(1, 'Relay disconnect: ' + obj.id + ' (' + obj.remoteaddr + ')');
119 + if (relayinfo != null) {
120 + if (relayinfo.state == 2) {
121 + // Disconnect the peer
122 + var peer = (relayinfo.peer1 == obj) ? relayinfo.peer2 : relayinfo.peer1;
123 + obj.parent.parent.debug(1, 'Relay disconnect: ' + obj.id + ' (' + obj.remoteaddr + ' --> ' + peer.remoteaddr + ')');
124 + peer.id = null;
125 + try { peer.ws.close(); } catch (e) { } // Soft disconnect
126 + try { peer.ws._socket._parent.end(); } catch (e) { } // Hard disconnect
127 + } else {
128 + obj.parent.parent.debug(1, 'Relay disconnect: ' + obj.id + ' (' + obj.remoteaddr + ')');
129 + }
130 + delete parent.wsrelays[obj.id];
131 }
108 - delete parent.wsrelays[obj.id];
132 obj.peer = null;
133 obj.id = null;
134 }
multiserver.js
+57 -14
@@ -37,6 +37,7 @@ module.exports.CreateMultiServer = function (parent, args) {
37 obj.agentCertificatAsn1 = obj.parent.parent.webserver.agentCertificatAsn1;
38 obj.peerServerId = null;
39 obj.authenticated = 0;
40 + obj.serverCertHash = null;
41
42 // Disconnect from the server and/or stop trying
43 obj.stop = function () {
@@ -61,7 +62,6 @@ module.exports.CreateMultiServer = function (parent, args) {
62 // Register the connection event
63 obj.ws.on('connect', function (connection) {
64 obj.parent.parent.debug(1, 'OutPeer ' + obj.serverid + ': Connected');
64 - if (obj.meshScanner != null) { obj.meshScanner.stop(); }
65 obj.connectionState |= 2;
66 obj.conn = connection;
67 obj.nonce = obj.forge.random.getBytesSync(32);
@@ -125,20 +125,20 @@ module.exports.CreateMultiServer = function (parent, args) {
125 // Connection is a success, clean up
126 delete obj.nonce;
127 delete obj.servernonce;
128 - delete obj.serverCertHash;
128 + obj.serverCertHash = obj.common.rstr2hex(obj.serverCertHash).toLowerCase(); // Change this value to hex
129 obj.connectionState |= 4;
130 obj.retryBackoff = 0; // Set backoff connection timer back to fast.
131 obj.parent.parent.debug(1, 'OutPeer ' + obj.serverid + ': Verified peer connection to ' + obj.url);
132
133 // Send information about our server to the peer
134 - if (obj.connectionState == 15) { obj.conn.send(JSON.stringify({ action: 'info', serverid: obj.parent.serverid, dbid: obj.parent.parent.db.identifier, key: obj.parent.serverKey })); }
134 + if (obj.connectionState == 15) { obj.conn.send(JSON.stringify({ action: 'info', serverid: obj.parent.serverid, dbid: obj.parent.parent.db.identifier, key: obj.parent.serverKey, serverCertHash: obj.parent.parent.webserver.webCertificatHashHex })); }
135 //if ((obj.connectionState == 15) && (obj.connectHandler != null)) { obj.connectHandler(1); }
136 break;
137 }
138 case 4: {
139 // Server confirmed authentication, we are allowed to send commands to the server
140 obj.connectionState |= 8;
141 - if (obj.connectionState == 15) { obj.conn.send(JSON.stringify({ action: 'info', serverid: obj.parent.serverid, dbid: obj.parent.parent.db.identifier, key: obj.parent.serverKey })); }
141 + if (obj.connectionState == 15) { obj.conn.send(JSON.stringify({ action: 'info', serverid: obj.parent.serverid, dbid: obj.parent.parent.db.identifier, key: obj.parent.serverKey, serverCertHash: obj.parent.parent.webserver.webCertificatHashHex })); }
142 //if ((obj.connectionState == 15) && (obj.connectHandler != null)) { obj.connectHandler(1); }
143 break;
144 }
@@ -199,6 +199,7 @@ module.exports.CreateMultiServer = function (parent, args) {
199 if ((command.serverid != null) && (command.dbid != null)) {
200 if (command.serverid == obj.parent.serverid) { console.log('ERROR: Same server ID, trying to peer with self. (' + obj.url + ', ' + command.serverid + ').'); return; }
201 if (command.dbid != obj.parent.parent.db.identifier) { console.log('ERROR: Database ID mismatch. Trying to peer to a server with the wrong database. (' + obj.url + ', ' + command.serverid + ').'); return; }
202 + if (obj.serverCertHash != command.serverCertHash) { console.log('ERROR: Outer certificate hash mismatch. (' + obj.url + ', ' + command.serverid + ').'); return; }
203 obj.peerServerId = command.serverid;
204 obj.peerServerKey = command.key;
205 obj.authenticated = 3;
@@ -232,6 +233,7 @@ module.exports.CreateMultiServer = function (parent, args) {
233 obj.agentCertificatAsn1 = obj.parent.parent.webserver.agentCertificatAsn1;
234 obj.infoSent = 0;
235 obj.peerServerId = null;
236 + obj.serverCertHash = null;
237 if (obj.remoteaddr.startsWith('::ffff:')) { obj.remoteaddr = obj.remoteaddr.substring(7); }
238
239 // Send a message to the peer server
@@ -328,7 +330,7 @@ module.exports.CreateMultiServer = function (parent, args) {
330 function completePeerServerConnection() {
331 if (obj.authenticated != 1) return;
332 obj.send(obj.common.ShortToStr(4));
331 - obj.send(JSON.stringify({ action: 'info', serverid: obj.parent.serverid, dbid: obj.parent.parent.db.identifier, key: obj.parent.serverKey }));
333 + obj.send(JSON.stringify({ action: 'info', serverid: obj.parent.serverid, dbid: obj.parent.parent.db.identifier, key: obj.parent.serverKey, serverCertHash: obj.parent.parent.webserver.webCertificatHashHex }));
334 obj.authenticated = 2;
335 }
336
@@ -365,6 +367,7 @@ module.exports.CreateMultiServer = function (parent, args) {
367 if (obj.parent.peerConfig.servers[command.serverid] == null) { console.log('ERROR: Unknown peer serverid: ' + command.serverid + ' (' + obj.remoteaddr + ').'); return; }
368 obj.peerServerId = command.serverid;
369 obj.peerServerKey = command.key;
370 + obj.serverCertHash = command.serverCertHash;
371 obj.authenticated = 3;
372 obj.parent.SetupPeerServer(obj, obj.peerServerId);
373 }
@@ -484,7 +487,7 @@ module.exports.CreateMultiServer = function (parent, args) {
487
488 // Process a message coming from a peer server
489 obj.ProcessPeerServerMessage = function (server, peerServerId, msg) {
487 - //console.log('ProcessPeerServerMessage', peerServerId, msg.action, typeof msg, msg);
490 + //console.log('ProcessPeerServerMessage', peerServerId, msg);
491 switch (msg.action) {
492 case 'bus': {
493 obj.parent.DispatchEvent(msg.ids, null, msg.event, true); // Dispatch the peer event
@@ -503,6 +506,28 @@ module.exports.CreateMultiServer = function (parent, args) {
506 obj.parent.ClearConnectivityState(msg.meshid, msg.nodeid, msg.connectType, peerServerId);
507 break;
508 }
509 + case 'relay': {
510 + // Check if there is a waiting session
511 + var rsession = obj.parent.webserver.wsrelays[msg.id];
512 + if (rsession != null) {
513 + // Yes, there is a waiting session, see if we must initiate.
514 + if (peerServerId > obj.parent.serverId) {
515 + // We must initiate the connection to the peer
516 + var userid = null;
517 + if (rsession.peer1.req.session != null) { userid = rsession.peer1.req.session.userid; }
518 + obj.createPeerRelay(rsession.peer1.ws, rsession.peer1.req, peerServerId, userid);
519 + delete obj.parent.webserver.wsrelays[msg.id];
520 + }
521 + } else {
522 + // Add this relay session to the peer relay list
523 + obj.parent.webserver.wsPeerRelays[msg.id] = { serverId: peerServerId, time: Date.now() };
524 +
525 + // Clear all relay sessions that are more than 1 minute
526 + var oneMinuteAgo = Date.now() - 60000;
527 + for (var id in obj.parent.webserver.wsPeerRelays) { if (obj.parent.webserver.wsPeerRelays[id].time < oneMinuteAgo) { delete obj.parent.webserver.wsPeerRelays[id]; } }
528 + }
529 + break;
530 + }
531 case 'msg': {
532 if (msg.sessionid != null) {
533 // Route this message to a connected user session
@@ -541,13 +566,16 @@ module.exports.CreateMultiServer = function (parent, args) {
566 if ((server == null) || (server.peerServerKey == null)) { return null; }
567 var cookieKey = server.peerServerKey;
568
569 + // Parse the user if needed
570 + if (typeof user == 'string') { user = { _id: user, domain: user.split('/')[1] }; }
571 +
572 // Build the connection URL
573 var path = req.path;
574 if (path[0] == '/') path = path.substring(1);
575 if (path.substring(path.length - 11) == '/.websocket') { path = path.substring(0, path.length - 11); }
576 var queryStr = ''
577 for (var i in req.query) { queryStr += ((queryStr == '') ? '?' : '&') + i + '=' + req.query[i]; }
550 - queryStr += ((queryStr == '') ? '?' : '&') + 'auth=' + obj.encodeCookie({ userid: user._id, domainid: user.domain }, cookieKey);
578 + if (user != null) { queryStr += ((queryStr == '') ? '?' : '&') + 'auth=' + obj.encodeCookie({ userid: user._id, domainid: user.domain }, cookieKey); }
579 var url = obj.peerConfig.servers[serverid].url + path + queryStr;
580
581 // Setup an connect the web socket
@@ -566,10 +594,20 @@ module.exports.CreateMultiServer = function (parent, args) {
594 peerTunnel.wsclient = new WebSocketClient();
595
596 // Register the connection failed event
569 - peerTunnel.wsclient.on('connectFailed', function (error) { peerTunnel.parent.parent.debug(1, 'FTunnel ' + obj.serverid + ': Failed connection'); disconnect(); });
597 + peerTunnel.wsclient.on('connectFailed', function (error) { peerTunnel.parent.parent.debug(1, 'FTunnel ' + obj.serverid + ': Failed connection'); peerTunnel.ws1.close(); });
598
599 // Register the connection event
600 peerTunnel.wsclient.on('connect', function (connection) {
601 + // Get the peer server's certificate and compute the server public key hash
602 + var rawcertbuf = connection.socket.getPeerCertificate().raw, rawcert = '';
603 + for (var i = 0; i < rawcertbuf.length; i++) { rawcert += String.fromCharCode(rawcertbuf[i]); }
604 + var serverCert = obj.forge.pki.certificateFromAsn1(obj.forge.asn1.fromDer(rawcert));
605 + var serverCertHashHex = obj.forge.pki.getPublicKeyFingerprint(serverCert.publicKey, { encoding: 'hex', md: obj.forge.md.sha256.create() });
606 +
607 + // Check if the peer certificate is the expected one for this serverid
608 + if (obj.peerServers[serverid] == null || obj.peerServers[serverid].serverCertHash != serverCertHashHex) { console.log('ERROR: Outer certificate hash mismatch. (' + peerTunnel.url + ', ' + peerTunnel.serverid + ').'); peerTunnel.ws1.close(); return; }
609 +
610 + // Connection accepted.
611 peerTunnel.ws2 = connection;
612
613 // If error, do nothing
@@ -579,14 +617,19 @@ module.exports.CreateMultiServer = function (parent, args) {
617 peerTunnel.ws2.on('close', function (req) { peerTunnel.parent.parent.debug(1, 'FTunnel disconnect ' + peerTunnel.nodeid); peerTunnel.close(); });
618
619 // If a message is received from the peer, Peer ---> Browser
582 - peerTunnel.ws2.on('message', function (msg) { if (msg.type == 'binary') { peerTunnel.ws2.pause(); peerTunnel.ws1.send(msg.binaryData, function () { peerTunnel.ws2.resume(); }); } });
620 + peerTunnel.ws2.on('message', function (msg) {
621 + try {
622 + if (msg.type == 'utf8') { peerTunnel.ws2.pause(); peerTunnel.ws1.send(msg.utf8Data, function () { peerTunnel.ws2.resume(); }); }
623 + else if (msg.type == 'binary') { peerTunnel.ws2.pause(); peerTunnel.ws1.send(msg.binaryData, function () { peerTunnel.ws2.resume(); }); }
624 + } catch (e) { }
625 + });
626
627 // Resume the web socket to start the data flow
628 peerTunnel.ws1.resume();
629 });
630
631 // If a message is received from the browser, Browser ---> Peer
589 - peerTunnel.ws1.on('message', function (msg) { peerTunnel.ws1.pause(); peerTunnel.ws2.send(msg, function () { peerTunnel.ws1.resume(); }); });
632 + peerTunnel.ws1.on('message', function (msg) { try { peerTunnel.ws1.pause(); peerTunnel.ws2.send(msg, function () { peerTunnel.ws1.resume(); }); } catch (e) { } });
633
634 // If error, do nothing
635 peerTunnel.ws1.on('error', function (err) { console.log(err); peerTunnel.close(); });
@@ -601,12 +644,12 @@ module.exports.CreateMultiServer = function (parent, args) {
644 peerTunnel.close = function (arg) {
645 if (arg == 2) {
646 // Hard close, close the TCP socket
604 - try { peerTunnel.ws1._socket._parent.end(); peerTunnel.parent.parent.debug(1, 'FTunnel1: Hard disconnect'); } catch (e) { console.log(e); }
605 - try { peerTunnel.ws2._socket._parent.end(); peerTunnel.parent.parent.debug(1, 'FTunnel2: Hard disconnect'); } catch (e) { console.log(e); }
647 + if (peerTunnel.ws1 != null) { try { peerTunnel.ws1._socket._parent.end(); peerTunnel.parent.parent.debug(1, 'FTunnel1: Hard disconnect'); } catch (e) { console.log(e); } }
648 + if (peerTunnel.ws2 != null) { try { peerTunnel.ws2._socket._parent.end(); peerTunnel.parent.parent.debug(1, 'FTunnel2: Hard disconnect'); } catch (e) { console.log(e); } }
649 } else {
650 // Soft close, close the websocket
608 - try { peerTunnel.ws1.close(); peerTunnel.parent.parent.debug(1, 'FTunnel1: Soft disconnect '); } catch (e) { console.log(e); }
609 - try { peerTunnel.ws2.close(); peerTunnel.parent.parent.debug(1, 'FTunnel2: Soft disconnect '); } catch (e) { console.log(e); }
651 + if (peerTunnel.ws1 != null) { try { peerTunnel.ws1.close(); peerTunnel.parent.parent.debug(1, 'FTunnel1: Soft disconnect '); } catch (e) { console.log(e); } }
652 + if (peerTunnel.ws2 != null) { try { peerTunnel.ws2.close(); peerTunnel.parent.parent.debug(1, 'FTunnel2: Soft disconnect '); } catch (e) { console.log(e); } }
653 }
654 }
655
package.json
+1 -1
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.0.7-w",
3 + "version": "0.0.7-y",
4 "keywords": [
5 "Remote Management",
6 "Intel AMT",
webserver.js
+3 -1
@@ -68,6 +68,7 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
68
69 // Perform hash on web certificate and agent certificate
70 obj.webCertificatHash = parent.certificateOperations.forge.pki.getPublicKeyFingerprint(parent.certificateOperations.forge.pki.certificateFromPem(obj.certificates.web.cert).publicKey, { md: parent.certificateOperations.forge.md.sha256.create(), encoding: 'binary' });
71 + obj.webCertificatHashHex = parent.certificateOperations.forge.pki.getPublicKeyFingerprint(parent.certificateOperations.forge.pki.certificateFromPem(obj.certificates.web.cert).publicKey, { md: parent.certificateOperations.forge.md.sha256.create(), encoding: 'hex' });
72 obj.agentCertificatHashHex = parent.certificateOperations.forge.pki.getPublicKeyFingerprint(parent.certificateOperations.forge.pki.certificateFromPem(obj.certificates.agent.cert).publicKey, { md: parent.certificateOperations.forge.md.sha256.create(), encoding: 'hex' });
73 obj.agentCertificatAsn1 = parent.certificateOperations.forge.asn1.toDer(parent.certificateOperations.forge.pki.certificateToAsn1(parent.certificateOperations.forge.pki.certificateFromPem(parent.certificates.agent.cert))).getBytes();
74
@@ -75,7 +76,8 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
76 obj.wsagents = {};
77 obj.wssessions = {}; // UserId --> Array Of Sessions
78 obj.wssessions2 = {}; // UserId + SessionId --> Session
78 - obj.wsrelays = {};
79 + obj.wsrelays = {}; // Id -> Relay
80 + obj.wsPeerRelays = {}; // Id -> { ServerId, Time }
81
82 // Setup randoms
83 obj.crypto.randomBytes(32, function (err, buf) { obj.httpAuthRandom = buf; });