diff --git a/index.html b/index.html
index da19106..483adc9 100644
--- a/index.html
+++ b/index.html
@@ -10345,8 +10345,10 @@
for (var i in AmtOcrPba) { x += ''; }
QH('idx_d24customBootMediaIndex', x);
}
- QV('ForceHttpBootOption', amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true);
- QV('ForceHttpUrlBootOption', amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true);
+ var httpsBootPossible = (meshCentralServer==null && wsstack.comm.xtlsCertificate != null) || (meshCentralServer!=null && ((currentcomputer.conn & 4) == 4) && currentcomputer.tls == 1) || (meshCentralServer!=null && ((currentcomputer.conn & 2) == 2) )
+
+ QV('ForceHttpBootOption', (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible);
+ QV('ForceHttpUrlBootOption', (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible);
// ###END###{PowerControl-OneClick}
QV('d24dForceProgressEvents', amtPowerBootCapabilities['ForcedProgressEvents'] == true);
QV('d24dUseIDER', amtPowerBootCapabilities['IDER'] == true);
diff --git a/output/index.htm b/output/index.htm
index ec83a60..da55ad2 100644
--- a/output/index.htm
+++ b/output/index.htm
@@ -1021,7 +1021,7 @@ th {
@@ -1264,12 +1265,17 @@ th {
Image Encoding
@@ -2121,7 +2127,7 @@ var CreateAmtRedirect = function (module) {
obj.authuri = '/RedirectionService';
obj.digestRealmMatch = null;
obj.onStateChanged = null;
- obj.disconnectCode = 0;
+ obj.disconnectCode = 0; // 2 = BUSY, 3 = UNSUPPORTED, 256 = ERROR, 50000 = RLE16 fail, 50001 = AmtDisconnect.
function ToIntStr(v) { return String.fromCharCode((v & 0xFF), ((v >> 8) & 0xFF), ((v >> 16) & 0xFF), ((v >> 24) & 0xFF)); }
function ToShortStr(v) { return String.fromCharCode((v & 0xFF), ((v >> 8) & 0xFF)); }
@@ -2140,6 +2146,7 @@ var CreateAmtRedirect = function (module) {
obj.xtlsoptions = tlsoptions;
obj.xtlsFingerprint = tlsFingerprint;
obj.connectstate = 0;
+ obj.disconnectCode = 0;
if (obj.xtlsoptions && obj.xtlsoptions.meshServerConnect) {
// Use the websocket wrapper to connect to MeshServer server
@@ -2190,6 +2197,7 @@ var CreateAmtRedirect = function (module) {
obj.xxOnSocketData = function (data) {
if (!data || obj.connectstate == -1) return;
+ if (typeof(data)=='string') {data = new Buffer(data,'binary')}
// Redirection tracing
if (urlvars && urlvars['redirtrace']) {
var datastr = arrToStr(new Uint8Array(data));
@@ -3853,9 +3861,10 @@ var WsmanStackCreateService = function (host, port, user, pass, tls, extra) {
// Private method
obj.ParseWsman = function (xml) {
if (xml == null) return null;
+ var r = { Header: {} };
try {
if (!xml.childNodes) xml = _turnToXml(xml);
- var r = { Header: {} }, header = xml.getElementsByTagName('Header')[0], t;
+ var header = xml.getElementsByTagName('Header')[0], t;
if (!header) header = xml.getElementsByTagName('a:Header')[0];
if (!header) return null;
for (var i = 0; i < header.childNodes.length; i++) {
@@ -3867,17 +3876,18 @@ var WsmanStackCreateService = function (host, port, user, pass, tls, extra) {
if (!body) return null;
if (body.childNodes.length > 0) {
t = body.childNodes[0].localName;
- if (t.indexOf('_OUTPUT') == t.length - 7) { t = t.substring(0, t.length - 7); }
+ var x = t.indexOf('_OUTPUT');
+ if ((x != -1) && (x == (t.length - 7))) { t = t.substring(0, t.length - 7); }
r.Header['Method'] = t;
try {
r.Body = _ParseWsmanRec(body.childNodes[0]);
} catch (ex) { console.log('_ParseWsmanRec failed', body, ex); return null; }
}
- return r;
} catch (ex) {
console.log('Unable to parse XML: ' + xml + ', ' + ex);
return null;
}
+ return r;
}
// Private method
@@ -34768,7 +34778,35 @@ function _arrayBufferToString(buffer) {
for (var i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]); }
return binary;
}
-/**
+
+function certCetAsn1Values(node, list) {
+ if ((typeof node === 'string') && (node.indexOf('https://') == 0)) { list.push(node); return; }
+ if (Array.isArray(node)) { for (var i in node) { certCetAsn1Values(node[i], list); } return; }
+ if (node && typeof node === 'object') { certCetAsn1Values(node.value, list) }
+}
+
+function getExtensionUrls(cert, val) {
+ var list = [], ext = cert.getExtension(val);
+ if (ext != null) { certCetAsn1Values(forge.asn1.fromDer(ext.value), list); }
+ return list;
+}
+
+var certUrlCache = null;
+var certUrlCacheFile = null;
+function getCertUrl(url, func) {
+ if (certUrlCacheFile == null) { if (process.env.LOCALAPPDATA != null) { certUrlCacheFile = require('path').join(process.env.LOCALAPPDATA, 'mccache.json'); } else { certUrlCacheFile = 'mccache.json'; } }
+ if (certUrlCache == null) { try { certUrlCache = JSON.parse(require('fs').readFileSync(certUrlCacheFile)); } catch (ex) { certUrlCache = {}; } }
+ if ((certUrlCache[url] != null) && (certUrlCache[url].data != null)) { var timeout = 0; if (url.endsWith('.crl')) { timeout = Date.now() - (14 * 86400000); } if (certUrlCache[url].time > timeout) { func(url, atob(certUrlCache[url].data)); return; } }
+ console.log('Loading: ' + url);
+ var u = require('url').parse(url);
+ var req = require('https').get({ hostname: u.hostname, port: u.port?u.port:443, path: u.path, method: 'GET', rejectUnauthorized: false
+ }, function (resp) {
+ var data = '';
+ resp.on('data', function (chunk) { if (data != null) { data += chunk.toString('binary'); } if (data.length > 500000) { data = null; } });
+ resp.on('end', function () { certUrlCache[url] = { data: btoa(data), time: Date.now() }; try { require('fs').writeFileSync(certUrlCacheFile, JSON.stringify(certUrlCache, null, 2)); } catch (ex) { } func(url, data); });
+ });
+ req.on('error', function (err) { console.log('Error: ' + err.message); func(url, null); });
+}/**
* @fileoverview Script Compiler / Decompiler / Runner
* @author Ylian Saint-Hilaire
* @version v0.1.0e
@@ -35199,7 +35237,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.rwidth = 0;
obj.rheight = 0;
obj.bpp = 2; // Bytes per pixel (1 or 2 supported)
- obj.useZRLE = true;
+ obj.useRLE = true;
obj.showmouse = true;
obj.buttonmask = 0;
obj.localKeyMap = true;
@@ -35209,7 +35247,6 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.sparew2 = 0;
obj.spareh2 = 0;
obj.sparecache = {};
- obj.ZRLEfirst = 1;
obj.onScreenSizeChange = null;
obj.frameRateDelay = 0;
@@ -35222,6 +35259,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.onKvmDataAck = -1;
obj.holding = false;
obj.lastKeepAlive = Date.now();
+ obj.kvmExt = {};
+ obj.kvmExtChanged = null;
+ obj.useZLib = false;
+ obj.graymode = false;
obj.mNagleTimer = null; // Mouse motion slowdown timer
obj.mx = 0; // Last mouse x position
@@ -35322,10 +35363,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
*/
// SetEncodings, with AMT we can't omit RAW, must be specified.
- // Intel AMT supports encodings: RAW (0), ZRLE (16), Desktop Size (0xFFFFFF21, -223)
+ // Intel AMT supports encodings: RAW (0), RLE (16), Desktop Size (0xFFFFFF21, -223)
var supportedEncodings = '';
- if (obj.useZRLE) supportedEncodings += IntToStr(16);
+ if (obj.useRLE) supportedEncodings += IntToStr(16);
supportedEncodings += IntToStr(0);
supportedEncodings += IntToStr(1092);
@@ -35338,13 +35379,19 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.state = 4;
if (obj.parent) { obj.parent.disconnectCode = 0; obj.parent.xxStateChange(3); }
- _SendRefresh();
//obj.timer = setInterval(obj.xxOnTimer, 50);
obj.ox = -1; // Old mouse x position
-
+
+ if (obj.kvmExtChanged != null) {
+ obj.sendKvmExtCmd(2, obj.graymode ? 1 : 0); // Set Decimation State
+ obj.sendKvmExtCmd(4, obj.useZLib ? 1 : 0); // Set ZLib state
+ }
+ _SendRefresh();
+
if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
+ if (obj.parent) { obj.parent.disconnectCode = 50001; } // Everything looks good, a disconnection here would be Intel AMT initiated.
}
else if (obj.state == 4) {
switch (obj.acc[0]) {
@@ -35415,7 +35462,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
}
_putImage(obj.spare, x, y);
} else if (encoding == 16) {
- // ZRLE encoding
+ // RLE encoding
if (obj.acc.byteLength < 16) return;
var datalen = accview.getUint32(12);
if (obj.acc.byteLength < (16 + datalen)) return;
@@ -35742,13 +35789,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.Start = function () {
obj.state = 0;
obj.acc = null;
- obj.ZRLEfirst = 1;
obj.inflate.inflateReset();
obj.onKvmDataPending = [];
obj.onKvmDataAck = -1;
obj.kvmDataSupported = false;
+ obj.kvmExt = {};
for (var i in obj.sparecache) { delete obj.sparecache[i]; }
}
@@ -35911,6 +35958,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-DataChannel-Recv(' + (d.length - 16) + '): ' + d.substring(16)); }
if (d.length >= 16) { obj.onKvmData(d.substring(16)); } // Event the data and ack
if ((obj.onKvmDataAck == true) && (obj.onKvmDataPending.length > 0)) { obj.sendKvmData(obj.onKvmDataPending.shift()); } // Send pending data
+ } else if ((d.length >= 13) && (d.substring(0, 11) == '\0KvmExtCmd\0')) {
+ var cmd = d.charCodeAt(11), val = d.charCodeAt(12);
+ console.log('Received KvmExtCmd', cmd, val);
+ if (cmd == 1) { obj.kvmExt.decimation = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(1, val); } }
+ if (cmd == 2) { obj.sendKvmExtCmd(1); }
+ if (cmd == 3) { obj.kvmExt.compression = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(3, val); } }
+ if (cmd == 4) { obj.sendKvmExtCmd(3); }
} else {
console.log('Got KVM clipboard data:', d);
if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-ClipBoard-Recv(' + d.length + '): ' + rstr2hex(d) + ', ' + d); }
@@ -35920,6 +35974,12 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
}
+ obj.sendKvmExtCmd = function (cmd, val) {
+ console.log('Sending KvmExtCmd', cmd, val);
+ var x = '\0KvmExtCmd\0' + String.fromCharCode(cmd) + (val != null ? String.fromCharCode(val) : '');
+ obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(x.length) + x);
+ }
+
obj.sendKvmData = function (x) {
if (obj.onKvmDataAck !== true) {
obj.onKvmDataPending.push(x);
@@ -41652,7 +41712,7 @@ var CreateWebSocketWrapper = function (host, port, path, certhash) {
var amtwirelessif = -1; // Set to the interface index for the wireless interface, -1 if no wireless.
var desktop;
- var desktopsettings = { encoding:1, showfocus:false, showmouse:true, showcad:true, limitFrameRate:false, noMouseRotate:false };
+ var desktopsettings = { encflags: 1, showfocus: false, showmouse: true, showcad: true, limitFrameRate: false, noMouseRotate: false };
var webcompilerfeatures = ['AgentPresence','Alarms','AuditLog','CertificateManager','Certificates','ComputerSelector','ComputerSelector-Local','ComputerSelectorScanner','ComputerSelectorToolbar','ContextMenus','Desktop','DesktopFocus','DesktopInband','DesktopInbandFiles','Desktop-Multi','DesktopRotation','Desktop-Settings','DesktopType','EventLog','EventSubscriptions','FileSaver','HardwareInfo','IDER','IDER-IMRSDK','IDERStats','Inflate','Look-Commander','MeshServerConnect','Mode-NodeWebkit','NetworkSettings','PowerControl','PowerControl-Advanced','PowerControl-OneClick','RemoteAccess','Scripting','Scripting-Editor','SessionRecording','Storage','SystemDefense','Terminal','Terminal-Enumation-All','Terminal-FxEnumation-All','TerminalReplay','TerminalSize','USBSetup','VersionWarning','Wireless','WsmanBrowser'];
var StatusStrs = ["Disconnected", "Connecting...", "Setup...", "Connected"];
@@ -42340,6 +42400,7 @@ var CreateWebSocketWrapper = function (host, port, path, certhash) {
if (terminal.m.capture) delete terminal.m.capture;
terminal.Stop();
+ desktop.disconnectCode = 0;
desktop.Stop();
}
@@ -42706,6 +42767,15 @@ var CreateWebSocketWrapper = function (host, port, path, certhash) {
function addComputer() {
if (xxdialogMode) return;
+
+ // Build the list of groups
+ var groups = [], x = '';
+ for (var y in computerlist) { var computer = computerlist[y]; if ((computer.tags != null) && (computer.tags != '') && (groups.indexOf(computer.tags) == -1) && (computer.tags.indexOf('"') == -1)) { groups.push(computer.tags); } }
+ groups.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
+ for (var y in groups) { x += '