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);