Author: remm
Date: Wed Jan 22 14:39:51 2014
New Revision: 1560363

URL: http://svn.apache.org/r1560363
Log:
- Drop the code from SSO (I didn't know StandardSession.expire was already 
setting the context CL.
- Add bind/unbind to StandardSession.expire instead (and only do it if the 
classloader actually changes).
- See later if the bind/unbind code can be moved to StandardContext, but all 
uses seem slightly different.

Modified:
    tomcat/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java
    tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
    tomcat/trunk/java/org/apache/catalina/session/StandardSession.java

Modified: tomcat/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java?rev=1560363&r1=1560362&r2=1560363&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/SingleSignOn.java Wed 
Jan 22 14:39:51 2014
@@ -20,23 +20,17 @@ package org.apache.catalina.authenticato
 
 
 import java.io.IOException;
-import java.security.AccessController;
 import java.security.Principal;
-import java.security.PrivilegedAction;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.Cookie;
 
-import org.apache.catalina.Context;
-import org.apache.catalina.Globals;
-import org.apache.catalina.Manager;
 import org.apache.catalina.Realm;
 import org.apache.catalina.Session;
 import org.apache.catalina.SessionEvent;
 import org.apache.catalina.SessionListener;
-import org.apache.catalina.ThreadBindingListener;
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
 import org.apache.catalina.valves.ValveBase;
@@ -421,15 +415,7 @@ public class SingleSignOn extends ValveB
                 reverse.remove(sessions[i]);
             }
             // Invalidate this session
-            ClassLoader oldContextClassLoader = null;
-            try {
-                oldContextClassLoader = bindThread(sessions[i]);
-                sessions[i].expire();
-            } finally {
-                if (oldContextClassLoader != null) {
-                    unbindThread(sessions[i], oldContextClassLoader);
-                }
-            }
+            sessions[i].expire();
         }
 
         // NOTE:  Clients may still possess the old single sign on cookie,
@@ -438,97 +424,6 @@ public class SingleSignOn extends ValveB
 
     }
 
