Partial web page multi-language support done.

This commit is contained in:
Ylian Saint-Hilaire 2019-10-17 17:13:55 -07:00
parent 6b71476ab8
commit 3f02c8251a
6 changed files with 638 additions and 644 deletions

View File

@ -165,28 +165,28 @@
try { recFileMetadata = JSON.parse(data) } catch (ex) { cleanup(); return; } try { recFileMetadata = JSON.parse(data) } catch (ex) { cleanup(); return; }
if ((recFileMetadata == null) || (recFileMetadata.magic != 'MeshCentralRelaySession') || (recFileMetadata.ver != 1)) { cleanup(); return; } if ((recFileMetadata == null) || (recFileMetadata.magic != 'MeshCentralRelaySession') || (recFileMetadata.ver != 1)) { cleanup(); return; }
var x = ''; var x = '';
x += addInfo('Time', recFileMetadata.time); x += addInfo("Time", recFileMetadata.time);
if (recFileEndTime != 0) { var secs = Math.floor((recFileEndTime - time) / 1000); x += addInfo('Duration', secs + ' second' + ((secs > 1) ? 's' : '')); } if (recFileEndTime != 0) { var secs = Math.floor((recFileEndTime - time) / 1000); x += addInfo("Duration", format("{0} second{1}", secs, (secs > 1) ? 's' : '')); }
x += addInfo('Username', recFileMetadata.username); x += addInfo("Username", recFileMetadata.username);
x += addInfo('UserID', recFileMetadata.userid); x += addInfo("UserID", recFileMetadata.userid);
x += addInfo('SessionID', recFileMetadata.sessionid); x += addInfo("SessionID", recFileMetadata.sessionid);
if (recFileMetadata.ipaddr1 && recFileMetadata.ipaddr2) { x += addInfo('Addresses', recFileMetadata.ipaddr1 + ' to ' + recFileMetadata.ipaddr2); } if (recFileMetadata.ipaddr1 && recFileMetadata.ipaddr2) { x += addInfo("Addresses", format("{0} to {1}", recFileMetadata.ipaddr1, recFileMetadata.ipaddr2)); }
if (recFileMetadata.devicename) { x += addInfo('DeviceName', recFileMetadata.devicename); } if (recFileMetadata.devicename) { x += addInfo("DeviceName", recFileMetadata.devicename); }
x += addInfo('NodeID', recFileMetadata.nodeid); x += addInfo("NodeID", recFileMetadata.nodeid);
if (recFileMetadata.protocol) { if (recFileMetadata.protocol) {
var p = recFileMetadata.protocol; var p = recFileMetadata.protocol;
if (p == 1) { p = 'MeshCentral Terminal'; } if (p == 1) { p = "MeshCentral Terminal"; }
else if (p == 2) { p = 'MeshCentral Desktop'; } else if (p == 2) { p = "MeshCentral Desktop"; }
else if (p == 100) { p = 'Intel® AMT WSMAN'; } else if (p == 100) { p = "Intel® AMT WSMAN"; }
else if (p == 101) { p = 'Intel® AMT Redirection'; } else if (p == 101) { p = "Intel® AMT Redirection"; }
x += addInfoNoEsc('Protocol', p); x += addInfoNoEsc("Protocol", p);
} }
QV('DeskParent', true); QV('DeskParent', true);
QV('TermParent', false); QV('TermParent', false);
if (recFileMetadata.protocol == 1) { if (recFileMetadata.protocol == 1) {
// MeshCentral remote terminal // MeshCentral remote terminal
recFileProtocol = 1; recFileProtocol = 1;
x += '<br /><br /><span style=color:gray>Press [space] to play/pause.</span>'; x += '<br /><br /><span style=color:gray>' + "Press [space] to play/pause." + '</span>';
QE('PlayButton', true); QE('PlayButton', true);
QE('PauseButton', false); QE('PauseButton', false);
QE('RestartButton', false); QE('RestartButton', false);
@ -195,7 +195,7 @@
else if (recFileMetadata.protocol == 2) { else if (recFileMetadata.protocol == 2) {
// MeshCentral remote desktop // MeshCentral remote desktop
recFileProtocol = 2; recFileProtocol = 2;
x += '<br /><br /><span style=color:gray>Press [space] to play/pause.</span>'; x += '<br /><br /><span style=color:gray>' + "Press [space] to play/pause." + '</span>';
QE('PlayButton', true); QE('PlayButton', true);
QE('PauseButton', false); QE('PauseButton', false);
QE('RestartButton', false); QE('RestartButton', false);
@ -301,7 +301,7 @@
QS('progressbar').width = '0px'; QS('progressbar').width = '0px';
QH('timespan', '00:00:00'); QH('timespan', '00:00:00');
QV('metadatadiv', true); QV('metadatadiv', true);
QH('metadatadiv', '<span style=\"font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:28px\">MeshCentral Session Player</span><br /><br /><span style=color:gray>Drag & drop a .mcrec file or click "Open File..."</span>'); QH('metadatadiv', '<span style=\"font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:28px\">MeshCentral Session Player</span><br /><br /><span style=color:gray>' + "Drag & drop a .mcrec file or click \"Open File...\"" + '</span>');
QV('DeskParent', true); QV('DeskParent', true);
QV('TermParent', false); QV('TermParent', false);
} }
@ -529,10 +529,9 @@
function messagebox(t, m) { setSessionActivity(); QH('id_dialogMessage', m); setDialogMode(1, t, 1); } function messagebox(t, m) { setSessionActivity(); QH('id_dialogMessage', m); setDialogMode(1, t, 1); }
function statusbox(t, m) { setSessionActivity(); QH('id_dialogMessage', m); setDialogMode(1, t); } function statusbox(t, m) { setSessionActivity(); QH('id_dialogMessage', m); setDialogMode(1, t); }
function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; } function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
function pad2(num) { var s = "00" + num; return s.substr(s.length - 2); } function pad2(num) { var s = '00' + num; return s.substr(s.length - 2); }
function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };
start(); start();
</script> </script>

