You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jg...@apache.org on 2005/04/17 19:01:03 UTC

svn commit: r161667 - in geronimo/trunk/modules/tomcat: ./ src/java/org/apache/geronimo/tomcat/ src/java/org/apache/geronimo/tomcat/deployment/ src/java/org/apache/geronimo/tomcat/valve/ src/plan/ src/test/org/apache/geronimo/tomcat/

Author: jgenender
Date: Sun Apr 17 10:01:00 2005
New Revision: 161667

URL: http://svn.apache.org/viewcvs?view=rev&rev=161667
Log:
Updated to use new security gbean and removed parameter in container to set the endorsed dir (it never worked)

Modified:
    geronimo/trunk/modules/tomcat/project.xml
    geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatContainer.java
    geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatGeronimoRealm.java
    geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatWebAppContext.java
    geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java
    geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/valve/PolicyContextValve.java
    geronimo/trunk/modules/tomcat/src/plan/tomcat-plan.xml
    geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/AbstractWebModuleTest.java
    geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/JACCSecurityTest.java

Modified: geronimo/trunk/modules/tomcat/project.xml
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/project.xml?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/project.xml (original)
+++ geronimo/trunk/modules/tomcat/project.xml Sun Apr 17 10:01:00 2005
@@ -116,6 +116,11 @@
         </dependency>
         <dependency>
             <groupId>geronimo</groupId>
+            <artifactId>geronimo-security-builder</artifactId>
+            <version>${pom.currentVersion}</version>
+        </dependency>
+        <dependency>
+            <groupId>geronimo</groupId>
             <artifactId>geronimo-system</artifactId>
             <version>${pom.currentVersion}</version>
         </dependency>

Modified: geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatContainer.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatContainer.java?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatContainer.java (original)
+++ geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatContainer.java Sun Apr 17 10:01:00 2005
@@ -74,12 +74,7 @@
     private Context defaultContext;
 
     /**
-     * The java.endorsed.dirs directories
-     */
-    private String endorsedDirs = System.getProperty("java.endorsed.dirs");
-
-    /**
-     * Used only to resolve the path to the endorsed standards dir
+     * Used only to resolve the paths
      */
     private ServerInfo serverInfo;
 
@@ -111,10 +106,8 @@
     public void doStart() throws Exception {
         log.debug("doStart()");
 
-        // set endorsed dirs (so it's not mandatory to set it up by a user
-        // anymore)
-        System.setProperty("java.endorsed.dirs", serverInfo.resolvePath(getEndorsedDirs()));
-
+        log.info("Endorsed Dirs set to:" + System.getProperty("java.endorsed.dirs"));
+        
         // The comments are from the javadoc of the Embedded class
 
         // 1. Instantiate a new instance of this class.
@@ -218,14 +211,6 @@
         System.setProperty("catalina.home", catalinaHome);
     }
 
-    public String getEndorsedDirs() {
-        return endorsedDirs;
-    }
-
-    public void setEndorsedDirs(String endorsedDirs) {
-        this.endorsedDirs = endorsedDirs;
-    }
-
     public void addConnector(Connector connector) {
         embedded.addConnector(connector);
     }
@@ -242,7 +227,6 @@
         infoFactory.setConstructor(new String[] { "catalinaHome", "ServerInfo" });
 
         infoFactory.addAttribute("catalinaHome", String.class, true);
-        infoFactory.addAttribute("endorsedDirs", String.class, true);
 
         infoFactory.addReference("ServerInfo", ServerInfo.class, "GBean");
 

Modified: geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatGeronimoRealm.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatGeronimoRealm.java?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatGeronimoRealm.java (original)
+++ geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatGeronimoRealm.java Sun Apr 17 10:01:00 2005
@@ -76,13 +76,13 @@
 
     private static final Log log = LogFactory.getLog(TomcatGeronimoRealm.class);
 
-    private String policyContextID = null;
-    private PolicyConfigurationFactory factory = null;
-    private PolicyConfiguration policyConfiguration = null;
-    private Subject defaultSubject = null;
-    private PermissionCollection checked = new Permissions();
-    private Map roleDesignates = new HashMap();
-    private String loginDomainName = null;
+    private final String policyContextID;
+    private final Subject defaultSubject;
+	private final DefaultPrincipal defaultPrincipal;
+    private final PermissionCollection checked;
+    private final PermissionCollection excluded;
+    private final Map roleDesignates;
+    private final String loginDomainName;
 
     private Context context = null;
     private static ThreadLocal currentRequest = new ThreadLocal();