-    protected ClassLoader bindThread(Session session) {
-
-        Manager manager = session.getManager();
-        Context context = null;
-        ClassLoader contextClassLoader = null;
-        ThreadBindingListener threadBindingListener = null;
-        if (manager != null) {
-            context = manager.getContext();
-        }
-        if (context != null) {
-            if (context.getLoader() != null && 
context.getLoader().getClassLoader() != null) {
-                contextClassLoader = context.getLoader().getClassLoader();
-            }
-            threadBindingListener = context.getThreadBindingListener();
-        }
-        if (threadBindingListener == null || contextClassLoader == null) {
-            return null;
-        }
-
-        if (Globals.IS_SECURITY_ENABLED) {
-            return AccessController.doPrivileged(new 
PrivilegedBind(contextClassLoader, threadBindingListener));
-        } else {
-            ClassLoader oldContextClassLoader =
-                    Thread.currentThread().getContextClassLoader();
-            Thread.currentThread().setContextClassLoader(contextClassLoader);
-            threadBindingListener.bind();
-            return oldContextClassLoader;
-        }
-
-    }
-
-    protected class PrivilegedBind implements PrivilegedAction<ClassLoader> {
-        private ClassLoader contextClassLoader;
-        private ThreadBindingListener threadBindingListener;
-
-        PrivilegedBind(ClassLoader contextClassLoader, ThreadBindingListener 
threadBindingListener) {
-            this.contextClassLoader = contextClassLoader;
-            this.threadBindingListener = threadBindingListener;
-        }
-
-        @Override
-        public ClassLoader run() {
-            ClassLoader oldContextClassLoader =
-                    Thread.currentThread().getContextClassLoader();
-            Thread.currentThread().setContextClassLoader(contextClassLoader);
-            threadBindingListener.bind();
-            return oldContextClassLoader;
-        }
-    }
-
-    protected void unbindThread(Session session, ClassLoader 
oldContextClassLoader) {
-
-        Manager manager = session.getManager();
-        Context context = null;
-        ThreadBindingListener threadBindingListener = null;
-        if (manager != null) {
-            context = manager.getContext();
-        }
-        if (context != null) {
-            threadBindingListener = context.getThreadBindingListener();
-        }
-        if (threadBindingListener == null) {
-            return;
-        }
-
-        if (Globals.IS_SECURITY_ENABLED) {
-            AccessController.doPrivileged(new 
PrivilegedUnbind(oldContextClassLoader, threadBindingListener));
-        } else {
-            threadBindingListener.unbind();
-            
Thread.currentThread().setContextClassLoader(oldContextClassLoader);
-        }
-
-    }
-
-    protected class PrivilegedUnbind implements PrivilegedAction<Void> {
-        private ClassLoader oldContextClassLoader;
-        private ThreadBindingListener threadBindingListener;
-
-        PrivilegedUnbind(ClassLoader oldContextClassLoader, 
ThreadBindingListener threadBindingListener) {
-            this.oldContextClassLoader = oldContextClassLoader;
-            this.threadBindingListener = threadBindingListener;
-        }
-
-        @Override
-        public Void run() {
-            threadBindingListener.unbind();
-            
Thread.currentThread().setContextClassLoader(oldContextClassLoader);
-            return null;
-        }
-    }
-
     /**
      * Attempts reauthentication to the given <code>Realm</code> using
      * the credentials associated with the single sign-on session

Modified: tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java?rev=1560363&r1=1560362&r2=1560363&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java Wed 
Jan 22 14:39:51 2014
@@ -42,7 +42,6 @@ public final class SecurityClassLoad {
             return;
         }
 
-        loadAuthenticatorPackage(loader);
         loadCorePackage(loader);
         loadCoyotePackage(loader);
         loadLoaderPackage(loader);
@@ -56,18 +55,6 @@ public final class SecurityClassLoad {
     }
 
 
-    private static final void loadAuthenticatorPackage(ClassLoader loader)
-            throws Exception {
-        final String basePackage = "org.apache.catalina.authenticator.";
-        loader.loadClass
-            (basePackage +
-             "SingleSignOn$PrivilegedBind");
-        loader.loadClass
-            (basePackage +
-             "SingleSignOn$PrivilegedUnbind");
-   }
-
-
     private static final void loadCorePackage(ClassLoader loader)
             throws Exception {
         final String basePackage = "org.apache.catalina.core.";
@@ -148,7 +135,9 @@ public final class SecurityClassLoad {
         loader.loadClass
             (basePackage + "StandardSession");
         loader.loadClass
-            (basePackage + "StandardSession$PrivilegedSetTccl");
+            (basePackage + "StandardSession$PrivilegedBind");
+        loader.loadClass
+            (basePackage + "StandardSession$PrivilegedUnbind");
         loader.loadClass
             (basePackage + "StandardSession$1");
         loader.loadClass

Modified: tomcat/trunk/java/org/apache/catalina/session/StandardSession.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/StandardSession.java?rev=1560363&r1=1560362&r2=1560363&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/session/StandardSession.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/session/StandardSession.java Wed Jan 
22 14:39:51 2014
@@ -53,6 +53,7 @@ import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
 import org.apache.catalina.SessionEvent;
 import org.apache.catalina.SessionListener;
+import org.apache.catalina.ThreadBindingListener;
 import org.apache.catalina.TomcatPrincipal;
 import org.apache.catalina.security.SecurityUtil;
 import org.apache.tomcat.util.ExceptionUtils;
@@ -802,20 +803,9 @@ public class StandardSession implements 
             // The call to expire() may not have been triggered by the webapp.
             // Make sure the webapp's class loader is set when calling the
             // listeners
-            ClassLoader oldTccl = null;
-            if (context.getLoader() != null &&
-                    context.getLoader().getClassLoader() != null) {
-                oldTccl = Thread.currentThread().getContextClassLoader();
-                if (Globals.IS_SECURITY_ENABLED) {
-                    PrivilegedAction<Void> pa = new PrivilegedSetTccl(
-                            context.getLoader().getClassLoader());
-                    AccessController.doPrivileged(pa);
-                } else {
-                    Thread.currentThread().setContextClassLoader(
-                            context.getLoader().getClassLoader());
-                }
-            }
+            ClassLoader oldContextClassLoader = null;
             try {
+                oldContextClassLoader = bindThread(context);
                 if (notify) {
                     Object listeners[] = 
context.getApplicationLifecycleListeners();
                     if (listeners != null && listeners.length > 0) {
@@ -848,15 +838,7 @@ public class StandardSession implements 
                     }
                 }
             } finally {
-                if (oldTccl != null) {
-                    if (Globals.IS_SECURITY_ENABLED) {
-                        PrivilegedAction<Void> pa =
-                            new PrivilegedSetTccl(oldTccl);
-                        AccessController.doPrivileged(pa);
-                    } else {
-                        Thread.currentThread().setContextClassLoader(oldTccl);
-                    }
-                }
+                unbindThread(context, oldContextClassLoader);
             }
 
             if (ACTIVITY_CHECK) {
@@ -897,6 +879,99 @@ public class StandardSession implements 
     }
 
 
+    protected ClassLoader bindThread(Context context) {
+
+        ClassLoader contextClassLoader = null;
+        ThreadBindingListener threadBindingListener = null;
+        if (context != null) {
+            if (context.getLoader() != null && 
context.getLoader().getClassLoader() != null) {
+                contextClassLoader = context.getLoader().getClassLoader();
+            }
+            threadBindingListener = context.getThreadBindingListener();
+        }
+        if (threadBindingListener == null || contextClassLoader == null) {
+            return null;
+        }
+
+        if (Globals.IS_SECURITY_ENABLED) {
+            return AccessController.doPrivileged(new 
PrivilegedBind(contextClassLoader, threadBindingListener));
+        } else {
+            ClassLoader oldContextClassLoader =
+                    Thread.currentThread().getContextClassLoader();
+            if (oldContextClassLoader == contextClassLoader) {
+                return null;
+            } else {
+                
Thread.currentThread().setContextClassLoader(contextClassLoader);
+                threadBindingListener.bind();
+                return oldContextClassLoader;
+            }
+        }
+
+    }
+
+    protected class PrivilegedBind implements PrivilegedAction<ClassLoader> {
+        private ClassLoader contextClassLoader;
+        private ThreadBindingListener threadBindingListener;
+
+        PrivilegedBind(ClassLoader contextClassLoader, ThreadBindingListener 
threadBindingListener) {
+            this.contextClassLoader = contextClassLoader;
+            this.threadBindingListener = threadBindingListener;
+        }
+
+        @Override
+        public ClassLoader run() {
+            ClassLoader oldContextClassLoader =
+                    Thread.currentThread().getContextClassLoader();
+            if (oldContextClassLoader == contextClassLoader) {
+                return null;
+            } else {
+                
Thread.currentThread().setContextClassLoader(contextClassLoader);
+                threadBindingListener.bind();
+                return oldContextClassLoader;
+            }
+        }
+    }
+
+    protected void unbindThread(Context context, ClassLoader 
oldContextClassLoader) {
+
+        if (oldContextClassLoader == null) {
+            return;
+        }
+        ThreadBindingListener threadBindingListener = null;
+        if (context != null) {
+            threadBindingListener = context.getThreadBindingListener();
+        }
+        if (threadBindingListener == null) {
+            return;
+        }
+
+        if (Globals.IS_SECURITY_ENABLED) {
+            AccessController.doPrivileged(new 
PrivilegedUnbind(oldContextClassLoader, threadBindingListener));
+        } else {
+            threadBindingListener.unbind();
+            
Thread.currentThread().setContextClassLoader(oldContextClassLoader);
+        }
+
+    }
+
+    protected class PrivilegedUnbind implements PrivilegedAction<Void> {
+        private ClassLoader oldContextClassLoader;
+        private ThreadBindingListener threadBindingListener;
+
+        PrivilegedUnbind(ClassLoader oldContextClassLoader, 
ThreadBindingListener threadBindingListener) {
+            this.oldContextClassLoader = oldContextClassLoader;
+            this.threadBindingListener = threadBindingListener;
+        }
+
+        @Override
+        public Void run() {
+            threadBindingListener.unbind();
+            
Thread.currentThread().setContextClassLoader(oldContextClassLoader);
+            return null;
+        }
+    }
+
+
     /**
      * Perform the internal processing required to passivate
      * this session.
@@ -1838,22 +1913,6 @@ public class StandardSession implements 
     }
 
 
-    private static class PrivilegedSetTccl
-    implements PrivilegedAction<Void> {
-
-        private ClassLoader cl;
-
-        PrivilegedSetTccl(ClassLoader cl) {
-            this.cl = cl;
-        }
-
-        @Override
-        public Void run() {
-            Thread.currentThread().setContextClassLoader(cl);
-            return null;
-        }
-    }
-
 }
 
 



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

Reply via email to