Author: jgallimore
Date: Mon Aug 22 20:35:23 2011
New Revision: 1160418

URL: http://svn.apache.org/viewvc?rev=1160418&view=rev
Log:
Add security and work contexts to connector support

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/ConnectorCallbackHandler.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/SecurityContextHandler.java
Modified:
    
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/SimpleBootstrapContext.java

Modified: 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java?rev=1160418&r1=1160417&r2=1160418&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
 Mon Aug 22 20:35:23 2011
@@ -321,6 +321,8 @@ public class TomcatWebAppBuilder impleme
     @Override
     public void start(StandardContext standardContext) {
         if (isIgnored(standardContext)) return;
+        
+        CoreContainerSystem cs = getContainerSystem();
 
         Assembler a = getAssembler();
         if (a == null) {
@@ -346,6 +348,13 @@ public class TomcatWebAppBuilder impleme
                 }
             }
         }
+        
+        if (appContext == null) {
+               String contextRoot = standardContext.getName();
+               if (contextRoot.startsWith("/")) {
+                       contextRoot = contextRoot.replaceAll("^/+", "");
+               }
+        }
 
         contextInfo.standardContext = standardContext;
 
@@ -355,6 +364,11 @@ public class TomcatWebAppBuilder impleme
             for (WebAppInfo w : contextInfo.appInfo.webApps) {
                 if (("/" + w.contextRoot).equals(standardContext.getPath()) || 
isRootApplication(standardContext)) {
                     webAppInfo = w;
+                    
+                    if (appContext == null) {
+                       appContext = 
cs.getAppContext(contextInfo.appInfo.appId);
+                    }
+                    
                     break;
                 }
             }
@@ -380,7 +394,7 @@ public class TomcatWebAppBuilder impleme
                 
webContext.setClassLoader(standardContext.getLoader().getClassLoader());
                 webContext.getInjections().addAll(injections);
                 appContext.getWebContexts().add(webContext);
-                getContainerSystem().addWebContext(webContext);
+                cs.addWebContext(webContext);
             } catch (Exception e) {
                 logger.error("Error merging OpenEJB JNDI entries in to war " + 
standardContext.getPath() + ": Exception: " + e.getMessage(), e);
             }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1160418&r1=1160417&r2=1160418&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Mon Aug 22 20:35:23 2011
@@ -16,7 +16,59 @@
  */
 package org.apache.openejb.assembler.classic;
 
+import java.io.File;
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.Instrumentation;
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.naming.Binding;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NameAlreadyBoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.persistence.EntityManagerFactory;
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.work.WorkManager;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
+import javax.validation.ValidationException;
+import javax.validation.ValidatorFactory;
+
+import org.apache.geronimo.connector.GeronimoBootstrapContext;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
+import org.apache.geronimo.connector.work.HintsContextHandler;
 import org.apache.geronimo.connector.work.TransactionContextHandler;
 import org.apache.geronimo.connector.work.WorkContextHandler;
 import org.apache.geronimo.transaction.manager.GeronimoTransactionManager;
@@ -42,6 +94,7 @@ import org.apache.openejb.core.Transacti
 import org.apache.openejb.core.WebContext;
 import org.apache.openejb.core.ivm.naming.IvmContext;
 import org.apache.openejb.core.ivm.naming.IvmJndiFactory;
+import org.apache.openejb.core.security.SecurityContextHandler;
 import org.apache.openejb.core.timer.EjbTimerServiceImpl;
 import org.apache.openejb.core.timer.NullEjbTimerServiceImpl;
 import org.apache.openejb.core.timer.ScheduleData;
@@ -1345,7 +1398,19 @@ public class Assembler extends Assembler
             if (transactionManager instanceof GeronimoTransactionManager) {
                 GeronimoTransactionManager geronimoTransactionManager = 
(GeronimoTransactionManager) transactionManager;
                 TransactionContextHandler txWorkContextHandler = new 
TransactionContextHandler(geronimoTransactionManager);
-                workManager = new GeronimoWorkManager(threadPool, threadPool, 
threadPool, 
Collections.<WorkContextHandler>singletonList(txWorkContextHandler));
+                
+                // use id as default realm name if realm is not specified in 
service properties
+                String securityRealmName = 
getStringProperty(serviceInfo.properties, "realm", serviceInfo.id);
+                                
+                SecurityContextHandler securityContextHandler = new 
SecurityContextHandler(securityRealmName);
+                HintsContextHandler hintsContextHandler = new 
HintsContextHandler();
+                
+                Collection<WorkContextHandler> workContextHandlers = new 
ArrayList<WorkContextHandler>();
+                workContextHandlers.add(txWorkContextHandler);
+                workContextHandlers.add(securityContextHandler);
+                workContextHandlers.add(hintsContextHandler);
+                
+                workManager = new GeronimoWorkManager(threadPool, threadPool, 
threadPool, workContextHandlers);
             } else {
                 workManager = new SimpleWorkManager(threadPool);
             }
