From 6c851c9a6d14c4df847abaae49230aad8c9789e2 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Thu, 28 Feb 2019 16:17:22 -0800 Subject: [PATCH] Updated clickonce, password hint is configurable. --- meshuser.js | 22 ++- package.json | 2 +- .../MeshMiniRouter.application | 21 --- .../MeshMiniRouter.exe.manifest | 82 ------------ .../MeshMiniRouter.application | 65 +++++++++ .../MeshMiniRouter.exe.config.deploy | 0 .../MeshMiniRouter.exe.deploy | Bin 186880 -> 193344 bytes .../MeshMiniRouter.exe.manifest | 126 ++++++++++++++++++ .../MeshMiniRouter.ico.deploy | Bin .../minirouter/MeshMiniRouter.application | 54 +++++++- public/clickonce/minirouter/publish.htm | 2 +- views/default-min.handlebars | 2 +- views/default-mobile-min.handlebars | 2 +- views/default-mobile.handlebars | 2 +- views/default.handlebars | 39 ++++-- views/login-min.handlebars | 2 +- views/login-mobile-min.handlebars | 2 +- views/login-mobile.handlebars | 38 ++++-- views/login.handlebars | 20 ++- webserver.js | 49 ++++--- 20 files changed, 353 insertions(+), 177 deletions(-) delete mode 100644 public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.application delete mode 100644 public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_22/MeshMiniRouter.exe.manifest create mode 100644 public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.application rename public/clickonce/minirouter/Application Files/{MeshMiniRouter_2_0_0_22 => MeshMiniRouter_2_0_0_25}/MeshMiniRouter.exe.config.deploy (100%) rename public/clickonce/minirouter/Application Files/{MeshMiniRouter_2_0_0_22 => MeshMiniRouter_2_0_0_25}/MeshMiniRouter.exe.deploy (84%) create mode 100644 public/clickonce/minirouter/Application Files/MeshMiniRouter_2_0_0_25/MeshMiniRouter.exe.manifest rename public/clickonce/minirouter/Application Files/{MeshMiniRouter_2_0_0_22 => MeshMiniRouter_2_0_0_25}/MeshMiniRouter.ico.deploy (100%) 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=USbRwLwns6JZuKPsNdKr/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==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 +hvcNAQcBoIIBBASCAQBKbiXcH3fr5SMeDPvc82iS4AuhqDfxmTYOCbcjBfpz2XXc +2gpP2OFO4vq5GLGfuwYv21MuFqzhC9GUhFxqwQ/2wwVjgsB19vT2L5J2NBpD2hPq ++Ct8v6w+j8/jk21MV0mjyiPjelkrMipsv8FJw1Yqm400BSM3eOrZPtx3wTu1PIWG +fO0LNLbVr/3Ia0xmqyIjZnRJHkygTsFS5DIkcwoq4Lun8qZxwqqNy1EIdlu9lUOy +4RxETR8t1y3UrQr+jQbZCzTUJQFJPw7uIknQZW57OWwaqQ/g4nmudXUdXPVe1mI6 +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 866545d4adea05df1d84b09a4c199252ce389797..690117590aa40ad6455819e2e14fc1daf603fd0e 100644 GIT binary patch delta 16256 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 delta 9334 zcmbVS34B!5)j#)b^JX&hGH>>o1ekzjhh5vZRn*p`a6YApQ}`>7u;^!uOt1`1k#zy7{a{`Z`7&pr2? zbI-l+z6US7pV#t4-kRGxE7t_4Q||W;b*4Pgi|BQQ$nOd-{b=n&Jyg(Ze_w2AA1QQ+ zl&kb}b8S)BpH`*f>mMpq==9!S?$nBIzUi-Fd>VSMJ1az)c*A*0bQ6c2qoQ-Sfv~{8 zvG}8qPA^-w%77zDQLP|g+{U-nk8u>Ur81a z_S^pQaYZ7UwW8iR5s3r6(PzJ{nX*&mQ^`(1^H0$|(AgG)X4~#qizHN8$r*1ENpwT z^A4}bwl$X*z*pzByn?nTdiWJFux(GTE{YiLZ0+08QTy1S_Jiuvr!GgeNs4>>^gZ1> zr*EYk(NpSt0erdNAh@jb?-N;rnSEtsbe~8{<9lJ6tKPB3sqTLsx^L{?2e@70ZzcK$ zJS!@lR|gEr+=}#iiEL7uDv7k%Db;6`Yq7ktc}l#QC5qZy#f{c{0XLT3JY2R~b3e3} z7CEK*&GLLwEUn>lq`tX7#H7ssg6RRQ+Qg_e{4WGr!%3iW%D4>qntvzJ7@yMcB}850 zd1d734rdB_c?fnW;yT4+Bc}wM(g(f^F^WUlQyad*FruT=@*t^l9vd7r*s(hnI`x&E zdrOy_*h58WVtGR+%t%Ln1YK})f!vNe79w$tbDRe+=-6upd-XN!M&^G5Y#zwtn_T4R zWekxt7j_ImOm!X_(!rWm3qznqRza*>5l(!U2E`@*?53q2qHiQ1U)38Vw(?T@7OR<|gJsnWRAy znZC1LX=1Jx8LG`KGgevW=&`^e$cyN_I3y%u&Rau@G6v5|i zzq3+}v2&vP-V6==gfry2VoYsjk79W-Ka1E))9o>9FDyaQjXY26lor-)y}Z-+Cw<^g zVAAwV^^+&oI{*XD<3r;awrtkMPAO#~7WUYl@{X{On}VCz>6uDAoVL?GnYGfV|5qAM zXRAAjLTB`_&apUe7P&&IrZ&yitW#!I^HAoRSg%w5td6LSJUg%adz~B~ciyOqi=oc@RTTjqN(1la zDrg$&6c7J_$2BI;igWkh8n}!72R)3D2g2E#5aZdYaL^8xn`C=aQ^Q_Tk}@LO8#c-= zanH^q+_P=F{6f-QOQ@)j9V*vj&?!Tlu2hC&YbDd<26q#~9u|y9nhE#N8|Dleku3X{ znSJ}*%%(rYLA7eV(=s9@W;^$c=u-I4gT>u)r)ver`7r105tn9?Jcru&QXb81EKi^k z9IStQ)dqP;bP8;3@NxMVch)CPX#sD!mm*r!A&7%es&4P3MH1XjXWWiQfI-2O3t4&wytx+TX z4Xw)2ear%xo`!s<*O-z*el~>hG?Pc2+7RUE=x9XRcAg$xl$d>bX5)0WbDbwf4=@YQ zGS$~L6$|TRmYZgS4O4tz7`9O!#AD)fc&|3_SqP0YQ`|A8OP85kC#NL{+w|C{pJp*C z3v-yxZ^l%J`HnvJyiPIqp&fCb*17UP6wQ1TDKTg4*v`?2`$UhqPx6xEn3}pftH%}( zz5)kHmnB38(H0^TT_!DPtiSQ<`B;5AUO_Y!1=?lGBpP`U5uf8-#!RUmiFPvhVa|!M z-HK2~e4ikcA=TjzmPTIT5HDZja2KqsF3ya{5yd})mU%{n4f?ypWkxuhPhGJ32EAhJ zwG68FF#bT|+Y)~!@p*|ciETz#SQsg>w`ZT}qZNS#QHv&r=KForE4U!)qt+zj4SvSM z$pslSc8ZxwFJlEd3|bni2^drrtqJ((g9w|b%AfDI=r)_N#a9!sXlSS)W|21*#*`0f zEU65=2n*}vH2pELj}Blm^yag*yY%%DgT@9}^HXcTV$h7#Sjrg4Ua_!fb-W;kDdXI& zM_Ub`I{=!dogH(zD8CIIw752X7Uo;h+Kx~szi5hh_YsP zua7cQbXE<9Y62nJqIUOo6GlE);UhMy-YHdY(0IVtF&?l`<%w^`C?9RZ^db5+vHWql zqSIvW42|V!i{)2XZ2xyiwLwpd`jkOa1B}ll*tz_Smzz(Jc61Zt4=lzpaz)>;UyQ~m zm6&Ly=*yHX9u_z-Vdy!TUOVs0=?=GKFV9`?&4_oUqD4Yq=x#%uWaoo1a_}gGj zfH&o14A`{%Uyxb@clrmP;TA|PA2(p`yH0W;P%XIDdBN3Dh1}*rx;{KO!dw|l1#x^0 zjzmRY91FO1QszD+^jYdhHKbzjf8w;M12+Xmhs0*$ruh5(%YmOste~qvm(jJrA#@{f zrKJC!Yy{mb>9O90phx>zClKVZOQn2}|Hq(RoBxpd2iRtYzSftZW4}KO{Hga=;DH27 zW(IEu)(Vz1g;?@+{8rr{E6(zZLMwsE6w{N%YG9i-9M}4OAqTWO&8j53>pJQ>?Ybf- zCPg}zDU;1*(%-xk$FVxN5!gGh75H>=JMbI|^Ht!jeP@pA=?j8;CpY5Cyw_o|e-YuA zr3!E+jm&YMiZ^v1EtcF%v_g-fww}oKjZPR8pi;awxLyRojh9@O(ixbsXsTr0fk9f6 z>*RqpO)uwx>*-Kxxnk3r9QQ)%Z9Po?mE-RA{z;Ee@O)SER&Y_eSaMm~7TTf2=zht) zL|*j7=mp7fN;2>3aoW<82WIIG@w%R%D|)$R4n~jbDY{p3@Dz@w=yAy{qnp7M(yMqJ z^SH_2I?~N}hd_ih-y0;nUE;dS+?b$2MP%Ua$(nmHLlFgYT#wkN8NCbrImdpMH%{wH zi*bEr)sK8%>)q(QVJ@d)ic;#E<2HjUqo3!v_ee9&r(hLpx;gAgVQm-YHnMjyI9$3?ZyMn5W^z}|}0~Fvz^x$ROm!-qtE+#+T{+as~xN&qJUbC6&WzRCk)Aci4E^S|J)X+6EUGDe6 zxfx>$UCft8sBYJrj7w>Oox*w5HoO3v;*O=rG6EREZ&pazMjm004+*{G5;=T5L2S7aQq65VMo zihkSX*>=7~XU_Qh-6`>yL@(ZpusAD1Z1iyO-!*+0gO%JU*Y&gA`X`-H$Yr+4$ezgO z$tKEa+-UwCTp8oZ()c)hI&&P1LWg~9je7;nfeS71V=*8*$;ubeRPPl-mql3I@&3%1h^OwkERpOjdn7~wSa z1{zeEK@+4!7+?U$$GcIr(lZ$Zc1>1LjZz)!5870sRI6O!9ZL1ea;<_+Vmpqd<#LNI zk`K{&_}(yyj=|1!S}v`vmAFabHi^3>?vS`sVphp~iW_aU@-7blYUP)qIkXlIT?=}( zH5b^T1!+@GQfJ--$+byA+mwT$DD8lJ2_z?dOED$8zLqwsD}k)DmL3R3(K{o07wuLy zi;c8RN_I=!BggKhcQfK%Hfly;ln3ua$Il>Hk!Yh$)Tll~?TV8^VwF5(rCymEV!Q-y zEuvI#51oYmt0dIr(KmpXsc%94=lnguo8ayus@48LLdnM710AqF1U{II0yhG)%11H0 znpG>GB-qn$kb@%C8~+$nzNtm2R4p<84(w!pNqgv1vx0i7yiC2tgp?4K>LRZps?_() zfT&gnsA17td_zLisKr)VREpJsuE0K4xu{e3hAM!^fs5p|LWr0-TzF9pV=|&%4H_4V zc`&_%ykeeGgAQKrDq#nv!t{jL3{fQuXOX%~xmheydnFbF8-1;!ogPS4;C(^&-Uga0 zsa-jUYecnrweKU0jd?!?&I(mP@=of1;9S!8B_xx46{1w#s|h7jEk>mbrCM|{-$Rrq zwSY2Dc_$TCs?|0OD^;C@0KLiV0E~G%17}Lp$6;;}aY=G-3FKG%&Q~_6$9(;i6L94M zU>h=;h3iY`1TBpZhvfRi#mWwKZ=yo%R5_#78KiC^2G591Rd%ZZ-z?yB+6+;nG)3kp zep#h{+AQWuorREePc2qzl-nb%z!AyikWYxMR)m<4T(9uH*n(+xBL^pGxt|yJh`K|m zR)#2yd(}sjc4Z(cX`jq@wUXJZ{!*HFQK=PI#rG+P)Mlt2QXh&%>5#e<&%j#2c!K7| ze}@THqF0D3V*jno6E8)+fYCQ%6#~=51Sb27ib{e*q#lvAQY077W>k}sUMq_l1)jH* zj;WChR=P-B8}+O0>Z58%70Op8R$cjVFrn_CwrD5yqan5WHR8Cnn_I z33{kCOW`_LrydeF#5Su(5alE4F&S%(Hp%xSXj9#-3c>4rOk5UwL9Nw(h6SkA-ijQ^ zs5M&9cnio$J|b?y=~ky*nf#-=N3Q)mWm)PoWW@-7C3E9N&1Pc>txB^4@4>}XpjazK zFS~nODbs2+zP8kg&;5P1TIobP9Z6JBJ8{v~imkB=Aipa%PFpVXk=X>L$=W8dGk!U6 zQ+%9ODz>Yx6N|NWdJG$kS9B?QgT@L>aJ5(ioF#T>JGA>!k88EsSLP8dLUy2Ct5*LU z3*rTX9g0vY5Z9~Ks{%O4wLD{uRwoYYn-QvFjDr(gXQdf(sLbp^dGwUggTnMYumGQ5 zdQcbo0EpLVPY>!N@j@~{kB~Gzz=6h96F5!c9EyX!j;cJ>(&n$JiPm_2O}EfW;7Z_o zIc%aso_6IPNZOTp?rvA^hY7FBBCpC4uX;cAHA|(WR7y%AAy2iGR7**OOOXIT7<7t4nBO2(>DQE z<=+eZM!6q2of!M4SkhBt+$tqumFX`-jJlMZkT}d_Ntw!{I!eh_g(XvzdxxXxA(_V# zEP67?cwLB9E8{zW)xJl8kBMIZk9wJ&Z8MUTKj(eaIXUyK%rULMUa4y>d>=tp3id2U zgWp}arQsfR=6A7P$O_+*Ex?WB+cNi4%-Lh7=-qLNI#+Ls&VOZq5;#|pKeoC*CSC~> zmE6f+bBMNp-nh=C7lNL!#idV#+t$pk)7!qj@<&G7t=A6~Z3k~SnAi63qAH~=wD`)1 zvvbV^=h)guomFejYg>KS0VSedK$K@rI@*$2H+D-l+3_J~_&d(rySthJBQ1oTEpmQx zcPvvB%J$YtgqkhQBSP~`kl9K*JD7DqxvHb|v?5H?Wvbm~9Low5uHF>4snydI%Fb|^ zVz;UDr*&cZ?QFfBy+L?xGWhnyET)D<4ZQ1+NXs#RF%DzrO8HxBRqnGRPv6iSC$ zmUClgPqKkl;o+W8s|?X@^*Rr4Om+|8S{rJ$rFv`BLyE9lllaE0nwF)=z7Dc4t2_U_ zu^>~Vrm4{K=%JRsg<4K@&=tES%l=w+YcaZf(1qMG(<(P`jIEy!mpbT{C#|9}%>Zdw zTMI+_*{zjckBSr^U?H6xEUkrF2kThutPaky&>9{E;d(RR3z_FqK-8GHkPD)<2>o~i$23mUxJs#C!btFOh zhoZAOV4;vSJ&;DoJ3Cwg_gU5FG4aDP$c2Dtr=N5fpJMVKv%nL!6w8c;S`NW|T($ZC z+z(l>I13)`brx?f@Jb!Y-M4w0A-D!~XUsjUX6qcGIcj^z-RWpOf*CPqHvI6so{ zI*0G++lS3qh!Kfu*%WGd%WgU1MZ`Q;heCWUZ`;r<8^kS#x88PmtJrmT ztFpMF{PaKBQLxkbp!pF0_~t|WlbeZ?Mo!vr6{yIny+FdJur`#a&d*fpU qKZv;PLj!hsjwqwPBi%6VZKd+ts%^dZ&lKKw6#4Iird|N{bMb#eDU}fb 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=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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==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) {