@@ -98,15 +98,23 @@
     protected static final String name = "TomcatGeronimoRealm";
 
     public TomcatGeronimoRealm(String policyContextID,
-                               Security securityConfig,
+                               DefaultPrincipal defaultPrincipal,
                                String loginDomainName,
-                               Set securityRoles,
-                               PermissionCollection uncheckedPermissions,
+                               PermissionCollection checkedPermissions,
                                PermissionCollection excludedPermissions,
-                               Map rolePermissions) throws PolicyContextException, ClassNotFoundException {
+                               Map roleDesignates) 
+            throws PolicyContextException, ClassNotFoundException {
 
+        assert policyContextID != null;
+        assert defaultPrincipal != null;
+        
         this.policyContextID = policyContextID;
-        this.defaultSubject = ConfigurationUtil.generateDefaultSubject(securityConfig.getDefaultPrincipal());
+        this.defaultPrincipal = defaultPrincipal;
+        this.loginDomainName = loginDomainName;
+        this.defaultSubject = ConfigurationUtil.generateDefaultSubject(defaultPrincipal);
+        this.checked = checkedPermissions;
+        this.excluded = excludedPermissions;
+        this.roleDesignates = roleDesignates;
 
         /**
          * Register our default subject with the ContextManager
@@ -115,26 +123,7 @@
         SubjectId id = ContextManager.getSubjectId(defaultSubject);
         defaultSubject.getPrincipals().add(new IdentificationPrincipal(id));
 
-        factory = PolicyConfigurationFactory.getPolicyConfigurationFactory();
-        policyConfiguration = factory.getPolicyConfiguration(policyContextID, true);
-
-        configure(uncheckedPermissions, excludedPermissions, rolePermissions);
-        RoleMappingConfiguration roleMapper = RoleMappingConfigurationFactory.getRoleMappingFactory().getRoleMappingConfiguration(policyContextID, false);
-        addRoleMappings(securityRoles, securityConfig, roleMapper);
-        policyConfiguration.commit();
-        this.loginDomainName = loginDomainName;
-
-        Set allRolePermissions = new HashSet();
-        for (Iterator iterator = rolePermissions.entrySet().iterator(); iterator.hasNext();) {
-            Map.Entry entry = (Map.Entry) iterator.next();
-            Set permissionsForRole = (Set) entry.getValue();
-            allRolePermissions.addAll(permissionsForRole);
-        }
-        for (Iterator iterator = allRolePermissions.iterator(); iterator.hasNext();) {
-            Permission permission = (Permission) iterator.next();
-            checked.add(permission);
-        }
-    }
+     }
 
     /**
      * Enforce any user data constraint required by the security constraint
@@ -178,6 +167,7 @@
             /**
              * JACC v1.0 secion 4.1.1
              */
+            WebUserDataPermission wudp = new WebUserDataPermission(request);
             acc.checkPermission(new WebUserDataPermission(request));
 
         } catch (AccessControlException ace) {
@@ -468,93 +458,6 @@
     }
 
 