@@ -1353,7 +1418,9 @@ public class Assembler extends Assembler
 
             // BootstrapContext: wraps the WorkMananger and XATerminator
             BootstrapContext bootstrapContext;
-            if (transactionManager instanceof XATerminator) {
+            if (transactionManager instanceof GeronimoTransactionManager) {
+               bootstrapContext = new 
GeronimoBootstrapContext((GeronimoWorkManager)workManager, 
(GeronimoTransactionManager)transactionManager, 
(GeronimoTransactionManager)transactionManager);
+            } else if (transactionManager instanceof XATerminator) {
                 bootstrapContext = new SimpleBootstrapContext(workManager, 
(XATerminator) transactionManager);
             } else {
                 bootstrapContext = new SimpleBootstrapContext(workManager);
@@ -1361,7 +1428,7 @@ public class Assembler extends Assembler
 
             // start the resource adapter
             try {
-                logger.debug("createResource.startingResourceAdapter", 
serviceInfo.id, service.getClass().getName());
+               logger.debug("createResource.startingResourceAdapter", 
serviceInfo.id, service.getClass().getName());
                 resourceAdapter.start(bootstrapContext);
             } catch (ResourceAdapterInternalException e) {
                 throw new OpenEJBException(e);
@@ -1423,7 +1490,7 @@ public class Assembler extends Assembler
     }
 
     private int getIntProperty(Properties properties, String propertyName, int 
defaultValue) {
-        String propertyValue = properties.getProperty(propertyName);
+        String propertyValue = getStringProperty(properties, propertyName, 
Integer.toString(defaultValue));
         if (propertyValue == null) {
             return defaultValue;
         }
@@ -1434,6 +1501,15 @@ public class Assembler extends Assembler
         }
     }
 
+    private String getStringProperty(Properties properties, String 
propertyName, String defaultValue) {
+        String propertyValue = properties.getProperty(propertyName);
+        if (propertyValue == null) {
+            return defaultValue;
+        }
+
+        return propertyValue;
+    }
+    
     public void createConnectionManager(ConnectionManagerInfo serviceInfo) 
throws OpenEJBException {
 
         ObjectRecipe serviceRecipe = createRecipe(serviceInfo);

Added: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/ConnectorCallbackHandler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/ConnectorCallbackHandler.java?rev=1160418&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/ConnectorCallbackHandler.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/ConnectorCallbackHandler.java
 Mon Aug 22 20:35:23 2011
@@ -0,0 +1,85 @@
+package org.apache.openejb.core.security;
+
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.message.callback.CallerPrincipalCallback;
+import javax.security.auth.message.callback.CertStoreCallback;
+import javax.security.auth.message.callback.GroupPrincipalCallback;
+import javax.security.auth.message.callback.PasswordValidationCallback;
+import javax.security.auth.message.callback.PrivateKeyCallback;
+import javax.security.auth.message.callback.SecretKeyCallback;
+import javax.security.auth.message.callback.TrustStoreCallback;
+
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.SecurityService;
+
+/**
+ * Spec 16.4.1: must support CallerPrincipalCallback, GroupPrincipalCallback, 
PasswordValidationCallback. Recommended to support CertStoreCallback, 
PrivateKeyCallback, SecretKeyCallback, and TrustStoreCallback.
+ * 
+ * @version $Rev: 925911 $ $Date: 2010-03-21 22:03:35 +0000 (Sun, 21 Mar 2010) 
$
+ */
+public class ConnectorCallbackHandler implements CallbackHandler {
+
+       private Principal callerPrincipal;
+       private String[] groupsArray;
+       private final String securityRealmName;
+
+       public ConnectorCallbackHandler(String securityRealmName) {
+               this.securityRealmName = securityRealmName;
+       }
+
+       public void handle(Callback[] callbacks) throws IOException, 
UnsupportedCallbackException {
+               for (Callback callback : callbacks) {
+                       // jaspi to server communication
+                       if (callback instanceof CallerPrincipalCallback) {
+                               callerPrincipal = ((CallerPrincipalCallback) 
callback).getPrincipal();
+                       } else if (callback instanceof GroupPrincipalCallback) {
+                               groupsArray = ((GroupPrincipalCallback) 
callback).getGroups();
+                       } else if (callback instanceof 
PasswordValidationCallback) {
+                               PasswordValidationCallback 
passwordValidationCallback = (PasswordValidationCallback) callback;
+                               Subject subject = 
passwordValidationCallback.getSubject();
+                               final String userName = 
passwordValidationCallback.getUsername();
+                               final char[] password = 
passwordValidationCallback.getPassword();
+
+                               SecurityService securityService = 
SystemInstance.get().getComponent(SecurityService.class);
+                               try {
+                                       Object loginObj = 
securityService.login(securityRealmName, userName, password == null ? "" : new 
String(password));
+                                       securityService.associate(loginObj);
+                                       callerPrincipal = 
securityService.getCallerPrincipal();
+                                       
passwordValidationCallback.setResult(true);
+                               } catch (LoginException e) {
+                                       
passwordValidationCallback.setResult(false);
+                               }
+                       }
+                       // server to jaspi communication
+                       // TODO implement these
+                       else if (callback instanceof CertStoreCallback) {
+                       
+                       } else if (callback instanceof PrivateKeyCallback) {
+                       
+                       } else if (callback instanceof SecretKeyCallback) {
+                       
+                       } else if (callback instanceof TrustStoreCallback) {
+                       
+                       } else {
+                               throw new 
UnsupportedCallbackException(callback);
+                       }
+               }
+       }
+
+       public Principal getCallerPrincipal() {
+               return callerPrincipal;
+       }
+
+       public List<String> getGroups() {
+               return groupsArray == null ? null : Arrays.asList(groupsArray);
+       }
+}
\ No newline at end of file

Added: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/SecurityContextHandler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/SecurityContextHandler.java?rev=1160418&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/SecurityContextHandler.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/SecurityContextHandler.java
 Mon Aug 22 20:35:23 2011
@@ -0,0 +1,50 @@
+package org.apache.openejb.core.security;
+
+import javax.resource.spi.work.SecurityContext;
+import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkContext;
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginException;
+
+import org.apache.geronimo.connector.work.WorkContextHandler;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.SecurityService;
+
+public class SecurityContextHandler implements 
WorkContextHandler<SecurityContext>{
+
+    private ConnectorCallbackHandler callbackHandler;
+       private final String securityRealmName;
+
+       public SecurityContextHandler(String securityRealmName) {
+               this.securityRealmName = securityRealmName;
+       }
+
+       public void before(SecurityContext securityContext) throws 
WorkCompletedException {
+        if (securityContext != null) {
+            callbackHandler = new ConnectorCallbackHandler(securityRealmName);
+            
+            Subject clientSubject = new Subject();
+                       securityContext.setupSecurityContext(callbackHandler, 
clientSubject, null);
+        }
+    }
+
+    public void after(SecurityContext securityContext) throws 
WorkCompletedException {
+       SecurityService securityService = 
SystemInstance.get().getComponent(SecurityService.class);
+       Object loginObj = securityService.disassociate();
+       if (loginObj != null) {
+               try {
+                               securityService.logout(loginObj);
+                       } catch (LoginException e) {
+                       }
+       }
+    }
+
+       public boolean supports(Class<? extends WorkContext> clazz) {
+               return SecurityContext.class.isAssignableFrom(clazz);
+       }
+
+       public boolean required() {
+               return false;
+       }
+
+}

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/SimpleBootstrapContext.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/SimpleBootstrapContext.java?rev=1160418&r1=1160417&r2=1160418&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/SimpleBootstrapContext.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/SimpleBootstrapContext.java
 Mon Aug 22 20:35:23 2011
@@ -24,6 +24,8 @@ import javax.resource.spi.work.WorkConte
 import javax.resource.spi.work.WorkManager;
 import javax.transaction.TransactionSynchronizationRegistry;
 
+import org.apache.geronimo.connector.work.GeronimoWorkManager;
+
 public class SimpleBootstrapContext implements BootstrapContext {
     private final WorkManager workManager;
     private final XATerminator xaTerminator;
@@ -58,8 +60,12 @@ public class SimpleBootstrapContext impl
         return null;
     }
 
-    public boolean isContextSupported(Class<? extends WorkContext> arg0) {
-        // TODO: add work context support
+    public boolean isContextSupported(Class<? extends WorkContext> cls) {
+        if (workManager instanceof GeronimoWorkManager) {
+               GeronimoWorkManager geronimoWorkManager = (GeronimoWorkManager) 
workManager;
+               return geronimoWorkManager.isContextSupported(cls);
+        }
+        
         return false;
     }
 }


Reply via email to