File diff suppressed because it is too large Load Diff

View File

@ -57,8 +57,8 @@
var webPageFullScreen = true; var webPageFullScreen = true;
var nightMode = (getstore('_nightMode', '0') == '1'); var nightMode = (getstore('_nightMode', '0') == '1');
var terms = "{{{terms}}}"; var terms = '{{{terms}}}';
if (terms != "") { QH('column_l', decodeURIComponent(terms)); } if (terms != '') { QH('column_l', decodeURIComponent(terms)); }
QV('column_l', true); QV('column_l', true);
userInterfaceSelectMenu(); userInterfaceSelectMenu();
@ -94,15 +94,15 @@
var hide = 0; var hide = 0;
//if (args.hide) { hide = parseInt(args.hide); } //if (args.hide) { hide = parseInt(args.hide); }
if (webPageFullScreen == false) { if (webPageFullScreen == false) {
QC('body').remove("menu_stack"); QC('body').remove('menu_stack');
QC('body').remove("fullscreen"); QC('body').remove('fullscreen');
QC('body').remove("arg_hide"); QC('body').remove('arg_hide');
//if (xxcurrentView >= 10) QC('column_l').add('room4submenu'); //if (xxcurrentView >= 10) QC('column_l').add('room4submenu');
//QV('UserDummyMenuSpan', false); //QV('UserDummyMenuSpan', false);
//QV('page_leftbar', false); //QV('page_leftbar', false);
} else { } else {
QC('body').add("fullscreen"); QC('body').add('fullscreen');
if (hide & 16) QC('body').add("arg_hide"); // This is replacement for QV('page_leftbar', !(hide & 16)); if (hide & 16) QC('body').add('arg_hide'); // This is replacement for QV('page_leftbar', !(hide & 16));
//QV('UserDummyMenuSpan', (xxcurrentView < 10) && webPageFullScreen); //QV('UserDummyMenuSpan', (xxcurrentView < 10) && webPageFullScreen);
//QV('page_leftbar', true); //QV('page_leftbar', true);
} }
@ -117,9 +117,9 @@
putstore('webPageStackMenu', webPageStackMenu); putstore('webPageStackMenu', webPageStackMenu);
} }
if (webPageStackMenu == false) { if (webPageStackMenu == false) {
QC('body').remove("menu_stack"); QC('body').remove('menu_stack');
} else { } else {
QC('body').add("menu_stack"); QC('body').add('menu_stack');
//if (xxcurrentView >= 10) QC('column_l').remove('room4submenu'); //if (xxcurrentView >= 10) QC('column_l').remove('room4submenu');
} }
} }

View File