-    public void addRoleMappings(Set securityRoles, Security security, RoleMappingConfiguration roleMapper) throws PolicyContextException, GeronimoSecurityException {
-
-        for (Iterator roleMappings = security.getRoleMappings().values().iterator(); roleMappings.hasNext();) {
-            Role role = (Role) roleMappings.next();
-            String roleName = role.getRoleName();
-            Set principalSet = new HashSet();
-
-            if (!securityRoles.contains(roleName)) {
-                throw new GeronimoSecurityException("Role does not exist in this configuration");
-            }
-
-            Subject roleDesignate = new Subject();
-
-            for (Iterator realms = role.getRealms().values().iterator(); realms.hasNext();) {
-                Realm realm = (Realm) realms.next();
-
-                for (Iterator principals = realm.getPrincipals().iterator(); principals.hasNext();) {
-                    org.apache.geronimo.security.deploy.Principal principal = (org.apache.geronimo.security.deploy.Principal) principals.next();
-
-                    RealmPrincipal realmPrincipal = ConfigurationUtil.generateRealmPrincipal(principal, realm.getRealmName());
-                    if (realmPrincipal == null) {
-                        throw new GeronimoSecurityException("Unable to create realm principal");
-                    }
-
-                    principalSet.add(realmPrincipal);
-                    if (principal.isDesignatedRunAs()) {
-                        roleDesignate.getPrincipals().add(realmPrincipal);
-                    }
-                }
-            }
-
-            for (Iterator names = role.getDNames().iterator(); names.hasNext();) {
-                DistinguishedName dn = (DistinguishedName) names.next();
-
-                X500Principal x500Principal = ConfigurationUtil.generateX500Principal(dn.getName());
-
-                principalSet.add(x500Principal);
-                if (dn.isDesignatedRunAs()) {
-                    roleDesignate.getPrincipals().add(x500Principal);
-                }
-            }
-
-            roleMapper.addRoleMapping(roleName, principalSet);
-
-            if (roleDesignate.getPrincipals().size() > 0) {
-                setRoleDesignate(roleName, roleDesignate);
-            }
-        }
-
-        /**
-         * Register the role designates with the context manager.
-         */
-        for (Iterator iter = roleDesignates.keySet().iterator(); iter.hasNext();) {
-            String roleName = (String) iter.next();
-            Subject roleDesignate = (Subject) roleDesignates.get(roleName);
-
-            ContextManager.registerSubject(roleDesignate);
-            SubjectId id = ContextManager.getSubjectId(roleDesignate);
-            roleDesignate.getPrincipals().add(new IdentificationPrincipal(id));
-        }
-
-    }
-
-    private void setRoleDesignate(String roleName, Subject subject) {
-        roleDesignates.put(roleName, subject);
-    }
-
-    private void configure(PermissionCollection uncheckedPermissions,
-                           PermissionCollection excludedPermissions,
-                           Map rolePermissions) throws GeronimoSecurityException {
-        try {
-            policyConfiguration.addToExcludedPolicy(excludedPermissions);
-            policyConfiguration.addToUncheckedPolicy(uncheckedPermissions);
-            for (Iterator iterator = rolePermissions.entrySet().iterator(); iterator.hasNext();) {
-                Map.Entry entry = (Map.Entry) iterator.next();
-                String roleName = (String) entry.getKey();
-                Set permissions = (Set) entry.getValue();
-                for (Iterator iterator1 = permissions.iterator(); iterator1.hasNext();) {
-                    Permission permission = (Permission) iterator1.next();
-                    policyConfiguration.addToRole(roleName, permission);
-                }
-            }
-        } catch (PolicyContextException e) {
-            throw new GeronimoSecurityException(e);
-        }
-    }
-
     /**
      * Prepare for active use of the public methods of this <code>Component</code>.
      *
@@ -581,23 +484,8 @@
         // Perform normal superclass finalization
         super.stop();
 
-        for (Iterator iter = roleDesignates.keySet().iterator(); iter.hasNext();) {
-            String roleName = (String) iter.next();
-            Subject roleDesignate = (Subject) roleDesignates.get(roleName);
-
-            ContextManager.unregisterSubject(roleDesignate);
-        }
+        // Remove the defaultSubject
         ContextManager.unregisterSubject(defaultSubject);
-
-        try {
-
-            if (policyConfiguration != null)
-                policyConfiguration.delete();
-
-        } catch (PolicyContextException pce) {
-            //Oh well, we tried
-        }
-
     }
 
     public void setContext(Context context) {

Modified: geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatWebAppContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatWebAppContext.java?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatWebAppContext.java (original)
+++ geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/TomcatWebAppContext.java Sun Apr 17 10:01:00 2005
@@ -20,6 +20,7 @@
 import java.net.URI;
 import java.net.URL;
 import java.security.PermissionCollection;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -36,10 +37,12 @@
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.gbean.GBeanLifecycle;
 import org.apache.geronimo.security.deploy.Security;
+import org.apache.geronimo.security.jacc.RoleDesignateSource;
 import org.apache.geronimo.naming.reference.KernelAwareReference;
 import org.apache.geronimo.naming.reference.ClassLoaderAwareReference;
 import org.apache.geronimo.naming.java.SimpleReadOnlyContext;
 import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.jmx.JMXUtil;
 import org.apache.geronimo.tomcat.valve.ComponentContextValve;
 import org.apache.geronimo.tomcat.valve.TransactionContextValve;
 import org.apache.geronimo.tomcat.valve.PolicyContextValve;
@@ -47,13 +50,16 @@
 import org.apache.geronimo.transaction.context.OnlineUserTransaction;
 import org.apache.geronimo.transaction.context.TransactionContextManager;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.j2ee.management.J2EEApplication;
+import org.apache.geronimo.j2ee.management.J2EEServer;
+import org.apache.geronimo.j2ee.management.impl.InvalidObjectNameException;
 
+import javax.management.ObjectName;
 import javax.naming.NamingException;
 
-
 /**
  * Wrapper for a WebApplicationContext that sets up its J2EE environment.
- *
+ * 
  * @version $Rev: 56022 $ $Date: 2004-10-30 07:16:18 +0200 (Sat, 30 Oct 2004) $
  */
 public class TomcatWebAppContext implements GBeanLifecycle, TomcatContext {
@@ -63,39 +69,58 @@
     protected final TomcatContainer container;
 
     protected Context context = null;
+
     private final URI webAppRoot;
+
     private String path = null;
+
     private String docBase = null;
 
     private final LoginConfig loginConfig;
+
     private final Realm tomcatRealm;
+
     private final Set securityConstraints;
+
     private final Set securityRoles;
+
     private final Map componentContext;
+
     private final Kernel kernel;
+
     private final TransactionContextManager transactionContextManager;
+
     private final String policyContextID;
 
-    public TomcatWebAppContext(URI webAppRoot,
-                               URI[] webClassPath,
-                               URL configurationBaseUrl,
-                               LoginConfig loginConfig,
-                               Realm tomcatRealm,
-                               Set securityConstraints,
-
-                               String policyContextID,
-                               String loginDomainName,
-                               Security securityConfig,
-                               Set securityRoles,
-                               PermissionCollection uncheckedPermissions,
-                               PermissionCollection excludedPermissions,
-                               Map rolePermissions,
-                               Map componentContext,
-                               OnlineUserTransaction userTransaction,
-                               TransactionContextManager transactionContextManager,
-                               TrackedConnectionAssociator trackedConnectionAssociator,
-                               TomcatContainer container,
-                               Kernel kernel) throws NamingException {
+    private final RoleDesignateSource roleDesignateSource;
+
+    private final J2EEServer server;
+
+    private final J2EEApplication application;
+
+    public TomcatWebAppContext(
+            String objectName, 
+            String originalSpecDD,
+            URI webAppRoot, 
+            URI[] webClassPath, 
+            URL configurationBaseUrl,
+            LoginConfig loginConfig, 
+            Realm tomcatRealm,
+            Set securityConstraints,
+            String policyContextID, 
+            String loginDomainName,
+            Security securityConfig, 
+            Set securityRoles,
+            Map componentContext, 
+            OnlineUserTransaction userTransaction,
+            TransactionContextManager transactionContextManager,
+            TrackedConnectionAssociator trackedConnectionAssociator,
+            TomcatContainer container, 
+            RoleDesignateSource roleDesignateSource,
+            J2EEServer server, 
+            J2EEApplication application, 
+            Kernel kernel)
+            throws NamingException {
 
         assert webAppRoot != null;
         assert webClassPath != null;
@@ -117,10 +142,27 @@
 
         this.componentContext = componentContext;
         this.transactionContextManager = transactionContextManager;
+
+        this.roleDesignateSource = roleDesignateSource;
+        this.server = server;
+        this.application = application;
+
         this.kernel = kernel;
+        ObjectName myObjectName = JMXUtil.getObjectName(objectName);
+        verifyObjectName(myObjectName);
+
+        if (tomcatRealm != null){
+            if (roleDesignateSource == null) {
+                throw new IllegalArgumentException("RoleDesignateSource must be supplied for a secure web app");
+            }            
+        }
+        userTransaction.setUp(transactionContextManager,
+                trackedConnectionAssociator);
 
-        userTransaction.setUp(transactionContextManager, trackedConnectionAssociator);
+    }
 
+    public String getServer() {
+        return server.getObjectName();
     }
 
     public String getDocBase() {
@@ -135,7 +177,7 @@
         context.setDocBase(webAppRoot.getPath());
         context.setPath(path);
 
-        //Security
+        // Security
         if (tomcatRealm != null) {
             if (tomcatRealm instanceof TomcatGeronimoRealm) {
                 ((TomcatGeronimoRealm) tomcatRealm).setContext(context);
@@ -167,13 +209,16 @@
         javax.naming.Context enc = null;
         try {
             if (componentContext != null) {
-                for (Iterator iterator = componentContext.values().iterator(); iterator.hasNext();) {
+                for (Iterator iterator = componentContext.values().iterator(); iterator
+                        .hasNext();) {
                     Object value = iterator.next();
                     if (value instanceof KernelAwareReference) {
                         ((KernelAwareReference) value).setKernel(kernel);
                     }
                     if (value instanceof ClassLoaderAwareReference) {
-                        ((ClassLoaderAwareReference) value).setClassLoader(context.getLoader().getClassLoader());
+                        ((ClassLoaderAwareReference) value)
+                                .setClassLoader(context.getLoader()
+                                        .getClassLoader());
                     }
                 }
                 enc = new SimpleReadOnlyContext(componentContext);
@@ -182,19 +227,21 @@
             log.error(ne);
         }
 
-        //Set the valves for the context
-        if (enc != null){
+        // Set the valves for the context
+        if (enc != null) {
             ComponentContextValve contextValve = new ComponentContextValve(enc);
             ((StandardContext) context).addValve(contextValve);
         }
 
-        if (transactionContextManager != null){
-            TransactionContextValve transactionValve = new TransactionContextValve(transactionContextManager);
+        if (transactionContextManager != null) {
+            TransactionContextValve transactionValve = new TransactionContextValve(
+                    transactionContextManager);
             ((StandardContext) context).addValve(transactionValve);
         }
 
-        if (policyContextID != null){
-            PolicyContextValve policyValve = new PolicyContextValve(policyContextID);
+        if (policyContextID != null) {
+            PolicyContextValve policyValve = new PolicyContextValve(
+                    policyContextID);
             ((StandardContext) context).addValve(policyValve);
         }
     }
@@ -215,6 +262,42 @@
         this.path = path;
     }
 
+    /**
+     * ObjectName must match this pattern: <p/>
+     * domain:j2eeType=WebModule,name=MyName,J2EEServer=MyServer,J2EEApplication=MyApplication
+     */
+    private void verifyObjectName(ObjectName objectName) {
+        if (objectName.isPattern()) {
+            throw new InvalidObjectNameException(
+                    "ObjectName can not be a pattern", objectName);
+        }
+        Hashtable keyPropertyList = objectName.getKeyPropertyList();
+        if (!NameFactory.WEB_MODULE.equals(keyPropertyList.get("j2eeType"))) {
+            throw new InvalidObjectNameException(
+                    "WebModule object name j2eeType property must be 'WebModule'",
+                    objectName);
+        }
+        if (!keyPropertyList.containsKey(NameFactory.J2EE_NAME)) {
+            throw new InvalidObjectNameException(
+                    "WebModule object must contain a name property", objectName);
+        }
+        if (!keyPropertyList.containsKey(NameFactory.J2EE_SERVER)) {
+            throw new InvalidObjectNameException(
+                    "WebModule object name must contain a J2EEServer property",
+                    objectName);
+        }
+        if (!keyPropertyList.containsKey(NameFactory.J2EE_APPLICATION)) {
+            throw new InvalidObjectNameException(
+                    "WebModule object name must contain a J2EEApplication property",
+                    objectName);
+        }
+        if (keyPropertyList.size() != 4) {
+            throw new InvalidObjectNameException(
+                    "WebModule object name can only have j2eeType, name, J2EEApplication, and J2EEServer properties",
+                    objectName);
+        }
+    }
+
     public void doStart() throws Exception {
 
         // See the note of TomcatContainer::addContext
@@ -240,58 +323,69 @@
     public static final GBeanInfo GBEAN_INFO;
 
     static {
-        GBeanInfoBuilder infoFactory = new GBeanInfoBuilder("Tomcat WebApplication Context", TomcatWebAppContext.class, NameFactory.WEB_MODULE);
-
-        infoFactory.addAttribute("webAppRoot", URI.class, true);
-        infoFactory.addAttribute("webClassPath", URI[].class, true);
-        infoFactory.addAttribute("configurationBaseUrl", URL.class, true);
-
-        infoFactory.addAttribute("path", String.class, true);
-
-        infoFactory.addAttribute("loginConfig", LoginConfig.class, true);
-
-        infoFactory.addAttribute("tomcatRealm", Realm.class, true);
-        infoFactory.addAttribute("securityConstraints", Set.class, true);
-
-        infoFactory.addAttribute("policyContextID", String.class, true);
-        infoFactory.addAttribute("loginDomainName", String.class, true);
-        infoFactory.addAttribute("securityConfig", Security.class, true);
-        infoFactory.addAttribute("securityRoles", Set.class, true);
-        infoFactory.addAttribute("uncheckedPermissions", PermissionCollection.class, true);
-        infoFactory.addAttribute("excludedPermissions", PermissionCollection.class, true);
-        infoFactory.addAttribute("rolePermissions", Map.class, true);
-
-        infoFactory.addAttribute("componentContext", Map.class, true);
-        infoFactory.addAttribute("userTransaction", OnlineUserTransaction.class, true);
-        infoFactory.addReference("TransactionContextManager", TransactionContextManager.class, NameFactory.JTA_RESOURCE);
-        infoFactory.addReference("TrackedConnectionAssociator", TrackedConnectionAssociator.class, NameFactory.JCA_RESOURCE);
-
-        infoFactory.addReference("Container", TomcatContainer.class, NameFactory.GERONIMO_SERVICE);
-        infoFactory.addAttribute("kernel", Kernel.class, false);
-
-        infoFactory.setConstructor(new String[]{
-            "webAppRoot",
-            "webClassPath",
-            "configurationBaseUrl",
-            "loginConfig",
-            "tomcatRealm",
-            "securityConstraints",
-            "policyContextID",
-            "loginDomainName",
-            "securityConfig",
-            "securityRoles",
-            "uncheckedPermissions",
-            "excludedPermissions",
-            "rolePermissions",
-            "componentContext",
-            "userTransaction",
-            "TransactionContextManager",
-            "TrackedConnectionAssociator",
-            "Container",
-            "kernel"
-        });
+        GBeanInfoBuilder infoBuilder = new GBeanInfoBuilder(
+                "Tomcat WebApplication Context", TomcatWebAppContext.class,
+                NameFactory.WEB_MODULE);
+
+        infoBuilder.addAttribute("objectName", String.class, false);
+        infoBuilder.addAttribute("deploymentDescriptor", String.class, true);
+        infoBuilder.addAttribute("webAppRoot", URI.class, true);
+        infoBuilder.addAttribute("webClassPath", URI[].class, true);
+        infoBuilder.addAttribute("configurationBaseUrl", URL.class, true);
+
+        infoBuilder.addAttribute("path", String.class, true);
+
+        infoBuilder.addAttribute("loginConfig", LoginConfig.class, true);
+
+        infoBuilder.addAttribute("tomcatRealm", Realm.class, true);
+        infoBuilder.addAttribute("securityConstraints", Set.class, true);
+
+        infoBuilder.addAttribute("policyContextID", String.class, true);
+        infoBuilder.addAttribute("loginDomainName", String.class, true);
+        infoBuilder.addAttribute("securityConfig", Security.class, true);
+        infoBuilder.addAttribute("securityRoles", Set.class, true);
+        infoBuilder.addAttribute("componentContext", Map.class, true);
+        infoBuilder.addAttribute("userTransaction",
+                OnlineUserTransaction.class, true);
+        infoBuilder.addReference("TransactionContextManager",
+                TransactionContextManager.class, NameFactory.JTA_RESOURCE);
+        infoBuilder.addReference("TrackedConnectionAssociator",
+                TrackedConnectionAssociator.class, NameFactory.JCA_RESOURCE);
+
+        infoBuilder.addReference("Container", TomcatContainer.class,
+                NameFactory.GERONIMO_SERVICE);
+        infoBuilder.addReference("RoleDesignateSource",
+                RoleDesignateSource.class, NameFactory.JACC_MANAGER);
+        infoBuilder.addReference("J2EEServer", J2EEServer.class);
+        infoBuilder.addReference("J2EEApplication", J2EEApplication.class);
+        infoBuilder.addAttribute("kernel", Kernel.class, false);
+
+        infoBuilder.setConstructor(new String[] { 
+                "objectName",
+                "deploymentDescriptor",
+                "webAppRoot", 
+                "webClassPath",
+                "configurationBaseUrl", 
+                "loginConfig", 
+                "tomcatRealm",
+                "securityConstraints", 
+                "policyContextID", 
+                "loginDomainName",
+                "securityConfig", 
+                "securityRoles", 
+                "componentContext",
+                "userTransaction", 
+                "TransactionContextManager",
+                "TrackedConnectionAssociator", 
+                "Container",
+                "RoleDesignateSource", 
+                "J2EEServer", 
+                "J2EEApplication",
+                "kernel" 
+                }
+        );
 
-        GBEAN_INFO = infoFactory.getBeanInfo();
+        GBEAN_INFO = infoBuilder.getBeanInfo();
     }
 
     public static GBeanInfo getGBeanInfo() {

Modified: geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java (original)
+++ geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java Sun Apr 17 10:01:00 2005
@@ -52,6 +52,9 @@
 import org.apache.geronimo.j2ee.j2eeobjectnames.J2eeContextImpl;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
 import org.apache.geronimo.schema.SchemaConversionUtils;
+import org.apache.geronimo.security.deploy.DefaultPrincipal;
+import org.apache.geronimo.security.deployment.SecurityBuilder;
+import org.apache.geronimo.security.deployment.SecurityConfiguration;
 import org.apache.geronimo.tomcat.TomcatWebAppContext;
 import org.apache.geronimo.xbeans.geronimo.jetty.JettyWebAppDocument;
 import org.apache.geronimo.xbeans.geronimo.jetty.JettyWebAppType;
@@ -113,6 +116,13 @@
         try {
             gbean = new GBeanData(TomcatWebAppContext.GBEAN_INFO);
 
+            gbean.setReferencePattern("J2EEServer", earContext.getServerObjectName());
+            if (!earContext.getJ2EEApplicationName().equals("null")) {
+                gbean.setReferencePattern("J2EEApplication", earContext.getApplicationObjectName());
+            }
+
+            gbean.setAttribute("deploymentDescriptor", module.getOriginalSpecDD());
+
             gbean.setName(webModuleName);
             gbean.setAttribute("webAppRoot", baseUri);
             gbean.setAttribute("webClassPath", webClassPath);
@@ -125,6 +135,7 @@
             gbean.setAttribute("path", webModule.getContextRoot());
 
             gbean.setReferencePattern("Container", tomcatContainerObjectName);
+            
         } catch (Exception e) {
             throw new DeploymentException("Unable to initialize webapp GBean", e);
         }

Modified: geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/valve/PolicyContextValve.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/valve/PolicyContextValve.java?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/valve/PolicyContextValve.java (original)
+++ geronimo/trunk/modules/tomcat/src/java/org/apache/geronimo/tomcat/valve/PolicyContextValve.java Sun Apr 17 10:01:00 2005
@@ -41,6 +41,7 @@
         String oldId = PolicyContext.getContextID();
 
         PolicyContext.setContextID(policyContextID);
+        PolicyContext.setHandlerData(request);
 
         // Pass this request on to the next valve in our pipeline
         getNext().invoke(request, response);

Modified: geronimo/trunk/modules/tomcat/src/plan/tomcat-plan.xml
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/plan/tomcat-plan.xml?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/plan/tomcat-plan.xml (original)
+++ geronimo/trunk/modules/tomcat/src/plan/tomcat-plan.xml Sun Apr 17 10:01:00 2005
@@ -88,7 +88,6 @@
     <gbean gbeanName="geronimo.server:type=WebContainer,container=Tomcat" class="org.apache.geronimo.tomcat.TomcatContainer">
         <attribute name="catalinaHome">var/catalina</attribute>
         <attribute name="port">8090</attribute>
-        <attribute name="endorsedDirs">lib</attribute>
         <reference name="ServerInfo"><gbean-name>geronimo.system:role=ServerInfo</gbean-name></reference>
     </gbean>
     <gbean gbeanName="geronimo.server:type=WebConnector,container=Tomcat,port=8090" class="org.apache.geronimo.tomcat.connector.HTTPConnector">

Modified: geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/AbstractWebModuleTest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/AbstractWebModuleTest.java?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/AbstractWebModuleTest.java (original)
+++ geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/AbstractWebModuleTest.java Sun Apr 17 10:01:00 2005
@@ -19,7 +19,9 @@
 import java.io.File;
 import java.net.URI;
 import java.security.PermissionCollection;
+import java.security.Permissions;
 import java.util.*;
+
 import javax.management.ObjectName;
 
 import junit.framework.TestCase;
@@ -34,11 +36,13 @@
 import org.apache.geronimo.kernel.Kernel;
 import org.apache.geronimo.kernel.management.State;
 import org.apache.geronimo.security.SecurityServiceImpl;
+import org.apache.geronimo.security.deploy.DefaultPrincipal;
 import org.apache.geronimo.security.deploy.Principal;
-import org.apache.geronimo.security.deploy.Security;
 import org.apache.geronimo.security.jaas.GeronimoLoginConfiguration;
 import org.apache.geronimo.security.jaas.JaasLoginService;
 import org.apache.geronimo.security.jaas.LoginModuleGBean;
+import org.apache.geronimo.security.jacc.ApplicationPolicyConfigurationManager;
+import org.apache.geronimo.security.jacc.ComponentPermissions;
 import org.apache.geronimo.security.realm.GenericSecurityRealm;
 import org.apache.geronimo.system.serverinfo.ServerInfo;
 import org.apache.geronimo.tomcat.connector.HTTPConnector;
@@ -104,13 +108,26 @@
     }
 
     protected ObjectName setUpJAASSecureAppContext(Set securityConstraints, Set securityRoles) throws Exception {
+        ObjectName jaccBeanName = NameFactory.getComponentName(null, null, null, null, "foo", NameFactory.JACC_MANAGER, moduleContext);
+        GBeanData jaccBeanData = new GBeanData(jaccBeanName, ApplicationPolicyConfigurationManager.GBEAN_INFO);
+        PermissionCollection excludedPermissions= new Permissions();
+        PermissionCollection uncheckedPermissions= new Permissions();
+        ComponentPermissions componentPermissions = new ComponentPermissions(excludedPermissions, uncheckedPermissions, new HashMap());
+        Map contextIDToPermissionsMap = new HashMap();
+        contextIDToPermissionsMap.put(POLICY_CONTEXT_ID, componentPermissions);
+        jaccBeanData.setAttribute("contextIdToPermissionsMap", contextIDToPermissionsMap);
+        jaccBeanData.setAttribute("principalRoleMap", new HashMap());
+        jaccBeanData.setAttribute("roleDesignates", new HashMap());
+        start(jaccBeanData);
+
         GBeanData app = new GBeanData(webModuleName, TomcatWebAppContext.GBEAN_INFO);
         app.setAttribute("webAppRoot", new File("target/var/catalina/webapps/war3/").toURI());
         app.setAttribute("webClassPath", new URI[]{});
         app.setAttribute("configurationBaseUrl", new File("target/var/catalina/webapps/war3/WEB-INF/web.xml").toURL());
         app.setAttribute("path", "/securetest");
         app.setAttribute("policyContextID", POLICY_CONTEXT_ID);
-
+        app.setReferencePattern("RoleDesignateSource", jaccBeanName);
+ 
         LoginConfig loginConfig = new LoginConfig();
         loginConfig.setAuthMethod(Constants.FORM_METHOD);
         loginConfig.setRealmName("Test JAAS Realm");
@@ -141,13 +158,23 @@
         return webModuleName;
     }
 
-    protected ObjectName setUpSecureAppContext(Security securityConfig,
-                                               Set securityConstraints,
-                                               PermissionCollection uncheckedPermissions,
-                                               PermissionCollection excludedPermissions,
-                                               Map rolePermissions,
+    protected ObjectName setUpSecureAppContext(Set securityConstraints,
+                                               Map roleDesignates, 
+                                               Map principalRoleMap,
+                                               ComponentPermissions componentPermissions, 
+                                               DefaultPrincipal defaultPrincipal, 
+                                               PermissionCollection checked,
                                                Set securityRoles)
             throws Exception {
+        
+        ObjectName jaccBeanName = NameFactory.getComponentName(null, null, null, null, "foo", NameFactory.JACC_MANAGER, moduleContext);
+        GBeanData jaccBeanData = new GBeanData(jaccBeanName, ApplicationPolicyConfigurationManager.GBEAN_INFO);
+        Map contextIDToPermissionsMap = new HashMap();
+        contextIDToPermissionsMap.put(POLICY_CONTEXT_ID, componentPermissions);
+        jaccBeanData.setAttribute("contextIdToPermissionsMap", contextIDToPermissionsMap);
+        jaccBeanData.setAttribute("principalRoleMap", principalRoleMap);
+        jaccBeanData.setAttribute("roleDesignates", roleDesignates);
+        start(jaccBeanData);
 
         GBeanData app = new GBeanData(webModuleName, TomcatWebAppContext.GBEAN_INFO);
         app.setAttribute("webAppRoot", new File("target/var/catalina/webapps/war3/").toURI());
@@ -155,6 +182,7 @@
         app.setAttribute("configurationBaseUrl", new File("target/var/catalina/webapps/war3/WEB-INF/web.xml").toURL());
         app.setAttribute("path", "/securetest");
         app.setAttribute("policyContextID", POLICY_CONTEXT_ID);
+        app.setReferencePattern("RoleDesignateSource", jaccBeanName);
  
         LoginConfig loginConfig = new LoginConfig();
         loginConfig.setAuthMethod(Constants.FORM_METHOD);
@@ -167,12 +195,11 @@
         app.setAttribute("securityRoles", securityRoles);
 
         TomcatGeronimoRealm realm = new TomcatGeronimoRealm(POLICY_CONTEXT_ID,
-                                                            securityConfig,
+                                                            defaultPrincipal,
                                                             "demo-properties-realm",
-                                                            securityRoles,
-                                                            uncheckedPermissions,
-                                                            excludedPermissions,
-                                                            rolePermissions);
+                                                            checked,
+                                                            componentPermissions.getExcludedPermissions(),
+                                                            roleDesignates);
         realm.setUserClassNames("org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal");
         realm.setRoleClassNames("org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal");
         app.setAttribute("tomcatRealm", realm);
@@ -264,7 +291,7 @@
         cl = this.getClass().getClassLoader();
         containerName = NameFactory.getWebComponentName(null, null, null, null, "tomcatContainer", "WebResource", moduleContext);
         connectorName = NameFactory.getWebComponentName(null, null, null, null, "tomcatConnector", "WebResource", moduleContext);
-        webModuleName = NameFactory.getWebComponentName(null, null, null, null, NameFactory.WEB_MODULE, "WebResource", moduleContext);
+        webModuleName = NameFactory.getModuleName(null, null, null, null, "testModule", moduleContext);
 
         tmName = NameFactory.getComponentName(null, null, null, null, "TransactionManager", NameFactory.JTA_RESOURCE, moduleContext);
         tcmName = NameFactory.getComponentName(null, null, null, null, "TransactionContextManager", NameFactory.JTA_RESOURCE, moduleContext);
@@ -283,7 +310,6 @@
         // Need to override the constructor for unit tests
         container = new GBeanData(containerName, TomcatContainer.GBEAN_INFO);
         container.setAttribute("catalinaHome", "target/var/catalina");
-        container.setAttribute("endorsedDirs", "target/endorsed");
         container.setReferencePattern("ServerInfo", serverInfoName);
 
         connector = new GBeanData(connectorName, HTTPConnector.GBEAN_INFO);

Modified: geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/JACCSecurityTest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/JACCSecurityTest.java?view=diff&r1=161666&r2=161667
==============================================================================
--- geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/JACCSecurityTest.java (original)
+++ geronimo/trunk/modules/tomcat/src/test/org/apache/geronimo/tomcat/JACCSecurityTest.java Sun Apr 17 10:01:00 2005
@@ -25,20 +25,28 @@
 import java.security.Permissions;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import javax.management.ObjectName;
+import javax.security.auth.Subject;
+import javax.security.auth.x500.X500Principal;
 import javax.security.jacc.WebResourcePermission;
 import javax.security.jacc.WebUserDataPermission;
 
 import org.apache.catalina.deploy.SecurityCollection;
 import org.apache.catalina.deploy.SecurityConstraint;
 
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.security.RealmPrincipal;
 import org.apache.geronimo.security.deploy.DefaultPrincipal;
+import org.apache.geronimo.security.deploy.DistinguishedName;
 import org.apache.geronimo.security.deploy.Principal;
 import org.apache.geronimo.security.deploy.Realm;
 import org.apache.geronimo.security.deploy.Role;
 import org.apache.geronimo.security.deploy.Security;
+import org.apache.geronimo.security.jacc.ComponentPermissions;
+import org.apache.geronimo.security.util.ConfigurationUtil;
 
 
 /**
@@ -56,6 +64,9 @@
      * @throws Exception thrown if an error in the test occurs
      */
     public void testExplicitMapping() throws Exception {
+        
+        Security securityConfig = new Security();
+        securityConfig.setUseContextHandler(false);
 
         Set constraints = new HashSet();
 
@@ -75,9 +86,6 @@
         sc.addCollection(coll);
         constraints.add(sc);
 
-        Security securityConfig = new Security();
-        securityConfig.setUseContextHandler(false);
-
         DefaultPrincipal defaultPrincipal = new DefaultPrincipal();
         defaultPrincipal.setRealmName("demo-properties-realm");
         Principal principal = new Principal();
@@ -86,7 +94,7 @@
         defaultPrincipal.setPrincipal(principal);
 
         securityConfig.setDefaultPrincipal(defaultPrincipal);
-
+        
         Role role = new Role();
         role.setRoleName("content-administrator");
         principal = new Principal();
@@ -98,7 +106,11 @@
         role.getRealms().put(realm.getRealmName(), realm);
 
         securityConfig.getRoleMappings().put(role.getRoleName(), role);
-
+        
+        Map roleDesignates = new HashMap();
+        Map principalRoleMap = new HashMap();
+        buildPrincipalRoleMap(securityConfig, roleDesignates, principalRoleMap);
+       
         PermissionCollection uncheckedPermissions = new Permissions();
 
         PermissionCollection excludedPermissions = new Permissions();
@@ -106,17 +118,22 @@
         excludedPermissions.add(new WebUserDataPermission("/auth/login.html", ""));
 
         Map rolePermissions = new HashMap();
-        Set permissions = new HashSet();
+        PermissionCollection permissions = new Permissions();
         permissions.add(new WebUserDataPermission("/protected/*", ""));
         permissions.add(new WebResourcePermission("/protected/*", ""));
         rolePermissions.put("content-administrator", permissions);
         rolePermissions.put("auto-administrator", permissions);
+        
+        PermissionCollection checked = permissions;
 
+        ComponentPermissions componentPermissions = new ComponentPermissions(excludedPermissions, uncheckedPermissions, rolePermissions);
+       
         Set securityRoles = new HashSet();
         securityRoles.add("content-administrator");
         securityRoles.add("auto-administrator");
 
-        startWebApp(securityConfig, constraints, uncheckedPermissions, excludedPermissions, rolePermissions, securityRoles);
+        startWebApp(constraints, roleDesignates, principalRoleMap,  componentPermissions,
+                defaultPrincipal, checked, securityRoles);
 
         //Begin the test
         HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:8080/securetest/protected/hello.txt").openConnection();
@@ -185,15 +202,17 @@
         stopWebApp();
     }
 
-    protected void startWebApp(Security securityConfig,
-                               Set securityConstraints,
-                               PermissionCollection uncheckedPermissions,
-                               PermissionCollection excludedPermissions,
-                               Map rolePermissions,
-                               Set securityRoles) throws Exception {
+    protected void startWebApp(
+            Set securityConstraints,
+            Map roleDesignates, 
+            Map principalRoleMap,
+            ComponentPermissions componentPermissions, 
+            DefaultPrincipal defaultPrincipal, 
+            PermissionCollection checked,
+            Set securityRoles) throws Exception {
 
-        appName = setUpSecureAppContext(securityConfig, securityConstraints, uncheckedPermissions,
-                                        excludedPermissions, rolePermissions, securityRoles);
+        appName = setUpSecureAppContext(securityConstraints, roleDesignates, principalRoleMap,
+                componentPermissions, defaultPrincipal, checked, securityRoles);
 
 
     }
@@ -202,6 +221,82 @@
         stop(appName);
     }
 
+    public static void buildPrincipalRoleMap(Security security, Map roleDesignates, Map principalRoleMap) throws DeploymentException {
+        Map roleToPrincipalMap = new HashMap();
+        buildRolePrincipalMap(security, roleDesignates, roleToPrincipalMap);
+        invertMap(roleToPrincipalMap, principalRoleMap);
+    }
+
+    private static Map invertMap(Map roleToPrincipalMap, Map principalRoleMapping) {
+        for (Iterator roles = roleToPrincipalMap.entrySet().iterator(); roles.hasNext();) {
+            Map.Entry entry = (Map.Entry) roles.next();
+            String role = (String) entry.getKey();
+            Set principals = (Set) entry.getValue();
+            for (Iterator iter = principals.iterator(); iter.hasNext();) {
+                java.security.Principal principal = (java.security.Principal) iter.next();
+
+                HashSet roleSet = (HashSet) principalRoleMapping.get(principal);
+                if (roleSet == null) {
+                    roleSet = new HashSet();
+                    principalRoleMapping.put(principal, roleSet);
+                }
+                roleSet.add(role);
+            }
+        }
+        return principalRoleMapping;
+    }
+
+    private static void buildRolePrincipalMap(Security security, Map roleDesignates, Map roleToPrincipalMap) throws DeploymentException {
+
+        Iterator rollMappings = security.getRoleMappings().values().iterator();
+        while (rollMappings.hasNext()) {
+            Role role = (Role) rollMappings.next();
+
+            String roleName = role.getRoleName();
+            Subject roleDesignate = new Subject();
+            Set principalSet = new HashSet();
+
+            Iterator realms = role.getRealms().values().iterator();
+            while (realms.hasNext()) {
+                Realm realm = (Realm) realms.next();
+
+                Iterator principals = realm.getPrincipals().iterator();
+                while (principals.hasNext()) {
+                    Principal principal = (Principal) principals.next();
+
+                    RealmPrincipal realmPrincipal = ConfigurationUtil.generateRealmPrincipal(principal, realm.getRealmName());
+
+                    if (realmPrincipal == null) throw new DeploymentException("Unable to create realm principal");
+
+                    principalSet.add(realmPrincipal);
+                    if (principal.isDesignatedRunAs()) roleDesignate.getPrincipals().add(realmPrincipal);
+                }
+            }
+
+            for (Iterator names = role.getDNames().iterator(); names.hasNext();) {
+                DistinguishedName dn = (DistinguishedName) names.next();
+
+                X500Principal x500Principal = ConfigurationUtil.generateX500Principal(dn.getName());
+
+                principalSet.add(x500Principal);
+                if (dn.isDesignatedRunAs()) {
+                    roleDesignate.getPrincipals().add(x500Principal);
+                }
+            }
+
+            Set roleMapping = (Set) roleToPrincipalMap.get(roleName);
+            if (roleMapping == null) {
+                roleMapping = new HashSet();
+                roleToPrincipalMap.put(roleName, roleMapping);
+            }
+            roleMapping.addAll(principalSet);
+
+            if (roleDesignate.getPrincipals().size() > 0) {
+                roleDesignates.put(roleName, roleDesignate);
+            }
+        }
+    }
+    
     protected void setUp() throws Exception {
         super.setUp();
         setUpSecurity();