yoavs 2005/03/23 07:17:17
Modified: catalina/src/share/org/apache/catalina/realm JNDIRealm.java
webapps/docs changelog.xml
Log:
Bugzilla 32938.
Revision Changes Path
1.21 +43 -1
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java
Index: JNDIRealm.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- JNDIRealm.java 23 Feb 2005 19:27:56 -0000 1.20
+++ JNDIRealm.java 23 Mar 2005 15:17:17 -0000 1.21
@@ -16,9 +16,11 @@
package org.apache.catalina.realm;
+import java.io.IOException;
import java.security.Principal;
import java.text.MessageFormat;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
@@ -40,6 +42,8 @@
import javax.naming.directory.SearchResult;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.util.Base64;
+import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.buf.CharChunk;
/**
* <p>Implementation of <strong>Realm</strong> that works with a directory
@@ -1190,6 +1194,44 @@
new String(Base64.encode(md.digest()));
validated = password.equals(digestedPassword);
}
+ } else if (password.startsWith("{SSHA}")) {
+ // Bugzilla 32938
+ /* sync since super.digest() does this same thing */
+ synchronized (this) {
+ password = password.substring(6);
+
+ md.reset();
+ md.update(credentials.getBytes());
+
+ // Decode stored password.
+ ByteChunk pwbc = new ByteChunk(password.length());
+ try {
+ pwbc.append(password.getBytes(), 0,
password.length());
+ } catch (IOException e) {
+ // Should never happen
+ containerLog.error("Could not append password bytes
to chunk: ", e);
+ }
+
+ CharChunk decoded = new CharChunk();
+ Base64.decode(pwbc, decoded);
+ char[] pwarray = decoded.getBuffer();
+
+ // Split decoded password into hash and salt.
+ final int saltpos = 20;
+ byte[] hash = new byte[saltpos];
+ for (int i=0; i< hash.length; i++) {
+ hash[i] = (byte) pwarray[i];
+ }
+
+ byte[] salt = new byte[pwarray.length - saltpos];
+ for (int i=0; i< salt.length; i++)
+ salt[i] = (byte)pwarray[i+saltpos];
+
+ md.update(salt);
+ byte[] dp = md.digest();
+
+ validated = Arrays.equals(dp, hash);
+ } // End synchronized(this) block
} else {
// Hex hashes should be compared case-insensitive
validated = (digest(credentials).equalsIgnoreCase(password));
1.246 +3 -0 jakarta-tomcat-catalina/webapps/docs/changelog.xml
Index: changelog.xml
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/webapps/docs/changelog.xml,v
retrieving revision 1.245
retrieving revision 1.246
diff -u -r1.245 -r1.246
--- changelog.xml 23 Mar 2005 15:02:58 -0000 1.245
+++ changelog.xml 23 Mar 2005 15:17:17 -0000 1.246
@@ -81,6 +81,9 @@
<update>
<bug>33636</bug>: Set lastModified attribute when expanding WAR
files. (yoavs)
</update>
+ <update>
+ <bug>32938</bug>: Allow Salted SHA (SSHA) passwords in JNDIRealm.
(yoavs)
+ </update>
</changelog>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]