@ -267,12 +267,12 @@
</div> </div>
<script> <script>
'use strict'; 'use strict';
var passhint = "{{{passhint}}}"; var passhint = '{{{passhint}}}';
var newAccountPass = parseInt('{{{newAccountPass}}}'); var newAccountPass = parseInt('{{{newAccountPass}}}');
var emailCheck = ('{{{emailcheck}}}' == 'true'); var emailCheck = ('{{{emailcheck}}}' == 'true');
var features = parseInt('{{{features}}}'); var features = parseInt('{{{features}}}');
var passRequirements = "{{{passRequirements}}}"; var passRequirements = '{{{passRequirements}}}';
if (passRequirements != "") { passRequirements = JSON.parse(decodeURIComponent(passRequirements)); } else { passRequirements = {}; } if (passRequirements != '') { passRequirements = JSON.parse(decodeURIComponent(passRequirements)); } else { passRequirements = {}; }
var passRequirementsEx = ((passRequirements.min != null) || (passRequirements.max != null) || (passRequirements.upper != null) || (passRequirements.lower != null) || (passRequirements.numeric != null) || (passRequirements.nonalpha != null)); var passRequirementsEx = ((passRequirements.min != null) || (passRequirements.max != null) || (passRequirements.upper != null) || (passRequirements.lower != null) || (passRequirements.numeric != null) || (passRequirements.nonalpha != null));
var hardwareKeyChallenge = decodeURIComponent('{{{hkey}}}'); var hardwareKeyChallenge = decodeURIComponent('{{{hkey}}}');
var currentpanel = 0; var currentpanel = 0;
@ -297,8 +297,8 @@
} }
if (features & 0x200000) { // Email is username if (features & 0x200000) { // Email is username
QH('loginusername', 'Email:'); QH('loginusername', "Email:");
QH('resetAccountSpan', 'Forgot password?'); QH('resetAccountSpan', "Forgot password?");
QV('nuUserRow', false); QV('nuUserRow', false);
} }
@ -311,10 +311,10 @@
validateCreate(); validateCreate();
if ('{{loginmode}}' != '') { go(parseInt('{{loginmode}}')); } else { go(1); } if ('{{loginmode}}' != '') { go(parseInt('{{loginmode}}')); } else { go(1); }
QV('newAccountDiv', ('{{{newAccount}}}' === '1') || ('{{{newAccount}}}' === 'true')); // If new accounts are not allowed, don't display the new account link. QV('newAccountDiv', ('{{{newAccount}}}' === '1') || ('{{{newAccount}}}' === 'true')); // If new accounts are not allowed, don't display the new account link.
if ((passRequirements.hint === true) && (passhint != null) && (passhint.length > 0)) { QV("showPassHintLink", true); } if ((passRequirements.hint === true) && (passhint != null) && (passhint.length > 0)) { QV('showPassHintLink', true); }
QV("newAccountPass", (newAccountPass == 1)); QV('newAccountPass', (newAccountPass == 1));
QV("resetAccountDiv", (emailCheck == true)); QV('resetAccountDiv', (emailCheck == true));
QV("hrAccountDiv", (emailCheck == true) || (newAccountPass == 1)); QV('hrAccountDiv', (emailCheck == true) || (newAccountPass == 1));
if ('{{loginmode}}' == '4') { if ('{{loginmode}}' == '4') {
try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null } try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
@ -396,7 +396,7 @@
function go(x) { function go(x) {
currentpanel = x; currentpanel = x;
setDialogMode(0); setDialogMode(0);
QV("showPassHintLink", false); QV('showPassHintLink', false);
QV('loginpanel', x == 1); QV('loginpanel', x == 1);
QV('createpanel', x == 2); QV('createpanel', x == 2);
QV('resetpanel', x == 3); QV('resetpanel', x == 3);
@ -432,9 +432,9 @@
if (!passRequirementsEx) { if (!passRequirementsEx) {
// No password requirements, display password strength // No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('apassword1').value); var passStrength = checkPasswordStrength(Q('apassword1').value);
if (passStrength >= 80) { QH('passWarning', '<span style=color:green><b>Strong Password</b><span>'); } if (passStrength >= 80) { QH('passWarning', '<span style=color:green><b>' + "Strong Password" + '</b><span>'); }
else if (passStrength >= 60) { QH('passWarning', '<span style=color:blue><b>Good Password</b><span>'); } else if (passStrength >= 60) { QH('passWarning', '<span style=color:blue><b>' + "Good Password" + '</b><span>'); }
else { QH('passWarning', '<span style=color:red><b>Weak Password</b><span>'); } else { QH('passWarning', '<span style=color:red><b>' + "Weak Password" + '</b><span>'); }
} else { } else {
// Password requirements provided, use that // Password requirements provided, use that
var passReq = checkPasswordRequirements(Q('apassword1').value, passRequirements); var passReq = checkPasswordRequirements(Q('apassword1').value, passRequirements);
@ -442,7 +442,7 @@
ok = false; ok = false;
//QS('nuPass1').color = '#7b241c'; //QS('nuPass1').color = '#7b241c';
//QS('nuPass2').color = '#7b241c'; //QS('nuPass2').color = '#7b241c';
QH('passWarning', '<span style=color:red><b>Password Policy</b><span>'); // TODO: Display problem hint QH('passWarning', '<span style=color:red><b>' + "Password Policy" + '</b><span>'); // TODO: Display problem hint
QV('passwordPolicyCallout', true); QV('passwordPolicyCallout', true);
QH('passwordPolicyCallout', passwordPolicyText(Q('apassword1').value)); QH('passwordPolicyCallout', passwordPolicyText(Q('apassword1').value));
} else { } else {
@ -480,9 +480,9 @@
if (!passRequirementsEx) { if (!passRequirementsEx) {
// No password requirements, display password strength // No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('rapassword1').value); var passStrength = checkPasswordStrength(Q('rapassword1').value);
if (passStrength >= 80) { QH('rpassWarning', '<span style=color:green><b>Strong Password</b><span>'); } if (passStrength >= 80) { QH('rpassWarning', '<span style=color:green><b>' + "Strong Password" + '</b><span>'); }
else if (passStrength >= 60) { QH('rpassWarning', '<span style=color:blue><b>Good Password</b><span>'); } else if (passStrength >= 60) { QH('rpassWarning', '<span style=color:blue><b>' + "Good Password" + '</b><span>'); }
else { QH('rpassWarning', '<span style=color:red><b>Weak Password</b><span>'); } else { QH('rpassWarning', '<span style=color:red><b>' + "Weak Password" + '</b><span>'); }
} else { } else {
// Password requirements provided, use that // Password requirements provided, use that
var passReq = checkPasswordRequirements(Q('rapassword1').value, passRequirements); var passReq = checkPasswordRequirements(Q('rapassword1').value, passRequirements);
@ -490,7 +490,7 @@
ok = false; ok = false;
QS('rnuPass1').color = '#7b241c'; QS('rnuPass1').color = '#7b241c';
QS('rnuPass2').color = '#7b241c'; QS('rnuPass2').color = '#7b241c';
QH('rpassWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>'); // This is also a link to the password policy QH('rpassWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>' + "Password Policy" + '</b><div>'); // This is also a link to the password policy
QV('rpasswordPolicyCallout', true); QV('rpasswordPolicyCallout', true);
QH('rpasswordPolicyCallout', passwordPolicyText(Q('rapassword1').value)); QH('rpasswordPolicyCallout', passwordPolicyText(Q('rapassword1').value));
} else { } else {
@ -513,21 +513,19 @@
setDialogMode(0); setDialogMode(0);
var x = validateEmail(Q('remail').value); var x = validateEmail(Q('remail').value);
QE('eresetButton', x); QE('eresetButton', x);
if ((e != null) && (e.keyCode == 13) && (x == true)) { if ((e != null) && (e.keyCode == 13) && (x == true)) { Q('eresetButton').click(); }
Q('eresetButton').click();
}
if (e != null) { haltEvent(e); } if (e != null) { haltEvent(e); }
} }
function passwordPolicyText(pass) { function passwordPolicyText(pass) {
var policy = '<div style=text-align:left>'; var policy = '<div style=text-align:left>';
var counts = strCount(pass); var counts = strCount(pass);
if (passRequirements.min && ((pass == null) || (pass.length < passRequirements.min))) { policy += 'Minimum length of ' + passRequirements.min + '<br />'; } if (passRequirements.min && ((pass == null) || (pass.length < passRequirements.min))) { policy += format("Minimum length of {0}", passRequirements.min) + '<br />'; }
if (passRequirements.max && ((pass == null) || (pass.length > passRequirements.max))) { policy += 'Maximum length of ' + passRequirements.max + '<br />'; } if (passRequirements.max && ((pass == null) || (pass.length > passRequirements.max))) { policy += format("Maximum length of {0}", passRequirements.max) + '<br />'; }
if (passRequirements.upper && ((pass == null) || (counts.upper < passRequirements.upper))) { policy += '' + passRequirements.upper + ' upper case<br />'; } if (passRequirements.upper && ((pass == null) || (counts.upper < passRequirements.upper))) { policy += format("{0} upper case", passRequirements.upper) + '<br />'; }
if (passRequirements.lower && ((pass == null) || (counts.lower < passRequirements.lower))) { policy += '' + passRequirements.lower + ' lower case<br />'; } if (passRequirements.lower && ((pass == null) || (counts.lower < passRequirements.lower))) { policy += format("{0} lower case", passRequirements.lower) + '<br />'; }
if (passRequirements.numeric && ((pass == null) || (counts.numeric < passRequirements.numeric))) { policy += '' + passRequirements.numeric + ' numeric<br />'; } if (passRequirements.numeric && ((pass == null) || (counts.numeric < passRequirements.numeric))) { policy += format("{0} numeric", passRequirements.numeric) + '<br />'; }
if (passRequirements.nonalpha && ((pass == null) || (counts.nonalpha < passRequirements.nonalpha))) { policy += passRequirements.nonalpha + ' non-alphanumeric<br />'; } if (passRequirements.nonalpha && ((pass == null) || (counts.nonalpha < passRequirements.nonalpha))) { policy += format("{0} non-alphanumeric", passRequirements.nonalpha) + '<br />'; }
policy += '</div>'; policy += '</div>';
return policy; return policy;
} }
@ -621,13 +619,14 @@
if (((b & 8) || x) && f) f(x, t); if (((b & 8) || x) && f) f(x, t);
} }
function center() { QS('dialog').left = ((((getDocWidth() - 400) / 2)) + "px"); } function center() { QS('dialog').left = ((((getDocWidth() - 400) / 2)) + 'px'); }
function messagebox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t, 1); } function messagebox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t, 1); }
function statusbox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t); } function statusbox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t); }
function getDocWidth() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientWidth != 0) return document.documentElement.clientWidth; return document.getElementsByTagName('body')[0].clientWidth; } function getDocWidth() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientWidth != 0) return document.documentElement.clientWidth; return document.getElementsByTagName('body')[0].clientWidth; }
function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; } function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
function haltReturn(e) { if (e.keyCode == 13) { haltEvent(e); } } function haltReturn(e) { if (e.keyCode == 13) { haltEvent(e); } }
function validateEmail(v) { var emailReg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return emailReg.test(v); } // New version function validateEmail(v) { var emailReg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return emailReg.test(v); } // New version
function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };
</script> </script>
</body> </body>

