AMT manager improvements.

Ylian Saint-Hilaire committed Oct 7, 2020 at 23:13 UTC bd61bfe2d01533ba6c4923e4c8c058bdd65f822f
3 files changed +30 -27
amt/amt-wsman-comm.js
+24 -26
@@ -1,11 +1,11 @@
1 -/**
1 +/** m
2 * @description Intel(r) AMT WSMAN communication using Node.js TLS
3 * @author Ylian Saint-Hilaire/Joko Sastriawan
4 * @version v0.2.0b
5 */
6
7 // Construct a MeshServer object
8 -var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
8 +var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, transportServer) {
9 //console.log('CreateWsmanComm', host, port, user, pass, tls, tlsoptions);
10
11 var obj = {};
@@ -38,7 +38,7 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
38 obj.pass = pass;
39 obj.xtls = tls;
40 obj.xtlsoptions = tlsoptions;
41 - obj.mode = mode; // 1 = Direct, 2 = CIRA, 3 = APF relay
41 + obj.transportServer = transportServer; // This can be a CIRA or APF server, if null, local sockets are used as transport.
42 obj.xtlsFingerprint;
43 obj.xtlsCertificate = null;
44 obj.xtlsCheck = 0; // 0 = No TLS, 1 = CA Checked, 2 = Pinned, 3 = Untrusted
@@ -166,34 +166,32 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
166 obj.socketState = 1;
167 obj.kerberosDone = 0;
168
169 - if ((obj.parent != null) && ((obj.mode === 2) || (obj.mode === 3))) { // CIRA and APF
170 - if (obj.mode == 2) { // CIRA
171 - var ciraconn = obj.parent.mpsserver.ciraConnections[obj.host];
172 - obj.socket = obj.parent.mpsserver.SetupCiraChannel(ciraconn, obj.port);
173 - } else { // APF
174 - var apfconn = obj.parent.apfserver.apfConnections[obj.host];
175 - obj.socket = obj.parent.apfserver.SetupCiraChannel(apfconn, obj.port);
176 - }
177 - obj.socket.onData = function (ccon, data) { obj.xxOnSocketData(data); }
178 - obj.socket.onStateChange = function (ccon, state) {
179 - if (state == 0) {
180 - try {
169 + if (obj.transportServer != null) {
170 + // CIRA or APF server
171 + obj.socket = obj.transportServer.SetupCiraChannelToHost(obj.host, obj.port);
172 + if (obj.socket == null) {
173 + try { obj.xxOnSocketClosed(); } catch (e) { }
174 + } else {
175 + obj.socket.onData = function (ccon, data) { obj.xxOnSocketData(data); }
176 + obj.socket.onStateChange = function (ccon, state) {
177 + if (state == 0) {
178 + // Channel closed
179 obj.socketParseState = 0;
180 obj.socketAccumulator = '';
181 obj.socketHeader = null;
182 obj.socketData = '';
183 obj.socketState = 0;
186 - obj.xxOnSocketClosed();
187 - } catch (e) { }
188 - } else if (state == 2) {
189 - // channel open success
190 - obj.xxOnSocketConnected();
184 + try { obj.xxOnSocketClosed(); } catch (e) { }
185 + } else if (state == 2) {
186 + // Channel open success
187 + obj.xxOnSocketConnected();
188 + }
189 }
190 }
191 } else {
192 // Direct connection
193 if (obj.xtls != 1) {
196 - // Connect without TLS
194 + // Direct connect without TLS
195 obj.socket = new obj.net.Socket();
196 obj.socket.setEncoding('binary');
197 obj.socket.setTimeout(6000); // Set socket idle timeout
@@ -203,7 +201,7 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
201 obj.socket.on('error', obj.xxOnSocketClosed);
202 obj.socket.connect(obj.port, obj.host, obj.xxOnSocketConnected);
203 } else {
206 - // Connect with TLS
204 + // Direct connect with TLS
205 var options = { ciphers: 'RSA+AES:!aNULL:!MD5:!DSS', secureOptions: obj.constants.SSL_OP_NO_SSLv2 | obj.constants.SSL_OP_NO_SSLv3 | obj.constants.SSL_OP_NO_COMPRESSION | obj.constants.SSL_OP_CIPHER_SERVER_PREFERENCE, rejectUnauthorized: false };
206 if (obj.xtlsMethod != 0) { options.secureProtocol = 'TLSv1_method'; }
207 if (obj.xtlsoptions) {
@@ -231,7 +229,7 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
229 obj.xxOnSocketConnected = function () {
230 if (obj.socket == null) return;
231 // check TLS certificate for webrelay and direct only
234 - if (((obj.mode == null) || (obj.mode < 2)) && (obj.xtls == 1)) {
232 + if ((obj.transportServer == null) && (obj.xtls == 1)) {
233 obj.xtlsCertificate = obj.socket.getPeerCertificate();
234
235 // ###BEGIN###{Certificates}
@@ -350,7 +348,7 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
348 if (isNaN(s)) s = 500;
349 if (s == 401 && ++(obj.authcounter) < 3) {
350 obj.challengeParams = obj.parseDigest(header['www-authenticate']); // Set the digest parameters, after this, the socket will close and we will auto-retry
353 - if (obj.mode == 1) { obj.socket.end(); }
351 + if (obj.transportServer == null) { obj.socket.end(); }
352 } else {
353 var r = obj.pendingAjaxCall.shift();
354 if (r == null || r.length < 1) { console.log("pendingAjaxCall error, " + r); return; }
@@ -366,7 +364,7 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
364 obj.xxOnSocketClosed = function () {
365 //obj.Debug("xxOnSocketClosed");
366 obj.socketState = 0;
369 - if (((obj.mode == null) || (obj.mode == 1)) && (obj.socket != null)) { obj.socket.destroy(); obj.socket = null; }
367 + if ((obj.transportServer == null) && (obj.socket != null)) { obj.socket.destroy(); obj.socket = null; }
368 if (obj.pendingAjaxCall.length > 0) {
369 var r = obj.pendingAjaxCall.shift(), retry = r[5];
370 setTimeout(function () { obj.PerformAjaxExNodeJS2(r[0], r[1], r[2], r[3], r[4], --retry) }, 500); // Wait half a second and try again
@@ -374,7 +372,7 @@ var CreateWsmanComm = function (host, port, user, pass, tls, tlsoptions, mode) {
372 }
373
374 obj.xxOnSocketTimeout = function () {
377 - if (((obj.mode == null) || (obj.mode == 1)) && (obj.socket != null)) { obj.socket.destroy(); obj.socket = null; }
375 + if ((obj.transportServer == null) && (obj.socket != null)) { obj.socket.destroy(); obj.socket = null; }
376 }
377
378 // NODE.js specific private method
amt/amt-wsman.js
-1
@@ -30,7 +30,6 @@ function WsmanStackCreateService(comm)
30 obj.Address = '/wsman';
31 obj.xmlParser = require('./amt-xml.js');
32 obj.comm = comm;
33 - obj.comm.parent = obj;
33
34 obj.PerformAjax = function PerformAjax(postdata, callback, tag, pri, namespaces) {
35 if (namespaces == null) namespaces = '';
mpsserver.js
+6
@@ -866,6 +866,12 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) {
866 }
867 }
868
869 + obj.SetupCiraChannelToHost = function (host, targetport) {
870 + var ciraconn = obj.parent.mpsserver.ciraConnections[host];
871 + if (ciraconn == null) return null;
872 + return obj.SetupCiraChannel(ciraconn, targetport);
873 + }
874 +
875 obj.SetupCiraChannel = function (socket, targetport) {
876 var sourceport = (socket.tag.nextsourceport++ % 30000) + 1024;
877 var cirachannel = { targetport: targetport, channelid: socket.tag.nextchannelid++, socket: socket, state: 1, sendcredits: 0, amtpendingcredits: 0, amtCiraWindow: 0, ciraWindow: 32768 };