View | Details | Raw Unified | Return to bug 12617
Collapse All | Expand All

(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/password_check.inc (-6 / +40 lines)
Lines 7-32 Link Here
7
    var category_selector = "[% category_selector | html %]";
7
    var category_selector = "[% category_selector | html %]";
8
    var STRONG_MSG = _("Password must contain at least %s characters, including UPPERCASE, lowercase and numbers");
8
    var STRONG_MSG = _("Password must contain at least %s characters, including UPPERCASE, lowercase and numbers");
9
    var WEAK_MSG = _("Password must contain at least %s characters");
9
    var WEAK_MSG = _("Password must contain at least %s characters");
10
10
    var COMPLEX_MSG = _("Password must contain numbers, lower and uppercase characters and special characters and must be at least %s characters long.");
11
    var ALPHA_MSG = _("Password must contain both numbers and non-special characters and must be at least %s characters long.");
12
    var SIMPLE_MSG = _("Password can only contain digits 0-9 and must be at least %s characters long.");
11
    if(category_selector && $('select'+category_selector).length) {
13
    if(category_selector && $('select'+category_selector).length) {
12
        jQuery.validator.addMethod("password_strong", function(value, element){
14
        jQuery.validator.addMethod("password_strong", function(value, element){
13
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
15
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
14
            var min_lenght = $('select'+category_selector+' option:selected').data('pwdLength');
16
            var min_length = $('select'+category_selector+' option:selected').data('pwdLength');
15
            var regex_text = require_strong?"(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{"+min_lenght+",}":".{"+min_lenght+",}";
17
            var passwordpolicy = $('select'+category_selector+' option:selected').data('pwdPolicy');
18
            var regex_text = '';
19
            if(passwordpolicy){
20
                if(passwordpolicy == 'complex'){
21
                    regex_text = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%\^&*(){}[\\]<>?/|\-]).{"+min_length+",}";
22
                }else if(passwordpolicy == 'alphanumeric'){
23
                    regex_text = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{"+min_length+",}";
24
                }else{
25
                    regex_text = "(?=.*\\d)(?=.*[0-9]).{"+min_length+",}";
26
                }
27
            }else{
28
                regex_text = require_strong?"(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{"+min_length+",}":".{"+min_length+",}";
29
            }
16
            var pattern_regex = new RegExp(regex_text);
30
            var pattern_regex = new RegExp(regex_text);
17
            return this.optional(element) || value == '****' || pattern_regex.test(value);
31
            return this.optional(element) || value == '****' || pattern_regex.test(value);
18
        }, function(unused, element) {
32
        }, function(unused, element) {
19
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
33
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
20
            var min_lenght = $('select'+category_selector+' option:selected').data('pwdLength');
34
            var min_length = $('select'+category_selector+' option:selected').data('pwdLength');
21
            return (require_strong?STRONG_MSG:WEAK_MSG).format(min_lenght)
35
            var passwordpolicy = $('select'+category_selector+' option:selected').data('pwdPolicy');
36
            if(passwordpolicy){
37
                if(passwordpolicy == 'complex'){
38
                    return (COMPLEX_MSG).format(min_length);
39
                }else if(passwordpolicy == 'alphanumeric'){
40
                    return (ALPHA_MSG).format(min_length);
41
                }else{
42
                    return (SIMPLE_MSG).format(min_length);
43
                }
44
            }else{
45
                return (require_strong?STRONG_MSG:WEAK_MSG).format(min_length)
46
            }
22
        });
47
        });
23
    } else {
48
    } else {
24
        [% IF RequireStrongPassword %]
49
        [% IF RequireStrongPassword %]
25
            pwd_title = STRONG_MSG.format([% minPasswordLength | html %]);
50
            pwd_title = STRONG_MSG.format([% minPasswordLength | html %]);
26
            pattern_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{[% minPasswordLength | html %],}/;
51
            pattern_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{[% minPasswordLength | html %],}/;
27
        [% ELSIF minPasswordLength %]
52
        [% ELSIF minPasswordLength && !password_policy %]
28
            pwd_title = WEAK_MSG.format([% minPasswordLength | html %]);
53
            pwd_title = WEAK_MSG.format([% minPasswordLength | html %]);
29
            pattern_regex = /.{[% minPasswordLength | html %],}/;
54
            pattern_regex = /.{[% minPasswordLength | html %],}/;
55
         [% ELSIF password_policy == 'simplenumeric' %]
56
            pwd_title = SIMPLE_MSG.format([% minPasswordLength | html %]);
57
            pattern_regex = /(?=.*\d)([0-9]){[% minPasswordLength | html %],}/;
58
        [% ELSIF password_policy == 'alphanumeric' %]
59
            pwd_title = ALPHA_MSG.format([% minPasswordLength | html %]);;
60
            pattern_regex = /(?=.*\d)(?=.*[a-zA-Z])([a-zA-Z0-9]){[% minPasswordLength | html %],}/;
61
        [% ELSIF password_policy == 'complex' %]
62
            pwd_title = COMPLEX_MSG.format([% minPasswordLength | html %]);
63
            pattern_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%\^&*(){}[\\]<>?/|\-])([a-zA-Z0-9!@#$%\^&*(){}[\\]<>?/|\-]){[% minPasswordLength | html %],}/;
30
        [% END %]
64
        [% END %]
31
        jQuery.validator.addMethod("password_strong", function(value, element){
65
        jQuery.validator.addMethod("password_strong", function(value, element){
32
            return this.optional(element) || value == '****' || pattern_regex.test(value);
66
            return this.optional(element) || value == '****' || pattern_regex.test(value);
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/member-password.tt (-1 / +1 lines)
Lines 175-181 Link Here
175
            });
175
            });
176
        });
