[jboss-cvs] JBossAS SVN: r114782 - branches/JBPAPP_5/server/src/main/org/jboss/ejb.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Mar 25 05:29:52 EDT 2014


Author: wolfc
Date: 2014-03-25 05:29:52 -0400 (Tue, 25 Mar 2014)
New Revision: 114782

Modified:
   branches/JBPAPP_5/server/src/main/org/jboss/ejb/EJBPermissionMapping.java
Log:
JBPAPP-11037: fix EJB permission mapping as per EJB 3.0 17.3


Modified: branches/JBPAPP_5/server/src/main/org/jboss/ejb/EJBPermissionMapping.java
===================================================================
--- branches/JBPAPP_5/server/src/main/org/jboss/ejb/EJBPermissionMapping.java	2014-03-25 09:28:32 UTC (rev 114781)
+++ branches/JBPAPP_5/server/src/main/org/jboss/ejb/EJBPermissionMapping.java	2014-03-25 09:29:52 UTC (rev 114782)
@@ -21,14 +21,18 @@
  */
 package org.jboss.ejb;
 
+import java.lang.reflect.Method;
+import java.security.Permissions;
 import java.util.Iterator;
 import java.util.Set;
 
+import javax.ejb.EJBContext;
 import javax.security.jacc.EJBMethodPermission;
 import javax.security.jacc.EJBRoleRefPermission;
 import javax.security.jacc.PolicyConfiguration;
 import javax.security.jacc.PolicyContextException;
 
+import org.jboss.logging.Logger;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.ExcludeListMetaData;
@@ -49,10 +53,24 @@
  */
 public class EJBPermissionMapping
 {
+   private static final Logger LOGGER = Logger.getLogger(EJBPermissionMapping.class);
 
+   private static boolean anyInterfaceImplied(final Permissions specifiedPermissions, final String ejbName, final Method method)
+   {
+      for (MethodInterfaceType methodInterfaceType : MethodInterfaceType.values())
+      {
+         EJBMethodPermission p = new EJBMethodPermission(ejbName, methodInterfaceType.name(), method);
+         if (specifiedPermissions.implies(p))
+            return true;
+      }
+      return false;
+   }
+
    public static void createPermissions(JBossEnterpriseBeanMetaData bean, PolicyConfiguration pc)
          throws PolicyContextException
    {
+      final Permissions specifiedPermissions = new Permissions();
+
       // Process the method-permission MethodMetaData
       MethodPermissionsMetaData perms = bean.getMethodPermissions();
       if (perms != null)
@@ -74,6 +92,7 @@
                   MethodInterfaceType miType = mmd.getMethodIntf();
                   String iface = miType != null ? miType.name() : null;
                   EJBMethodPermission p = new EJBMethodPermission(mmd.getEjbName(), methodName, iface, params);
+                  specifiedPermissions.add(p);
                   if (perm.getUnchecked() != null)
                   {
                      pc.addToUncheckedPolicy(p);
@@ -111,6 +130,7 @@
                MethodInterfaceType miType = mmd.getMethodIntf();
                String iface = miType != null ? miType.name() : null;
                EJBMethodPermission p = new EJBMethodPermission(mmd.getEjbName(), methodName, iface, params);
+               specifiedPermissions.add(p);
                pc.addToExcludedPolicy(p);
             }
       }
@@ -121,7 +141,11 @@
          for (org.jboss.metadata.javaee.spec.SecurityRoleRefMetaData ref : refs)
          {
             EJBRoleRefPermission p = new EJBRoleRefPermission(bean.getEjbName(), ref.getRoleName());
-            pc.addToRole(ref.getRoleLink(), p);
+            // EJB 3.0 17.3.3 if not used, then equal to the role-name
+            String roleLink = ref.getRoleLink();
+            if (roleLink == null)
+               roleLink = ref.getRoleName();
+            pc.addToRole(roleLink, p);
          }
 
       /* Special handling of stateful session bean getEJBObject due how the
@@ -137,5 +161,30 @@
             pc.addToUncheckedPolicy(p);
          }
       }
+
+      // EJB 3.0 17.3.2.3
+      try
+      {
+         Class beanClass = Class.forName(bean.getEjbClass(), false, Thread.currentThread().getContextClassLoader());
+         for (Method method : beanClass.getMethods())
+         {
+            Class declaringClass = method.getDeclaringClass();
+            if (declaringClass == Object.class || EJBContext.class.isAssignableFrom(declaringClass))
+               continue;
+            if (anyInterfaceImplied(specifiedPermissions, bean.getEjbName(), method))
+               continue;
+            // now without an interface
+            EJBMethodPermission p = new EJBMethodPermission(bean.getEjbName(), null, method);
+            if (specifiedPermissions.implies(p))
+               continue;
+            // if nothing has been said yet about this kind of permission
+            pc.addToUncheckedPolicy(p);
+            LOGGER.debugf("No permission specified for %s, adding it to unchecked", p);
+         }
+      }
+      catch (ClassNotFoundException e)
+      {
+         throw new RuntimeException(e);
+      }
    }
 }



More information about the jboss-cvs-commits mailing list