]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 455584 - Use bz_crypt everywhere instead of the crypt() function
authordkl%redhat.com <>
Thu, 23 Oct 2008 02:54:56 +0000 (02:54 +0000)
committerdkl%redhat.com <>
Thu, 23 Oct 2008 02:54:56 +0000 (02:54 +0000)
Patch by David Lawrence <dkl@redhat.com> = r/a=LpSolit

Bugzilla/Auth/Verify/DB.pm
Bugzilla/Util.pm
userprefs.cgi

index f2c008dbf1e5718eb107308fe80840a92b1493c3..0f73063d244fa039a5fc3936a9fb8439f1327ca1 100644 (file)
@@ -53,14 +53,9 @@ sub check_credentials {
         "SELECT cryptpassword FROM profiles WHERE userid = ?",
         undef, $user_id);
 
-    # Wide characters cause crypt to die
-    if (Bugzilla->params->{'utf8'}) {
-        utf8::encode($password) if utf8::is_utf8($password);
-    }
-
     # Using the internal crypted password as the salt,
     # crypt the password the user entered.
-    my $entered_password_crypted = crypt($password, $real_password_crypted);
+    my $entered_password_crypted = bz_crypt($password, $real_password_crypted);
  
     return { failure => AUTH_LOGINFAILED }
         if $entered_password_crypted ne $real_password_crypted;
index f072285854a9012fbb5f833c1d849b146acf0f3c..a8ba2d81c333c4e85b6826932e7954b99722455c 100644 (file)
@@ -464,21 +464,23 @@ sub file_mod_time {
 }
 
 sub bz_crypt {
-    my ($password) = @_;
-
-    # The list of characters that can appear in a salt.  Salts and hashes
-    # are both encoded as a sequence of characters from a set containing
-    # 64 characters, each one of which represents 6 bits of the salt/hash.
-    # The encoding is similar to BASE64, the difference being that the
-    # BASE64 plus sign (+) is replaced with a forward slash (/).
-    my @saltchars = (0..9, 'A'..'Z', 'a'..'z', '.', '/');
-
-    # Generate the salt.  We use an 8 character (48 bit) salt for maximum
-    # security on systems whose crypt uses MD5.  Systems with older
-    # versions of crypt will just use the first two characters of the salt.
-    my $salt = '';
-    for ( my $i=0 ; $i < 8 ; ++$i ) {
-        $salt .= $saltchars[rand(64)];
+    my ($password, $salt) = @_;
+
+    if (!defined $salt) {
+        # The list of characters that can appear in a salt.  Salts and hashes
+        # are both encoded as a sequence of characters from a set containing
+        # 64 characters, each one of which represents 6 bits of the salt/hash.
+        # The encoding is similar to BASE64, the difference being that the
+        # BASE64 plus sign (+) is replaced with a forward slash (/).
+        my @saltchars = (0..9, 'A'..'Z', 'a'..'z', '.', '/');
+
+        # Generate the salt.  We use an 8 character (48 bit) salt for maximum
+        # security on systems whose crypt uses MD5.  Systems with older
+        # versions of crypt will just use the first two characters of the salt.
+        $salt = '';
+        for ( my $i=0 ; $i < 8 ; ++$i ) {
+            $salt .= $saltchars[rand(64)];
+        }
     }
 
     # Wide characters cause crypt to die
@@ -489,6 +491,10 @@ sub bz_crypt {
     # Crypt the password.
     my $cryptedpassword = crypt($password, $salt);
 
+    # HACK: Perl has bug where returned crypted password is considered tainted
+    # Upstream Bug: http://rt.perl.org/rt3/Public/Bug/Display.html?id=59998
+    trick_taint($cryptedpassword) unless (is_tainted($password) || is_tainted($salt));
+
     # Return the crypted password.
     return $cryptedpassword;
 }
@@ -914,9 +920,10 @@ of the "mtime" parameter of the perl "stat" function.
 
 =over 4
 
-=item C<bz_crypt($password)>
+=item C<bz_crypt($password, $salt)>
 
 Takes a string and returns a C<crypt>ed value for it, using a random salt.
+An optional salt string may also be passed in.
 
 Please always use this function instead of the built-in perl "crypt"
 when initially encrypting a password.
index 24a6a569988afd35a421c20dd113adc59fee4809..4ce0f57159499df0c5df41cf4147a67d8f3221e9 100755 (executable)
@@ -92,12 +92,7 @@ sub SaveAccount {
 
         my $oldpassword = $cgi->param('Bugzilla_password');
 
-        # Wide characters cause crypt to die
-        if (Bugzilla->params->{'utf8'}) {
-            utf8::encode($oldpassword) if utf8::is_utf8($oldpassword);
-        } 
-
-        if (crypt($oldpassword, $oldcryptedpwd) ne $oldcryptedpwd) 
+        if (bz_crypt($oldpassword, $oldcryptedpwd) ne $oldcryptedpwd) 
         {
             ThrowUserError("old_password_incorrect");
         }