View File

@ -259,15 +259,15 @@
</div> </div>
<script> <script>
'use strict'; 'use strict';
var passhint = "{{{passhint}}}"; var passhint = '{{{passhint}}}';
var newAccountPass = parseInt('{{{newAccountPass}}}'); var newAccountPass = parseInt('{{{newAccountPass}}}');
var emailCheck = ('{{{emailcheck}}}' == 'true'); var emailCheck = ('{{{emailcheck}}}' == 'true');
var passRequirements = "{{{passRequirements}}}"; var passRequirements = '{{{passRequirements}}}';
var hardwareKeyChallenge = decodeURIComponent('{{{hkey}}}'); var hardwareKeyChallenge = decodeURIComponent('{{{hkey}}}');
if (passRequirements != "") { passRequirements = JSON.parse(decodeURIComponent(passRequirements)); } else { passRequirements = {}; } if (passRequirements != '') { passRequirements = JSON.parse(decodeURIComponent(passRequirements)); } else { passRequirements = {}; }
var passRequirementsEx = ((passRequirements.min != null) || (passRequirements.max != null) || (passRequirements.upper != null) || (passRequirements.lower != null) || (passRequirements.numeric != null) || (passRequirements.nonalpha != null)); var passRequirementsEx = ((passRequirements.min != null) || (passRequirements.max != null) || (passRequirements.upper != null) || (passRequirements.lower != null) || (passRequirements.numeric != null) || (passRequirements.nonalpha != null));
var features = parseInt('{{{features}}}'); var features = parseInt('{{{features}}}');
var welcomeText = decodeURIComponent("{{{welcometext}}}"); var welcomeText = decodeURIComponent('{{{welcometext}}}');
var currentpanel = 0; var currentpanel = 0;
var uiMode = parseInt(getstore('uiMode', '1')); var uiMode = parseInt(getstore('uiMode', '1'));
var webPageFullScreen = true; var webPageFullScreen = true;
@ -299,8 +299,8 @@
} }
if (features & 0x200000) { // Email is username if (features & 0x200000) { // Email is username
QH('loginusername', 'Email:'); QH('loginusername', "Email:");
QH('resetAccountSpan', 'Forgot password?'); QH('resetAccountSpan', "Forgot password?");
QV('nuUserRow', false); QV('nuUserRow', false);
} }
@ -320,10 +320,10 @@
validateCreate(); validateCreate();
if ('{{loginmode}}' != '') { go(parseInt('{{loginmode}}')); } else { go(1); } if ('{{loginmode}}' != '') { go(parseInt('{{loginmode}}')); } else { go(1); }
QV('newAccountDiv', ('{{{newAccount}}}' === '1') || ('{{{newAccount}}}' === 'true')); // If new accounts are not allowed, don't display the new account link. QV('newAccountDiv', ('{{{newAccount}}}' === '1') || ('{{{newAccount}}}' === 'true')); // If new accounts are not allowed, don't display the new account link.
if ((passhint != null) && (passhint.length > 0)) { QV("showPassHintLink", true); } if ((passhint != null) && (passhint.length > 0)) { QV('showPassHintLink', true); }
QV("newAccountPass", (newAccountPass == 1)); QV('newAccountPass', (newAccountPass == 1));
QV("resetAccountDiv", (emailCheck == true)); QV('resetAccountDiv', (emailCheck == true));
QV("hrAccountDiv", (emailCheck == true) || (newAccountPass == 1)); QV('hrAccountDiv', (emailCheck == true) || (newAccountPass == 1));
if ('{{loginmode}}' == '4') { if ('{{loginmode}}' == '4') {
try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null } try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
@ -414,7 +414,7 @@
function go(x) { function go(x) {
currentpanel = x; currentpanel = x;
setDialogMode(0); setDialogMode(0);
QV("showPassHintLink", false); QV('showPassHintLink', false);
QV('loginpanel', x == 1); QV('loginpanel', x == 1);
QV('createpanel', x == 2); QV('createpanel', x == 2);
QV('resetpanel', x == 3); QV('resetpanel', x == 3);
@ -461,9 +461,9 @@
if (!passRequirementsEx) { if (!passRequirementsEx) {
// No password requirements, display password strength // No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('apassword1').value); var passStrength = checkPasswordStrength(Q('apassword1').value);
if (passStrength >= 80) { QH('passWarning', '<span style=color:green><b>Strong Password</b><span>'); } if (passStrength >= 80) { QH('passWarning', '<span style=color:green><b>' + "Strong Password" + '</b><span>'); }
else if (passStrength >= 60) { QH('passWarning', '<span style=color:blue><b>Good Password</b><span>'); } else if (passStrength >= 60) { QH('passWarning', '<span style=color:blue><b>' + "Good Password" + '</b><span>'); }
else { QH('passWarning', '<span style=color:red><b>Weak Password</b><span>'); } else { QH('passWarning', '<span style=color:red><b>' + "Weak Password" + '</b><span>'); }
} else { } else {
// Password requirements provided, use that // Password requirements provided, use that
var passReq = checkPasswordRequirements(Q('apassword1').value, passRequirements); var passReq = checkPasswordRequirements(Q('apassword1').value, passRequirements);
@ -471,7 +471,7 @@
ok = false; ok = false;
QS('nuPass1').color = '#7b241c'; QS('nuPass1').color = '#7b241c';
QS('nuPass2').color = '#7b241c'; QS('nuPass2').color = '#7b241c';
QH('passWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>'); // This is also a link to the password policy QH('passWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>' + "Password Policy" + '</b><div>'); // This is also a link to the password policy
QV('passwordPolicyCallout', true); QV('passwordPolicyCallout', true);
QH('passwordPolicyCallout', passwordPolicyText(Q('apassword1').value)); QH('passwordPolicyCallout', passwordPolicyText(Q('apassword1').value));
} else { } else {
@ -510,9 +510,9 @@
if (!passRequirementsEx) { if (!passRequirementsEx) {
// No password requirements, display password strength // No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('rapassword1').value); var passStrength = checkPasswordStrength(Q('rapassword1').value);
if (passStrength >= 80) { QH('rpassWarning', '<span style=color:green><b>Strong Password</b><span>'); } if (passStrength >= 80) { QH('rpassWarning', '<span style=color:green><b>' + "Strong Password" + '</b><span>'); }
else if (passStrength >= 60) { QH('rpassWarning', '<span style=color:blue><b>Good Password</b><span>'); } else if (passStrength >= 60) { QH('rpassWarning', '<span style=color:blue><b>' + "Good Password" + '</b><span>'); }
else { QH('rpassWarning', '<span style=color:red><b>Weak Password</b><span>'); } else { QH('rpassWarning', '<span style=color:red><b>' + "Weak Password" + '</b><span>'); }
} else { } else {
// Password requirements provided, use that // Password requirements provided, use that
var passReq = checkPasswordRequirements(Q('rapassword1').value, passRequirements); var passReq = checkPasswordRequirements(Q('rapassword1').value, passRequirements);
@ -520,7 +520,7 @@
ok = false; ok = false;
QS('rnuPass1').color = '#7b241c'; QS('rnuPass1').color = '#7b241c';
QS('rnuPass2').color = '#7b241c'; QS('rnuPass2').color = '#7b241c';
QH('rpassWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Password Policy</b><div>'); // This is also a link to the password policy QH('rpassWarning', '<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>' + "Password Policy" + '</b><div>'); // This is also a link to the password policy
QV('rpasswordPolicyCallout', true); QV('rpasswordPolicyCallout', true);
QH('rpasswordPolicyCallout', passwordPolicyText(Q('rapassword1').value)); QH('rpasswordPolicyCallout', passwordPolicyText(Q('rapassword1').value));
} else { } else {
@ -542,12 +542,12 @@
function passwordPolicyText(pass) { function passwordPolicyText(pass) {
var policy = '<div style=text-align:left>'; var policy = '<div style=text-align:left>';
var counts = strCount(pass); var counts = strCount(pass);
if (passRequirements.min && ((pass == null) || (pass.length < passRequirements.min))) { policy += 'Minimum length of ' + passRequirements.min + '<br />'; } if (passRequirements.min && ((pass == null) || (pass.length < passRequirements.min))) { policy += format("Minimum length of {0}", passRequirements.min) + '<br />'; }
if (passRequirements.max && ((pass == null) || (pass.length > passRequirements.max))) { policy += 'Maximum length of ' + passRequirements.max + '<br />'; } if (passRequirements.max && ((pass == null) || (pass.length > passRequirements.max))) { policy += format("Maximum length of {0}", passRequirements.max) + '<br />'; }
if (passRequirements.upper && ((pass == null) || (counts.upper < passRequirements.upper))) { policy += '' + passRequirements.upper + ' upper case<br />'; } if (passRequirements.upper && ((pass == null) || (counts.upper < passRequirements.upper))) { policy += format("{0} upper case", passRequirements.upper) + '<br />'; }
if (passRequirements.lower && ((pass == null) || (counts.lower < passRequirements.lower))) { policy += '' + passRequirements.lower + ' lower case<br />'; } if (passRequirements.lower && ((pass == null) || (counts.lower < passRequirements.lower))) { policy += format("{0} lower case", passRequirements.lower) + '<br />'; }
if (passRequirements.numeric && ((pass == null) || (counts.numeric < passRequirements.numeric))) { policy += '' + passRequirements.numeric + ' numeric<br />'; } if (passRequirements.numeric && ((pass == null) || (counts.numeric < passRequirements.numeric))) { policy += format("{0} numeric", passRequirements.numeric) + '<br />'; }
if (passRequirements.nonalpha && ((pass == null) || (counts.nonalpha < passRequirements.nonalpha))) { policy += passRequirements.nonalpha + ' non-alphanumeric<br />'; } if (passRequirements.nonalpha && ((pass == null) || (counts.nonalpha < passRequirements.nonalpha))) { policy += format("{0} non-alphanumeric", passRequirements.nonalpha) + '<br />'; }
policy += '</div>'; policy += '</div>';
return policy; return policy;
} }
@ -657,9 +657,9 @@
if (webPageFullScreen == false) { if (webPageFullScreen == false) {
// By adding body class, it will change a style of all ellements using CSS selector // By adding body class, it will change a style of all ellements using CSS selector
// No need for JS anymore and it will be consistent style for all the templates. // No need for JS anymore and it will be consistent style for all the templates.
QC('body').remove("fullscreen"); QC('body').remove('fullscreen');
} else { } else {
QC('body').add("fullscreen"); QC('body').add('fullscreen');
} }
QV('body', true); QV('body', true);
center(); center();
@ -707,6 +707,7 @@
function validateEmail(v) { var emailReg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return emailReg.test(v); } // New version function validateEmail(v) { var emailReg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return emailReg.test(v); } // New version
function putstore(name, val) { try { if (typeof (localStorage) === 'undefined') return; localStorage.setItem(name, val); } catch (e) { } } function putstore(name, val) { try { if (typeof (localStorage) === 'undefined') return; localStorage.setItem(name, val); } catch (e) { } }
function getstore(name, val) { try { if (typeof (localStorage) === 'undefined') return val; var v = localStorage.getItem(name); if ((v == null) || (v == null)) return val; return v; } catch (e) { return val; } } function getstore(name, val) { try { if (typeof (localStorage) === 'undefined') return val; var v = localStorage.getItem(name); if ((v == null) || (v == null)) return val; return v; } catch (e) { return val; } }
function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };
</script> </script>
</body> </body>

View File

@ -55,7 +55,7 @@
var userMediaSupport = 0; var userMediaSupport = 0;
var notification = null; var notification = null;
getUserMediaSupport(function (x) { userMediaSupport = x; }) getUserMediaSupport(function (x) { userMediaSupport = x; })
var webrtcconfiguration = "{{{webrtconfig}}}"; var webrtcconfiguration = '{{{webrtconfig}}}';
if (webrtcconfiguration == '') { webrtcconfiguration = null; } else { try { webrtcconfiguration = JSON.parse(decodeURIComponent(webrtcconfiguration)); } catch (ex) { console.log('Invalid WebRTC config: \"' + webrtcconfiguration + '\".'); webrtcconfiguration = null; } } if (webrtcconfiguration == '') { webrtcconfiguration = null; } else { try { webrtcconfiguration = JSON.parse(decodeURIComponent(webrtcconfiguration)); } catch (ex) { console.log('Invalid WebRTC config: \"' + webrtcconfiguration + '\".'); webrtcconfiguration = null; } }
// File transfer state // File transfer state
@ -165,10 +165,10 @@
// If web notifications are granted, use it. // If web notifications are granted, use it.
if (Notification) { QV('notifyButton', Notification.permission != 'granted'); } if (Notification) { QV('notifyButton', Notification.permission != 'granted'); }
if (Notification && (Notification.permission == "granted")) { if (Notification && (Notification.permission == 'granted')) {
if (notification != null) { notification.close(); notification = null; } if (notification != null) { notification.close(); notification = null; }
if (args.title) { if (args.title) {
notification = new Notification("MeshMessenger - " + args.title, { body: msg }); notification = new Notification("MeshMessenger" + ' - ' + args.title, { body: msg });
} else { } else {
notification = new Notification("MeshMessenger", { body: msg }); notification = new Notification("MeshMessenger", { body: msg });
} }
@ -243,7 +243,7 @@
// Initiate the WebRTC offer or handle the offer from the peer. // Initiate the WebRTC offer or handle the offer from the peer.
if (startDataChannel == true) { if (startDataChannel == true) {
webchannel = webrtc.createDataChannel("DataChannel", {}); // { ordered: false, maxRetransmits: 2 } webchannel = webrtc.createDataChannel('DataChannel', {}); // { ordered: false, maxRetransmits: 2 }
webchannel.onmessage = function (event) { processMessage(event.data, 2); }; webchannel.onmessage = function (event) { processMessage(event.data, 2); };
webchannel.onopen = function () { webchannel.ok = true; updateControls(); sendws({ action: 'rtcSwitch', v: 0 }); }; webchannel.onopen = function () { webchannel.ok = true; updateControls(); sendws({ action: 'rtcSwitch', v: 0 }); };
webchannel.onclose = function (event) { if (webchannel && webchannel.ok) { disconnect(); } else { hangUpButtonClick(0); } } webchannel.onclose = function (event) { if (webchannel && webchannel.ok) { disconnect(); } else { hangUpButtonClick(0); } }
@ -276,7 +276,7 @@
// Disconnect everything // Disconnect everything
function disconnect() { function disconnect() {
if (state > 0) { displayControl('Connection closed.'); } if (state > 0) { displayControl("Connection closed."); }
if (state > 1) { setTimeout(start, 500); } if (state > 1) { setTimeout(start, 500); }
cancelAllFileTransfers(); cancelAllFileTransfers();
hangUpButtonClick(0, true); // Data channel hangUpButtonClick(0, true); // Data channel
@ -369,9 +369,9 @@
// File sharing button // File sharing button
function fileButtonClick() { function fileButtonClick() {
var chooser = Q('uploadFileInput'); var chooser = Q('uploadFileInput');
if (chooser.getAttribute("eventset") != 1) { if (chooser.getAttribute('eventset') != 1) {
chooser.setAttribute("eventset", "1"); chooser.setAttribute('eventset', '1');
chooser.addEventListener("change", fileSelect, false); chooser.addEventListener('change', fileSelect, false);
} }
chooser.value = null; chooser.value = null;
chooser.click(); chooser.click();
@ -382,7 +382,7 @@
if (state != 2) return; if (state != 2) return;
var x = Q('uploadFileInput'); var x = Q('uploadFileInput');
if (x.files.length > 10) { if (x.files.length > 10) {
displayControl('Limit of 10 file uploads at the same time.'); displayControl("Limit of 10 file uploads at the same time.");
} else { } else {
for (var i = 0; i < x.files.length; i++) { for (var i = 0; i < x.files.length; i++) {
if (x.files[i].size > 0) { if (x.files[i].size > 0) {
@ -400,7 +400,7 @@
haltEvent(e); haltEvent(e);
if ((state != 2) || (e.dataTransfer == null)) return; if ((state != 2) || (e.dataTransfer == null)) return;
if (e.dataTransfer.files.length > 10) { if (e.dataTransfer.files.length > 10) {
displayControl('Limit of 10 file uploads at the same time.'); displayControl("Limit of 10 file uploads at the same time.");
} else { } else {
for (var i = 0; i < e.dataTransfer.files.length; i++) { for (var i = 0; i < e.dataTransfer.files.length; i++) {
if (e.dataTransfer.files[i].size > 0) { if (e.dataTransfer.files[i].size > 0) {
@ -515,7 +515,7 @@
// Toggle notification // Toggle notification
function enableNotificationsButtonClick() { function enableNotificationsButtonClick() {
if (Notification) { Notification.requestPermission().then(function (permission) { QV('notifyButton', permission != "granted"); }); } if (Notification) { Notification.requestPermission().then(function (permission) { QV('notifyButton', permission != 'granted'); }); }
return false; return false;
} }
@ -559,13 +559,13 @@
} }
if (id == 1) { if (id == 1) {
localVideo.removeAttribute("src"); localVideo.removeAttribute('src');
localVideo.removeAttribute("srcObject"); localVideo.removeAttribute('srcObject');
if (localStream != null) { localStream = null; } if (localStream != null) { localStream = null; }
displayLocalVideo(false); displayLocalVideo(false);
} else if (id == 2) { } else if (id == 2) {
remoteVideo.removeAttribute("src"); remoteVideo.removeAttribute('src');
remoteVideo.removeAttribute("srcObject"); remoteVideo.removeAttribute('srcObject');
displayRemoteVideo(false); displayRemoteVideo(false);
} }
@ -605,10 +605,10 @@
// Get started // Get started
updateControls(); updateControls();
if ((typeof args.id == 'string') && (args.id.length > 0)) { if ((typeof args.id == 'string') && (args.id.length > 0)) {
var url = window.location.protocol.replace("http", "ws") + "//" + window.location.host + window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/')) + '/meshrelay.ashx?id=' + args.id; var url = window.location.protocol.replace('http', 'ws') + '//' + window.location.host + window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/')) + '/meshrelay.ashx?id=' + args.id;
if ((args.auth != null) && (args.auth != '')) { url += '&auth=' + args.auth; } if ((args.auth != null) && (args.auth != '')) { url += '&auth=' + args.auth; }
socket = new WebSocket(url); socket = new WebSocket(url);
socket.onopen = function () { state = 1; displayControl('Waiting for other user...'); } socket.onopen = function () { state = 1; displayControl("Waiting for other user..."); }
socket.onerror = function (e) { /*console.error(e);*/ } socket.onerror = function (e) { /*console.error(e);*/ }
socket.onclose = function () { disconnect(); } socket.onclose = function () { disconnect(); }
socket.onmessage = function (msg) { socket.onmessage = function (msg) {
@ -616,7 +616,7 @@
hangUpButtonClick(0, true); hangUpButtonClick(0, true);
hangUpButtonClick(1, true); hangUpButtonClick(1, true);
hangUpButtonClick(2, true); hangUpButtonClick(2, true);
displayControl('Connected.'); displayControl("Connected.");
state = 2; state = 2;
updateControls(); updateControls();
sendws({ action: 'random', random: random }); // Send a random number. Higher number starts the WebRTC session. sendws({ action: 'random', random: random }); // Send a random number. Higher number starts the WebRTC session.
@ -625,7 +625,7 @@
if (state == 2) { processMessage(msg.data, 1); } if (state == 2) { processMessage(msg.data, 1); }
} }
} else { } else {
displayControl('Error: No connection key specified.'); displayControl("Error: No connection key specified.");
} }
} }