- 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."
This commit is contained in:
Aysel Afsar 2016-02-02 15:31:01 -05:00
parent d3671a5bdd
commit 236ab64add
10 changed files with 52 additions and 28 deletions

View File

@ -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();

View File

@ -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);
}
});

View File

@ -6,6 +6,7 @@
}
}
.progress {
#entrySignUp .progress{
height: 5px;
margin-bottom: 1px
}

View File

@ -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);

View File

@ -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) {

View File

@ -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");
});

View File

@ -22,6 +22,8 @@
"staleSessionInactivityTimeout": 1800000,
"staleSessionHeartbeatInterval": 180000,
"staleSessionPurgeInterval": 60000,
"staleSessionActivityEvents": "mousemove click keydown"
"staleSessionActivityEvents": "mousemove click keydown",
"usePwstrength": false,
"useZxcvbn": false
}
}

View File

@ -20,6 +20,8 @@
"staleSessionInactivityTimeout": 1800000,
"staleSessionHeartbeatInterval": 180000,
"staleSessionPurgeInterval": 60000,
"staleSessionActivityEvents": "mousemove click keydown"
"staleSessionActivityEvents": "mousemove click keydown",
"usePwstrength": false,
"useZxcvbn": false
}
}

View File

@ -21,6 +21,8 @@
"staleSessionInactivityTimeout": 1800000,
"staleSessionHeartbeatInterval": 180000,
"staleSessionPurgeInterval": 60000,
"staleSessionActivityEvents": "mousemove click keydown"
"staleSessionActivityEvents": "mousemove click keydown",
"usePwstrength": false,
"useZxcvbn": false
}
}

View File

@ -20,6 +20,8 @@
"staleSessionInactivityTimeout": 1800000,
"staleSessionHeartbeatInterval": 180000,
"staleSessionPurgeInterval": 60000,
"staleSessionActivityEvents": "mousemove click keydown"
"staleSessionActivityEvents": "mousemove click keydown",
"usePwstrength": false,
"useZxcvbn": false
}
}