You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/01/20 14:55:39 UTC

svn commit: r1435843 - in /tomee/tomee/trunk: container/openejb-core/src/main/java/org/apache/openejb/core/ivm/ container/openejb-core/src/main/java/org/apache/openejb/core/security/ container/openejb-core/src/main/java/org/apache/openejb/ri/sp/ contai...

Author: rmannibucau
Date: Sun Jan 20 13:55:38 2013
New Revision: 1435843

URL: http://svn.apache.org/viewvc?rev=1435843&view=rev
Log:
TOMEE-744 identity in our securityservice is a simple threadlocal. for @asynch we can't use an inherited threadlocal so simply propagating the security service state (identity often) to be able to use it in @asynch methods

Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java
    tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java Sun Jan 20 13:55:38 2013
@@ -22,7 +22,9 @@ import org.apache.openejb.OpenEJBExcepti
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.async.AsynchronousPool;
 import org.apache.openejb.core.ServerFederation;
+import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.spi.ApplicationServer;
+import org.apache.openejb.spi.SecurityService;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
@@ -231,10 +233,18 @@ public abstract class EjbObjectProxyHand
         final AsynchronousPool asynchronousPool = beanContext.getModuleContext().getAppContext().getAsynchronousPool();
 
         if (beanContext.isAsynchronous(method)) {
+            final SecurityService<?> securityService = SystemInstance.get().getComponent(SecurityService.class);
+            final Object state = securityService.currentState();
             return asynchronousPool.invoke(new Callable<Object>() {
                 @Override
                 public Object call() throws Exception {
-                    return synchronizedBusinessMethod(interfce, method, args);
+                    final Object threadState = securityService.currentState();
+                    securityService.setState(state);
+                    try {
+                        return synchronizedBusinessMethod(interfce, method, args);
+                    } finally {
+                        securityService.setState(threadState);
+                    }
                 }
             }, method.getReturnType() == Void.TYPE);
         } else {

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java Sun Jan 20 13:55:38 2013
@@ -335,6 +335,18 @@ public abstract class AbstractSecuritySe
         return new Subject(true, principals, new HashSet(), new HashSet());
     }
 
+    @Override
+    public Object currentState() {
+        return clientIdentity.get();
+    }
+
+    @Override
+    public void setState(final Object o) {
+        if (Identity.class.isInstance(o)) {
+            clientIdentity.set(Identity.class.cast(o));
+        }
+    }
+
     protected final static class SecurityContext {
 
         public final Subject subject;

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ri/sp/PseudoSecurityService.java Sun Jan 20 13:55:38 2013
@@ -70,4 +70,12 @@ public class PseudoSecurityService imple
     public boolean isCallerAuthorized(Method method, InterfaceType type) {
         return true;
     }
+
+    public void setState(Object o) {
+        // no-op
+    }
+
+    public Object currentState() {
+        return null;
+    }
 }
\ No newline at end of file

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/spi/SecurityService.java Sun Jan 20 13:55:38 2013
@@ -73,4 +73,7 @@ public interface SecurityService<T> exte
      */
     public boolean isCallerAuthorized(Method method, InterfaceType type);
 
+    // mainly for asynch handling
+    public void setState(Object o);
+    public Object currentState();
 }
\ No newline at end of file

Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java?rev=1435843&r1=1435842&r2=1435843&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java (original)
+++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatSecurityService.java Sun Jan 20 13:55:38 2013
@@ -139,6 +139,23 @@ public class TomcatSecurityService exten
         return roles;
     }
 
+    @Override
+    public Principal getCallerPrincipal() {
+        final Identity currentIdentity = clientIdentity.get();
+        if (currentIdentity != null) {
+            final Set<Principal> principals = currentIdentity.getSubject().getPrincipals();
+            for (final Principal principal : principals) {
+                if (principal.getClass().isAnnotationPresent(CallerPrincipal.class)) {
+                    return principal;
+                }
+            }
+            if (!principals.isEmpty()) {
+                return principals.iterator().next();
+            }
+        }
+        return super.getCallerPrincipal();
+    }
+
     public Object enterWebApp(Realm realm, Principal principal, String runAs) {
         Identity newIdentity = null;
         if (principal != null) {
@@ -160,8 +177,13 @@ public class TomcatSecurityService exten
 
     public void exitWebApp(Object state) {
         if (state instanceof WebAppState) {
-            WebAppState webAppState = (WebAppState) state;
-            clientIdentity.set(webAppState.oldIdentity);
+            final WebAppState webAppState = (WebAppState) state;
+            if (webAppState.oldIdentity == null) {
+                clientIdentity.remove();
+            } else {
+                clientIdentity.set(webAppState.oldIdentity);
+            }
+
             if (webAppState.hadRunAs) {
                 runAsStack.get().removeFirst();
             }