Author: markt
Date: Wed Feb  1 14:49:51 2006
New Revision: 374199

URL: http://svn.apache.org/viewcvs?rev=374199&view=rev
Log:
Port changes for CLIENT-CERT in JNDIRealm from TC5.
Addresses bug 7831

Modified:
    
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java
    
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/RealmBase.java

Modified: 
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java
URL: 
http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java?rev=374199&r1=374198&r2=374199&view=diff
==============================================================================
--- 
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java
 (original)
+++ 
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/JNDIRealm.java
 Wed Feb  1 14:49:51 2006
@@ -998,10 +998,6 @@
             log("  dn=" + dn);
         }
 
-        // Return if no attributes to retrieve
-        if (attrIds == null || attrIds.length == 0)
-            return new User(username, dn, null, null);
-
         // Get required attributes from user entry
         Attributes attrs = null;
         try {
@@ -1474,10 +1470,74 @@
      */
     protected Principal getPrincipal(String username) {
 
-        return (null);
+        DirContext context = null;
+        Principal principal = null;
+
+        try {
+
+            // Ensure that we have a directory context available
+            context = open();
+
+            // Occassionally the directory context will timeout.  Try one more
+            // time before giving up.
+            try {
+
+                // Authenticate the specified username if possible
+                principal = getPrincipal(context, username);
+
+            } catch (CommunicationException e) {
+
+                // log the exception so we know it's there.
+                log(sm.getString("jndiRealm.exception"), e);
+
+                // close the connection so we know it will be reopened.
+                if (context != null)
+                    close(context);
+
+                // open a new directory context.
+                context = open();
+
+                // Try the authentication again.
+                principal = getPrincipal(context, username);
+
+            }
+
+
+            // Release this context
+            release(context);
+
+            // Return the authenticated Principal (if any)
+            return (principal);
+
+        } catch (NamingException e) {
+
+            // Log the problem for posterity
+            log(sm.getString("jndiRealm.exception"), e);
+
+            // Close the connection so that it gets reopened next time
+            if (context != null)
+                close(context);
+
+            // Return "not authenticated" for this request
+            return (null);
+
+        }
 
     }
 
+
+    /**
+     * Return the Principal associated with the given user name.
+     */
+    protected synchronized Principal getPrincipal(DirContext context,
+                                                  String username)
+        throws NamingException {
+        
+        User user = getUser(context, username);
+        
+        return new GenericPrincipal(this, user.username, user.password ,
+                getRoles(context, user));
+    }
 
 
     /**

Modified: 
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/RealmBase.java
URL: 
http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/RealmBase.java?rev=374199&r1=374198&r2=374199&view=diff
==============================================================================
--- 
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/RealmBase.java
 (original)
+++ 
tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/RealmBase.java
 Wed Feb  1 14:49:51 2006
@@ -413,7 +413,7 @@
         }
 
         // Check the existence of the client Principal in our database
-        return (getPrincipal(certs[0].getSubjectDN().getName()));
+        return (getPrincipal(certs[0]));
 
     }
 
@@ -673,6 +673,13 @@
     protected abstract Principal getPrincipal(String username);
 
 
+    /**
+     * Return the Principal associated with the given certificate.
+     */
+    protected Principal getPrincipal(X509Certificate usercert) {
+        return(getPrincipal(usercert.getSubjectDN().getName()));
+    }
+    
     /**
      * Log a message on the Logger associated with our Container (if any)
      *



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to