Skip to content

Commit 3c0e5c2

Browse files
Merge pull request victorjonsson#490 from jonuriarte/master
Added 'content' validator to security
2 parents 730ed0a + a221028 commit 3c0e5c2

File tree

3 files changed

+133
-2
lines changed

3 files changed

+133
-2
lines changed

src/main/utils.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,14 @@
686686
badPlPesel: 'The PESEL entered is invalid',
687687
badPlNip: 'The NIP entered is invalid',
688688
badPlRegon: 'The REGON entered is invalid',
689-
badreCaptcha: 'Please confirm that you are not a bot'
689+
badreCaptcha: 'Please confirm that you are not a bot',
690+
passwordComplexityStart: 'Password must contain at least ',
691+
passwordComplexitySeparator: ', ',
692+
passwordComplexityUppercaseInfo: ' uppercase letter(s)',
693+
passwordComplexityLowercaseInfo: ' lowercase letter(s)',
694+
passwordComplexitySpecialCharsInfo: ' special character(s)',
695+
passwordComplexityNumericCharsInfo: ' numeric character(s)',
696+
passwordComplexityEnd: '.'
690697
}
691698
});
692699

src/modules/security.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,85 @@
514514
errorMessageKey: 'requiredFields'
515515
});
516516

517+
/*
518+
* Check password content depending on following parameters:
519+
* data-validation-require-uc-letter,
520+
* data-validation-require-lc-letter,
521+
* data-validation-require-special-char,
522+
* data-validation-require-numeral
523+
*
524+
*/
525+
$.formUtils.addValidator({
526+
name : 'complexity',
527+
validatorFunction : function(val, $el) {
528+
var numRequiredUppercaseChars = $el.valAttr('require-uc-letter') || '0',
529+
numRequiredLowercaseChars = $el.valAttr('require-lc-letter') || '0',
530+
numRequiredSpecialChars = $el.valAttr('require-special-char') || '0',
531+
numRequiredNumericChars = $el.valAttr('require-numeral') || '0',
532+
patternUpperCaseChars = '^(?=(?:.*[A-Z]){'+numRequiredUppercaseChars+',}).+',
533+
patternLowerCaseChars = '^(?=(?:.*[a-z]){'+numRequiredLowercaseChars+',}).+',
534+
patternSpecialChars = '^(?=(?:.*(_|[!"#$%&\'()*+\\\\,-./:;<=>?@[\\]^_`{|}~])){'+numRequiredSpecialChars+',}).+',
535+
patternNumericChars = '^(?=(?:.*\\d){'+numRequiredNumericChars+',}).+',
536+
resultRegExpRequiredUppercaseChars = true,
537+
resultRegExpRequiredLowercaseChars = true,
538+
resultRegExpRequiredSpecialChars = true,
539+
resultRegExpRequiredNumericChars = true,
540+
error = false,
541+
message_error = '';
542+
543+
if (numRequiredUppercaseChars !== '0'){
544+
resultRegExpRequiredUppercaseChars = new RegExp(patternUpperCaseChars).test(val);
545+
}
546+
if (numRequiredLowercaseChars !== '0'){
547+
resultRegExpRequiredLowercaseChars = new RegExp(patternLowerCaseChars).test(val);
548+
}
549+
if (numRequiredSpecialChars !== '0'){
550+
resultRegExpRequiredSpecialChars = new RegExp(patternSpecialChars).test(val);
551+
}
552+
if (numRequiredNumericChars !== '0'){
553+
resultRegExpRequiredNumericChars = new RegExp(patternNumericChars).test(val);
554+
}
555+
556+
if (!resultRegExpRequiredUppercaseChars){
557+
error = true;
558+
message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredUppercaseChars + $.formUtils.LANG.passwordComplexityUppercaseInfo;
559+
}
560+
if (!resultRegExpRequiredLowercaseChars){
561+
if (error){
562+
message_error = message_error + $.formUtils.LANG.passwordComplexitySeparator + numRequiredLowercaseChars + $.formUtils.LANG.passwordComplexityLowercaseInfo;
563+
}
564+
else{
565+
error = true;
566+
message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredLowercaseChars + $.formUtils.LANG.passwordComplexityLowercaseInfo;
567+
}
568+
}
569+
if (!resultRegExpRequiredSpecialChars){
570+
if (error){
571+
message_error = message_error + $.formUtils.LANG.passwordComplexitySeparator + numRequiredSpecialChars + $.formUtils.LANG.passwordComplexitySpecialCharsInfo;
572+
}
573+
else{
574+
error = true;
575+
message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredSpecialChars + $.formUtils.LANG.passwordComplexitySpecialCharsInfo;
576+
}
577+
}
578+
if (!resultRegExpRequiredNumericChars){
579+
if (error){
580+
message_error = message_error + $.formUtils.LANG.passwordComplexitySeparator + numRequiredNumericChars + $.formUtils.LANG.passwordComplexityNumericCharsInfo;
581+
}
582+
else{
583+
message_error = $.formUtils.LANG.passwordComplexityStart + numRequiredNumericChars + $.formUtils.LANG.passwordComplexityNumericCharsInfo;
584+
}
585+
}
586+
587+
this.errorMessage = message_error + $.formUtils.LANG.passwordComplexityEnd;
588+
if(resultRegExpRequiredUppercaseChars && resultRegExpRequiredLowercaseChars && resultRegExpRequiredSpecialChars && resultRegExpRequiredNumericChars){
589+
return true;
590+
}
591+
return false;
592+
},
593+
errorMessage : '',
594+
errorMessageKey: ''
595+
});
517596
/*
518597
* Google reCaptcha 2
519598
*/

