maguro      2004/11/11 12:08:50

  Modified:    modules/openejb-builder/src/java/org/openejb/deployment
                        CMPEntityBuilder.java EntityBuilder.java
                        OpenEJBModuleBuilder.java SessionBuilder.java
  Added:       modules/openejb-builder/src/java/org/openejb/deployment
                        ContainerSecurityBuilder.java
  Removed:     modules/openejb-builder/src/java/org/openejb/deployment
                        SecurityBuilder.java
  Log:

  Renamed SecurityBuilder to ContainerSecurityBuilder.
  
  Revision  Changes    Path
  1.5       +6 -6      
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java
  
  Index: CMPEntityBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CMPEntityBuilder.java     11 Nov 2004 13:27:44 -0000      1.4
  +++ CMPEntityBuilder.java     11 Nov 2004 17:08:50 -0000      1.5
  @@ -547,12 +547,12 @@
           
builder.setNonTransactedTimerName(earContext.getNonTransactedTimerName());
   
           Permissions toBeChecked = new Permissions();
  -        SecurityBuilder securityBuilder = 
getModuleBuilder().getSecurityBuilder();
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Home", 
builder.getHomeInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "LocalHome", 
builder.getLocalHomeInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Remote", 
builder.getRemoteInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Local", 
builder.getLocalInterfaceName(), cl);
  -        securityBuilder.fillContainerBuilderSecurity(builder,
  +        ContainerSecurityBuilder containerSecurityBuilder = 
getModuleBuilder().getSecurityBuilder();
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Home", builder.getHomeInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"LocalHome", builder.getLocalHomeInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Remote", builder.getRemoteInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Local", builder.getLocalInterfaceName(), cl);
  +        containerSecurityBuilder.fillContainerBuilderSecurity(builder,
                   toBeChecked,
                   security,
                   ((EjbJarType) ejbModule.getSpecDD()).getAssemblyDescriptor(),
  
  
  
  1.3       +6 -6      
openejb/modules/openejb-builder/src/java/org/openejb/deployment/EntityBuilder.java
  
  Index: EntityBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/EntityBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- EntityBuilder.java        10 Nov 2004 04:38:31 -0000      1.2
  +++ EntityBuilder.java        11 Nov 2004 17:08:50 -0000      1.3
  @@ -123,12 +123,12 @@
           
builder.setNonTransactedTimerName(earContext.getNonTransactedTimerName());
   
           Permissions toBeChecked = new Permissions();
  -        SecurityBuilder securityBuilder = 
getModuleBuilder().getSecurityBuilder();
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Home", 
builder.getHomeInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "LocalHome", 
builder.getLocalHomeInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Remote", 
builder.getRemoteInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Local", 
builder.getLocalInterfaceName(), cl);
  -        securityBuilder.fillContainerBuilderSecurity(builder,
  +        ContainerSecurityBuilder containerSecurityBuilder = 
getModuleBuilder().getSecurityBuilder();
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Home", builder.getHomeInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"LocalHome", builder.getLocalHomeInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Remote", builder.getRemoteInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Local", builder.getLocalInterfaceName(), cl);
  +        containerSecurityBuilder.fillContainerBuilderSecurity(builder,
                   toBeChecked,
                   security,
                   ((EjbJarType) ejbModule.getSpecDD()).getAssemblyDescriptor(),
  
  
  
  1.6       +8 -7      
openejb/modules/openejb-builder/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java
  
  Index: OpenEJBModuleBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- OpenEJBModuleBuilder.java 11 Nov 2004 14:21:13 -0000      1.5
  +++ OpenEJBModuleBuilder.java 11 Nov 2004 17:08:50 -0000      1.6
  @@ -79,6 +79,7 @@
   import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
   import org.apache.geronimo.schema.SchemaConversionUtils;
   import org.apache.geronimo.security.deploy.Security;
  +import org.apache.geronimo.security.deployment.SecurityBuilder;
   import org.apache.geronimo.xbeans.geronimo.naming.GerResourceLocatorType;
   import org.apache.geronimo.xbeans.j2ee.EjbJarDocument;
   import org.apache.geronimo.xbeans.j2ee.EjbJarType;
  @@ -121,14 +122,14 @@
       private final SessionBuilder sessionBuilder;
       private final EntityBuilder entityBuilder;
       private final MdbBuilder mdbBuilder;
  -    private final SecurityBuilder securityBuilder;
  +    private final ContainerSecurityBuilder containerSecurityBuilder;
       private final SkeletonGenerator skeletonGenerator;
   
       public OpenEJBModuleBuilder(Kernel kernel, URI defaultParentId, 
SkeletonGenerator skeletonGenerator) {
           this.kernel = kernel;
           this.defaultParentId = defaultParentId;
           this.skeletonGenerator = skeletonGenerator;
  -        this.securityBuilder = new SecurityBuilder(this);
  +        this.containerSecurityBuilder = new ContainerSecurityBuilder(this);
           this.cmpEntityBuilder = new CMPEntityBuilder(this);
           this.sessionBuilder = new SessionBuilder(this);
           this.entityBuilder = new EntityBuilder(this);
  @@ -139,8 +140,8 @@
           return kernel;
       }
   
  -    public SecurityBuilder getSecurityBuilder() {
  -        return securityBuilder;
  +    public ContainerSecurityBuilder getSecurityBuilder() {
  +        return containerSecurityBuilder;
       }
   
       public SkeletonGenerator getSkeletonGenerator() {
  @@ -314,7 +315,7 @@
                } catch (CompilerException e) {
                    throw new DeploymentException("Unable to generate CORBA 
skels for: " + moduleUri, e);
                } finally {
  -                 tempJar.delete();
  +                DeploymentUtil.recursiveDelete(tempJar);
                }
           }
       }
  @@ -435,7 +436,7 @@
               transactionPolicyHelper = new TransactionPolicyHelper();
           }
   
  -        Security security = 
org.apache.geronimo.security.deployment.SecurityBuilder.buildSecurityConfig(openejbEjbJar.getSecurity());
  +        Security security = 
SecurityBuilder.buildSecurityConfig(openejbEjbJar.getSecurity());
   
           EnterpriseBeansType enterpriseBeans = ejbJar.getEnterpriseBeans();
   
  
  
  
  1.3       +7 -7      
openejb/modules/openejb-builder/src/java/org/openejb/deployment/SessionBuilder.java
  
  Index: SessionBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/SessionBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SessionBuilder.java       10 Nov 2004 04:38:31 -0000      1.2
  +++ SessionBuilder.java       11 Nov 2004 17:08:50 -0000      1.3
  @@ -95,14 +95,14 @@
   
           ContainerBuilder builder = null;
           Permissions toBeChecked = new Permissions();
  -        SecurityBuilder securityBuilder = 
getModuleBuilder().getSecurityBuilder();
  +        ContainerSecurityBuilder containerSecurityBuilder = 
getModuleBuilder().getSecurityBuilder();
           boolean isStateless = 
"Stateless".equals(sessionBean.getSessionType().getStringValue());
           if (isStateless) {
               builder = new StatelessContainerBuilder();
               
builder.setTransactedTimerName(earContext.getTransactedTimerName());
               
builder.setNonTransactedTimerName(earContext.getNonTransactedTimerName());
               
builder.setServiceEndpointName(OpenEJBModuleBuilder.getJ2eeStringValue(sessionBean.getServiceEndpoint()));
  -            securityBuilder.addToPermissions(toBeChecked, ejbName, 
"ServiceEndpoint", builder.getServiceEndpointName(), cl);
  +            containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"ServiceEndpoint", builder.getServiceEndpointName(), cl);
           } else {
               builder = new StatefulContainerBuilder();
           }
  @@ -115,12 +115,12 @@
           
builder.setLocalHomeInterfaceName(OpenEJBModuleBuilder.getJ2eeStringValue(sessionBean.getLocalHome()));
           
builder.setLocalInterfaceName(OpenEJBModuleBuilder.getJ2eeStringValue(sessionBean.getLocal()));
   
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Home", 
builder.getHomeInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "LocalHome", 
builder.getLocalHomeInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Remote", 
builder.getRemoteInterfaceName(), cl);
  -        securityBuilder.addToPermissions(toBeChecked, ejbName, "Local", 
builder.getLocalInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Home", builder.getHomeInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"LocalHome", builder.getLocalHomeInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Remote", builder.getRemoteInterfaceName(), cl);
  +        containerSecurityBuilder.addToPermissions(toBeChecked, ejbName, 
"Local", builder.getLocalInterfaceName(), cl);
   
  -        securityBuilder.fillContainerBuilderSecurity(builder,
  +        containerSecurityBuilder.fillContainerBuilderSecurity(builder,
                   toBeChecked,
                   security,
                   ((EjbJarType) ejbModule.getSpecDD()).getAssemblyDescriptor(),
  
  
  
  1.1                  
openejb/modules/openejb-builder/src/java/org/openejb/deployment/ContainerSecurityBuilder.java
  
  Index: ContainerSecurityBuilder.java
  ===================================================================
  /* ====================================================================
   * Redistribution and use of this software and associated documentation
   * ("Software"), with or without modification, are permitted provided
   * that the following conditions are met:
   *
   * 1. Redistributions of source code must retain copyright
   *    statements and notices.  Redistributions must also contain a
   *    copy of this document.
   *
   * 2. Redistributions in binary form must reproduce this list of
   *    conditions and the following disclaimer in the documentation
   *    and/or other materials provided with the distribution.
   *
   * 3. The name "OpenEJB" must not be used to endorse or promote
   *    products derived from this Software without prior written
   *    permission of The OpenEJB Group.  For written permission,
   *    please contact [EMAIL PROTECTED]
   *
   * 4. Products derived from this Software may not be called "OpenEJB"
   *    nor may "OpenEJB" appear in their names without prior written
   *    permission of The OpenEJB Group. OpenEJB is a registered
   *    trademark of The OpenEJB Group.
   *
   * 5. Due credit should be given to the OpenEJB Project
   *    (http://openejb.org/).
   *
   * THIS SOFTWARE IS PROVIDED BY THE OPENEJB GROUP AND CONTRIBUTORS
   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   * THE OPENEJB GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the OpenEJB Project.  For more information
   * please see <http://openejb.org/>.
   *
   * ====================================================================
   */
  package org.openejb.deployment;
  
  import javax.management.MalformedObjectNameException;
  import javax.management.ObjectName;
  import javax.security.auth.Subject;
  import javax.security.jacc.EJBMethodPermission;
  import javax.security.jacc.EJBRoleRefPermission;
  import java.lang.reflect.Method;
  import java.security.Permission;
  import java.security.Permissions;
  import java.util.Enumeration;
  import java.util.HashSet;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.Set;
  
  import org.apache.geronimo.deployment.DeploymentException;
  import org.apache.geronimo.security.GeronimoSecurityException;
  import org.apache.geronimo.security.PrimaryRealmPrincipal;
  import org.apache.geronimo.security.RealmPrincipal;
  import org.apache.geronimo.security.deploy.AutoMapAssistant;
  import org.apache.geronimo.security.deploy.DefaultPrincipal;
  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.realm.SecurityRealm;
  import org.apache.geronimo.security.util.ConfigurationUtil;
  import org.apache.geronimo.xbeans.j2ee.AssemblyDescriptorType;
  import org.apache.geronimo.xbeans.j2ee.ExcludeListType;
  import org.apache.geronimo.xbeans.j2ee.JavaTypeType;
  import org.apache.geronimo.xbeans.j2ee.MethodPermissionType;
  import org.apache.geronimo.xbeans.j2ee.MethodType;
  import org.apache.geronimo.xbeans.j2ee.RoleNameType;
  import org.apache.geronimo.xbeans.j2ee.SecurityIdentityType;
  import org.apache.geronimo.xbeans.j2ee.SecurityRoleRefType;
  
  import org.openejb.security.SecurityConfiguration;
  
  
  class ContainerSecurityBuilder {
  
      protected final OpenEJBModuleBuilder moduleBuilder;
  
      public ContainerSecurityBuilder(final OpenEJBModuleBuilder moduleBuilder) 
{
          super();
          this.moduleBuilder = moduleBuilder;
      }
  
  
      /**
       * Fill the container moduleBuilder with the security information that it 
needs
       * to create the proper interceptors.  A 
<code>SecurityConfiguration</code>
       * is also filled with permissions that need to be used to fill the JACC
       * policy configuration.
       *
       * @param builder            the container moduleBuilder that is to be 
filled
       * @param notAssigned        the set of all possible permissions.  These 
will be
       *                           culled so that all that are left are those 
that have
       *                           not been assigned roles.
       * @param security           the OpenEJB security information already 
parsed
       *                           from XML descriptor into a POJO
       * @param assemblyDescriptor the assembly descriptor
       * @param EJBName            the name of the EJB
       * @param securityIdentity   the EJB's security identity
       * @param roleReferences     the EJB's role references
       * @throws DeploymentException if any constraints are violated
       */
      protected void fillContainerBuilderSecurity(SecureBuilder builder,
                                                  Permissions notAssigned,
                                                  Security security,
                                                  AssemblyDescriptorType 
assemblyDescriptor,
                                                  String EJBName,
                                                  SecurityIdentityType 
securityIdentity,
                                                  SecurityRoleRefType[] 
roleReferences)
              throws DeploymentException {
  
          if (security == null) return;
  
          SecurityConfiguration securityConfiguration = new 
SecurityConfiguration();
  
          securityConfiguration.setPolicyContextId(builder.getContainerId());
          builder.setSecurityEnabled(true);
          builder.setSecurityConfiguration(securityConfiguration);
          builder.setDoAsCurrentCaller(security.isDoAsCurrentCaller());
          builder.setUseContextHandler(security.isUseContextHandler());
  
          /**
           * Add the default subject
           */
          builder.setDefaultSubject(generateDefaultSubject(security));
  
          /**
           * JACC v1.0 section 3.1.5.1
           */
          MethodPermissionType[] methodPermissions = 
assemblyDescriptor.getMethodPermissionArray();
          if (methodPermissions != null) {
              for (int i = 0; i < methodPermissions.length; i++) {
                  MethodPermissionType mpt = methodPermissions[i];
                  MethodType[] methods = mpt.getMethodArray();
                  RoleNameType[] roles = mpt.getRoleNameArray();
                  boolean unchecked = (mpt.getUnchecked() != null);
  
                  Map rolePermissions = securityConfiguration.getRolePolicies();
  
                  for (int k = 0; k < methods.length; k++) {
                      MethodType method = methods[k];
  
                      if 
(!EJBName.equals(method.getEjbName().getStringValue())) continue;
  
                      String methodName = 
OpenEJBModuleBuilder.getJ2eeStringValue(method.getMethodName());
                      String methodIntf = 
OpenEJBModuleBuilder.getJ2eeStringValue(method.getMethodIntf());
                      String[] methodPara = (method.getMethodParams() != null ? 
toStringArray(method.getMethodParams().getMethodParamArray()) : null);
  
                      // map EJB semantics to JACC semantics for method names
                      if ("*".equals(methodName)) methodName = null;
  
                      EJBMethodPermission permission = new 
EJBMethodPermission(EJBName, methodName, methodIntf, methodPara);
                      notAssigned = cullPermissions(notAssigned, permission);
                      if (unchecked) {
                          
securityConfiguration.getUncheckedPolicy().add(permission);
                      } else {
                          for (int j = 0; j < roles.length; j++) {
                              String rolename = roles[j].getStringValue();
  
                              Permissions permissions = (Permissions) 
rolePermissions.get(rolename);
                              if (permissions == null) {
                                  permissions = new Permissions();
                                  rolePermissions.put(rolename, permissions);
                              }
                              permissions.add(permission);
                          }
                      }
                  }
  
              }
          }
  
          /**
           * JACC v1.0 section 3.1.5.2
           */
          ExcludeListType excludeList = assemblyDescriptor.getExcludeList();
          if (excludeList != null) {
              MethodType[] methods = excludeList.getMethodArray();
              for (int i = 0; i < methods.length; i++) {
                  MethodType method = methods[i];
  
                  if (!EJBName.equals(method.getEjbName().getStringValue())) 
continue;
  
                  String methodName = 
OpenEJBModuleBuilder.getJ2eeStringValue(method.getMethodName());
                  String methodIntf = 
OpenEJBModuleBuilder.getJ2eeStringValue(method.getMethodIntf());
                  String[] methodPara = (method.getMethodParams() != null ? 
toStringArray(method.getMethodParams().getMethodParamArray()) : null);
  
                  EJBMethodPermission permission = new 
EJBMethodPermission(EJBName, methodName, methodIntf, methodPara);
  
                  securityConfiguration.getExcludedPolicy().add(permission);
                  notAssigned = cullPermissions(notAssigned, permission);
              }
          }
  
          /**
           * JACC v1.0 section 3.1.5.3
           */
          if (roleReferences != null) {
              for (int i = 0; i < roleReferences.length; i++) {
                  if (roleReferences[i].getRoleLink() == null) throw new 
DeploymentException("Missing role-link");
  
                  String roleName = 
roleReferences[i].getRoleName().getStringValue();
                  String roleLink = 
roleReferences[i].getRoleLink().getStringValue();
  
                  Map roleRefPermissions = 
securityConfiguration.getRoleReferences();
                  Set roleLinks = (Set) roleRefPermissions.get(roleLink);
                  if (roleLinks == null) {
                      roleLinks = new HashSet();
                      roleRefPermissions.put(roleLink, roleLinks);
  
                  }
                  roleLinks.add(new EJBRoleRefPermission(EJBName, roleName));
              }
          }
  
          /**
           * Set the security interceptor's run-as subject, if one has been 
defined.
           */
          boolean found = (securityIdentity == null || 
securityIdentity.getRunAs() == null);
          String runAsName = (!found ? 
securityIdentity.getRunAs().getRoleName().getStringValue() : "");
          Iterator rollMappings = security.getRoleMappings().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().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);
                  }
              }
              securityConfiguration.getRoleMapping().put(roleName, 
principalSet);
  
              if (!found && roleDesignate.getPrincipals().size() > 0 && 
runAsName.equals(roleName)) {
                  builder.setRunAs(roleDesignate);
                  found = true;
              }
          }
          if (!found) throw new DeploymentException("Role designate not found 
for role: " + runAsName);
  
  
          /**
           * EJB v2.1 section 21.3.2
           * <p/>
           * It is possible that some methods are not assigned to any security
           * roles nor contained in the <code>exclude-list</code> element. In
           * this case, it is the responsibility of the Deployer to assign 
method
           * permissions for all of the unspecified methods, either by assigning
           * them to security roles, or by marking them as 
<code>unchecked</code>.
           */
          Permissions permissions;
          if (security.getDefaultRole() == null || 
security.getDefaultRole().length() == 0) {
              permissions = securityConfiguration.getUncheckedPolicy();
          } else {
              Map rolePermissions = securityConfiguration.getRolePolicies();
              permissions = (Permissions) 
rolePermissions.get(security.getDefaultRole());
              if (permissions == null) {
                  permissions = new Permissions();
                  rolePermissions.put(security.getDefaultRole(), permissions);
              }
          }
  
          Enumeration e = notAssigned.elements();
          while (e.hasMoreElements()) {
              Permission p = (Permission) e.nextElement();
              permissions.add(p);
          }
      }
  
      /**
       * Generate the default principal from the security config.
       *
       * @param security The Geronimo security configuration.
       * @return the default principal
       */
      protected Subject generateDefaultSubject(Security security) throws 
