Internationalized RDP login page and added 3FA support.

Ylian Saint-Hilaire committed Jun 12, 2020 at 13:56 UTC 1f61bc7c2b08b4dd7a7e175f39da50a3393041c4
7 files changed +30 -32
MeshCentralServer.njsproj
+1
@@ -572,6 +572,7 @@
572 <Content Include="views\login.handlebars" />
573 <Content Include="views\message.handlebars" />
574 <Content Include="views\messenger.handlebars" />
575 + <Content Include="views\mstsc.handlebars" />
576 <Content Include="views\terms-mobile.handlebars" />
577 <Content Include="views\terms.handlebars" />
578 <Content Include="views\xterm.handlebars" />
public/mstsc/keymap.html deleted
-20
@@ -1,20 +0,0 @@
1 -<!DOCTYPE html>
2 -<html lang="en">
3 - <head>
4 -
5 - <script language="javascript">
6 - function install() {
7 - // bind keyboard event
8 - window.addEventListener('keydown', function (e) {
9 - document.getElementById('output').innerHTML += e.keyCode + ' : "' + e.code + '", <br>';
10 - e.preventDefault();
11 - return false;
12 - });
13 - }
14 - </script>
15 - </head>
16 -
17 - <body onload='install()'>
18 - <p id='output'></p>
19 - </body>
20 -</html>
translate/translate.js
+2
@@ -32,6 +32,7 @@ var meshCentralSourceFiles = [
32 "../views/message.handlebars",
33 "../views/messenger.handlebars",
34 "../views/player.handlebars",
35 + "../views/mstsc.handlebars",
36 "../emails/account-check.html",
37 "../emails/account-invite.html",
38 "../emails/account-login.html",
@@ -61,6 +62,7 @@ var minifyMeshCentralSourceFiles = [
62 "../views/message.handlebars",
63 "../views/messenger.handlebars",
64 "../views/player.handlebars",
65 + "../views/mstsc.handlebars",
66 "../public/scripts/agent-desktop-0.0.2.js",
67 "../public/scripts/agent-redir-rtc-0.1.0.js",
68 "../public/scripts/agent-redir-ws-0.1.1.js",
translate/translate.json
+9 -2
@@ -6318,6 +6318,7 @@
6318 "default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->connectbutton1span",
6319 "default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->connectbutton2span",
6320 "default.handlebars->container->column_l->p13->p13toolbar->1->0->1->3",
6321 + "mstsc.handlebars->main->1->3->1->8->1->0",
6322 "xterm.handlebars->p11->deskarea0->deskarea1->3"
6323 ]
6324 },
@@ -8852,7 +8853,9 @@
8853 "default.handlebars->27->1487",
8854 "default.handlebars->27->1533",
8855 "default.handlebars->27->1542",
8855 - "default.handlebars->27->1597"
8856 + "default.handlebars->27->1597",
8857 + "mstsc.handlebars->main->1->3->1->2->1->0",
8858 + "mstsc.handlebars->main->1->3->1->2->3"
8859 ]
8860 },
8861 {
@@ -19679,7 +19682,9 @@
19682 "default.handlebars->27->1661",
19683 "default.handlebars->27->251",
19684 "default.handlebars->27->280",
19682 - "default.handlebars->27->645"
19685 + "default.handlebars->27->645",
19686 + "mstsc.handlebars->main->1->3->1->6->1->0",
19687 + "mstsc.handlebars->main->1->3->1->6->3"
19688 ]
19689 },
19690 {
@@ -27999,6 +28004,8 @@
28004 "default.handlebars->27->249",
28005 "default.handlebars->27->279",
28006 "default.handlebars->27->644",
28007 + "mstsc.handlebars->main->1->3->1->4->1->0",
28008 + "mstsc.handlebars->main->1->3->1->4->3",
28009 "player.handlebars->3->4"
28010 ]
28011 },
views/default.handlebars
+2 -2
@@ -2208,13 +2208,13 @@
2208 newWindow.opener = null;
2209 }
2210 } else if (message.tag == 'novnc') {
2211 - var vncurl = window.location.origin + domainUrl + 'novnc/vnc.html?ws=wss%3A%2F%2F' + window.location.host + '%2Fmeshrelay.ashx%3Fauth%3D' + message.cookie + '&show_dot=1';
2211 + var vncurl = window.location.origin + domainUrl + 'novnc/vnc.html?ws=wss%3A%2F%2F' + window.location.host + '%2Fmeshrelay.ashx%3Fauth%3D' + message.cookie + '&show_dot=1' + (urlargs.key?('&key=' + urlargs.key):'');
2212 var node = getNodeFromId(message.nodeid);
2213 if (node != null) { vncurl += '&name=' + encodeURIComponentEx(node.name); }
2214 var newWindow = window.open(vncurl, 'mcnovnc/' + message.nodeid);
2215 newWindow.opener = null;
2216 } else if (message.tag == 'mstsc') {
2217 - var rdpurl = window.location.origin + domainUrl + 'mstsc/index.html?ws=' + message.cookie;
2217 + var rdpurl = window.location.origin + domainUrl + 'mstsc.html?ws=' + message.cookie + (urlargs.key?('&key=' + urlargs.key):'');
2218 var node = getNodeFromId(message.nodeid);
2219 if (node != null) { rdpurl += '&name=' + encodeURIComponentEx(node.name); }
2220 var newWindow = window.open(rdpurl, 'mcmstsc/' + message.nodeid);
views/mstsc.handlebars renamed
+7 -8
@@ -6,16 +6,15 @@
6 <meta name="viewport" content="width=device-width, initial-scale=1">
7 <link rel="icon" href="/favicon.ico">
8 <title>RDP</title>
9 - <script type="text/javascript" src="mstsc.js"></script>
10 - <script type="text/javascript" src="keyboard.js"></script>
11 - <script type="text/javascript" src="rle.js"></script>
12 - <script type="text/javascript" src="client.js"></script>
13 - <script type="text/javascript" src="canvas.js"></script>
9 + <script type="text/javascript" src="mstsc/mstsc.js"></script>
10 + <script type="text/javascript" src="mstsc/keyboard.js"></script>
11 + <script type="text/javascript" src="mstsc/rle.js"></script>
12 + <script type="text/javascript" src="mstsc/client.js"></script>
13 + <script type="text/javascript" src="mstsc/canvas.js"></script>
14 <style>
15 body {
16 font-family:sans-serif;
17 margin: 0;
18 - xoverflow: hidden;
18 background-color: black;
19 }
20
@@ -35,14 +34,14 @@
34 }
35
36 .signinform {
38 - width: 330px;
37 + width: 380px;
38 margin: 0 auto;
39 }
40
41 .formLabel { }
42
43 .formControl {
45 - width: 210px;
44 + width:calc(100% - 16px);
45 font-size: 17px;
46 border-radius: 5px;
47 }
webserver.js
+9
@@ -1627,6 +1627,14 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
1627 render(req, res, getRenderPage('invite', req, domain), getRenderArgs({ messageid: 100 }, req, domain)); // Bad invitation code
1628 }
1629
1630 + // Called to render the MSTSC (RDP) web page
1631 + function handleMSTSCRequest(req, res) {
1632 + const domain = getDomain(req);
1633 + if (domain == null) { parent.debug('web', 'handleMSTSCRequest: failed checks.'); res.sendStatus(404); return; }
1634 + if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key
1635 + render(req, res, getRenderPage('mstsc', req, domain), getRenderArgs({}, req, domain));
1636 + }
1637 +
1638 // Called to process an agent invite request
1639 function handleAgentInviteRequest(req, res) {
1640 const domain = getDomain(req);
@@ -4350,6 +4358,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4358
4359 // Setup MSTSC.js if needed
4360 if (domain.mstsc === true) {
4361 + obj.app.get(url + 'mstsc.html', handleMSTSCRequest);
4362 obj.app.ws(url + 'mstsc/relay.ashx', function (ws, req) {
4363 PerformWSSessionAuth(ws, req, false, function (ws1, req1, domain, user) {
4364 require('./mstsc.js').CreateMstscRelay(obj, obj.db, ws1, req1, obj.args, domain, user);