From 236ab64addd824cfa29e0abd778517195a514956 Mon Sep 17 00:00:00 2001 From: Aysel Afsar Date: Tue, 2 Feb 2016 15:31:01 -0500 Subject: [PATCH] - added optional pwstrength and zxcvbn and disabled by default. - Reset ActiveEntry.errorMessages after active-entry buttons are clicked - "Password is invalid" message is replaced by "Password must have at least 8 characters. It must contain at least 1 uppercase, 1 lowercase, 1 number and 1 special character." --- .../components/entrySignIn/entrySignIn.js | 5 +++- .../components/entrySignUp/entrySignUp.js | 19 ++++++++------- .../components/entrySignUp/entrySignUp.less | 3 ++- Packages/active-entry/lib/ActiveEntry.js | 9 ++++++-- Packages/active-entry/lib/validatePassword.js | 23 +++++++++++-------- .../tests/gagarin/activeEntryTests.js | 5 +++- config/localhostOrthanc.json | 4 +++- config/medicalConnections.json | 4 +++- config/medkenOrthanc.json | 4 +++- config/siimDCM4CHEE.json | 4 +++- 10 files changed, 52 insertions(+), 28 deletions(-) diff --git a/Packages/active-entry/components/entrySignIn/entrySignIn.js b/Packages/active-entry/components/entrySignIn/entrySignIn.js index 30e0f9519..9f1b109c4 100755 --- a/Packages/active-entry/components/entrySignIn/entrySignIn.js +++ b/Packages/active-entry/components/entrySignIn/entrySignIn.js @@ -57,7 +57,7 @@ Template.entrySignIn.helpers({ getPasswordValidationStyling: function () { if (ActiveEntry.errorMessages.equals('password', "Password is required")) { return "border: 1px solid #a94442"; - } else if (ActiveEntry.errorMessages.equals('password', "Password is invalid")) { + } else if (ActiveEntry.errorMessages.equals('password', "Password must have at least 8 characters. It must contain at least 1 uppercase, 1 lowercase, 1 number and 1 special character.")) { return "border: 1px solid #f2dede"; } else if (ActiveEntry.errorMessages.equals('password', "Password present")) { return "border: 1px solid green"; @@ -77,10 +77,12 @@ Template.entrySignIn.events({ }, 'click #forgotPasswordButton': function (event) { event.preventDefault(); + ActiveEntry.reset(); Router.go('/forgotPassword'); }, "click #needAnAccountButton": function (event) { event.preventDefault(); + ActiveEntry.reset(); Router.go('/entrySignUp'); }, 'keyup input[name="email"]': function (event, template) { @@ -116,6 +118,7 @@ Template.entrySignIn.events({ // }, 'click #signInToAppButton': function (event, template){ console.log('click #signInToAppButton'); + ActiveEntry.reset(); // var emailValue = template.$('[name=email]').val(); // var passwordValue = template.$('[name=password]').val(); var emailValue = template.$('#signInPageEmailInput').val(); diff --git a/Packages/active-entry/components/entrySignUp/entrySignUp.js b/Packages/active-entry/components/entrySignUp/entrySignUp.js index b9ea40561..4614546b8 100755 --- a/Packages/active-entry/components/entrySignUp/entrySignUp.js +++ b/Packages/active-entry/components/entrySignUp/entrySignUp.js @@ -33,10 +33,7 @@ Template.entrySignUp.helpers({ entryErrorMessages: function () { var errorMessages = []; Object.keys(ActiveEntry.errorMessages.all()).forEach(function(key) { - if (key !== "signInError" && ActiveEntry.errorMessages.get(key) && - ActiveEntry.errorMessages.get(key) !== "null" && - ActiveEntry.errorMessages.get(key) !== undefined && - ActiveEntry.errorMessages.get(key) !== null) { + if (key !== "signInError" && ActiveEntry.errorMessages.get(key)) { errorMessages.push(ActiveEntry.errorMessages.get(key)); } }); @@ -64,7 +61,7 @@ Template.entrySignUp.helpers({ getPasswordStyling: function () { if (ActiveEntry.errorMessages.equals('password', "Password is required")) { return "border: 1px solid #a94442"; - } else if (ActiveEntry.errorMessages.equals('password', "Password is invalid")) { + } else if (ActiveEntry.errorMessages.equals('password', "Password must have at least 8 characters. It must contain at least 1 uppercase, 1 lowercase, 1 number and 1 special character.")) { return "border: 1px solid #f2dede"; } else if (ActiveEntry.successMessages.equals('password', "Password present")) { return "border: 1px solid green"; @@ -75,7 +72,7 @@ Template.entrySignUp.helpers({ getConfirmPasswordStyling: function () { if (ActiveEntry.errorMessages.equals('confirm', "Password is required")) { return "border: 1px solid #a94442"; - } else if (ActiveEntry.errorMessages.equals('confirm', "Password is invalid")) { + } else if (ActiveEntry.errorMessages.equals('confirm', "Passwords do not match")) { return "border: 1px solid #f2dede"; } else if (ActiveEntry.successMessages.equals('confirm', "Passwords match")) { return "border: 1px solid green"; @@ -98,6 +95,7 @@ Template.entrySignUp.helpers({ Template.entrySignUp.events({ "click #signUpPageSignInButton": function (event) { + ActiveEntry.reset(); event.preventDefault(); Router.go('/entrySignIn'); }, @@ -133,9 +131,7 @@ Template.entrySignUp.events({ 'click #signUpPageJoinNowButton': function (event, template) { event.preventDefault(); - ActiveEntry.errorMessages.set('signInError', null); - //ActiveEntry.verifyPassword(event, template); - + ActiveEntry.reset(); var newUser = { fullName: template.$('[name="fullName"]').val(), email: template.$('[name="email"]').val(), @@ -154,5 +150,8 @@ Template.entrySignUp.events({ Template.entrySignUp.onRendered(function() { // Password strength meter for password inputs - this.$(':password').pwstrength(pwstrengthOptions); + console.log(passwordValidationSettings) + if (passwordValidationSettings.usePwstrength) { + this.$('#signUpPagePasswordInput').pwstrength(passwordValidationSettings.pwstrengthOptions); + } }); diff --git a/Packages/active-entry/components/entrySignUp/entrySignUp.less b/Packages/active-entry/components/entrySignUp/entrySignUp.less index 6c35a257e..4295e1b46 100755 --- a/Packages/active-entry/components/entrySignUp/entrySignUp.less +++ b/Packages/active-entry/components/entrySignUp/entrySignUp.less @@ -6,6 +6,7 @@ } } -.progress { +#entrySignUp .progress{ height: 5px; + margin-bottom: 1px } diff --git a/Packages/active-entry/lib/ActiveEntry.js b/Packages/active-entry/lib/ActiveEntry.js index a77cf890f..a013dacd3 100755 --- a/Packages/active-entry/lib/ActiveEntry.js +++ b/Packages/active-entry/lib/ActiveEntry.js @@ -51,7 +51,7 @@ ActiveEntry.verifyPassword = function (password) { ActiveEntry.errorMessages.set('password', 'Password is required'); ActiveEntry.successMessages.set('password', null); } else if (!validatePassword(password)) { - ActiveEntry.errorMessages.set('password', 'Password is invalid'); + ActiveEntry.errorMessages.set('password', 'Password must have at least 8 characters. It must contain at least 1 uppercase, 1 lowercase, 1 number and 1 special character.'); ActiveEntry.successMessages.set('password', null); } else { //ActiveEntry.errorMessages.set('password', 'Password present'); @@ -65,6 +65,9 @@ ActiveEntry.verifyConfirmPassword = function (password, confirmPassword) { //ActiveEntry.errorMessages.set('confirm', 'Passwords match'); ActiveEntry.errorMessages.set('confirm', null); ActiveEntry.successMessages.set('confirm', 'Passwords match'); + } else{ + ActiveEntry.errorMessages.set('confirm', 'Passwords do not match'); + ActiveEntry.successMessages.set('confirm', null); } }; ActiveEntry.verifyEmail = function (email) { @@ -115,6 +118,7 @@ ActiveEntry.signUp = function (emailValue, passwordValue, confirmPassword, fullN ActiveEntry.verifyPassword(passwordValue); ActiveEntry.verifyConfirmPassword(passwordValue, confirmPassword); ActiveEntry.verifyFullName(fullName); + ActiveEntry.errorMessages.set('signInError', null); var errorIsFound = false; Object.keys(ActiveEntry.errorMessages.keys).forEach(function(key) { @@ -124,7 +128,6 @@ ActiveEntry.signUp = function (emailValue, passwordValue, confirmPassword, fullN }); if(errorIsFound) { - // TODO: Show error messages return; } @@ -159,10 +162,12 @@ ActiveEntry.signUp = function (emailValue, passwordValue, confirmPassword, fullN // }); }; ActiveEntry.signOut = function (){ + ActiveEntry.reset(); Meteor.logout(); }; ActiveEntry.reset = function (){ + ActiveEntry.errorMessages.set('signInError', false); ActiveEntry.errorMessages.set('fullName', false); ActiveEntry.errorMessages.set('email', false); ActiveEntry.errorMessages.set('confirm', false); diff --git a/Packages/active-entry/lib/validatePassword.js b/Packages/active-entry/lib/validatePassword.js index a6594a188..674a19ffe 100644 --- a/Packages/active-entry/lib/validatePassword.js +++ b/Packages/active-entry/lib/validatePassword.js @@ -1,13 +1,18 @@ -pwstrengthOptions = { - common: { - minChar: 8, - zxcvbn: true - }, - ui: { - showVerdictsInsideProgressBar: true, - showStatus: true +passwordValidationSettings = {}; + +Meteor.startup(function(){ + passwordValidationSettings.usePwstrength = Meteor.settings.public.usePwstrength; + passwordValidationSettings.pwstrengthOptions = { + common: { + minChar: 8, + zxcvbn: (Meteor.settings.public.useZxcvbn || false) + }, + ui: { + showVerdictsInsideProgressBar: true, + showStatus: true + } } -}; +}); // Validate Password: at least 8 characters in length and contain at least 1 uppercase, 1 lowercase and 1 number and 1 special character validatePassword = function(password) { diff --git a/Packages/active-entry/tests/gagarin/activeEntryTests.js b/Packages/active-entry/tests/gagarin/activeEntryTests.js index 84ff7e484..8903f5863 100644 --- a/Packages/active-entry/tests/gagarin/activeEntryTests.js +++ b/Packages/active-entry/tests/gagarin/activeEntryTests.js @@ -61,7 +61,7 @@ describe('clinical:active-entry', function () { expect(ActiveEntry.errorMessages.get('password')).to.equal("Password is required"); ActiveEntry.verifyPassword('kittens'); - expect(ActiveEntry.errorMessages.get('password')).to.equal("Password is invalid"); + expect(ActiveEntry.errorMessages.get('password')).to.equal("Password must have at least 8 characters. It must contain at least 1 uppercase, 1 lowercase, 1 number and 1 special character."); ActiveEntry.verifyPassword('K1tt#ns123'); expect(ActiveEntry.successMessages.get('password')).to.equal("Password present"); @@ -71,6 +71,9 @@ describe('clinical:active-entry', function () { // ActiveEntry.verifyConfirmPassword it('Password match validation confirms that two passwords are the same.', function () { return client.execute(function (a) { + ActiveEntry.verifyConfirmPassword('K1tt#kittens', 'kittens'); + expect(ActiveEntry.successMessages.get('confirm')).to.equal("Passwords do not match"); + ActiveEntry.verifyConfirmPassword('K1tt#ns123', 'K1tt#ns123'); expect(ActiveEntry.successMessages.get('confirm')).to.equal("Passwords match"); }); diff --git a/config/localhostOrthanc.json b/config/localhostOrthanc.json index 8535b2975..652c44c30 100644 --- a/config/localhostOrthanc.json +++ b/config/localhostOrthanc.json @@ -22,6 +22,8 @@ "staleSessionInactivityTimeout": 1800000, "staleSessionHeartbeatInterval": 180000, "staleSessionPurgeInterval": 60000, - "staleSessionActivityEvents": "mousemove click keydown" + "staleSessionActivityEvents": "mousemove click keydown", + "usePwstrength": false, + "useZxcvbn": false } } diff --git a/config/medicalConnections.json b/config/medicalConnections.json index fd35535ec..df017489f 100644 --- a/config/medicalConnections.json +++ b/config/medicalConnections.json @@ -20,6 +20,8 @@ "staleSessionInactivityTimeout": 1800000, "staleSessionHeartbeatInterval": 180000, "staleSessionPurgeInterval": 60000, - "staleSessionActivityEvents": "mousemove click keydown" + "staleSessionActivityEvents": "mousemove click keydown", + "usePwstrength": false, + "useZxcvbn": false } } \ No newline at end of file diff --git a/config/medkenOrthanc.json b/config/medkenOrthanc.json index 21996628a..daed86dd6 100644 --- a/config/medkenOrthanc.json +++ b/config/medkenOrthanc.json @@ -21,6 +21,8 @@ "staleSessionInactivityTimeout": 1800000, "staleSessionHeartbeatInterval": 180000, "staleSessionPurgeInterval": 60000, - "staleSessionActivityEvents": "mousemove click keydown" + "staleSessionActivityEvents": "mousemove click keydown", + "usePwstrength": false, + "useZxcvbn": false } } \ No newline at end of file diff --git a/config/siimDCM4CHEE.json b/config/siimDCM4CHEE.json index d8f1253ef..e5d250a16 100644 --- a/config/siimDCM4CHEE.json +++ b/config/siimDCM4CHEE.json @@ -20,6 +20,8 @@ "staleSessionInactivityTimeout": 1800000, "staleSessionHeartbeatInterval": 180000, "staleSessionPurgeInterval": 60000, - "staleSessionActivityEvents": "mousemove click keydown" + "staleSessionActivityEvents": "mousemove click keydown", + "usePwstrength": false, + "useZxcvbn": false } } \ No newline at end of file