test/qunit.html

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1062,8 +1062,53 @@
10621062
});
10631063

10641064
});
1065-
// TODO: Write more tests...
1065+
1066+
/*
1067+
* COMPLEXITY VALIDATION
1068+
*/
1069+
test("Complexity validation", function() {
1070+
1071+
clearForm();
1072+
1073+
var values = [
1074+
{val:input('abcdefgh', {'':'complexity'}), isValid:true},
1075+
{val:input('ABCDEFGH', {'':'complexity'}), isValid:true},
1076+
{val:input('12345678', {'':'complexity'}), isValid:true},
1077+
{val:input('@|#{}[]', {'':'complexity'}), isValid:true},
1078+
{val:input('abcdefgh', {'require-lc-letter':'2', '':'complexity'}), isValid:true},
1079+
{val:input('12@ABCDEFgh', {'require-lc-letter':'2', '':'complexity'}), isValid:true},
1080+
{val:input('12@ABCDEFGh', {'require-lc-letter':'2', '':'complexity'}), isValid:false},
1081+
{val:input('12@ABCDEFGH', {'require-lc-letter':'2', '':'complexity'}), isValid:false},
1082+
{val:input('12@ABCDEFGH', {'require-uc-letter':'2', '':'complexity'}), isValid:true},
1083+
{val:input('12@abcdefGH', {'require-uc-letter':'2', '':'complexity'}), isValid:true},
1084+
{val:input('12@abcdefgH', {'require-uc-letter':'2', '':'complexity'}), isValid:false},
1085+
{val:input('12@abcdefgh', {'require-uc-letter':'2', '':'complexity'}), isValid:false},
1086+
{val:input('@{}[]', {'require-special-char':'2', '':'complexity'}), isValid:true},
1087+
{val:input('12abcdfgh{}', {'require-special-char':'2', '':'complexity'}), isValid:true},
1088+
{val:input('12abcdefgh{', {'require-special-char':'2', '':'complexity'}), isValid:false},
1089+
{val:input('12abcdefgh', {'require-special-char':'2', '':'complexity'}), isValid:false},
1090+
{val:input('12345678', {'require-numeral':'2', '':'complexity'}), isValid:true},
1091+
{val:input('@abcdfgh78', {'require-numeral':'2', '':'complexity'}), isValid:true},
1092+
{val:input('@abcdefgh1', {'require-numeral':'2', '':'complexity'}), isValid:false},
1093+
{val:input('@abcdefgh', {'require-numeral':'2', '':'complexity'}), isValid:false},
1094+
{val:input('abCD{}12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:true},
1095+
{val:input('abCD{}1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1096+
{val:input('abCD{12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1097+
{val:input('abC{}12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1098+
{val:input('aCD{}12', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1099+
{val:input('abCD{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1100+
{val:input('abC{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1101+
{val:input('aCD{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1102+
{val:input('aD{1', {'require-lc-letter':'2', 'require-uc-letter':'2', 'require-special-char':'2', 'require-numeral':'2', '':'complexity'}), isValid:false},
1103+
{val:input('aDDFV{}@1356', {'require-lc-letter':'4', 'require-uc-letter':'2', 'require-special-char':'3', 'require-numeral':'2', '':'complexity'}), isValid:false}
1104+
];
10661105

1106+
$.each(values, function(i, obj) {
1107+
runTest(obj, 'complexity');
1108+
});
1109+
});
1110+
1111+
// TODO: Write more tests...
10671112
}
10681113

10691114
$.validate({

0 commit comments

Comments
 (0)