You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2007/12/23 22:55:39 UTC

svn commit: r606621 - /tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java

Author: markt
Date: Sun Dec 23 13:55:38 2007
New Revision: 606621

URL: http://svn.apache.org/viewvc?rev=606621&view=rev
Log:
Fix 44084 with a patch provided by Noah Levitt. I also made a few additional fixes to line lengths etc.

Modified:
    tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java

Modified: tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java?rev=606621&r1=606620&r2=606621&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java (original)
+++ tomcat/trunk/java/org/apache/catalina/realm/JAASRealm.java Sun Dec 23 13:55:38 2007
@@ -241,21 +241,19 @@
      }
      
      /**
-      * Sets the list of comma-delimited classes that represent 
-      * roles. The classes in the list must implement <code>java.security.Principal</code>.
-      * When this accessor is called (for example, by a <code>Digester</code>
-      * instance parsing the
-      * configuration file), it will parse the class names and store the resulting
-      * string(s) into the <code>ArrayList</code> field </code>roleClasses</code>.
+      * Sets the list of comma-delimited classes that represent roles. The
+      * classes in the list must implement <code>java.security.Principal</code>.
+      * The supplied list of classes will be parsed when {@link #start()} is
+      * called.
       */
      public void setRoleClassNames(String roleClassNames) {
          this.roleClassNames = roleClassNames;
-         parseClassNames(roleClassNames, roleClasses);
      }
      
      /**
       * Parses a comma-delimited list of class names, and store the class names
-      * in the provided List. Each class must implement <codejava.security.Principal</code>.
+      * in the provided List. Each class must implement
+      * <code>java.security.Principal</code>.
       * 
       * @param classNamesString a comma-delimited list of fully qualified class names.
       * @param classNamesList the list in which the class names will be stored.
@@ -264,12 +262,17 @@
      protected void parseClassNames(String classNamesString, List<String> classNamesList) {
          classNamesList.clear();
          if (classNamesString == null) return;
-         
+
+         ClassLoader loader = this.getClass().getClassLoader();
+         if (isUseContextClassLoader())
+             loader = Thread.currentThread().getContextClassLoader();
+
          String[] classNames = classNamesString.split("[ ]*,[ ]*");
          for (int i=0; i<classNames.length; i++) {
              if (classNames[i].length()==0) continue;        
              try {
-                 Class principalClass = Class.forName(classNames[i]);
+                 Class principalClass = Class.forName(classNames[i], false,
+                         loader);
                  if (Principal.class.isAssignableFrom(principalClass)) {
                      classNamesList.add(classNames[i]);
                  } else {
@@ -293,16 +296,13 @@
      }
      
      /**
-     * Sets the list of comma-delimited classes that represent individual
-     * users. The classes in the list must implement <code>java.security.Principal</code>.
-     * When this accessor is called (for example, by a <code>Digester</code>
-     * instance parsing the
-     * configuration file), it will parse the class names and store the resulting
-     * string(s) into the <code>ArrayList</code> field </code>userClasses</code>.
-     */
+      * Sets the list of comma-delimited classes that represent individual
+      * users. The classes in the list must implement
+      * <code>java.security.Principal</code>. The supplied list of classes will
+      * be parsed when {@link #start()} is called.
+      */
     public void setUserClassNames(String userClassNames) {
         this.userClassNames = userClassNames;
-        parseClassNames(userClassNames, userClasses);
     }
 
 
@@ -335,9 +335,10 @@
         // What if the LoginModule is in the container class loader ?
         ClassLoader ocl = null;
 
-        if (isUseContextClassLoader()) {
-          ocl=Thread.currentThread().getContextClassLoader();
-          Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+        if (!isUseContextClassLoader()) {
+          ocl = Thread.currentThread().getContextClassLoader();
+          Thread.currentThread().setContextClassLoader(
+                  this.getClass().getClassLoader());
         }
 
         try {
@@ -348,7 +349,7 @@
             log.error(sm.getString("jaasRealm.unexpectedError"), e);
             return (null);
         } finally {
-            if( isUseContextClassLoader()) {
+            if(!isUseContextClassLoader()) {
               Thread.currentThread().setContextClassLoader(ocl);
             }
         }
@@ -462,9 +463,9 @@
         Principal userPrincipal = null;
 
         // Scan the Principals for this Subject
-        Iterator principals = subject.getPrincipals().iterator();
+        Iterator<Principal> principals = subject.getPrincipals().iterator();
         while (principals.hasNext()) {
-            Principal principal = (Principal) principals.next();
+            Principal principal = principals.next();
 
             String principalClass = principal.getClass().getName();
 
@@ -547,6 +548,10 @@
         // Perform normal superclass initialization
         super.start();
 
+        // These need to be called after loading configuration, in case
+        // useContextClassLoader appears after them in xml config
+        parseClassNames(userClassNames, userClasses);
+        parseClassNames(roleClassNames, roleClasses);
     }
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org