]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 558803: Add a parameter to specify the password complexity for new passwords
authorrojanu <aliustek@gmail.com>
Fri, 7 Jan 2011 14:14:40 +0000 (15:14 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Fri, 7 Jan 2011 14:14:40 +0000 (15:14 +0100)
r/a=LpSolit

Bugzilla/Config/Auth.pm
Bugzilla/User.pm
template/en/default/admin/params/auth.html.tmpl
template/en/default/global/user-error.html.tmpl

index c7d921ed57ba10b2294897484087520563bbe322..a61cab5a2ea6d33b6d9932bb80d4eea1fc9df17b 100644 (file)
@@ -121,6 +121,15 @@ sub get_param_list {
    type => 't',
    default => q:.*:,
    checker => \&check_regexp
+  },
+
+  {
+   name => 'password_complexity',
+   type => 's',
+   choices => [ 'no_constraints', 'mixed_letters', 'letters_numbers',
+                'letters_numbers_specialchars' ],
+   default => 'no_constraints',
+   checker => \&check_multi
   } );
   return @param_list;
 }
index d151139591565b4dc65ef62fc3e6f0f622f41d85..eafda6563b4484b42905ca2e8e1c05a706d494c4 100644 (file)
@@ -1946,6 +1946,19 @@ sub validate_password {
     } elsif ((defined $matchpassword) && ($password ne $matchpassword)) {
         ThrowUserError('passwords_dont_match');
     }
+    
+    my $complexity_level = Bugzilla->params->{password_complexity};
+    if ($complexity_level eq 'letters_numbers_specialchars') {
+        ThrowUserError('password_not_complex')
+          if ($password !~ /\w/ || $password !~ /\d/ || $password !~ /[[:punct:]]/);
+    } elsif ($complexity_level eq 'letters_numbers') {
+        ThrowUserError('password_not_complex')
+          if ($password !~ /[[:lower:]]/ || $password !~ /[[:upper:]]/ || $password !~ /\d/);
+    } elsif ($complexity_level eq 'mixed_letters') {
+        ThrowUserError('password_not_complex')
+          if ($password !~ /[[:lower:]]/ || $password !~ /[[:upper:]]/);
+    }
+
     # Having done these checks makes us consider the password untainted.
     trick_taint($_[0]);
     return 1;
index 35bddf1af93a288fef0fba216692ea2e714133c4..8e91e54c0e615d906a501a1df5ed7c14dcee6b8d 100644 (file)
                        "default (.*) permits any account matching the emailregexp " _
                        "to be created. If this parameter is left blank, no users " _
                        "will be permitted to create their own accounts and all accounts " _
-                       "will have to be created by an administrator." }
+                       "will have to be created by an administrator.",
+
+  password_complexity =>
+    "Set the complexity required for passwords. In all cases must the passwords " _
+    "be at least ${constants.USER_PASSWORD_MIN_LENGTH} characters long." _
+    "<ul><li>no_constraints - No complexity required.</li>" _
+    "<li>mixed_letters - Passwords must contain at least one UPPER and one lower " _
+    "case letter.</li>" _
+    "<li>letters_numbers - Passwords must contain at least one UPPER and one " _
+    "lower case letter and a number.</li>" _
+    "<li>letters_numbers_specialchars - Passwords must contain at least one " _
+    "UPPER or one lower case letter, a number and a special character.</li></ul>"
+  }
 %]
index b76106f2484162034a367a488962feea080d26c5..67012b555134c5f821d2cbbc71e5a331567ebe91 100644 (file)
     The password must be at least
     [%+ constants.USER_PASSWORD_MIN_LENGTH FILTER html %] characters long.
 
+  [% ELSIF error == "password_not_complex" %]
+     [% title = "Password Fails Requirements" %]
+     [% passregex = Param('password_complexity') %]
+     The password must contain at least one:
+     <ul>
+       [% IF passregex.search('letters') %]
+         <li>UPPERCASE letter</li>
+         <li>lowercase letter</li>
+       [% END %]
+       [% IF passregex.search('numbers') %]
+         <li>digit</li>
+       [% END %]
+       [% IF passregex.search('specialchars') %]
+         <li>special character</li>
+       [% END %]
+     </ul>
+
   [% ELSIF error == "product_access_denied" %]
     [% title = "Product Access Denied" %]
     Either the product