176
        });
177
    </script>
177
    </script>
178
    [% PROCESS 'password_check.inc' new_password => 'newpassword', minPasswordLength => patron.category.effective_min_password_length, RequireStrongPassword => patron.category.effective_require_strong_password %]
178
    [% PROCESS 'password_check.inc' new_password => 'newpassword', minPasswordLength => patron.category.effective_min_password_length, RequireStrongPassword => patron.category.effective_require_strong_password, password_policy => patron.category.passwordpolicy %]
179
[% END %]
179
[% END %]
180
180
181
[% INCLUDE 'intranet-bottom.inc' %]
181
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt (-1 / +1 lines)
Lines 1747-1753 legend:hover { Link Here
1747
    </script>
1747
    </script>
1748
    [% Asset.js("js/members.js") | $raw %]
1748
    [% Asset.js("js/members.js") | $raw %]
1749
    [% Asset.js("js/messaging-preference-form.js") | $raw %]
1749
    [% Asset.js("js/messaging-preference-form.js") | $raw %]
1750
    [% PROCESS 'password_check.inc' new_password => 'password', category_selector => '#categorycode_entry', minPasswordLength => patron.category.effective_min_password_length, RequireStrongPassword => patron.category.effective_require_strong_password %]
1750
    [% PROCESS 'password_check.inc' new_password => 'password', category_selector => '#categorycode_entry', minPasswordLength => patron.category.effective_min_password_length, RequireStrongPassword => patron.category.effective_require_strong_password, password_policy => patron.category.passwordpolicy %]
1751
[% END %]
1751
[% END %]
1752
1752
1753
[% INCLUDE 'intranet-bottom.inc' %]
1753
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/includes/password_check.inc (-5 / +42 lines)
Lines 4-36 Link Here
4
    var pattern_title = "";
4
    var pattern_title = "";
5
    var new_password_node_name = "[% new_password | html %]";
5
    var new_password_node_name = "[% new_password | html %]";
6
    var category_selector = "[% category_selector | html %]";
6
    var category_selector = "[% category_selector | html %]";
7
    var password_policy = "[% password_policy | html %]";
7
    var STRONG_MSG = _("Password must contain at least %s characters, including UPPERCASE, lowercase and numbers");
8
    var STRONG_MSG = _("Password must contain at least %s characters, including UPPERCASE, lowercase and numbers");
8
    var WEAK_MSG = _("Password must contain at least %s characters");
9
    var WEAK_MSG = _("Password must contain at least %s characters");
10
    var COMPLEX_MSG = _("Password must contain numbers, lower and uppercase characters and special characters and must be at least %s characters long.");
11
    var ALPHA_MSG = _("Password must contain both numbers and non-special characters and must be at least %s characters long.");
12
    var SIMPLE_MSG = _("Password can only contain digits 0-9 and must be at least %s characters long.");
9
13
10
    if(category_selector && $('select'+category_selector).length) {
14
    if(category_selector && $('select'+category_selector).length) {
11
        jQuery.validator.addMethod("password_strong", function(value, element){
15
        jQuery.validator.addMethod("password_strong", function(value, element){
12
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
16
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
13
            var min_lenght = $('select'+category_selector+' option:selected').data('pwdLength');
17
            var min_length = $('select'+category_selector+' option:selected').data('pwdLength');
14
            var regex_text = require_strong?"(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{"+min_lenght+",}":".{"+min_lenght+",}";
18
            var passwordpolicy = $('select'+category_selector+' option:selected').data('pwdPolicy');
19
            var regex_text = '';
20
            if(passwordpolicy){
21
                if(passwordpolicy == 'complex'){
22
                    regex_text = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%\^&*(){}[\\]<>?/|\-]).{"+min_length+",}";
23
                }else if(passwordpolicy == 'alphanumeric'){
24
                    regex_text = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{"+min_length+",}";
25
                }else{
26
                    regex_text = "(?=.*\\d)(?=.*[0-9]).{"+min_length+",}";
27
                }
28
            }else{
29
                regex_text = require_strong?"(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{"+min_length+",}":".{"+min_length+",}";
30
            }
15
            var pattern_regex = new RegExp(regex_text);
31
            var pattern_regex = new RegExp(regex_text);
16
            return this.optional(element) || pattern_regex.test(value);
32
            return this.optional(element) || pattern_regex.test(value);
17
        }, function(unused, element) {
33
        }, function(unused, element) {
18
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
34
            var require_strong = $('select'+category_selector+' option:selected').data('pwdStrong');
19
            var min_lenght = $('select'+category_selector+' option:selected').data('pwdLength');
35
            var min_length = $('select'+category_selector+' option:selected').data('pwdLength');
20
            return (require_strong?STRONG_MSG:WEAK_MSG).format(min_lenght)
36
            var passwordpolicy = $('select'+category_selector+' option:selected').data('pwdPolicy');
37
            if(passwordpolicy){
38
                if(passwordpolicy == 'complex'){
39
                    return (COMPLEX_MSG).format(min_length);
40
                }else if(passwordpolicy == 'alphanumeric'){
41
                    return (ALPHA_MSG).format(min_length);
42
                }else{
43
                    return (SIMPLE_MSG).format(min_length);
44
                }
45
            }else{
46
                return (require_strong?STRONG_MSG:WEAK_MSG).format(min_length)
47
            }
21
        });
48
        });
22
    } else {
49
    } else {
23
        [% IF RequireStrongPassword %]
50
        [% IF RequireStrongPassword %]
24
            pwd_title = STRONG_MSG.format([% minPasswordLength | html %]);
51
            pwd_title = STRONG_MSG.format([% minPasswordLength | html %]);
25
            pattern_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{[% minPasswordLength | html %],}/;
52
            pattern_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{[% minPasswordLength | html %],}/;
26
        [% ELSIF minPasswordLength %]
53
        [% ELSIF minPasswordLength && !password_policy %]
27
            pwd_title = WEAK_MSG.format([% minPasswordLength | html %]);
54
            pwd_title = WEAK_MSG.format([% minPasswordLength | html %]);
28
            pattern_regex = /.{[% minPasswordLength | html %],}/;
55
            pattern_regex = /.{[% minPasswordLength | html %],}/;
56
        [% ELSIF password_policy == 'simplenumeric' %]
57
            pwd_title = SIMPLE_MSG.format([% minPasswordLength | html %]);
58
            pattern_regex = /(?=.*\d)([0-9]){[% minPasswordLength | html %],}/;
59
        [% ELSIF password_policy == 'alphanumeric' %]
60
            pwd_title = ALPHA_MSG.format([% minPasswordLength | html %]);;
61
            pattern_regex = /(?=.*\d)(?=.*[a-zA-Z])([a-zA-Z0-9]){[% minPasswordLength | html %],}/;
62
        [% ELSIF password_policy == 'complex' %]
63
            pwd_title = COMPLEX_MSG.format([% minPasswordLength | html %]);
64
            pattern_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%\^&*(){}[\]<>?/|\-])([a-zA-Z0-9!@#$%\^&*(){}[\]<>?/|\-]){[% minPasswordLength | html %],}/;
29
        [% END %]
65
        [% END %]
30
        jQuery.validator.addMethod("password_strong", function(value, element){
66
        jQuery.validator.addMethod("password_strong", function(value, element){
31
            return this.optional(element) || value == '****' || pattern_regex.test(value);
67
            return this.optional(element) || value == '****' || pattern_regex.test(value);
32
        }, pwd_title);
68
        }, pwd_title);
33
    }
69
    }
