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==AQABCN=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=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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==AQABCN=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=USCY8GVgsoTYk3K6bJBY59d+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==AQABMIIFiDCCBHCgAwIBAgIRAMFAkI8vylir+13tTaPNiCMwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTkwMjA1MDAwMDAwWhcNMjIwMjA0MjM1OTU5WjCB0jELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTk3MTI0MQ8wDQYDVQQIDAZPcmVnb24xEjAQBgNVBAcMCUhpbGxzYm9ybzEsMCoGA1UECQwjMTM3MCBORSBPcmVuY28gU3RhdGlvbiBQa3d5IFVuaXQgMjQxDjAMBgNVBBIMBTk3MTI0MRwwGgYDVQQKDBNZbGlhbiBTYWludC1IaWxhaXJlMRQwEgYDVQQLDAtPcGVuIFNvdXJjZTEcMBoGA1UEAwwTWWxpYW4gU2FpbnQtSGlsYWlyZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMuBo/nUm1cn3lAoL5r8bftWi38BmqBJuTeR7lx3PbJ8SSJqPxMieuL60B9JbCg9JVpSMHUKQ+vf+UY8jKB37KSjUI9TFrvcSc2que5e01m/y9BmZ/k2xGog+99llSotKICfIkpc8zdb51GVG0zf8kKWy2/ocmGJ7Qg4c1tzjRrpdDhP9Jfw7QlBIEQFt7y1VeM+CZE5DlCen6R+ef82MNjrZQFkaTfpBAK3aY2yc2p7+NdLybfnY30tq4RweWrIlpLHDJLm/K5awVLSj0Fo40mecixN1cfvtQr04gCB9x8l0IrG1EdmW5y4mdd98D5KxBxa8QuoT4yFng2c/4WVpZkCAwEAAaOCAawwggGoMB8GA1UdIwQYMBaAFA7hOqhTOjHVir7Bu61nGgOFrTQOMB0GA1UdDgQWBBQAKclWaab3fMGe08CkV+m0jGQiNzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzARBglghkgBhvhCAQEEBAMCBBAwQAYDVR0gBDkwNzA1BgwrBgEEAbIxAQIBAwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBQ29kZVNpZ25pbmdDQS5jcmwwcwYIKwYBBQUHAQEEZzBlMD4GCCsGAQUFBzAChjJodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNydDAjBggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wJAYDVR0RBB0wG4EZeXNhaW50aGlsYWlyZUBob3RtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAGmd9J2Rp/PtNv9D2Pd38bn2Omkf8TI+Devz20d+00Pq1+0BJbh98V9jR3SgVbFdZqawnPwP53QNuFgofoRELZitu8OLqmxJRX6H4b6nsxmLR0XHBnNv1rh0mwgIOi6qGO8TvJEUrnr0Yj8zQpTAwnBRWMjmybqxgNNovui67Yq+0ppaXpGlOfMzVYmkv+cONVg3GeNLU7WEIMT2hrwpKRhmz3XVR3Mn3og8tUqrlqe0leBTLhg84t0ltP5xzP+Wyv+grOZGyGup2h9mWYa5AyrqVnRYsbnhhhi8UwaGTNu+v1WdpGt3eoYQGRPFNJtWIpCdN82D5hygSlaTjUEW6OA==MIIF9TCCA92gAwIBAgIQHaJIMG+bJhjQguCWfTPTajANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgxMTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAiBgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIYijTKFehifSfCWL2MIHi3cfJ8Uz+MmtiVmKUCGVEZ0MWLFEO2yhyemmcuVMMBW9aR1xqkOUGKlUZEQauBLYq798PgYrKf/7i4zIPoMGYmobHutAMNhodxpZW0fbieW15dRhqb0J+V8aouVHltg1X7XFpKcAC9o95ftanK+ODtj3o+/bkxBXRIgCFnoOc2P0tbPBrRXBbZOoT5Xax+YvMRi1hsLjcdmG0qfnYHEckC14l/vC0X/o84Xpi1VsLewvFRqnbyNVlPG8Lp5UEks9wO5/i9lNfIi6iwHr0bZ+UYc3Ix8cSjz/qfGFN1VkW6KEQ3fBiSVfQ+noXw62oY1YdMCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBQO4TqoUzox1Yq+wbutZxoDha00DjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAwYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEATWNQ7Uc0SmGk295qKoyb8QAAHh1iezrXMsL2s+Bjs/thAIiaG20QBwRPvrjqiXgi6w9G7PNGXkBGiRL0C3danCpBOvzW9Ovn9xWVM8Ohgyi33i/klPeFM4MtSkBIv5rCT0qxjyT0s4E307dksKYjalloUkJf/wTr4XRleQj1qZPea3FAmZa6ePG5yOLDCBaxq2NayBWAbXReSnV+pbjDbLXP30p5h1zHQE1jNfYw08+1Cg4LBH+gS667o6XQhACTPlNdNKUANWlsvp8gJRANGftQkGG+OY96jk32nw4e/gdREmaDJhlIlc5KycF/8zoFm/lv34h/wCOe0h5DekUxwZxNqfBZslkZ6GqNKQQCd3xLS81wvjqyVVp4Pry7bwMQJXcVNIr5NsxDkuS6T/FikyglVyn7URnHoSVAaoRXxrKdsbwcCtp8Z359LukoTBh+xHsxQXGaSynsCz1XUNLK3f2eBVHlRHjdAd6xdZgNVCT98E7j4viDvXK6yz067vBeF5Jobchh+abxKgoLpbn0nu6YMgWFnuv5gynTxix9vTp3Los3QqBqgu07SqqUEKThDfgXxbZaeTMYkuO1dfih6Y4KJR7kHvGfWocj/5+kUZ77OYARzdu1xKeogG/lU9Tg46LC0lsa+jImLWpXcBw8pFguo/NbSwfcMlnzh6cabVg=MIIIDwYJKoZIhvcNAQcCoIIIADCCB/wCAQExCzAJBgUrDgMCGgUAMIIBEwYJKoZI +hvcNAQcBoIIBBASCAQCFwjxkepZ7kry4OYqw9RXF1mSQ8hoViY8FGdQSKHPsnrzt +ifsAef9BVY7FlF27nbpt2xSv9GSy/VVOL0d70ruoYHXXcQOFOeA/e5nXA5Az2gdk +ejfA5s/k79i5NC2kf2Le57XCabLN71ecJOJpVhKS04AP0tvxxIoGr6og2Gp5QG+c +xNugCdAo75XKAW5YZmmt8Uo1kWIqNtS8zsLsegr+w5yCqVCDR+wJhPJWaAKVONa6 ++2qAfL+LI0W8eQcFP6rIfOBHmBqikbLZ2/nAqJ4FiIkMTzgSfmMzFSXdwbjyjVU0 +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==AQABCN=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=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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} "; x += ""; x += ""; - x += ""; + if (features & 0x00010000) { x += ""; } x += '
-
 
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
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

\ No newline at end of file + MeshCentral
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

\ 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
{{{title}}}
{{{title2}}}
\ No newline at end of file + MeshCentral
{{{title}}}
{{{title2}}}
\ 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 = "
"; x += ""; x += ""; - x += ""; + if (features & 0x00010000) { x += ""; } x += '
Password:
Password:
Hint:
Hint:
'; x += ''; x += ''; diff --git a/views/default.handlebars b/views/default.handlebars index 03078350..09ed08c6 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -5593,9 +5593,13 @@ x += "
Old password:
New password:
New password:
Password hint:
Password hint:
' - 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
{{{title}}}
{{{title2}}}

Welcome


\ No newline at end of file + MeshCentral - Login
{{{title}}}
{{{title2}}}

Welcome


\ 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
{{{title}}}
{{{title2}}}
\ No newline at end of file + MeshCentral - Login
{{{title}}}
{{{title2}}}
\ 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) {