From ef79a383b17a8093b6845b73967ea7640af1bc88 Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Thu, 25 Aug 2016 10:49:52 +0200 Subject: [PATCH 1/9] Added 'content' validator to security --- src/modules/security.js | 75 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/modules/security.js b/src/modules/security.js index 936ee50..1866ba2 100644 --- a/src/modules/security.js +++ b/src/modules/security.js @@ -514,6 +514,81 @@ errorMessageKey: 'requiredFields' }); + /* + * Check password content depending on following parameters: + * data-validation-require-uc-letter, + * data-validation-require-lc-letter, + * data-validation-require-special-char, + * data-validation-require-numeral + * + */ + $.formUtils.addValidator({ + name : 'content', + validatorFunction : function(val, $el, config, language) { + var require_uc = $el.valAttr('require-uc-letter') || '0', + require_lc = $el.valAttr('require-lc-letter') || '0', + require_sc = $el.valAttr('require-special-char') || '0', + require_num = $el.valAttr('require-numeral') || '0', + pattern_uc = '^(?=(?:.*[A-Z]){'+require_uc+',}).+', + pattern_lc = '^(?=(?:.*[a-z]){'+require_lc+',}).+', + pattern_sc = '^(?=(?:.*(_|[-+_!@#$%^&*?])){'+require_sc+',}).+', + pattern_num = '^(?=(?:.*\\d){'+require_num+',}).+', + message_error = 'Password must contain at least ', + error = false; + + if (require_uc !== '0'){ + result_uc = new RegExp(pattern_uc).test(val); + } + if (require_lc !== '0'){ + result_lc = new RegExp(pattern_lc).test(val); + } + if (require_sc !== '0'){ + result_sc = new RegExp(pattern_sc).test(val); + } + if (require_num !== '0'){ + result_num = new RegExp(pattern_num).test(val); + } + + if (!result_uc){ + error = true; + message_error = message_error + require_uc + ' uppercase letter(s)'; + } + if (!result_lc){ + if (error){ + message_error = message_error + ', ' + require_lc + ' lowercase letter(s)'; + } + else{ + error = true; + message_error = message_error + require_lc + ' lowercase letter(s)'; + } + } + if (!result_sc){ + if (error){ + message_error = message_error + ', ' + require_sc + ' special character(s)'; + } + else{ + error = true; + message_error = message_error + require_sc + ' special character(s)'; + } + } + if (!result_num){ + if (error){ + message_error = message_error + ', ' + require_num + ' numeric character(s)'; + } + else{ + message_error = message_error + require_num + ' numeric character(s)'; + } + } + + this.errorMessage = message_error + '.'; + if(result_uc && result_lc && result_sc && result_num){ + return true; + } + return false; + }, + errorMessage : '', + errorMessageKey: '' + }); /* * Google reCaptcha 2 */ From 6051883700af6a05c59a5923853912663100d841 Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Thu, 25 Aug 2016 11:25:15 +0200 Subject: [PATCH 2/9] Fix --- src/modules/security.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/security.js b/src/modules/security.js index 1866ba2..4fc67e6 100644 --- a/src/modules/security.js +++ b/src/modules/security.js @@ -537,16 +537,16 @@ error = false; if (require_uc !== '0'){ - result_uc = new RegExp(pattern_uc).test(val); + var result_uc = new RegExp(pattern_uc).test(val); } if (require_lc !== '0'){ - result_lc = new RegExp(pattern_lc).test(val); + var result_lc = new RegExp(pattern_lc).test(val); } if (require_sc !== '0'){ - result_sc = new RegExp(pattern_sc).test(val); + var result_sc = new RegExp(pattern_sc).test(val); } if (require_num !== '0'){ - result_num = new RegExp(pattern_num).test(val); + var result_num = new RegExp(pattern_num).test(val); } if (!result_uc){ From 61bc7f74e4eeeb72183330aab91fea09af37c2cc Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Thu, 25 Aug 2016 17:02:13 +0200 Subject: [PATCH 3/9] Fix 2 --- src/modules/security.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/modules/security.js b/src/modules/security.js index 4fc67e6..2252a43 100644 --- a/src/modules/security.js +++ b/src/modules/security.js @@ -534,19 +534,23 @@ pattern_sc = '^(?=(?:.*(_|[-+_!@#$%^&*?])){'+require_sc+',}).+', pattern_num = '^(?=(?:.*\\d){'+require_num+',}).+', message_error = 'Password must contain at least ', + result_uc = false, + result_lc = false, + result_sc = false, + result_num = false, error = false; if (require_uc !== '0'){ - var result_uc = new RegExp(pattern_uc).test(val); + result_uc = new RegExp(pattern_uc).test(val); } if (require_lc !== '0'){ - var result_lc = new RegExp(pattern_lc).test(val); + result_lc = new RegExp(pattern_lc).test(val); } if (require_sc !== '0'){ - var result_sc = new RegExp(pattern_sc).test(val); + result_sc = new RegExp(pattern_sc).test(val); } if (require_num !== '0'){ - var result_num = new RegExp(pattern_num).test(val); + result_num = new RegExp(pattern_num).test(val); } if (!result_uc){ From 7f0d968ec02b9cf1a57c9f4ce7c1d8815ee415e7 Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Thu, 25 Aug 2016 17:32:50 +0200 Subject: [PATCH 4/9] Fix 3 --- src/modules/security.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/security.js b/src/modules/security.js index 2252a43..ef25026 100644 --- a/src/modules/security.js +++ b/src/modules/security.js @@ -524,7 +524,7 @@ */ $.formUtils.addValidator({ name : 'content', - validatorFunction : function(val, $el, config, language) { + validatorFunction : function(val, $el) { var require_uc = $el.valAttr('require-uc-letter') || '0', require_lc = $el.valAttr('require-lc-letter') || '0', require_sc = $el.valAttr('require-special-char') || '0', From aac3074131817c9ed03ffa599e8a002ddf0640d2 Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Sat, 27 Aug 2016 19:43:27 +0200 Subject: [PATCH 5/9] Various fixes More descriptive variable names. Regex fix for special chars. Validator name changed. Localization added. --- src/modules/security.js | 71 ++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/src/modules/security.js b/src/modules/security.js index ef25026..9c859c6 100644 --- a/src/modules/security.js +++ b/src/modules/security.js @@ -523,69 +523,68 @@ * */ $.formUtils.addValidator({ - name : 'content', - validatorFunction : function(val, $el) { - var require_uc = $el.valAttr('require-uc-letter') || '0', - require_lc = $el.valAttr('require-lc-letter') || '0', - require_sc = $el.valAttr('require-special-char') || '0', - require_num = $el.valAttr('require-numeral') || '0', - pattern_uc = '^(?=(?:.*[A-Z]){'+require_uc+',}).+', - pattern_lc = '^(?=(?:.*[a-z]){'+require_lc+',}).+', - pattern_sc = '^(?=(?:.*(_|[-+_!@#$%^&*?])){'+require_sc+',}).+', - pattern_num = '^(?=(?:.*\\d){'+require_num+',}).+', - message_error = 'Password must contain at least ', - result_uc = false, - result_lc = false, - result_sc = false, - result_num = false, + name : 'complexity', + validatorFunction : function(val, $el, conf, lang) { + var numRequiredUppercaseChars = $el.valAttr('require-uc-letter') || '0', + numRequiredLowercaseChars = $el.valAttr('require-lc-letter') || '0', + numRequiredSpecialChars = $el.valAttr('require-special-char') || '0', + numRequiredNumericChars = $el.valAttr('require-numeral') || '0', + patternUpperCaseChars = '^(?=(?:.*[A-Z]){'+numRequiredUppercaseChars+',}).+', + patternLowerCaseChars = '^(?=(?:.*[a-z]){'+numRequiredLowercaseChars+',}).+', + patternSpecialChars = '^(?=(?:.*(_|[!"#$%&\'()*+\\\\,-./:;<=>?@[\\]^_`{|}~])){'+numRequiredSpecialChars+',}).+', + patternNumericChars = '^(?=(?:.*\\d){'+numRequiredNumericChars+',}).+', + resultRegExpRequiredUppercaseChars = false, + resultRegExpRequiredLowercaseChars = false, + resultRegExpRequiredSpecialChars = false, + resultRegExpRequiredNumericChars = false, error = false; - if (require_uc !== '0'){ - result_uc = new RegExp(pattern_uc).test(val); + if (numRequiredUppercaseChars !== '0'){ + resultRegExpRequiredUppercaseChars = new RegExp(patternUpperCaseChars).test(val); } - if (require_lc !== '0'){ - result_lc = new RegExp(pattern_lc).test(val); + if (numRequiredLowercaseChars !== '0'){ + resultRegExpRequiredLowercaseChars = new RegExp(patternLowerCaseChars).test(val); } - if (require_sc !== '0'){ - result_sc = new RegExp(pattern_sc).test(val); + if (numRequiredSpecialChars !== '0'){ + resultRegExpRequiredSpecialChars = new RegExp(patternSpecialChars).test(val); } - if (require_num !== '0'){ - result_num = new RegExp(pattern_num).test(val); + if (numRequiredNumericChars !== '0'){ + resultRegExpRequiredNumericChars = new RegExp(patternNumericChars).test(val); } - if (!result_uc){ + if (!resultRegExpRequiredUppercaseChars){ error = true; - message_error = message_error + require_uc + ' uppercase letter(s)'; + message_error = lang.passwordComplexityStart + numRequiredUppercaseChars + lang.passwordComplexityUppercaseInfo; } - if (!result_lc){ + if (!resultRegExpRequiredLowercaseChars){ if (error){ - message_error = message_error + ', ' + require_lc + ' lowercase letter(s)'; + message_error = message_error + lang.passwordComplexitySeparator + numRequiredLowercaseChars + lang.passwordComplexityLowercaseInfo; } else{ error = true; - message_error = message_error + require_lc + ' lowercase letter(s)'; + message_error = lang.passwordComplexityStart + numRequiredLowercaseChars + lang.passwordComplexityLowercaseInfo; } } - if (!result_sc){ + if (!resultRegExpRequiredSpecialChars){ if (error){ - message_error = message_error + ', ' + require_sc + ' special character(s)'; + message_error = message_error + lang.passwordComplexitySeparator + numRequiredSpecialChars + lang.passwordComplexitySpecialCharsInfo; } else{ error = true; - message_error = message_error + require_sc + ' special character(s)'; + message_error = lang.passwordComplexityStart + numRequiredSpecialChars + lang.passwordComplexitySpecialCharsInfo; } } - if (!result_num){ + if (!resultRegExpRequiredNumericChars){ if (error){ - message_error = message_error + ', ' + require_num + ' numeric character(s)'; + message_error = message_error + lang.passwordComplexitySeparator + numRequiredNumericChars + lang.passwordComplexityNumericCharsInfo; } else{ - message_error = message_error + require_num + ' numeric character(s)'; + message_error = lang.passwordComplexityStart + numRequiredNumericChars + lang.passwordComplexityNumericCharsInfo; } } - this.errorMessage = message_error + '.'; - if(result_uc && result_lc && result_sc && result_num){ + this.errorMessage = message_error + lang.passwordComplexityEnd; + if(resultRegExpRequiredUppercaseChars && resultRegExpRequiredLowercaseChars && resultRegExpRequiredSpecialChars && resultRegExpRequiredNumericChars){ return true; } return false; From 060fe3513a6defac27149a456e5980439626f12c Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Sat, 27 Aug 2016 19:44:55 +0200 Subject: [PATCH 6/9] Fix Added localization --- src/main/utils.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/utils.js b/src/main/utils.js index de16646..16c9b77 100644 --- a/src/main/utils.js +++ b/src/main/utils.js @@ -686,7 +686,14 @@ badPlPesel: 'The PESEL entered is invalid', badPlNip: 'The NIP entered is invalid', badPlRegon: 'The REGON entered is invalid', - badreCaptcha: 'Please confirm that you are not a bot' + badreCaptcha: 'Please confirm that you are not a bot', + passwordComplexityStart: 'Password must contain at least ', + passwordComplexitySeparator: ', ', + passwordComplexityUppercaseInfo: ' uppercase letter(s)', + passwordComplexityLowercaseInfo: ' lowercase letter(s)', + passwordComplexitySpecialCharsInfo: ' special character(s)', + passwordComplexityNumericCharsInfo: ' numeric character(s)', + passwordComplexityEnd: '.' } }); From 1629dfc841cfa8572e7c3404eaf28cf24d220611 Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Mon, 29 Aug 2016 12:33:46 +0200 Subject: [PATCH 7/9] Added some test Added some test for the complexity validator --- test/qunit.html | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/test/qunit.html b/test/qunit.html index 3af589c..e37aa56 100644 --- a/test/qunit.html +++ b/test/qunit.html @@ -1062,8 +1062,53 @@ }); }); - // TODO: Write more tests... + + /* + * COMPLEXITY VALIDATION + */ + test("Complexity validation", function() { + + clearForm(); + + var values = [ + {val:input('abcdefgh', {'':'complexity'}), isValid:true}, + {val:input('ABCDEFGH', {'':'complexity'}), isValid:true}, + {val:input('12345678', {'':'complexity'}), isValid:true}, + {val:input('@|#{}[]', {'':'complexity'}), isValid:true}, + {val:input('abcdefgh', {'require-lc-letter':'2', '':'complexity'}), isValid:true}, + {val:input('12@ABCDEFgh', {'require-lc-letter':'2', '':'complexity'}), isValid:true}, + {val:input('12@ABCDEFGh', {'require-lc-letter':'2', '':'complexity'}), isValid:false}, + {val:input('12@ABCDEFGH', {'require-lc-letter':'2', '':'complexity'}), isValid:false}, + {val:input('12@ABCDEFGH', {'require-uc-letter':'2', '':'complexity'}), isValid:true}, + {val:input('12@abcdefGH', {'require-uc-letter':'2', '':'complexity'}), isValid:true}, + {val:input('12@abcdefgH', {'require-uc-letter':'2', '':'complexity'}), isValid:false}, + {val:input('12@abcdefgh', {'require-uc-letter':'2', '':'complexity'}), isValid:false}, + {val:input('@{}[]', {'require-special-char':'2', '':'complexity'}), isValid:true}, + {val:input('12abcdfgh{}', {'require-special-char':'2', '':'complexity'}), isValid:true}, + {val:input('12abcdefgh{', {'require-special-char':'2', '':'complexity'}), isValid:false}, + {val:input('12abcdefgh', {'require-special-char':'2', '':'complexity'}), isValid:false}, + {val:input('12345678', {'require-numeral':'2', '':'complexity'}), isValid:true}, + {val:input('@abcdfgh78', {'require-numeral':'2', '':'complexity'}), isValid:true}, + {val:input('@abcdefgh1', {'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('@abcdefgh', {'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('abCD{}12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:true}, + {val:input('abCD{}1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('abCD{12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('abC{}12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('aCD{}12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('abCD{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('abC{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('aCD{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('aD{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false}, + {val:input('aDDFV{}@1356', {'require-lc-letter':'4', 'require-uc-letter':'2', 'require-special-char':'3', 'require-numeral':'2', '':'complexity'}), isValid:false} + ]; + $.each(values, function(i, obj) { + runTest(obj, 'complexity'); + }); + }); + + // TODO: Write more tests... } $.validate({ From a9e36a32c29b580d79aa2c239fd15fd71550f06e Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Mon, 29 Aug 2016 12:34:59 +0200 Subject: [PATCH 8/9] Fix 4 --- src/modules/security.js | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/modules/security.js b/src/modules/security.js index 9c859c6..b807e30 100644 --- a/src/modules/security.js +++ b/src/modules/security.js @@ -533,11 +533,12 @@ patternLowerCaseChars = '^(?=(?:.*[a-z]){'+numRequiredLowercaseChars+',}).+', patternSpecialChars = '^(?=(?:.*(_|[!"#$%&\'()*+\\\\,-./:;<=>?@[\\]^_`{|}~])){'+numRequiredSpecialChars+',}).+', patternNumericChars = '^(?=(?:.*\\d){'+numRequiredNumericChars+',}).+', - resultRegExpRequiredUppercaseChars = false, - resultRegExpRequiredLowercaseChars = false, - resultRegExpRequiredSpecialChars = false, - resultRegExpRequiredNumericChars = false, - error = false; + resultRegExpRequiredUppercaseChars = true, + resultRegExpRequiredLowercaseChars = true, + resultRegExpRequiredSpecialChars = true, + resultRegExpRequiredNumericChars = true, + error = false, + message_error = ''; if (numRequiredUppercaseChars !== '0'){ resultRegExpRequiredUppercaseChars = new RegExp(patternUpperCaseChars).test(val); @@ -554,36 +555,36 @@ if (!resultRegExpRequiredUppercaseChars){ error = true; - message_error = lang.passwordComplexityStart + numRequiredUppercaseChars + lang.passwordComplexityUppercaseInfo; + message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredUppercaseChars + $.formUtils.LANG.passwordComplexityUppercaseInfo; } if (!resultRegExpRequiredLowercaseChars){ if (error){ - message_error = message_error + lang.passwordComplexitySeparator + numRequiredLowercaseChars + lang.passwordComplexityLowercaseInfo; + message_error = message_error + $.formUtils.LANG.passwordComplexitySeparator + numRequiredLowercaseChars + $.formUtils.LANG.passwordComplexityLowercaseInfo; } else{ error = true; - message_error = lang.passwordComplexityStart + numRequiredLowercaseChars + lang.passwordComplexityLowercaseInfo; + message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredLowercaseChars + $.formUtils.LANG.passwordComplexityLowercaseInfo; } } if (!resultRegExpRequiredSpecialChars){ if (error){ - message_error = message_error + lang.passwordComplexitySeparator + numRequiredSpecialChars + lang.passwordComplexitySpecialCharsInfo; + message_error = message_error + $.formUtils.LANG.passwordComplexitySeparator + numRequiredSpecialChars + $.formUtils.LANG.passwordComplexitySpecialCharsInfo; } else{ error = true; - message_error = lang.passwordComplexityStart + numRequiredSpecialChars + lang.passwordComplexitySpecialCharsInfo; + message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredSpecialChars + $.formUtils.LANG.passwordComplexitySpecialCharsInfo; } } if (!resultRegExpRequiredNumericChars){ if (error){ - message_error = message_error + lang.passwordComplexitySeparator + numRequiredNumericChars + lang.passwordComplexityNumericCharsInfo; + message_error = message_error + $.formUtils.LANG.passwordComplexitySeparator + numRequiredNumericChars + $.formUtils.LANG.passwordComplexityNumericCharsInfo; } else{ - message_error = lang.passwordComplexityStart + numRequiredNumericChars + lang.passwordComplexityNumericCharsInfo; + message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredNumericChars + $.formUtils.LANG.passwordComplexityNumericCharsInfo; } } - this.errorMessage = message_error + lang.passwordComplexityEnd; + this.errorMessage = message_error + $.formUtils.LANG.passwordComplexityEnd; if(resultRegExpRequiredUppercaseChars && resultRegExpRequiredLowercaseChars && resultRegExpRequiredSpecialChars && resultRegExpRequiredNumericChars){ return true; } From a221028ed89c52de163ee0929225bca2481f77ee Mon Sep 17 00:00:00 2001 From: Jon Uriarte Bilbao Date: Mon, 29 Aug 2016 12:38:31 +0200 Subject: [PATCH 9/9] Fix --- src/modules/security.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/security.js b/src/modules/security.js index b807e30..f0009ea 100644 --- a/src/modules/security.js +++ b/src/modules/security.js @@ -524,7 +524,7 @@ */ $.formUtils.addValidator({ name : 'complexity', - validatorFunction : function(val, $el, conf, lang) { + validatorFunction : function(val, $el) { var numRequiredUppercaseChars = $el.valAttr('require-uc-letter') || '0', numRequiredLowercaseChars = $el.valAttr('require-lc-letter') || '0', numRequiredSpecialChars = $el.valAttr('require-special-char') || '0',