70
34
    jQuery.validator.addMethod("password_no_spaces", function(value, element){
71
    jQuery.validator.addMethod("password_no_spaces", function(value, element){
35
        return ( this.optional(element) || !value.match(/^\s/) && !value.match(/\s$/) );
72
        return ( this.optional(element) || !value.match(/^\s/) && !value.match(/\s$/) );
36
    }, _("Password contains leading and/or trailing spaces"));
73
    }, _("Password contains leading and/or trailing spaces"));
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-memberentry.tt (-6 / +6 lines)
Lines 1255-1272 Link Here
1255
        $(document).ready(function() {
1255
        $(document).ready(function() {
1256
            var setPwdMessage = function() {
1256
            var setPwdMessage = function() {
1257
                var require_strong = $('select#borrower_categorycode option:selected').data('pwdStrong');
1257
                var require_strong = $('select#borrower_categorycode option:selected').data('pwdStrong');
1258
                var min_lenght = $('select#borrower_categorycode option:selected').data('pwdLength');
1258
                var min_length = $('select#borrower_categorycode option:selected').data('pwdLength');
1259
                var passwordpolicy = $('select#borrower_categorycode option:selected').data('pwdPolicy');
1259
                var passwordpolicy = $('select#borrower_categorycode option:selected').data('pwdPolicy');
1260
                if(passwordpolicy){
1260
                if(passwordpolicy){
1261
                    if(passwordpolicy == 'complex'){
1261
                    if(passwordpolicy == 'complex'){
1262
                        $('#password_alert').html((PWD_COMPLEX_MSG).format(min_lenght));
1262
                        $('#password_alert').html((PWD_COMPLEX_MSG).format(min_length));
1263
                    }else if(passwordpolicy == 'alphanumeric'){
1263
                    }else if(passwordpolicy == 'alphanumeric'){
1264
                        $('#password_alert').html((PWD_ALPHA_MSG).format(min_lenght));
1264
                        $('#password_alert').html((PWD_ALPHA_MSG).format(min_length));
1265
                    }else{
1265
                    }else{
1266
                        $('#password_alert').html((PWD_SIMPLE_MSG).format(min_lenght));
1266
                        $('#password_alert').html((PWD_SIMPLE_MSG).format(min_length));
1267
                    }
1267
                    }
1268
                }else{
1268
                }else{
1269
                    $('#password_alert').html((require_strong?PWD_STRONG_MSG:PWD_WEAK_MSG).format(min_lenght));
1269
                    $('#password_alert').html((require_strong?PWD_STRONG_MSG:PWD_WEAK_MSG).format(min_length));
1270
                }
1270
                }
1271
            };
1271
            };
1272
            setPwdMessage();
1272
            setPwdMessage();
Lines 1275-1280 Link Here
1275
    [% END %]
1275
    [% END %]
1276
    //]]>
1276
    //]]>
1277
    </script>
1277
    </script>
1278
    [% PROCESS 'password_check.inc' new_password => 'borrower_password', category_selector => '#borrower_categorycode', RequireStrongPassword => patron.category.effective_require_strong_password, minPasswordLength => patron.category.effective_min_password_length %]
1278
    [% PROCESS 'password_check.inc' new_password => 'borrower_password', category_selector => '#borrower_categorycode', RequireStrongPassword => patron.category.effective_require_strong_password, minPasswordLength => patron.category.effective_min_password_length, password_policy => patron.category.passwordpolicy %]
1279
1279
1280
[% END %]
1280
[% END %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-passwd.tt (-1 / +1 lines)
Lines 126-132 Link Here
126
[% INCLUDE 'opac-bottom.inc' %]
126
[% INCLUDE 'opac-bottom.inc' %]
127
[% BLOCK jsinclude %]
127
[% BLOCK jsinclude %]
128
    [% Asset.js("lib/jquery/plugins/jquery.validate.min.js") | $raw %]
128
    [% Asset.js("lib/jquery/plugins/jquery.validate.min.js") | $raw %]
129
    [% PROCESS 'password_check.inc' new_password => 'Newkey', minPasswordLength => logged_in_user.category.effective_min_password_length, RequireStrongPassword => logged_in_user.category.effective_require_strong_password %]
129
    [% PROCESS 'password_check.inc' new_password => 'Newkey', minPasswordLength => logged_in_user.category.effective_min_password_length, RequireStrongPassword => logged_in_user.category.effective_require_strong_password, password_policy => logged_in_user.category.passwordpolicy %]
130
    <script>
130
    <script>
131
        $(document).ready(function() {
131
        $(document).ready(function() {
132
            $("#mainform").validate({
132
            $("#mainform").validate({
(-)a/members/memberentry.pl (-1 / +1 lines)
Lines 693-698 foreach my $category_type (qw(C A S P I X)) { Link Here
693
            'categoryname' => $patron_category->description,
693
            'categoryname' => $patron_category->description,
694
            'effective_min_password_length' => $patron_category->effective_min_password_length,
694
            'effective_min_password_length' => $patron_category->effective_min_password_length,
695
            'effective_require_strong_password' => $patron_category->effective_require_strong_password,
695
            'effective_require_strong_password' => $patron_category->effective_require_strong_password,
696
            'passwordpolicy' => $patron_category->passwordpolicy,
696
            'categorycodeselected' =>
697
            'categorycodeselected' =>
697
              ( defined($categorycode) && $patron_category->categorycode eq $categorycode ),
698
              ( defined($categorycode) && $patron_category->categorycode eq $categorycode ),
698
          };
699
          };
699
- 

Return to bug 12617