diff --git a/meshuser.js b/meshuser.js
index 2a07260f..6142b997 100644
--- a/meshuser.js
+++ b/meshuser.js
@@ -789,7 +789,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
// Check if this is an existing user
var newuser = { type: 'user', _id: newuserid, name: newusername, creation: Math.floor(Date.now() / 1000), domain: domain.id };
if (command.email != null) { newuser.email = command.email; } // Email
+ if (command.resetNextLogin === true) { newuser.passchange = -1; } else { newuser.passchange = Math.floor(Date.now() / 1000); }
obj.parent.users[newuserid] = newuser;
+
// Create a user, generate a salt and hash the password
require('./pass').hash(command.pass, function (err, salt, hash) {
if (err) throw err;
@@ -830,7 +832,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
// Change our own password
if (obj.common.validateString(command.oldpass, 1, 256) == false) break;
if (obj.common.validateString(command.newpass, 1, 256) == false) break;
- if (obj.common.validateString(command.hint, 0, 256) == false) break;
+ if ((command.hint != null) && (obj.common.validateString(command.hint, 0, 256) == false)) break;
if (obj.common.checkPasswordRequirements(command.newpass, domain.passwordrequirements) == false) break; // Password does not meet requirements
// Start by checking the old password
@@ -843,11 +845,13 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
displayNotificationMessage('Error, password not changed.');
} else {
// Change the password
- var hint = command.hint;
- if (hint.length > 250) hint = hint.substring(0, 250);
+ if ((domain.passwordrequirements != null) && (domain.passwordrequirements.hint === true) && (command.hint != null)) {
+ var hint = command.hint;
+ if (hint.length > 250) { hint = hint.substring(0, 250); }
+ user.passhint = hint;
+ }
user.salt = salt;
user.hash = hash;
- user.passhint = hint;
user.passchange = Math.floor(Date.now() / 1000);
delete user.passtype;
obj.db.SetUser(user);
@@ -870,7 +874,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
if (user.siteadmin != 0xFFFFFFFF) break;
if (obj.common.validateString(command.user, 1, 256) == false) break;
if (obj.common.validateString(command.pass, 1, 256) == false) break;
- if (obj.common.validateString(command.hint, 0, 256) == false) break;
+ if ((command.hint != null) && (obj.common.validateString(command.hint, 0, 256) == false)) break;
if (typeof command.removeMultiFactor != 'boolean') break;
if (obj.common.checkPasswordRequirements(command.pass, domain.passwordrequirements) == false) break; // Password does not meet requirements
@@ -881,8 +885,12 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
if (!err) {
chguser.salt = salt;
chguser.hash = hash;
- chguser.passhint = command.hint;
- if (command.resetNextLogin == true) { chguser.passchange = -1; } else { chguser.passchange = Math.floor(Date.now() / 1000); }
+ if ((domain.passwordrequirements != null) && (domain.passwordrequirements.hint === true) && (command.hint != null)) {
+ var hint = command.hint;
+ if (hint.length > 250) { hint = hint.substring(0, 250); }
+ chguser.passhint = hint;
+ }
+ if (command.resetNextLogin === true) { chguser.passchange = -1; } else { chguser.passchange = Math.floor(Date.now() / 1000); }
delete chguser.passtype; // Remove the password type if one was present.
if (command.removeMultiFactor == true) {
if (chguser.otpsecret) { delete chguser.otpsecret; }
diff --git a/package.json b/package.json
index d963df45..dc78090d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "meshcentral",
- "version": "0.2.9-h",
+ "version": "0.2.9-i",
"keywords": [
"Remote Management",
"Intel AMT",
diff --git a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.application b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.application
deleted file mode 100644
index de8e7b14..00000000
--- a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.application
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- WOFMexmFiT1cRB5ZPY6zmeQ7x/Cbx//7QyPjwnjKGnA=
-
-
-
-
\ No newline at end of file
diff --git a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.manifest b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.manifest
deleted file mode 100644
index 0b27acb2..00000000
--- a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.manifest
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- e/EE2UyAOSDkWCqJcDJPIiu7cOLRXJszqGGnayICf5I=
-
-
-
-
-
-
-
-
-
- UylUFD4/o0KBti+5/eodTDgq4BkUJD0J0aUXNd3yHbY=
-
-
-
-
-
-
-
-
- mkjbDQuo7YXa8wZxdKEu/ECXrORwwtpRgNj8NBKbzHo=
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.application b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.application
new file mode 100644
index 00000000..c7cb7de1
--- /dev/null
+++ b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.application
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CKdIZTY+zacc9zaEUGL/QVNR9UVhMgCupCL19vNPmxA=
+
+
+
+JJ26OWrp+sgoU/eac0hoqHXp+i9Tv9y6BZLcg1X4XPw= Vqo7kyRpoyTdshuBZp8jO6ItlZD9DUrHX15E5ccQKufS7YYxZ68tdJXKsg88/Gq4urge5pupz0UfEOf8lSqY3ER/1fLgfptImkL1azTCReOH061+Fc69U03j4YJxMrBEScq7gxlUFijU3C8zplw1uMWcGIC22q+ZTXD5jLSLorT9lUs6EKaub5h9gufm9/h6IEbXlEcoGxqhrD6vVrHDoJ7OHZ9XqETvZEXAMXzYWjbPYh5mljPWNxw8JUenTqgEUU+KxnKFJk1VwA1JANzOmHslqKmizYdpqbyTAoGYTLQy0BDhj4nkWtHpATlGA9Fn5+XbHUoILbTqj4KigTDfrA== y4Gj+dSbVyfeUCgvmvxt+1aLfwGaoEm5N5HuXHc9snxJImo/EyJ64vrQH0lsKD0lWlIwdQpD69/5RjyMoHfspKNQj1MWu9xJzaq57l7TWb/L0GZn+TbEaiD732WVKi0ogJ8iSlzzN1vnUZUbTN/yQpbLb+hyYYntCDhzW3ONGul0OE/0l/DtCUEgRAW3vLVV4z4JkTkOUJ6fpH55/zYw2OtlAWRpN+kEArdpjbJzanv410vJt+djfS2rhHB5asiWkscMkub8rlrBUtKPQWjjSZ5yLE3Vx++1CvTiAIH3HyXQisbUR2ZbnLiZ133wPkrEHFrxC6hPjIWeDZz/hZWlmQ== AQAB CN=Ylian Saint-Hilaire, OU=Open Source, O=Ylian Saint-Hilaire, POBox=97124, STREET=1370 NE Orenco Station Pkwy Unit 24, L=Hillsboro, S=Oregon, PostalCode=97124, C=US bRwLwns6JZuKPsNdKr/ifDW+tp6bjQkgB+U7XtB7My0= Sm4l3B936+UjHgz73PNokuALoag38Zk2Dgm3IwX6c9l13NoKT9jhTuL6uRixn7sGL9tTLhas4QvRlIRcasEP9sMFY4LAdfb09i+SdjQaQ9oT6vgrfL+sPo/P45NtTFdJo8oj43pZKzIqbL/BScNWKpuNNAUjN3jq2T7cd8E7tTyFhnztCzS21a/9yGtMZqsiI2Z0SR5MoE7BUuQyJHMKKuC7p/KmccKqjctRCHZbvZVDsuEcRE0fLdct1K0K/o0G2Qs01CUBST8O7iJJ0GVuezlsGqkP4OJ5rnV1HVz1XtZiOlum7kZeCpUf/dhlVSZ1IxOvMU3BKJJ3YNtfx2mkNA== y4Gj+dSbVyfeUCgvmvxt+1aLfwGaoEm5N5HuXHc9snxJImo/EyJ64vrQH0lsKD0lWlIwdQpD69/5RjyMoHfspKNQj1MWu9xJzaq57l7TWb/L0GZn+TbEaiD732WVKi0ogJ8iSlzzN1vnUZUbTN/yQpbLb+hyYYntCDhzW3ONGul0OE/0l/DtCUEgRAW3vLVV4z4JkTkOUJ6fpH55/zYw2OtlAWRpN+kEArdpjbJzanv410vJt+djfS2rhHB5asiWkscMkub8rlrBUtKPQWjjSZ5yLE3Vx++1CvTiAIH3HyXQisbUR2ZbnLiZ133wPkrEHFrxC6hPjIWeDZz/hZWlmQ== AQAB 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
+W6buRl4KlR/92GVVJnUjE68xTcEokndg21/HaaQ0oIIEnTCCBJkwggOBoAMCAQIC
+DxaI8DklXmOOaRQ5B+YzCzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMV
+VGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0
+cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTE1MTIz
+MTAwMDAwMFoXDTE5MDcwOTE4NDAzNlowgYQxCzAJBgNVBAYTAkdCMRswGQYDVQQI
+ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoT
+EUNPTU9ETyBDQSBMaW1pdGVkMSowKAYDVQQDEyFDT01PRE8gU0hBLTEgVGltZSBT
+dGFtcGluZyBTaWduZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDp
+6T3f1zcIyR44slJTQm0i8bHEBgRrnv2CdFBDfcagux9O+QJxJrHvQ9iDjEj85w+X
+eprrnN6mow47HEQYdY54pRdp/kkYpOK7XE7+jipUelDw1fbMkeeZedfeeZTXljP+
+DoO+Ir9jFiyj3Sgbrz2r6pfS8b8EEOc9SEX9H2hlwX9ZmWnAIjEMYm6nXGUBIbBj
+xCIYJ+7m/NIAPUcuqLiGVl0E3BMXJW4c30QPFc2326VXdkJvAGiCmdLjwd7wi5RX
+TOwIkCIhziIrmAxC5kKTlJiT7/0G2T+8W5tUPCCx7mrWR3rFq4DpMJre8aQ/VU0K
+CTSKdSnSaa2XD1C/+MoJAgMBAAGjgfQwgfEwHwYDVR0jBBgwFoAU2u1kdBScFDyr
+3ZmpvVsoTYs8ydgwHQYDVR0OBBYEFI5rLTNr9DOnk7MTmqXgCvcSNWqIMA4GA1Ud
+DwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI
+MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4t
+VVNFUkZpcnN0LU9iamVjdC5jcmwwNQYIKwYBBQUHAQEEKTAnMCUGCCsGAQUFBzAB
+hhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQC6
+MyRAQIx821ifs2CYsvXAMf7rH25Q9grg5OaBrSaHot/9s9r0c/MA+ykbiRsVPttr
+UpMrxKw5gdc8Z1eaOTbgKAia4zlPm4kJf3vFYX9ZiTIlCmquGj7woieotsO4h/cW
+BEhBPVzY7J9NIDEE2WWh7c1pB1MWPd02AgqI60DlBjALuBZL3O+8VQn/xj4SLnaz
+3M5C7/l2V+G3CgVAmFiaXXEWk3GMZYHqb/OJ9/tzrbTnv9mOb6oLTyXzuOHV3XWY
+aIH4qsDRgMLExDmJwfbJnmzXdPnZl/hPwpoKzV6P+Bnp4KWfxPCSIeYteSXJIvnD
+8DqEV606FvRjlBAdXdDGMYICMDCCAiwCAQEwgakwgZUxCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
+ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1
+c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdAIPFojwOSVeY45p
+FDkH5jMLMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwG
+CSqGSIb3DQEJBTEPFw0xOTAyMjgyMzQyMDVaMCMGCSqGSIb3DQEJBDEWBBTqcfSI
+ZIH2cGBZ5NbKLS8CFQuGkTANBgkqhkiG9w0BAQEFAASCAQAqA8H6wU7X8d+LDUk/
+//8sPvj/VT2AeBOCOWtKtwK4i7iH0BtSuhm5FTSTvad9sSYVEAC/eHvPCiZz58l0
+S7Ql4Z/msh9WTlmtR+XFWeSfgvg6zZTY3yJTpv15ee70DyLmOOxbMxGIJyZxrlzH
+Ayp4uuzYfUYy4KaEPX/KxnbCJmoNEPdYYgsBCbpvuHi5z25T4F1H204Ou9ylYvjA
+xBui3zrud2jm5wshgWfc3rG00RbtvEgQxFKpvXIykny8wL9w7ncMwEbRzcPydess
+nmwwCbhRkScEHrtynw04ufMC5PVaF0aNtS7a9SKdkfRbddsxcAXZNxtRAYBbuVE8
+TsPW
+
\ No newline at end of file
diff --git a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.config.deploy b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.config.deploy
similarity index 100%
rename from public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.config.deploy
rename to public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.config.deploy
diff --git a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.deploy b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.deploy
similarity index 84%
rename from public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.deploy
rename to public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.deploy
index 866545d4..69011759 100644
Binary files a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.deploy and b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.deploy differ
diff --git a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.manifest b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.manifest
new file mode 100644
index 00000000..43dfd130
--- /dev/null
+++ b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.manifest
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ znGsSXBIfZbzmb1bWcIxU3m5B9HSsTBQn8eRWF6c4O0=
+
+
+
+
+
+
+
+
+
+ UylUFD4/o0KBti+5/eodTDgq4BkUJD0J0aUXNd3yHbY=
+
+
+
+
+
+
+
+
+ mkjbDQuo7YXa8wZxdKEu/ECXrORwwtpRgNj8NBKbzHo=
+
+
+
+
+
+
+
+
+
+wesQvZCP4PR6hYljVN0LtZ3FDpHxGfBNo40AActQsW0= mDMMZby09uFPmDv9KjRXINo2glda8GdtXVQUTeBGGEw25yM3n+BfED9WDDTDDhRZpXa1JrRRKqr+dQAlqfy85Wn5E4UcmExUuQjXDg7SrKrx56biHCXiX7IDbh/VLHE+8P/xQAji2Dd6Z1kiSZd4YtUS7RJLozcM6CeVjchFFojGHk+1RcajQpxzJYUnh8ZdNRS+N/YHQI7WYQ6jQ3MzE078bc4Me4Te3VpzHgKt8WyhxaQHh7MCY7AAHTN5SILtKZ3JO/127AO6ae+RZSmYUVbwcEUKgfh3wTs5Ox2YzIIeyi6eAhkO9no0aOgrQWu2ho1IdbhMqqEFYhq+WGDwiw== y4Gj+dSbVyfeUCgvmvxt+1aLfwGaoEm5N5HuXHc9snxJImo/EyJ64vrQH0lsKD0lWlIwdQpD69/5RjyMoHfspKNQj1MWu9xJzaq57l7TWb/L0GZn+TbEaiD732WVKi0ogJ8iSlzzN1vnUZUbTN/yQpbLb+hyYYntCDhzW3ONGul0OE/0l/DtCUEgRAW3vLVV4z4JkTkOUJ6fpH55/zYw2OtlAWRpN+kEArdpjbJzanv410vJt+djfS2rhHB5asiWkscMkub8rlrBUtKPQWjjSZ5yLE3Vx++1CvTiAIH3HyXQisbUR2ZbnLiZ133wPkrEHFrxC6hPjIWeDZz/hZWlmQ== AQAB CN=Ylian Saint-Hilaire, OU=Open Source, O=Ylian Saint-Hilaire, POBox=97124, STREET=1370 NE Orenco Station Pkwy Unit 24, L=Hillsboro, S=Oregon, PostalCode=97124, C=US CY8GVgsoTYk3K6bJBY59d+OxGAOW9oCRUQGfC82lsdI= hcI8ZHqWe5K8uDmKsPUVxdZkkPIaFYmPBRnUEihz7J687Yn7AHn/QVWOxZRdu526bdsUr/Rksv1VTi9He9K7qGB113EDhTngP3uZ1wOQM9oHZHo3wObP5O/YuTQtpH9i3ue1wmmyze9XnCTiaVYSktOAD9Lb8cSKBq+qINhqeUBvnMTboAnQKO+VygFuWGZprfFKNZFiKjbUvM7C7HoK/sOcgqlQg0fsCYTyVmgClTjWuvtqgHy/iyNFvHkHBT+qyHzgR5gaopGy2dv5wKieBYiJDE84En5jMxUl3cG48o1VNMF/s1t6zyMmV/X2+bnjazFlxZSFA0xzOck4FsCm4g== y4Gj+dSbVyfeUCgvmvxt+1aLfwGaoEm5N5HuXHc9snxJImo/EyJ64vrQH0lsKD0lWlIwdQpD69/5RjyMoHfspKNQj1MWu9xJzaq57l7TWb/L0GZn+TbEaiD732WVKi0ogJ8iSlzzN1vnUZUbTN/yQpbLb+hyYYntCDhzW3ONGul0OE/0l/DtCUEgRAW3vLVV4z4JkTkOUJ6fpH55/zYw2OtlAWRpN+kEArdpjbJzanv410vJt+djfS2rhHB5asiWkscMkub8rlrBUtKPQWjjSZ5yLE3Vx++1CvTiAIH3HyXQisbUR2ZbnLiZ133wPkrEHFrxC6hPjIWeDZz/hZWlmQ== AQAB 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
+wX+zW3rPIyZX9fb5ueNrMWXFlIUDTHM5yTgWwKbioIIEnTCCBJkwggOBoAMCAQIC
+DxaI8DklXmOOaRQ5B+YzCzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMV
+VGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0
+cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTE1MTIz
+MTAwMDAwMFoXDTE5MDcwOTE4NDAzNlowgYQxCzAJBgNVBAYTAkdCMRswGQYDVQQI
+ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoT
+EUNPTU9ETyBDQSBMaW1pdGVkMSowKAYDVQQDEyFDT01PRE8gU0hBLTEgVGltZSBT
+dGFtcGluZyBTaWduZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDp
+6T3f1zcIyR44slJTQm0i8bHEBgRrnv2CdFBDfcagux9O+QJxJrHvQ9iDjEj85w+X
+eprrnN6mow47HEQYdY54pRdp/kkYpOK7XE7+jipUelDw1fbMkeeZedfeeZTXljP+
+DoO+Ir9jFiyj3Sgbrz2r6pfS8b8EEOc9SEX9H2hlwX9ZmWnAIjEMYm6nXGUBIbBj
+xCIYJ+7m/NIAPUcuqLiGVl0E3BMXJW4c30QPFc2326VXdkJvAGiCmdLjwd7wi5RX
+TOwIkCIhziIrmAxC5kKTlJiT7/0G2T+8W5tUPCCx7mrWR3rFq4DpMJre8aQ/VU0K
+CTSKdSnSaa2XD1C/+MoJAgMBAAGjgfQwgfEwHwYDVR0jBBgwFoAU2u1kdBScFDyr
+3ZmpvVsoTYs8ydgwHQYDVR0OBBYEFI5rLTNr9DOnk7MTmqXgCvcSNWqIMA4GA1Ud
+DwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI
+MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4t
+VVNFUkZpcnN0LU9iamVjdC5jcmwwNQYIKwYBBQUHAQEEKTAnMCUGCCsGAQUFBzAB
+hhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQC6
+MyRAQIx821ifs2CYsvXAMf7rH25Q9grg5OaBrSaHot/9s9r0c/MA+ykbiRsVPttr
+UpMrxKw5gdc8Z1eaOTbgKAia4zlPm4kJf3vFYX9ZiTIlCmquGj7woieotsO4h/cW
+BEhBPVzY7J9NIDEE2WWh7c1pB1MWPd02AgqI60DlBjALuBZL3O+8VQn/xj4SLnaz
+3M5C7/l2V+G3CgVAmFiaXXEWk3GMZYHqb/OJ9/tzrbTnv9mOb6oLTyXzuOHV3XWY
+aIH4qsDRgMLExDmJwfbJnmzXdPnZl/hPwpoKzV6P+Bnp4KWfxPCSIeYteSXJIvnD
+8DqEV606FvRjlBAdXdDGMYICMDCCAiwCAQEwgakwgZUxCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
+ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1
+c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdAIPFojwOSVeY45p
+FDkH5jMLMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwG
+CSqGSIb3DQEJBTEPFw0xOTAyMjgyMzQyMDJaMCMGCSqGSIb3DQEJBDEWBBRMJ+/D
+pucWQI26RB3CEZo9giVyTjANBgkqhkiG9w0BAQEFAASCAQB4JZpMFrUsxSvp4jKN
+0HI8c68qKvv37Ed7eF87X74Nto1vI/cT4Qi2ZJj8bzToSBqKbj3UQOhPlmxRWHUg
+oArn+tPJLnzwjgor/wA4YAMXCNGZ59n7hOzMfH7aseX6oRXaBXzzEsiggDDjmyf/
+9AFp6NqBeNpTr+V5ENGYqyjppiIGGfGTgkroX7Goxfi5KBUAS/jo7TYCv9Nr+y2d
+Cd7Zeeo6INNXawHzcTm2YMQRJymj5zFM22y/jko3xKBcyA0KKATthYBhFUsZIAiA
+yKVgVtXmZzJcyq3anKKIXqYNz2p3ZICzDiM5gzKdPGbVTo2hgew1UtEOGdz5tLmS
+n2jI
+
\ No newline at end of file
diff --git a/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.ico.deploy b/public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.ico.deploy
similarity index 100%
rename from public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.ico.deploy
rename to public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.ico.deploy
diff --git a/public/clickonce/minirouter/MeshMiniRouter.application b/public/clickonce/minirouter/MeshMiniRouter.application
index de8e7b14..c7cb7de1 100644
--- a/public/clickonce/minirouter/MeshMiniRouter.application
+++ b/public/clickonce/minirouter/MeshMiniRouter.application
@@ -1,21 +1,65 @@
-
+
-
-
+
+
- WOFMexmFiT1cRB5ZPY6zmeQ7x/Cbx//7QyPjwnjKGnA=
+ CKdIZTY+zacc9zaEUGL/QVNR9UVhMgCupCL19vNPmxA=
-
\ No newline at end of file
+JJ26OWrp+sgoU/eac0hoqHXp+i9Tv9y6BZLcg1X4XPw= Vqo7kyRpoyTdshuBZp8jO6ItlZD9DUrHX15E5ccQKufS7YYxZ68tdJXKsg88/Gq4urge5pupz0UfEOf8lSqY3ER/1fLgfptImkL1azTCReOH061+Fc69U03j4YJxMrBEScq7gxlUFijU3C8zplw1uMWcGIC22q+ZTXD5jLSLorT9lUs6EKaub5h9gufm9/h6IEbXlEcoGxqhrD6vVrHDoJ7OHZ9XqETvZEXAMXzYWjbPYh5mljPWNxw8JUenTqgEUU+KxnKFJk1VwA1JANzOmHslqKmizYdpqbyTAoGYTLQy0BDhj4nkWtHpATlGA9Fn5+XbHUoILbTqj4KigTDfrA== y4Gj+dSbVyfeUCgvmvxt+1aLfwGaoEm5N5HuXHc9snxJImo/EyJ64vrQH0lsKD0lWlIwdQpD69/5RjyMoHfspKNQj1MWu9xJzaq57l7TWb/L0GZn+TbEaiD732WVKi0ogJ8iSlzzN1vnUZUbTN/yQpbLb+hyYYntCDhzW3ONGul0OE/0l/DtCUEgRAW3vLVV4z4JkTkOUJ6fpH55/zYw2OtlAWRpN+kEArdpjbJzanv410vJt+djfS2rhHB5asiWkscMkub8rlrBUtKPQWjjSZ5yLE3Vx++1CvTiAIH3HyXQisbUR2ZbnLiZ133wPkrEHFrxC6hPjIWeDZz/hZWlmQ== AQAB CN=Ylian Saint-Hilaire, OU=Open Source, O=Ylian Saint-Hilaire, POBox=97124, STREET=1370 NE Orenco Station Pkwy Unit 24, L=Hillsboro, S=Oregon, PostalCode=97124, C=US bRwLwns6JZuKPsNdKr/ifDW+tp6bjQkgB+U7XtB7My0= Sm4l3B936+UjHgz73PNokuALoag38Zk2Dgm3IwX6c9l13NoKT9jhTuL6uRixn7sGL9tTLhas4QvRlIRcasEP9sMFY4LAdfb09i+SdjQaQ9oT6vgrfL+sPo/P45NtTFdJo8oj43pZKzIqbL/BScNWKpuNNAUjN3jq2T7cd8E7tTyFhnztCzS21a/9yGtMZqsiI2Z0SR5MoE7BUuQyJHMKKuC7p/KmccKqjctRCHZbvZVDsuEcRE0fLdct1K0K/o0G2Qs01CUBST8O7iJJ0GVuezlsGqkP4OJ5rnV1HVz1XtZiOlum7kZeCpUf/dhlVSZ1IxOvMU3BKJJ3YNtfx2mkNA== y4Gj+dSbVyfeUCgvmvxt+1aLfwGaoEm5N5HuXHc9snxJImo/EyJ64vrQH0lsKD0lWlIwdQpD69/5RjyMoHfspKNQj1MWu9xJzaq57l7TWb/L0GZn+TbEaiD732WVKi0ogJ8iSlzzN1vnUZUbTN/yQpbLb+hyYYntCDhzW3ONGul0OE/0l/DtCUEgRAW3vLVV4z4JkTkOUJ6fpH55/zYw2OtlAWRpN+kEArdpjbJzanv410vJt+djfS2rhHB5asiWkscMkub8rlrBUtKPQWjjSZ5yLE3Vx++1CvTiAIH3HyXQisbUR2ZbnLiZ133wPkrEHFrxC6hPjIWeDZz/hZWlmQ== AQAB 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
+W6buRl4KlR/92GVVJnUjE68xTcEokndg21/HaaQ0oIIEnTCCBJkwggOBoAMCAQIC
+DxaI8DklXmOOaRQ5B+YzCzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCVVMx
+CzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMV
+VGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0
+cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTE1MTIz
+MTAwMDAwMFoXDTE5MDcwOTE4NDAzNlowgYQxCzAJBgNVBAYTAkdCMRswGQYDVQQI
+ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoT
+EUNPTU9ETyBDQSBMaW1pdGVkMSowKAYDVQQDEyFDT01PRE8gU0hBLTEgVGltZSBT
+dGFtcGluZyBTaWduZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDp
+6T3f1zcIyR44slJTQm0i8bHEBgRrnv2CdFBDfcagux9O+QJxJrHvQ9iDjEj85w+X
+eprrnN6mow47HEQYdY54pRdp/kkYpOK7XE7+jipUelDw1fbMkeeZedfeeZTXljP+
+DoO+Ir9jFiyj3Sgbrz2r6pfS8b8EEOc9SEX9H2hlwX9ZmWnAIjEMYm6nXGUBIbBj
+xCIYJ+7m/NIAPUcuqLiGVl0E3BMXJW4c30QPFc2326VXdkJvAGiCmdLjwd7wi5RX
+TOwIkCIhziIrmAxC5kKTlJiT7/0G2T+8W5tUPCCx7mrWR3rFq4DpMJre8aQ/VU0K
+CTSKdSnSaa2XD1C/+MoJAgMBAAGjgfQwgfEwHwYDVR0jBBgwFoAU2u1kdBScFDyr
+3ZmpvVsoTYs8ydgwHQYDVR0OBBYEFI5rLTNr9DOnk7MTmqXgCvcSNWqIMA4GA1Ud
+DwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI
+MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4t
+VVNFUkZpcnN0LU9iamVjdC5jcmwwNQYIKwYBBQUHAQEEKTAnMCUGCCsGAQUFBzAB
+hhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQC6
+MyRAQIx821ifs2CYsvXAMf7rH25Q9grg5OaBrSaHot/9s9r0c/MA+ykbiRsVPttr
+UpMrxKw5gdc8Z1eaOTbgKAia4zlPm4kJf3vFYX9ZiTIlCmquGj7woieotsO4h/cW
+BEhBPVzY7J9NIDEE2WWh7c1pB1MWPd02AgqI60DlBjALuBZL3O+8VQn/xj4SLnaz
+3M5C7/l2V+G3CgVAmFiaXXEWk3GMZYHqb/OJ9/tzrbTnv9mOb6oLTyXzuOHV3XWY
+aIH4qsDRgMLExDmJwfbJnmzXdPnZl/hPwpoKzV6P+Bnp4KWfxPCSIeYteSXJIvnD
+8DqEV606FvRjlBAdXdDGMYICMDCCAiwCAQEwgakwgZUxCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo
+ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1
+c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdAIPFojwOSVeY45p
+FDkH5jMLMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwG
+CSqGSIb3DQEJBTEPFw0xOTAyMjgyMzQyMDVaMCMGCSqGSIb3DQEJBDEWBBTqcfSI
+ZIH2cGBZ5NbKLS8CFQuGkTANBgkqhkiG9w0BAQEFAASCAQAqA8H6wU7X8d+LDUk/
+//8sPvj/VT2AeBOCOWtKtwK4i7iH0BtSuhm5FTSTvad9sSYVEAC/eHvPCiZz58l0
+S7Ql4Z/msh9WTlmtR+XFWeSfgvg6zZTY3yJTpv15ee70DyLmOOxbMxGIJyZxrlzH
+Ayp4uuzYfUYy4KaEPX/KxnbCJmoNEPdYYgsBCbpvuHi5z25T4F1H204Ou9ylYvjA
+xBui3zrud2jm5wshgWfc3rG00RbtvEgQxFKpvXIykny8wL9w7ncMwEbRzcPydess
+nmwwCbhRkScEHrtynw04ufMC5PVaF0aNtS7a9SKdkfRbddsxcAXZNxtRAYBbuVE8
+TsPW
+
\ No newline at end of file
diff --git a/public/clickonce/minirouter/publish.htm b/public/clickonce/minirouter/publish.htm
index 56a6d54b..9f4480e1 100644
--- a/public/clickonce/minirouter/publish.htm
+++ b/public/clickonce/minirouter/publish.htm
@@ -59,7 +59,7 @@ FONT.key {font-weight: bold; color: darkgreen}
- Name: MeshCentral Mini-Router Version: 2.0.0.22 Publisher: Meshcentral.com
+ Name: MeshCentral Mini-Router Version: 2.0.0.25 Publisher: Meshcentral.com
diff --git a/views/default-min.handlebars b/views/default-min.handlebars
index 3987bfa3..2106c02d 100644
--- a/views/default-min.handlebars
+++ b/views/default-min.handlebars
@@ -1 +1 @@
- MeshCentral
↔
My Devices My Account My Events My Files My Users My Server
General Desktop Terminal Files Events Intel® AMT Console
Server disconnected , click to reconnect .
My Account Device Groups (
New )
My Files These files are shared publicly, click "link" to get public url.
✓
✗
My Server Server actions
Server Statistics
Intel® AMT Redirection port or KVM feature is disabled, click here to enable it.
Remote computer is not powered on, click here to issue a power command.
Intel® AMT Redirection port or KVM feature is disabled, click here to enable it.
Remote computer is not powered on, click here to issue a power command.
Show
Last 60 Last 120 Last 250 Last 500 Last 1000
General -
Events -
Show
Last 60 Last 120 Last 250 Last 500 Last 1000
Local file upload Server file selection File Selection
Agent Remote Desktop 100% 87.5% 75% 62.5% 50% 37.5% 25% 12.5% Scaling
Fast Medium Slow Very slow Frame rate
Intel® AMT Hardware KVM RLE8, Fastest RLE16, Recommended RAW8, Slow RAW16, Very Slow Image Encoding
\ No newline at end of file
+ MeshCentral
↔
My Devices My Account My Events My Files My Users My Server
General Desktop Terminal Files Events Intel® AMT Console
Server disconnected , click to reconnect .
My Account Device Groups (
New )
My Files These files are shared publicly, click "link" to get public url.
✓
✗
My Server Server actions
Server Statistics
Intel® AMT Redirection port or KVM feature is disabled, click here to enable it.
Remote computer is not powered on, click here to issue a power command.
Intel® AMT Redirection port or KVM feature is disabled, click here to enable it.
Remote computer is not powered on, click here to issue a power command.
Show
Last 60 Last 120 Last 250 Last 500 Last 1000
General -
Events -
Show
Last 60 Last 120 Last 250 Last 500 Last 1000
Local file upload Server file selection File Selection
Agent Remote Desktop 100% 87.5% 75% 62.5% 50% 37.5% 25% 12.5% Scaling
Fast Medium Slow Very slow Frame rate
Intel® AMT Hardware KVM RLE8, Fastest RLE16, Recommended RAW8, Slow RAW16, Very Slow Image Encoding
\ No newline at end of file
diff --git a/views/default-mobile-min.handlebars b/views/default-mobile-min.handlebars
index 1ffcfed7..ef1fc4f6 100644
--- a/views/default-mobile-min.handlebars
+++ b/views/default-mobile-min.handlebars
@@ -1 +1 @@
- MeshCentral
Server disconnected , click to reconnect .
◀
Account Security
Account Actions
Device Groups (
New )
◀
My Files
◀
\ No newline at end of file
+ MeshCentral
Server disconnected , click to reconnect .
◀
Account Security
Account Actions
Device Groups (
New )
◀
My Files
◀
\ No newline at end of file
diff --git a/views/default-mobile.handlebars b/views/default-mobile.handlebars
index d05dffe9..62456666 100644
--- a/views/default-mobile.handlebars
+++ b/views/default-mobile.handlebars
@@ -1152,7 +1152,7 @@
var x = "
'
- if (passRequirements) { var r = []; for (var i in passRequirements) { r.push(i + ':' + passRequirements[i]); } x += 'Requirements: ' + r.join(', ') + '. '; }
+ if (passRequirements) {
+ var r = [], rc = 0;
+ for (var i in passRequirements) { if ((i != 'reset') && (i != 'hint')) { r.push(i + ':' + passRequirements[i]); rc++; } }
+ if (rc > 0) { x += 'Requirements: ' + r.join(', ') + '. '; }
+ }
x += ' ';
//x += '';
//x += '
';
@@ -5608,7 +5612,9 @@
function account_showChangePasswordEx() {
if (Q('apassword1').value == Q('apassword2').value) {
- meshserver.send({ action: 'changepassword', oldpass: Q('apassword0').value, newpass: Q('apassword1').value, hint: Q('apasswordhint').value });
+ var r = { action: 'changepassword', oldpass: Q('apassword0').value, newpass: Q('apassword1').value };
+ if (features & 0x00010000) { r.hint = Q('apasswordhint').value; }
+ meshserver.send(r);
}
}
@@ -6487,7 +6493,14 @@
x += addHtmlValue('Email', '
');
x += addHtmlValue('Password', '
');
x += addHtmlValue('Password', '
');
- if (passRequirements) { var r = []; for (var i in passRequirements) { r.push(i + ':' + passRequirements[i]); } x += '
Requirements: ' + r.join(', ') + '.
'; }
+ x += '
Force password reset on next login.
';
+
+ if (passRequirements) {
+ var r = [], rc = 0;
+ for (var i in passRequirements) { if ((i != 'reset') && (i != 'hint')) { r.push(i + ':' + passRequirements[i]); rc++; } }
+ if (rc > 0) { x += '
Requirements: ' + r.join(', ') + '.
'; }
+ }
+
setDialogMode(2, "Create Account", 3, showCreateNewAccountDialogEx, x);
showCreateNewAccountDialogValidate();
Q('p4name').focus();
@@ -6501,7 +6514,7 @@
}
function showCreateNewAccountDialogEx() {
- meshserver.send({ action: 'adduser', username: Q('p4name').value, email: Q('p4email').value, pass: Q('p4pass1').value });
+ meshserver.send({ action: 'adduser', username: Q('p4name').value, email: Q('p4email').value, pass: Q('p4pass1').value, resetNextLogin: Q('p4resetNextLogin').checked });
}
function showUserAdminDialog(e, userid) {
@@ -6689,8 +6702,14 @@
var x = '';
x += addHtmlValue('Password', '
');
x += addHtmlValue('Password', '
');
- x += addHtmlValue('Password hint', '
');
- if (passRequirements) { var r = []; for (var i in passRequirements) { r.push(i + ':' + passRequirements[i]); } x += '
Requirements: ' + r.join(', ') + '.
'; }
+ if (features & 0x00010000) { x += addHtmlValue('Password hint', '
'); }
+
+ if (passRequirements) {
+ var r = [], rc = 0;
+ for (var i in passRequirements) { if ((i != 'reset') && (i != 'hint')) { r.push(i + ':' + passRequirements[i]); rc++; } }
+ if (rc > 0) { x += '
Requirements: ' + r.join(', ') + '.
'; }
+ }
+
x += '
Force password reset on next login.
';
if (multiFactor == 1) { x += '
Remove all 2nd factor authentication.
'; }
setDialogMode(2, "Change Password for " + EscapeHtml(currentUser.name), 3, p30showUserChangePassDialogEx, x, multiFactor);
@@ -6701,7 +6720,11 @@
function p30showUserChangePassDialogEx(b, tag) {
var removeMultiFactor = false;
if ((tag == 1) && (Q('p4twoFactorRemove').checked == true)) { removeMultiFactor = true; }
- if (Q('p4pass1').value == Q('p4pass2').value) { meshserver.send({ action: 'changeuserpass', user: currentUser.name, pass: Q('p4pass1').value, hint: Q('p4hint').value, removeMultiFactor: removeMultiFactor, resetNextLogin: Q('p4resetNextLogin').checked }); }
+ if (Q('p4pass1').value == Q('p4pass2').value) {
+ var r = { action: 'changeuserpass', user: currentUser.name, pass: Q('p4pass1').value, removeMultiFactor: removeMultiFactor, resetNextLogin: Q('p4resetNextLogin').checked };
+ if (features & 0x00010000) { r.hint = Q('p4hint').value; }
+ meshserver.send(r);
+ }
}
function p30showDeleteUserDialog() {
diff --git a/views/login-min.handlebars b/views/login-min.handlebars
index 7de9e556..f2dee8d2 100644
--- a/views/login-min.handlebars
+++ b/views/login-min.handlebars
@@ -1 +1 @@
-
MeshCentral - Login
Welcome Connect to your home or office devices from anywhere in the world using
MeshCentral , the real time, open source remote monitoring and management web site. You will need to download and install a management agent on your computers. Once installed, computers will show up in the "My Devices" section of this web site and you will be able to monitor them and take control of them.
\ No newline at end of file
+
MeshCentral - Login
Welcome Connect to your home or office devices from anywhere in the world using
MeshCentral , the real time, open source remote monitoring and management web site. You will need to download and install a management agent on your computers. Once installed, computers will show up in the "My Devices" section of this web site and you will be able to monitor them and take control of them.
\ No newline at end of file
diff --git a/views/login-mobile-min.handlebars b/views/login-mobile-min.handlebars
index 7bd32300..687c7d69 100644
--- a/views/login-mobile-min.handlebars
+++ b/views/login-mobile-min.handlebars
@@ -1 +1 @@
-
MeshCentral - Login
\ No newline at end of file
+
MeshCentral - Login
\ No newline at end of file
diff --git a/views/login-mobile.handlebars b/views/login-mobile.handlebars
index f678b25e..54815892 100644
--- a/views/login-mobile.handlebars
+++ b/views/login-mobile.handlebars
@@ -100,7 +100,7 @@
Password:
-
+
Pass Hint:
@@ -151,7 +151,7 @@
Login token:
-
+
@@ -203,7 +203,7 @@
Password:
-
+
Password Hint:
@@ -258,8 +258,10 @@
var emailCheck = ('{{{emailcheck}}}' == 'true');
var features = parseInt('{{{features}}}');
var passRequirements = "{{{passRequirements}}}";
- if (passRequirements != "") { passRequirements = JSON.parse(decodeURIComponent(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 hardwareKeyChallenge = '{{{hkey}}}';
+ var currentpanel = 0;
function startup() {
if ((features & 32) == 0) {
@@ -269,13 +271,16 @@
if (top != self && (loc == null || top.active == false)) { top.location = self.location; return; }
}
+ QV('createPanelHint', passRequirements.hint === true);
+ QV('resetpasswordpanelHint', passRequirements.hint === true);
+
window.onresize = center;
center();
validateLogin();
validateCreate();
if ('{{loginmode}}' != '') { go(parseInt('{{loginmode}}')); } else { go(1); }
QV('newAccountDiv', ('{{{newAccount}}}' != '0') && ('{{{newAccount}}}' != 'false')); // If new accounts are not allowed, don't display the new account link.
- if ((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("resetAccountDiv", (emailCheck == true));
QV("hrAccountDiv", (emailCheck == true) || (newAccountPass == 1));
@@ -284,7 +289,7 @@
try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
if ((hardwareKeyChallenge != null) && u2fSupported()) {
window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
- if (authResponse.signatureData) {
+ if ((currentpanel == 4) && authResponse.signatureData) {
Q('hwtokenInput').value = JSON.stringify(authResponse);
QE('tokenOkButton', true);
Q('tokenOkButton').click();
@@ -297,7 +302,7 @@
try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
if ((hardwareKeyChallenge != null) && u2fSupported()) {
window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
- if (authResponse.signatureData) {
+ if ((currentpanel == 5) && authResponse.signatureData) {
Q('resetHwtokenInput').value = JSON.stringify(authResponse);
QE('resetTokenOkButton', true);
Q('resetTokenOkButton').click();
@@ -308,7 +313,7 @@
}
function showPassHint() {
- messagebox("Password Hint", passhint);
+ if (passRequirements.hint === true) { messagebox("Password Hint", passhint); }
}
function xgo(x) {
@@ -322,6 +327,7 @@
}
function go(x) {
+ currentpanel = x;
setDialogMode(0);
QV("showPassHintLink", false);
QV('loginpanel', x == 1);
@@ -354,7 +360,7 @@
QH('passWarning', '');
QV('passwordPolicyCallout', false);
} else {
- if (passRequirements == null || passRequirements == '') {
+ if (!passRequirementsEx) {
// No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('apassword1').value);
if (passStrength >= 80) { QH('passWarning', 'Strong Password '); }
@@ -402,7 +408,7 @@
QH('rpassWarning', '');
QV('rpasswordPolicyCallout', false);
} else {
- if (passRequirements == null || passRequirements == '') {
+ if (!passRequirementsEx) {
// No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('rapassword1').value);
if (passStrength >= 80) { QH('rpassWarning', 'Strong Password '); }
@@ -491,16 +497,20 @@
return counts;
}
+ var xcheckTokenTimer = null;
+ function checkTokenTimer(enter) {
+ if ((enter == 0) && (xcheckTokenTimer != null)) { clearInterval(xcheckTokenTimer); xcheckTokenTimer = null; }
+ if ((enter == 1) && (xcheckTokenTimer == null)) { xcheckTokenTimer = setInterval(checkToken, 200); }
+ }
+
function checkToken() {
- var t1 = Q('tokenInput').value;
- var t2 = t1.split(' ').join('');
+ var t1 = Q('tokenInput').value, t2 = t1.split(' ').join('');
if (t1 != t2) { Q('tokenInput').value = t2; }
QE('tokenOkButton', (Q('tokenInput').value.length == 6) || (Q('tokenInput').value.length == 8) || (Q('tokenInput').value.length == 44));
}
function resetCheckToken() {
- var t1 = Q('resetTokenInput').value;
- var t2 = t1.split(' ').join('');
+ var t1 = Q('resetTokenInput').value, t2 = t1.split(' ').join('');
if (t1 != t2) { Q('resetTokenInput').value = t2; }
QE('resetTokenOkButton', (Q('resetTokenInput').value.length == 6) || (Q('resetTokenInput').value.length == 8) || (Q('resetTokenInput').value.length == 44));
}
diff --git a/views/login.handlebars b/views/login.handlebars
index 866eedcf..46ec525f 100644
--- a/views/login.handlebars
+++ b/views/login.handlebars
@@ -173,7 +173,7 @@
Password:
-
+
Password Hint:
@@ -273,7 +273,7 @@
Password:
-
+
Password Hint:
@@ -333,12 +333,14 @@
var emailCheck = ('{{{emailcheck}}}' == 'true');
var passRequirements = "{{{passRequirements}}}";
var hardwareKeyChallenge = '{{{hkey}}}';
- if (passRequirements != "") { passRequirements = JSON.parse(decodeURIComponent(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 features = parseInt('{{{features}}}');
var webPageFullScreen = getstore('webPageFullScreen', true);
if (webPageFullScreen == 'false') { webPageFullScreen = false; }
if (webPageFullScreen == 'true') { webPageFullScreen = true; }
var welcomeText = decodeURIComponent("{{{welcometext}}}");
+ var currentpanel = 0;
toggleFullScreen();
function startup() {
@@ -349,6 +351,9 @@
if (top != self && (loc == null || top.active == false)) { top.location = self.location; return; }
}
+ QV('createPanelHint', passRequirements.hint === true);
+ QV('resetpasswordpanelHint', passRequirements.hint === true);
+
// Display the welcome text
if (welcomeText) { QH('welcomeText', welcomeText); }
QV('welcomeText', true);
@@ -369,7 +374,7 @@
try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
if ((hardwareKeyChallenge != null) && u2fSupported()) {
window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
- if (authResponse.signatureData) {
+ if ((currentpanel == 4) && authResponse.signatureData) {
Q('hwtokenInput').value = JSON.stringify(authResponse);
QE('tokenOkButton', true);
Q('tokenOkButton').click();
@@ -382,7 +387,7 @@
try { if (hardwareKeyChallenge.length > 0) { hardwareKeyChallenge = JSON.parse(hardwareKeyChallenge); } else { hardwareKeyChallenge = null; } } catch (ex) { hardwareKeyChallenge = null }
if ((hardwareKeyChallenge != null) && u2fSupported()) {
window.u2f.sign(hardwareKeyChallenge.appId, hardwareKeyChallenge.challenge, hardwareKeyChallenge.registeredKeys, function (authResponse) {
- if (authResponse.signatureData) {
+ if ((currentpanel == 5) && authResponse.signatureData) {
Q('resetHwtokenInput').value = JSON.stringify(authResponse);
QE('resetTokenOkButton', true);
Q('resetTokenOkButton').click();
@@ -407,6 +412,7 @@
}
function go(x) {
+ currentpanel = x;
setDialogMode(0);
QV("showPassHintLink", false);
QV('loginpanel', x == 1);
@@ -451,7 +457,7 @@
QH('passWarning', '');
QV('passwordPolicyCallout', false);
} else {
- if (passRequirements == null || passRequirements == '') {
+ if (!passRequirementsEx) {
// No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('apassword1').value);
if (passStrength >= 80) { QH('passWarning', 'Strong Password '); }
@@ -499,7 +505,7 @@
QH('rpassWarning', '');
QV('rpasswordPolicyCallout', false);
} else {
- if (passRequirements == null || passRequirements == '') {
+ if (!passRequirementsEx) {
// No password requirements, display password strength
var passStrength = checkPasswordStrength(Q('rapassword1').value);
if (passStrength >= 80) { QH('rpassWarning', 'Strong Password '); }
diff --git a/webserver.js b/webserver.js
index b398ab2b..e5e29076 100644
--- a/webserver.js
+++ b/webserver.js
@@ -578,9 +578,8 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
req.session.loginmode = '2';
req.session.error = 'Username already exists. ';
} else {
- var hint = req.body.apasswordhint;
- if (hint.length > 250) hint = hint.substring(0, 250);
- var user = { type: 'user', _id: 'user/' + domain.id + '/' + req.body.username.toLowerCase(), name: req.body.username, email: req.body.email, creation: Math.floor(Date.now() / 1000), login: Math.floor(Date.now() / 1000), domain: domain.id, passhint: hint };
+ var user = { type: 'user', _id: 'user/' + domain.id + '/' + req.body.username.toLowerCase(), name: req.body.username, email: req.body.email, creation: Math.floor(Date.now() / 1000), login: Math.floor(Date.now() / 1000), domain: domain.id };
+ if ((domain.passwordrequirements != null) && (domain.passwordrequirements.hint === true) && (req.body.apasswordhint)) { var hint = req.body.apasswordhint; if (hint.length > 250) { hint = hint.substring(0, 250); } user.passhint = hint; }
var usercount = 0;
for (var i in obj.users) { if (obj.users[i].domain == domain.id) { usercount++; } }
if (usercount == 0) { user.siteadmin = 0xFFFFFFFF; if (domain.newaccounts === 2) { domain.newaccounts = 0; } } // If this is the first user, give the account site admin.
@@ -655,7 +654,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
if (err) throw err;
user.salt = salt;
user.hash = hash;
- user.passhint = req.body.rpasswordhint;
+ if ((domain.passwordrequirements != null) && (domain.passwordrequirements.hint === true)) { var hint = req.body.rpasswordhint; if (hint.length > 250) { hint = hint.substring(0, 250); } user.passhint = hint; } else { delete user.passhint; }
user.passchange = Math.floor(Date.now() / 1000);
delete user.passtype;
obj.db.SetUser(user);
@@ -812,7 +811,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
userinfo.hash = hash;
delete userinfo.passtype;
userinfo.passchange = Math.floor(Date.now() / 1000);
- userinfo.passhint = null;
+ delete userinfo.passhint;
//delete userinfo.otpsecret; // Currently a email password reset will turn off 2-step login.
obj.db.SetUser(userinfo);
@@ -925,11 +924,9 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
// Update the password
require('./pass').hash(req.body.apassword1, function (err, salt, hash) {
if (err) throw err;
- var hint = req.body.apasswordhint;
- if (hint.length > 250) hint = hint.substring(0, 250);
user.salt = salt;
user.hash = hash;
- user.passhint = req.body.apasswordhint;
+ if ((domain.passwordrequirements != null) && (domain.passwordrequirements.hint === true) && (req.body.apasswordhint)) { var hint = req.body.apasswordhint; if (hint.length > 250) hint = hint.substring(0, 250); user.passhint = hint; } else { delete user.passhint; }
user.passchange = Math.floor(Date.now() / 1000);
delete user.passtype;
obj.db.SetUser(user);
@@ -1070,22 +1067,23 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
// Give the web page a list of supported server features
features = 0;
- if (obj.args.wanonly == true) { features += 0x0001; } // WAN-only mode
- if (obj.args.lanonly == true) { features += 0x0002; } // LAN-only mode
- if (obj.args.nousers == true) { features += 0x0004; } // Single user mode
- if (domain.userQuota == -1) { features += 0x0008; } // No server files mode
- if (obj.args.mpstlsoffload) { features += 0x0010; } // No mutual-auth CIRA
- if ((parent.config != null) && (parent.config.settings != null) && (parent.config.settings.allowframing == true)) { features += 0x0020; } // Allow site within iframe
- if ((obj.parent.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName != 'un-configured') && (obj.args.lanonly != true)) { features += 0x0040; } // Email invites
- if (obj.args.webrtc == true) { features += 0x0080; } // Enable WebRTC (Default false for now)
- if (obj.args.clickonce !== false) { features += 0x0100; } // Enable ClickOnce (Default true)
- if (obj.args.allowhighqualitydesktop == true) { features += 0x0200; } // Enable AllowHighQualityDesktop (Default false)
- if (obj.args.lanonly == true || obj.args.mpsport == 0) { features += 0x0400; } // No CIRA
- if ((obj.parent.serverSelfWriteAllowed == true) && (user != null) && (user.siteadmin == 0xFFFFFFFF)) { features += 0x0800; } // Server can self-write (Allows self-update)
- if ((domain.auth != 'sspi') && (obj.parent.certificates.CommonName != 'un-configured') && (obj.args.nousers !== true)) { features += 0x1000; } // 2-step login supported
- if (domain.agentnoproxy === true) { features += 0x2000; } // Indicates that agents should be installed without using a HTTP proxy
- if (domain.yubikey && domain.yubikey.id && domain.yubikey.secret) { features += 0x4000; } // Indicates Yubikey support
- if (domain.geolocation == true) { features += 0x8000; } // Enable geo-location features
+ if (obj.args.wanonly == true) { features += 0x00000001; } // WAN-only mode
+ if (obj.args.lanonly == true) { features += 0x00000002; } // LAN-only mode
+ if (obj.args.nousers == true) { features += 0x00000004; } // Single user mode
+ if (domain.userQuota == -1) { features += 0x00000008; } // No server files mode
+ if (obj.args.mpstlsoffload) { features += 0x00000010; } // No mutual-auth CIRA
+ if ((parent.config != null) && (parent.config.settings != null) && (parent.config.settings.allowframing == true)) { features += 0x00000020; } // Allow site within iframe
+ if ((obj.parent.mailserver != null) && (obj.parent.certificates.CommonName != null) && (obj.parent.certificates.CommonName != 'un-configured') && (obj.args.lanonly != true)) { features += 0x00000040; } // Email invites
+ if (obj.args.webrtc == true) { features += 0x00000080; } // Enable WebRTC (Default false for now)
+ if (obj.args.clickonce !== false) { features += 0x00000100; } // Enable ClickOnce (Default true)
+ if (obj.args.allowhighqualitydesktop == true) { features += 0x00000200; } // Enable AllowHighQualityDesktop (Default false)
+ if (obj.args.lanonly == true || obj.args.mpsport == 0) { features += 0x00000400; } // No CIRA
+ if ((obj.parent.serverSelfWriteAllowed == true) && (user != null) && (user.siteadmin == 0xFFFFFFFF)) { features += 0x00000800; } // Server can self-write (Allows self-update)
+ if ((domain.auth != 'sspi') && (obj.parent.certificates.CommonName != 'un-configured') && (obj.args.nousers !== true)) { features += 0x00001000; } // 2-step login supported
+ if (domain.agentnoproxy === true) { features += 0x00002000; } // Indicates that agents should be installed without using a HTTP proxy
+ if (domain.yubikey && domain.yubikey.id && domain.yubikey.secret) { features += 0x00004000; } // Indicates Yubikey support
+ if (domain.geolocation == true) { features += 0x00008000; } // Enable geo-location features
+ if ((domain.passwordrequirements != null) && (domain.passwordrequirements.hint === true)) { features += 0x00010000; } // Enable password hints
// Create a authentication cookie
const authCookie = obj.parent.encodeCookie({ userid: user._id, domainid: domain.id }, obj.parent.loginCookieEncryptionKey);
@@ -1151,7 +1149,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
if (req.session != null) {
err = req.session.error;
msg = req.session.success;
- passhint = req.session.passhint;
+ if ((domain.passwordrequirements != null) && (domain.passwordrequirements.hint === true)) { passhint = EscapeHtml(req.session.passhint); }
delete req.session.error;
delete req.session.success;
delete req.session.passhint;
@@ -1159,7 +1157,6 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
var message = '';
if (err != null) message = '' + err + '
';
if (msg != null) message = '' + msg + '
';
- if (passhint != null) passhint = EscapeHtml(passhint);
var emailcheck = ((obj.parent.mailserver != null) && (domain.auth != 'sspi'));
if (obj.args.minify && !req.query.nominify) {