GeronimoSecurityException {
  
          DefaultPrincipal defaultPrincipal = security.getDefaultPrincipal();
          if (defaultPrincipal == null) {
              AutoMapAssistant config = security.getAssistant();
              try {
                  if (config != null) {
                      Set assistants = moduleBuilder.getKernel().listGBeans(new 
ObjectName("geronimo.security:type=SecurityRealm,realm=" + 
config.getSecurityRealm()));
                      if (assistants.size() < 1 || assistants.size() > 1) throw 
new GeronimoSecurityException("Only one auto mapping assistant should match " + 
config.getSecurityRealm());
  
                      org.apache.geronimo.security.realm.AutoMapAssistant 
assistant = (org.apache.geronimo.security.realm.AutoMapAssistant) 
assistants.iterator().next();
                      org.apache.geronimo.security.deploy.Principal principal = 
assistant.obtainDefaultPrincipal();
                      defaultPrincipal = new DefaultPrincipal();
                      defaultPrincipal.setPrincipal(principal);
                      defaultPrincipal.setRealmName(((SecurityRealm) 
assistant).getRealmName());
                  }
              } catch (MalformedObjectNameException e) {
                  throw new GeronimoSecurityException("Bad object name 
geronimo.security:type=SecurityRealm,realm=" + config.getSecurityRealm());
              }
          }
          if (defaultPrincipal == null) throw new 
GeronimoSecurityException("Unable to generate default principal");
  
          return generateDefaultSubject(security, defaultPrincipal);
      }
  
      protected Subject generateDefaultSubject(Security security, 
DefaultPrincipal defaultPrincipal) throws GeronimoSecurityException {
          Subject defaultSubject = new Subject();
  
          RealmPrincipal realmPrincipal = 
ConfigurationUtil.generateRealmPrincipal(defaultPrincipal.getPrincipal(), 
defaultPrincipal.getRealmName());
          if (realmPrincipal == null) {
              throw new GeronimoSecurityException("Unable to create realm 
principal");
          }
          PrimaryRealmPrincipal primaryRealmPrincipal = 
ConfigurationUtil.generatePrimaryRealmPrincipal(defaultPrincipal.getPrincipal(),
 defaultPrincipal.getRealmName());
          if (primaryRealmPrincipal == null) {
              throw new GeronimoSecurityException("Unable to create primary 
realm principal");
          }
  
          defaultSubject.getPrincipals().add(realmPrincipal);
          defaultSubject.getPrincipals().add(primaryRealmPrincipal);
  
          return defaultSubject;
      }
  
      /**
       * Gernate all the possible permissions for a bean's interface.
       * <p/>
       * Method permissions are defined in the deployment descriptor as a binary
       * relation from the set of security roles to the set of methods of the
       * home, component, and/or web service endpoint interfaces of session and
       * entity beans, including all their superinterfaces (including the 
methods
       * of the <code>EJBHome</code> and <code>EJBObject</code> interfaces 
and/or
       * <code>EJBLocalHome</code> and <code>EJBLocalObject</code> interfaces).
       *
       * @param permissions     the permission set to be extended
       * @param EJBName         the name of the EJB
       * @param methodInterface the EJB method interface
       * @param interfaceClass  the class name of the interface to be used to
       *                        generate the permissions
       * @param cl              the class loader to be used in obtaining the 
interface class
       * @throws DeploymentException
       */
      protected void addToPermissions(Permissions permissions,
                                      String EJBName, String methodInterface, 
String interfaceClass,
                                      ClassLoader cl)
              throws DeploymentException {
  
          if (interfaceClass == null) return;
  
          try {
              Class clazz = Class.forName(interfaceClass, false, cl);
              Method[] methods = clazz.getMethods();
              for (int i = 0; i < methods.length; i++) {
                  permissions.add(new EJBMethodPermission(EJBName, 
methodInterface, methods[i]));
              }
          } catch (ClassNotFoundException e) {
              throw new DeploymentException(e);
          }
  
      }
  
      protected void addRoleMappings(SecurityConfiguration 
securityConfiguration,
                                     SecureBuilder builder,
                                     Security security,
                                     SecurityIdentityType securityIdentity)
              throws DeploymentException {
  
          String runAsName = ((securityIdentity != null && 
securityIdentity.getRunAs() != null) ? 
securityIdentity.getRunAs().getRoleName().getStringValue() : "");
  
          autoMapRoles(securityConfiguration, builder, security, 
securityIdentity, runAsName);
          addExplicitMappings(securityConfiguration, builder, security, 
securityIdentity, runAsName);
  
          if (builder.getRunAs() == null) throw new DeploymentException("Role 
designate not found for role: " + runAsName);
      }
  
      protected void autoMapRoles(SecurityConfiguration securityConfiguration,
                                  SecureBuilder builder,
                                  Security security,
                                  SecurityIdentityType securityIdentity,
                                  String runAsName)
              throws DeploymentException {
  
          Iterator rollMappings = security.getRoleMappings().iterator();
          AutoMapAssistant config = security.getAssistant();
          try {
              if (config != null) {
                  ObjectName assistantName = new 
ObjectName("geronimo.security:type=SecurityRealm,realm=" + 
config.getSecurityRealm());
                  Set assistants = 
moduleBuilder.getKernel().listGBeans(assistantName);
                  if (assistants.size() < 1 || assistants.size() > 1) throw new 
GeronimoSecurityException("Only one auto mapping assistant should match " + 
assistantName);
  
                  org.apache.geronimo.security.realm.AutoMapAssistant assistant 
= (org.apache.geronimo.security.realm.AutoMapAssistant) 
assistants.iterator().next();
  
                  while (rollMappings.hasNext()) {
                      Role role = (Role) rollMappings.next();
  
                      String roleName = role.getRoleName();
                      Subject roleDesignate = new Subject();
                      Set principalSet = new HashSet();
  
                      Iterator classNames = 
assistant.obtainRolePrincipalClasses().iterator();
                      while (classNames.hasNext()) {
                          Principal principal = new Principal();
                          principal.setClassName((String) classNames.next());
                          principal.setPrincipalName(roleName);
  
                          RealmPrincipal realmPrincipal = 
ConfigurationUtil.generateRealmPrincipal(principal, ((SecurityRealm) 
assistant).getRealmName());
  
                          if (realmPrincipal == null) throw new 
DeploymentException("Unable to create realm principal");
  
                          principalSet.add(realmPrincipal);
                          roleDesignate.getPrincipals().add(realmPrincipal);
                      }
                      Set roleMapping = (Set) 
securityConfiguration.getRoleMapping().get(roleName);
                      if (roleMapping == null) {
                          roleMapping = new HashSet();
                          securityConfiguration.getRoleMapping().put(roleName, 
roleMapping);
                      }
                      roleMapping.addAll(principalSet);
  
                      if (roleDesignate.getPrincipals().size() > 0 && 
runAsName.equals(roleName)) {
                          if (builder.getRunAs() != null) {
                              
builder.getRunAs().getPrincipals().addAll(roleDesignate.getPrincipals());
                          } else {
                              builder.setRunAs(roleDesignate);
                          }
                      }
                  }
              }
          } catch (MalformedObjectNameException e) {
              throw new DeploymentException("Bad object name 
geronimo.security:type=SecurityRealm,realm=" + config.getSecurityRealm());
          }
      }
  
      protected void addExplicitMappings(SecurityConfiguration 
securityConfiguration,
                                         SecureBuilder builder,
                                         Security security,
                                         SecurityIdentityType securityIdentity,
                                         String runAsName)
              throws DeploymentException {
  
          Iterator rollMappings = security.getRoleMappings().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().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);
                  }
              }
              Set roleMapping = (Set) 
securityConfiguration.getRoleMapping().get(roleName);
              if (roleMapping == null) {
                  roleMapping = new HashSet();
                  securityConfiguration.getRoleMapping().put(roleName, 
roleMapping);
              }
              roleMapping.addAll(principalSet);
  
              if (roleDesignate.getPrincipals().size() > 0 && 
runAsName.equals(roleName)) {
                  if (builder.getRunAs() != null) {
                      
builder.getRunAs().getPrincipals().addAll(roleDesignate.getPrincipals());
                  } else {
                      builder.setRunAs(roleDesignate);
                  }
              }
          }
      }
  
      /**
       * Removes permissions from <code>toBeChecked</code> that are implied by
       * <code>permission</code>.
       *
       * @param toBeChecked the permissions that are to be checked and possibly
       *                    culled
       * @param permission  the permission that is to be used for culling
       * @return the culled set of permissions that are not implied by
       *         <code>permission</code>
       */
      private Permissions cullPermissions(Permissions toBeChecked, Permission 
permission) {
          Permissions result = new Permissions();
  
          Enumeration e = toBeChecked.elements();
          while (e.hasMoreElements()) {
              Permission test = (Permission) e.nextElement();
              if (!permission.implies(test)) {
                  result.add(test);
              }
          }
  
          return result;
      }
  
      private static String[] toStringArray(JavaTypeType[] methodParamArray) {
          String[] result = new String[methodParamArray.length];
          for (int i = 0; i < methodParamArray.length; i++) {
              result[i] = methodParamArray[i].getStringValue();
          }
          return result;
      }
  }
  
  

Reply via email to