Fix AMT password checking, added ClickOnce ECDSA cert support

Ylian Saint-Hilaire committed Dec 5, 2018 at 14:22 UTC 788a181d09902f4e102877ea5990c46fd8b7276e
10 files changed +20 -23
package.json
+1 -1
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.2.4-a",
3 + "version": "0.2.4-b",
4 "keywords": [
5 "Remote Management",
6 "Intel AMT",
public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_19/MeshMiniRouter.application renamed
+4 -4
@@ -1,20 +1,20 @@
1 <?xml version="1.0" encoding="utf-8"?>
2 <asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
3 - <assemblyIdentity name="MeshMiniRouter.application" version="2.0.0.18" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
3 + <assemblyIdentity name="MeshMiniRouter.application" version="2.0.0.19" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
4 <description asmv2:publisher="Meshcentral.com" asmv2:product="MeshCentral Mini-Router" asmv2:supportUrl="https://meshcentral.com/" xmlns="urn:schemas-microsoft-com:asm.v1" />
5 <deployment install="false" mapFileExtensions="true" trustURLParameters="true" />
6 <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
7 <framework targetVersion="4.5" profile="Full" supportedRuntime="4.0.30319" />
8 </compatibleFrameworks>
9 <dependency>
10 - <dependentAssembly dependencyType="install" codebase="Application Files\MeshMiniRouter_2_0_0_18\MeshMiniRouter.exe.manifest" size="4712">
11 - <assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.18" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
10 + <dependentAssembly dependencyType="install" codebase="Application Files\MeshMiniRouter_2_0_0_19\MeshMiniRouter.exe.manifest" size="4712">
11 + <assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.19" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
12 <hash>
13 <dsig:Transforms>
14 <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
15 </dsig:Transforms>
16 <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
17 - <dsig:DigestValue>MRs3i+wWL3/q3ug0vDLnjcM9sWnwJ7cH8RmaFbWEqBs=</dsig:DigestValue>
17 + <dsig:DigestValue>OrVnTQLTKIxVLZNkTlIIvRGSS1WhevCMECD0a58kSYI=</dsig:DigestValue>
18 </hash>
19 </dependentAssembly>
20 </dependency>
public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_19/MeshMiniRouter.exe.config.deploy renamed
public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_19/MeshMiniRouter.exe.deploy renamed
Binary files a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_18/MeshMiniRouter.exe.deploy and b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_19/MeshMiniRouter.exe.deploy differ
public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_19/MeshMiniRouter.exe.manifest renamed
+4 -4
@@ -1,10 +1,10 @@
1 <?xml version="1.0" encoding="utf-8"?>
2 <asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
3 - <asmv1:assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.18" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
3 + <asmv1:assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.19" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
4 <description asmv2:iconFile="MeshMiniRouter.ico" xmlns="urn:schemas-microsoft-com:asm.v1" />
5 <application />
6 <entryPoint>
7 - <assemblyIdentity name="MeshMiniRouter" version="1.0.6862.32063" language="neutral" processorArchitecture="msil" />
7 + <assemblyIdentity name="MeshMiniRouter" version="1.0.6913.24939" language="neutral" processorArchitecture="msil" />
8 <commandLine file="MeshMiniRouter.exe" parameters="" />
9 </entryPoint>
10 <trustInfo>
@@ -44,13 +44,13 @@
44 </dependency>
45 <dependency>
46 <dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="MeshMiniRouter.exe" size="186368">
47 - <assemblyIdentity name="MeshMiniRouter" version="1.0.6862.32063" language="neutral" processorArchitecture="msil" />
47 + <assemblyIdentity name="MeshMiniRouter" version="1.0.6913.24939" language="neutral" processorArchitecture="msil" />
48 <hash>
49 <dsig:Transforms>
50 <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
51 </dsig:Transforms>
52 <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
53 - <dsig:DigestValue>9CBRw9I6oJzioNiqBO2hWNS8fPrKJs8WKO4N99KM6NY=</dsig:DigestValue>
53 + <dsig:DigestValue>06I3GLTLWQ3HjlpCbxpboVtNzeTJZ6nWgSqw191sAuE=</dsig:DigestValue>
54 </hash>
55 </dependentAssembly>
56 </dependency>
public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_19/MeshMiniRouter.ico.deploy renamed
public/clickonce/minirouter/MeshMiniRouter.application
+4 -4
@@ -1,20 +1,20 @@
1 <?xml version="1.0" encoding="utf-8"?>
2 <asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
3 - <assemblyIdentity name="MeshMiniRouter.application" version="2.0.0.18" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
3 + <assemblyIdentity name="MeshMiniRouter.application" version="2.0.0.19" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
4 <description asmv2:publisher="Meshcentral.com" asmv2:product="MeshCentral Mini-Router" asmv2:supportUrl="https://meshcentral.com/" xmlns="urn:schemas-microsoft-com:asm.v1" />
5 <deployment install="false" mapFileExtensions="true" trustURLParameters="true" />
6 <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
7 <framework targetVersion="4.5" profile="Full" supportedRuntime="4.0.30319" />
8 </compatibleFrameworks>
9 <dependency>
10 - <dependentAssembly dependencyType="install" codebase="Application Files\MeshMiniRouter_2_0_0_18\MeshMiniRouter.exe.manifest" size="4712">
11 - <assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.18" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
10 + <dependentAssembly dependencyType="install" codebase="Application Files\MeshMiniRouter_2_0_0_19\MeshMiniRouter.exe.manifest" size="4712">
11 + <assemblyIdentity name="MeshMiniRouter.exe" version="2.0.0.19" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
12 <hash>
13 <dsig:Transforms>
14 <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
15 </dsig:Transforms>
16 <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
17 - <dsig:DigestValue>MRs3i+wWL3/q3ug0vDLnjcM9sWnwJ7cH8RmaFbWEqBs=</dsig:DigestValue>
17 + <dsig:DigestValue>OrVnTQLTKIxVLZNkTlIIvRGSS1WhevCMECD0a58kSYI=</dsig:DigestValue>
18 </hash>
19 </dependentAssembly>
20 </dependency>
public/clickonce/minirouter/publish.htm
+1 -1
@@ -59,7 +59,7 @@ FONT.key {font-weight: bold; color: darkgreen}
59 <TR><TD ALIGN="LEFT"><TABLE CELLPADDING="2" CELLSPACING="0" BORDER="0" WIDTH="540"><TR><TD WIDTH="496">
60
61 <!-- Begin AppInfo -->
62 -<TABLE><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>Name:</B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>MeshCentral Mini-Router</TD></TR><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>Version:</B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>2.0.0.18</TD></TR><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>Publisher:</B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>Meshcentral.com</TD></TR><tr><td colspan="3">&nbsp;</td></tr></TABLE>
62 +<TABLE><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>Name:</B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>MeshCentral Mini-Router</TD></TR><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>Version:</B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>2.0.0.19</TD></TR><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>Publisher:</B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>Meshcentral.com</TD></TR><tr><td colspan="3">&nbsp;</td></tr></TABLE>
63 <!-- End AppInfo -->
64
65
views/default.handlebars
+3 -2
@@ -1282,7 +1282,7 @@
1282 case 'getcookie': {
1283 if (message.tag == 'clickonce') {
1284 var basicPort = "{{{serverRedirPort}}}" == "" ? "{{{serverPublicPort}}}" : "{{{serverRedirPort}}}";
1285 - var rdpurl = "http://" + window.location.hostname + ":" + basicPort + "/clickonce/minirouter/MeshMiniRouter.application?WS=wss%3A%2F%2F" + window.location.hostname + "%2Fmeshrelay.ashx%3Fauth=" + message.cookie + "&CH={{{webcerthash}}}&AP=" + message.protocol + ((debugmode == 1)?"":"&HOL=1");
1285 + var rdpurl = "http://" + window.location.hostname + ":" + basicPort + "/clickonce/minirouter/MeshMiniRouter.application?WS=wss%3A%2F%2F" + window.location.hostname + "%2Fmeshrelay.ashx%3Fauth=" + message.cookie + "&CH={{{webcerthash}}}&AP=" + message.protocol + ((debugmode == 1) ? "" : "&HOL=1");
1286 window.open(rdpurl, '_blank');
1287 }
1288 break;
@@ -3229,6 +3229,7 @@
3229 if (((meshrights & 8) != 0) && (mesh.mtype == 2)) x += '<a style=cursor:pointer onclick=p10showMeshCmdDialog(1,"' + node._id + '") title="Traffic router used to connect to a device thru this server.">Router</a>&nbsp;';
3230
3231 // RDP link, show this link only of the remote machine is Windows.
3232 + console.log(((connectivity & 1) != 0), (clickOnce == true), (mesh.mtype == 2), ((meshrights & 8) != 0));
3233 if (((connectivity & 1) != 0) && (clickOnce == true) && (mesh.mtype == 2) && ((meshrights & 8) != 0)) {
3234 if ((node.agent.id > 0) && (node.agent.id < 5)) { x += '<a style=cursor:pointer onclick=p10clickOnce("' + node._id + '","RDP2",3389) title="Requires Microsoft ClickOnce support in your browser.">RDP</a>&nbsp;'; }
3235 if (node.agent.id > 4) {
@@ -6460,7 +6461,7 @@
6461 function addLinkConditional(x, f, c) { if (c) return addLink(x, f); return x; }
6462 function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
6463 function addOption(q, t, i) { var option = document.createElement("option"); option.text = t; option.value = i; Q(q).add(option); }
6463 - function passwordcheck(p) { var re = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()]).{8,}/; return re.test(p); }
6464 + function passwordcheck(p) { return (p.length > 7) && (/\d/.test(p)) && (/[a-z]/.test(p)) && (/[A-Z]/.test(p)) && (/\W/.test(p)); }
6465 function methodcheck(r) { if (r && r != null && r.Body && r.Body.ReturnValueStr != "SUCCESS") { messagebox("Call Error", r.Header.Method + ": " + r.Body.ReturnValueStr.replace("_", " ")); return true; } return false; }
6466 function TableStart() { return "<table cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=200px><p><td>"; }
6467 function TableStart2() { return "<table cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td><p><td>"; }
webserver.js
+3 -7
@@ -107,7 +107,6 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
107 obj.webCertificateHashBase64 = new Buffer(obj.webCertificateHash, 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$');
108 obj.webCertificateFullHash = parent.certificateOperations.getCertHashBinary(obj.certificates.web.cert);
109 obj.webCertificateFullHashs = { '': obj.webCertificateFullHash };
110 - obj.webCertificateFullHashBase64 = new Buffer(obj.webCertificateFullHash, 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$');
110 obj.agentCertificateHashHex = parent.certificateOperations.getPublicKeyHash(obj.certificates.agent.cert);
111 obj.agentCertificateHashBase64 = new Buffer(obj.agentCertificateHashHex, 'hex').toString('base64').replace(/\+/g, '@').replace(/\//g, '$');
112 obj.agentCertificateAsn1 = parent.certificateOperations.forge.asn1.toDer(parent.certificateOperations.forge.pki.certificateToAsn1(parent.certificateOperations.forge.pki.certificateFromPem(parent.certificates.agent.cert))).getBytes();
@@ -132,9 +131,6 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
131 }
132 }
133
135 - //console.log(new Buffer(obj.webCertificateHashs['devtest'], 'binary').toString('hex'));
136 - //console.log(new Buffer(obj.webCertificateFullHashs['devtest'], 'binary').toString('hex'));
137 -
134 // If we are running the legacy swarm server, compute the hash for that certificate
135 if (parent.certificates.swarmserver != null) {
136 obj.swarmCertificateAsn1 = parent.certificateOperations.forge.asn1.toDer(parent.certificateOperations.forge.pki.certificateToAsn1(parent.certificateOperations.forge.pki.certificateFromPem(parent.certificates.swarmserver.cert))).getBytes();
@@ -759,14 +755,14 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
755 if (obj.args.minify && !req.query.nominify) {
756 // Try to server the minified version if we can.
757 try {
762 - res.render(obj.path.join(__dirname, isMobileBrowser(req) ? 'views/default-mobile-min' : 'views/default-min'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, webcerthash: obj.webCertificateHashBase64, footer: (domain.footer == null) ? '' : domain.footer });
758 + res.render(obj.path.join(__dirname, isMobileBrowser(req) ? 'views/default-mobile-min' : 'views/default-min'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, webcerthash: new Buffer(obj.webCertificateFullHashs[domain.id], 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$'), footer: (domain.footer == null) ? '' : domain.footer });
759 } catch (ex) {
760 // In case of an exception, serve the non-minified version.
765 - res.render(obj.path.join(__dirname, isMobileBrowser(req) ? 'views/default-mobile' : 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, webcerthash: obj.webCertificateHashBase64, footer: (domain.footer == null) ? '' : domain.footer });
761 + res.render(obj.path.join(__dirname, isMobileBrowser(req) ? 'views/default-mobile' : 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, webcerthash: new Buffer(obj.webCertificateFullHashs[domain.id], 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$'), footer: (domain.footer == null) ? '' : domain.footer });
762 }
763 } else {
764 // Serve non-minified version of web pages.
769 - res.render(obj.path.join(__dirname, isMobileBrowser(req) ? 'views/default-mobile' : 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, webcerthash: obj.webCertificateHashBase64, footer: (domain.footer == null) ? '' : domain.footer });
765 + res.render(obj.path.join(__dirname, isMobileBrowser(req) ? 'views/default-mobile' : 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, webcerthash: new Buffer(obj.webCertificateFullHashs[domain.id], 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$'), footer: (domain.footer == null) ? '' : domain.footer });
766 }
767 } else {
768 // Send back the login application