User: stark   
  Date: 01/02/12 01:24:54

  Added:       security/src/main/org/jboss/security AppPolicy.java
                        AuthenticationInfo.java AuthorizationInfo.java
                        IAppPolicyStore.java SecurityPolicy.java
                        SecurityPolicyParser.java
  Log:
  Additions to the security framework to support JAAS based security
  proxy layers
  
  Revision  Changes    Path
  1.1                  contrib/security/src/main/org/jboss/security/AppPolicy.java
  
  Index: AppPolicy.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.security;
  
  import java.io.IOException;
  import java.security.AccessController;
  import java.security.AllPermission;
  import java.security.CodeSource;
  import java.security.KeyStore;
  import java.security.Permission;
  import java.security.PermissionCollection;
  import java.security.Permissions;
  import java.security.Principal;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Set;
  import javax.security.auth.AuthPermission;
  import javax.security.auth.Policy;
  import javax.security.auth.Refreshable;
  import javax.security.auth.RefreshFailedException;
  import javax.security.auth.Subject;
  import javax.security.auth.login.AppConfigurationEntry;
  
  /** A combination of keystore, authentication and authorization entries.
  
  @author [EMAIL PROTECTED]
  @version $Revision: 1.1 $
  */
  public class AppPolicy
  {
      /** A PermissionCollection that allows no permissions */
      public static final PermissionCollection NO_PERMISSIONS =  new Permissions();
      /** A PermissionCollection that allows all permissions */
      private static PermissionCollection ALL_PERMISSIONS;
  
      /**
       * @label defaultAppPolicy 
       */
      private static AppPolicy defaultAppPolicy;
  
      // Setup the class statics
      static
      {
          // A PermissionCollection that allows all permissions
          AllPermission all = new AllPermission();
          ALL_PERMISSIONS = all.newPermissionCollection();
          ALL_PERMISSIONS.add(all);
          // A default policy with no authentication and NO_PERMISSIONS
          defaultAppPolicy = new AppPolicy("other");
      }
  
      private String appName;
      private KeyStore keyStore;
  
      /**
       * @label permissions 
       */
      private AuthorizationInfo permissionInfo;
  
      /**
       * @label login 
       */
      private AuthenticationInfo loginInfo;
  
      public KeyStore getKeyStore()
      {
          return keyStore;
      }
      public void setKeyStore(KeyStore keyStore)
      {
          this.keyStore = keyStore;
      }
  
      public static void setDefaultAppPolicy(AppPolicy policy)
      {
          if( policy == null )
              throw new IllegalArgumentException("The policy argument cannot be null");
          defaultAppPolicy = policy;
      }
      public static AppPolicy getDefaultAppPolicy()
      {
          return defaultAppPolicy;
      }
  
      public AppPolicy(String appName)
      {
          this.appName = appName;
      }
  
      public AuthenticationInfo getLoginInfo()
      {
          AccessController.checkPermission(AuthenticationInfo.GET_CONFIG_ENTRY_PERM);
          return loginInfo;
      }
      public void setLoginInfo(AuthenticationInfo loginInfo)
      {
          AccessController.checkPermission(AuthenticationInfo.SET_CONFIG_ENTRY_PERM);
          this.loginInfo = loginInfo;
      }
      public AuthorizationInfo getPermissionInfo()
      {
          return permissionInfo;
      }
      public void setPermissionInfo(AuthorizationInfo permissionInfo)
      {
          this.permissionInfo = permissionInfo;
      }
  
      public AppConfigurationEntry[] getAppConfigurationEntry()
      {
          AppConfigurationEntry[] appConfig = null;
          if( loginInfo != null )
              appConfig = loginInfo.getAppConfigurationEntry();
          if( appConfig == null )
              appConfig = defaultAppPolicy.getAppConfigurationEntry();
          return appConfig;
      }
        public PermissionCollection getPermissions(Subject subject, CodeSource 
codesource)
        {
          PermissionCollection perms = NO_PERMISSIONS;
          AuthorizationInfo info = getPermissionInfo();
          if( info == null )
              info = defaultAppPolicy.getPermissionInfo();
          if( info != null )
          {
              perms = info.getPermissions(subject, codesource);
          }
  
          return perms;
        }
  
      public String toString()
      {
          StringBuffer buffer = new StringBuffer(appName);
          buffer.append('\n');
          buffer.append("AuthenticationInfo:\n");
          if( loginInfo != null )
              buffer.append(loginInfo);
          buffer.append("AuthorizationInfo:\n");
          if( permissionInfo != null )
              buffer.append(permissionInfo);
          return buffer.toString();
      }
     
  }
  
  
  
  1.1                  
contrib/security/src/main/org/jboss/security/AuthenticationInfo.java
  
  Index: AuthenticationInfo.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.security;
  
  import java.security.AccessController;
  import javax.security.auth.AuthPermission;
  import javax.security.auth.callback.CallbackHandler;
  import javax.security.auth.login.Configuration;
  import javax.security.auth.login.AppConfigurationEntry;
  
  /**
  
  @author [EMAIL PROTECTED]
  @version $Revision: 1.1 $
  */
  public class AuthenticationInfo
  {
      public static final AuthPermission GET_CONFIG_ENTRY_PERM = new 
AuthPermission("getLoginConfiguration");
      public static final AuthPermission SET_CONFIG_ENTRY_PERM = new 
AuthPermission("setLoginConfiguration");
      private AppConfigurationEntry[] loginModules;
      private CallbackHandler callbackHandler;
  
      /** Get an application authentication configuration. This requires an
      AuthPermission("getLoginConfiguration") access.
      */
      public AppConfigurationEntry[] getAppConfigurationEntry()
      {
          AccessController.checkPermission(GET_CONFIG_ENTRY_PERM);
          return loginModules;
      }
      /** Set an application authentication configuration. This requires an
      AuthPermission("setLoginConfiguration") access.
      */
      public void setAppConfigurationEntry(AppConfigurationEntry[] loginModules)
      {
          AccessController.checkPermission(SET_CONFIG_ENTRY_PERM);
          this.loginModules = loginModules;
      }
  
      /**
      */
      public CallbackHandler getAppCallbackHandler()
      {
          return callbackHandler;
      }
      public void setAppCallbackHandler(CallbackHandler handler)
      {
          this.callbackHandler = handler;
      }
  }
  
  
  
  1.1                  
contrib/security/src/main/org/jboss/security/AuthorizationInfo.java
  
  Index: AuthorizationInfo.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.security;
  
  import java.io.IOException;
  import java.security.AccessController;
  import java.security.CodeSource;
  import java.security.Permission;
  import java.security.PermissionCollection;
  import java.security.Permissions;
  import java.security.Principal;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Set;
  import javax.security.auth.AuthPermission;
  import javax.security.auth.Subject;
  
  /**
  
  @author [EMAIL PROTECTED]
  @version $Revision: 1.1 $
  */
  public class AuthorizationInfo
  {
      private static Set emptySet = new HashSet();
      private ArrayList policyMap = new ArrayList();
      private PolicyEntry[] policyEntries;
  
      /** An inner class that represents a grant entry in policyMap. It is composed
       *of a CodeSource and an array of Prinicpals along with the granted
       *permissions.
       */
      static class PolicyEntry
      {
          private CodeSource cs;
          private Principal[] principals;
          private ArrayList permissions;
  
          PolicyEntry(CodeSource cs, Principal[] principals, ArrayList permissions)
          {
              this.cs = cs;
              this.principals = principals;
              this.permissions = permissions;
          }
  
          public void getPermissions(PermissionCollection perms)
          {
              int length = permissions == null ? 0 : permissions.size();
              for(int n = 0; n < length; n ++)
              {
                  Permission permission = (Permission) permissions.get(n);
                  perms.add(permission);
              }
          }
  
          public boolean implies(CodeSource codesrc, Set subjectPrincipals)
          {
              boolean implies = false;
              // Check codesources
              if( this.cs == codesrc )
              {   // Both null or the same object
                  implies = true;
              }
              else if( this.cs != null && codesrc != null && this.cs.implies(codesrc) )
              {
                  implies = true;
              }
  
              // Check Principals
              if( implies == true )
              {
                  if( this.principals != null )
                  {   // Every one of our principals must be in subjectPrincipals
                      for(int p = 0; p < this.principals.length; p ++)
                      {
                          if( subjectPrincipals.contains(this.principals[p]) == false )
                          {
                              implies = false;
                              break;
                          }
                      }
                  }
              }
  
              return implies;
          }
          public boolean equals(Object obj)
          {
              PolicyEntry key = (PolicyEntry) obj;
              boolean equals = this.cs == key.cs;
              if( equals == false )
              {
                  if( this.cs != null && key.cs != null )
                      equals = this.cs.equals(key.cs);
                  if( equals == true )
                  {   // Every principal in this must equal 
                      if( this.principals != null && key.principals != null && 
this.principals.length == key.principals.length )
                      {
                          for(int p = 0; p < this.principals.length; p ++)
                          {
                              if( this.principals[p].equals(key.principals[p]) == 
false )
                              {
                                  equals = false;
                                  break;
                              }
                          }
                      }
                      else if( this.principals != null || key.principals != null )
                      {
                          equals = false;
                      }
                  }
              }
              return equals;
          }
          public int hashCode()
          {
              int hashCode = 0;
              if( cs != null )
                  hashCode = cs.hashCode();
              int length = (this.principals == null ? 0 : this.principals.length);
              for(int p = 0; p < length; p ++)
              {
                  hashCode += this.principals[p].hashCode();
              }
              return hashCode;
          }
  
          public String toString()
          {
              StringBuffer buffer = new StringBuffer();
              buffer.append("cs=");
              buffer.append(cs);
              buffer.append("; principals=");
              for(int p = 0; principals != null && p < principals.length; p ++)
                  buffer.append(principals[p]);
              buffer.append("; permissions=");
              buffer.append(permissions);
              return buffer.toString();
          }
      }
  
      public AuthorizationInfo()
      {
      }
  
        public PermissionCollection getPermissions(Subject subject, CodeSource 
codesource)
        {
                PermissionCollection perms = new Permissions();
          Set subjectPrincipals = emptySet;
          if( subject != null )
              subjectPrincipals = subject.getPrincipals();
          for(int n = 0; n < policyMap.size(); n ++)
          {
              PolicyEntry entry = (PolicyEntry) policyMap.get(n);
              if( entry.implies(codesource, subjectPrincipals) == true )
                  entry.getPermissions(perms);
          }
                return perms;
        }
  
      public String toString()
      {
          StringBuffer buffer = new StringBuffer("permissions:");
          return buffer.toString();
      }
  
      public void grant(CodeSource cs, ArrayList permissions)
      {
          grant(cs, permissions, null);
      }
      public void grant(CodeSource cs, ArrayList permissions, Principal[] principals)
      {
          PolicyEntry entry = new PolicyEntry(cs, principals, permissions);
  System.out.println("grant, "+entry);
          policyMap.add(entry);
      }
  }
  
  
  
  1.1                  
contrib/security/src/main/org/jboss/security/IAppPolicyStore.java
  
  Index: IAppPolicyStore.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.security;
  
  import java.security.CodeSource;
  import java.security.Principal;
  import java.util.ArrayList;
  
  /** An interface describing an AppPolicy security store. It is used by
  the SecurityPolicy class to isolate the source of security information
  from the SecurityPolicy.
  
  @author [EMAIL PROTECTED]
  @version $Revision: 1.1 $
  */
  public interface IAppPolicyStore
  {
      public AppPolicy getAppPolicy(String appName);
      public void refresh();
  
      /** @link aggregation 
       * @supplierCardinality 1..*
       * @clientCardinality 1*/
      /*#AppPolicy lnkAppPolicy;*/
  }
  
  
  
  1.1                  contrib/security/src/main/org/jboss/security/SecurityPolicy.java
  
  Index: SecurityPolicy.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.security;
  
  import java.net.URL;
  import java.security.AccessController;
  import java.security.CodeSource;
  import java.security.Permission;
  import java.security.PermissionCollection;
  import java.security.Permissions;
  import java.security.Principal;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Set;
  import javax.security.auth.AuthPermission;
  import javax.security.auth.Policy;
  import javax.security.auth.RefreshFailedException;
  import javax.security.auth.Subject;
  import javax.security.auth.login.Configuration;
  import javax.security.auth.login.AppConfigurationEntry;
  
  import org.jboss.security.SimplePrincipal;
  
  /** An concrete implementation of the javax.security.auth.Policy class that
  categorizes authorization info by application.
  
  @see javax.security.auth.Policy
  
  @author [EMAIL PROTECTED]
  @version $Revision: 1.1 $
  */
  public class SecurityPolicy extends Policy
  {
      private static final AuthPermission REFRESH_PERM = new 
AuthPermission("refreshPolicy");
      private static final Set emptySet = new HashSet();
      private static final ThreadLocal activeApp = new ThreadLocal();
  
      /**
       * @clientCardinality 1
       * @supplierCardinality 1
       * @clientRole Policy/Configuration Impl
       * @supplierRole Policy/Configuration data 
       */
      private IAppPolicyStore policyStore;
      private LoginConfiguration loginConfig = new LoginConfiguration();
  
      public class LoginConfiguration extends Configuration
      {
          public AppConfigurationEntry[] getAppConfigurationEntry(String appName)
          {
              AppConfigurationEntry[] entry = null;
              AppPolicy appPolicy = policyStore.getAppPolicy(appName);
              if( appPolicy != null )
              {
                  AuthenticationInfo loginInfo = appPolicy.getLoginInfo();
                  if( loginInfo != null )
                      entry = loginInfo.getAppConfigurationEntry();
              }
              return entry;
          }
  
          public void refresh()
          {
              SecurityPolicy.this.refresh();
          }
      }
  
      public static void setActiveApp(String appName)
      {
          activeApp.set(appName);
      }
      public static void unsetActiveApp()
      {
          activeApp.set(null);
      }
  
        public SecurityPolicy(IAppPolicyStore policyStore)
        {
          this.policyStore = policyStore;
        }
  
      public Configuration getLoginConfiguration()
      {
          return loginConfig;
      }
  
        public PermissionCollection getPermissions(Subject subject, CodeSource 
codesource)
        {
          String appName = (String) activeApp.get();
          if( appName == null )
              appName = "other";
                PermissionCollection perms = getPermissions(subject, codesource, 
appName);
                return perms;
      }
        public PermissionCollection getPermissions(Subject subject, CodeSource 
codesource, String appName)
        {
          AppPolicy policy = policyStore.getAppPolicy(appName);
          PermissionCollection perms = AppPolicy.NO_PERMISSIONS;
          if( policy != null )
              perms = policy.getPermissions(subject, codesource);
  System.out.println("getPermissions(cs="+codesource+", "+appName+") -> "+perms);
                return perms;
        }
      public AppPolicy getAppPolicy(String appName)
      {
          AppPolicy appPolicy = policyStore.getAppPolicy(appName);
          return appPolicy;
      }
  
        public void refresh()
        {
          AccessController.checkPermission(REFRESH_PERM);
          policyStore.refresh();
        }
  }
  
  
  
  1.1                  
contrib/security/src/main/org/jboss/security/SecurityPolicyParser.java
  
  Index: SecurityPolicyParser.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.security;
  
  import java.io.InputStream;
  import java.io.IOException;
  import java.lang.reflect.Constructor;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.security.CodeSource;
  import java.security.KeyStore;
  import java.security.GeneralSecurityException;
  import java.security.Permission;
  import java.security.Principal;
  import java.security.UnresolvedPermission;
  import java.security.cert.Certificate;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.StringTokenizer;
  import javax.security.auth.login.AppConfigurationEntry;
  import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
  
  import org.w3c.dom.Document;
  import org.w3c.dom.DOMException;
  import org.w3c.dom.Element;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  import org.w3c.dom.NamedNodeMap;
  
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.SAXParseException;
  import org.xml.sax.EntityResolver;
  
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.parsers.DocumentBuilder;
  
  import org.jboss.logging.Log;
  
  /** A class that parses a XML document that conforms to the security-policy.dtd
  DTD that implements IAppPolicyStore for use with the SecurityPolicy class.
  
  @author [EMAIL PROTECTED]
  @version $Revision: 1.1 $
  */
  public class SecurityPolicyParser implements IAppPolicyStore
  {
      private static String DEFAULT_APP_POLICY_NAME = "other";
      private URL policyURL;
      private HashMap policyMap = new HashMap();
  
        /** Creates new SecurityPolicyParser */
      public SecurityPolicyParser(URL policyURL)
      {
          this.policyURL = policyURL;
      }
  
  
      public AppPolicy getAppPolicy(String appName)
      {
          AppPolicy appPolicy = (AppPolicy) policyMap.get(appName);
          if( appPolicy == null )
              appPolicy = AppPolicy.getDefaultAppPolicy();
          return appPolicy;
      }
  
      /** Load/reload the security policy
       */
      public void refresh()
      {
          Document doc = null;
          try
          {
              doc = loadURL();
          }
          catch(Exception e)
          {
              e.printStackTrace();
              return;
          }
  
          Element root = doc.getDocumentElement();
          NodeList apps = root.getElementsByTagName("application-policy");
          for(int n = 0; n < apps.getLength(); n ++)
          {
              Element app = (Element) apps.item(n);
              String name = app.getAttribute("name");
              AppPolicy appPolicy = new AppPolicy(name);
              try
              {
                  parse(app, appPolicy);
                  if( name.equals(DEFAULT_APP_POLICY_NAME) )
                      AppPolicy.setDefaultAppPolicy(appPolicy);
                  else
                      policyMap.put(name, appPolicy);
              }
              catch(Exception e)
              {
                  e.printStackTrace();
              }
          }
      }
  
      private Document loadURL() throws Exception
      {
          InputStream is = policyURL.openStream();
          DocumentBuilderFactory docBuilderFactory = 
DocumentBuilderFactory.newInstance();
          DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
          EntityResolver resolver = new LocalResolver();
          docBuilder.setEntityResolver(resolver);
          Document doc = docBuilder.parse(is);
          return doc;
      }
      private void parse(Element policy, AppPolicy appPolicy) throws Exception
      {
          parseKeyStore(policy, appPolicy);
          parseAuthentication(policy, appPolicy);
          parseAuthorization(policy, appPolicy);
      }
  
      /** Parse the application-policy/keystore element
      @param policy, the application-policy element
      */
      private void parseKeyStore(Element policy, AppPolicy appPolicy) throws Exception
      {
          // Load the keystore
          NodeList keystore = policy.getElementsByTagName("keystore");
          String keystoreHref = ".keystore";
          String keystoreType = "JKS";
          if( keystore.getLength() > 0 )
          {   // Load the cert KeyStore. This needs more work to be complete...
              Element e = (Element) keystore.item(0);
              keystoreHref = e.getAttribute("href");
              keystoreType = e.getAttribute("type");
              InputStream keystoreStream = null;
              try
              {
                  URL keystoreURL = new URL(keystoreHref);
                  keystoreStream = keystoreURL.openStream();
              }
              catch(MalformedURLException ex)
              {   // Assume this is just a resource name and look for in
                  ClassLoader loader = Thread.currentThread().getContextClassLoader();
                  keystoreStream = loader.getResourceAsStream(keystoreHref);
              }
              KeyStore keyStore = KeyStore.getInstance(keystoreType);
              // Where to get the password from...
              char[] password = {};
              keyStore.load(keystoreStream, password);
              appPolicy.setKeyStore(keyStore);
          }
      }
  
      /** Parse the application-policy/authentication element
      @param policy, the application-policy element
      */
      private void parseAuthentication(Element policy, AppPolicy appPolicy) throws 
Exception
      {
          // Parse the permissions
          NodeList authentication = policy.getElementsByTagName("authentication");
          if( authentication.getLength() == 0 )
              return;
          Element auth = (Element) authentication.item(0);
          NodeList modules = auth.getElementsByTagName("login-module");
          ArrayList tmp = new ArrayList();
          for(int n = 0; n < modules.getLength(); n ++)
          {
              Element grant = (Element) modules.item(n);
              parseModule(grant, tmp);
          }
          AppConfigurationEntry[] entries = new AppConfigurationEntry[tmp.size()];
          tmp.toArray(entries);
          AuthenticationInfo info = new AuthenticationInfo();
          info.setAppConfigurationEntry(entries);
          appPolicy.setLoginInfo(info);
      }
      private void parseModule(Element module, ArrayList entries) throws Exception
      {
          LoginModuleControlFlag controlFlag = LoginModuleControlFlag.OPTIONAL;
          String className = module.getAttribute("code");
          String flag = module.getAttribute("flag");
          if( flag != null )
          {
              if( flag.equals(LoginModuleControlFlag.REQUIRED.toString()) )
                  controlFlag = LoginModuleControlFlag.REQUIRED;
              else if( flag.equals(LoginModuleControlFlag.REQUISITE.toString()) )
                  controlFlag = LoginModuleControlFlag.REQUISITE;
              else if( flag.equals(LoginModuleControlFlag.SUFFICIENT.toString()) )
                  controlFlag = LoginModuleControlFlag.SUFFICIENT;
              else if( flag.equals(LoginModuleControlFlag.OPTIONAL.toString()) )
                  controlFlag = LoginModuleControlFlag.OPTIONAL;
          }
          NodeList opts = module.getElementsByTagName("module-option");
          HashMap options = new HashMap();
          for(int n = 0; n < opts.getLength(); n ++)
          {
              Element opt = (Element) opts.item(n);
              String name = opt.getAttribute("name");
              String value = getContent(opt, "");
              options.put(name, value);
  System.out.println("Added module-option name="+name+", value="+value);
          }
          AppConfigurationEntry entry = new AppConfigurationEntry(className, 
controlFlag, options);
          entries.add(entry);
      }
  
      /** Parse the application-policy/authorization element
      @param policy, the application-policy element
      */
      private void parseAuthorization(Element policy, AppPolicy appPolicy) throws 
Exception
      {
          // Parse the permissions
          NodeList authorization = policy.getElementsByTagName("authorization");
          if( authorization.getLength() == 0 )
              return;
          Element auth = (Element) authorization.item(0);
          NodeList grants = auth.getElementsByTagName("grant");
          for(int n = 0; n < grants.getLength(); n ++)
          {
              Element grant = (Element) grants.item(n);
              parseGrant(grant, appPolicy);
          }
      }
      private void parseGrant(Element grant, AppPolicy appPolicy) throws Exception
      {
          // Look for the codebase
          URL codebase = null;
          if( grant.getAttribute("codebase") != null )
          {
              String attr = grant.getAttribute("codebase");
              if( attr.length() > 0 )
                  codebase = new URL(attr);
          }
          // Look for the code signers
          String[] signerAliases = {};
          Certificate[] signedBy = null;
          if( grant.getAttribute("signedBy") != null )
          {
              String signers = grant.getAttribute("signedBy");
              if( signers.length() > 0 )
                  signedBy = getCertificates(signers, appPolicy.getKeyStore());
          }
          CodeSource cs = new CodeSource(codebase, signedBy);
  
          // Look for the principals
          ArrayList principals = null;
          NodeList tmp = grant.getElementsByTagName("principal");
          ClassLoader loader = Thread.currentThread().getContextClassLoader();
          for(int n = 0; n < tmp.getLength(); n ++)
          {
              Element principal = (Element) tmp.item(n);
              String code = principal.getAttribute("code");
              String name = principal.getAttribute("name");
              try
              {
                  Class cls = loader.loadClass(code);
                  // Assume there exists a constructor(String)
                  Class[] parameterTypes = {String.class};
                  Constructor ctor = cls.getConstructor(parameterTypes);
                  Object[] args = {name};
                  Principal p = (Principal) ctor.newInstance(args);
                  if( principals == null )
                      principals = new ArrayList();
                  principals.add(p);
              }
              catch(Exception e)
              {
                  throw new 
GeneralSecurityException(e.getClass().getName()+','+e.getMessage());
              }
          }
  
          // Get the permissions
          ArrayList permissions = null;
          tmp = grant.getElementsByTagName("permission");
          for(int n = 0; n < tmp.getLength(); n ++)
          {
              Element perm = (Element) tmp.item(n);
              String code = perm.getAttribute("code");
              String name = perm.getAttribute("name");
              String actions = perm.getAttribute("actions");
              String signers = perm.getAttribute("signedBy"); // Currently ignored...
              name = expandString(name);
              try
              {
                  Class cls = null;
                  // Assume there exists a ctor(String) or a ctor(String, String)
                  Constructor ctor = null;
                  Permission p = null;
                  try
                  {
                      cls = loader.loadClass(code);
                      Class[] parameterTypes2 = {String.class, String.class};
                      Object[] args2 = {name, actions};
                      ctor = cls.getConstructor(parameterTypes2);
                      p = (Permission) ctor.newInstance(args2);
                  }
                  catch(ClassNotFoundException e)
                  {   // Use an UnresolvedPermission
                      Certificate[] certs = null;
                      if( signers != null )
                          certs = getCertificates(signers, appPolicy.getKeyStore());
                      if( signers == null || certs != null )
                          p = new UnresolvedPermission(code, name, actions, certs);
                  }
                  catch(Exception e)
                  {   // Try ctor(String)
                      Class[] parameterTypes = {String.class};
                      Object[] args = {name};
                      ctor = cls.getConstructor(parameterTypes);
                      p = (Permission) ctor.newInstance(args);
                  }
                  if( permissions == null )
                      permissions = new ArrayList();
                  if( p != null )
                      permissions.add(p);
              }
              catch(Exception e)
              {
                  throw new 
GeneralSecurityException(e.getClass().getName()+','+e.getMessage());
              }
          }
  
          Principal[] roles = new Principal[0];
          AuthorizationInfo authInfo = appPolicy.getPermissionInfo();
          if( authInfo == null )
          {
              authInfo = new AuthorizationInfo();
              appPolicy.setPermissionInfo(authInfo);
          }
  
          if( principals == null )
          {
              authInfo.grant(cs, permissions);
          }
          else
          {
              roles = (Principal[]) principals.toArray(roles);
              authInfo.grant(cs, permissions, roles);
          }
      }
  
      private String expandString(String str)
      {
          int index = str.indexOf("${/}");
          if( index >= 0 )
          {
              int start = 0;
              StringBuffer sb = new StringBuffer();
              while( index >= 0 )
              {
                  sb.append(str.substring(start, index));
                  sb.append(java.io.File.separatorChar);
                  start = index + 4;
                  index = str.indexOf("${/}", start);
              }
              if( start <= str.length()-1 )
                  sb.append(str.substring(start));
              str = sb.toString();
          }
          return str;
      }
  
      private Certificate[] getCertificates(String signedBy, KeyStore keyStore)
      {
          Certificate[] signedByCerts = null;
          StringTokenizer tokenizer = new StringTokenizer(signedBy, ",");
          ArrayList certs = new ArrayList();
          while( tokenizer.hasMoreTokens() )
          {
              String alias = tokenizer.nextToken();
              try
              {
                  Certificate cert = keyStore.getCertificate(alias);
                  certs.add(cert);
              }
              catch(GeneralSecurityException e)
              {
                  e.printStackTrace();
              }
          }
          if( certs.size() > 0 )
          {
              signedByCerts = new Certificate[certs.size()];
              certs.toArray(signedByCerts);
          }
          return signedByCerts;
      }
  
        public static String getContent(Element element, String defaultContent)
      {
                NodeList children = element.getChildNodes();
          String content = defaultContent;
          if( children.getLength() > 0 )
          {
              content = "";
              for(int n = 0; n < children.getLength(); n ++)
              {
                  if( children.item(n).getNodeType() == Node.TEXT_NODE || 
                      children.item(n).getNodeType() == Node.CDATA_SECTION_NODE )
                     content += children.item(n).getNodeValue();
                  else
                     content += children.item(n).getFirstChild();   
              }
              return content;
          }
          return content;
        }
  
        /** Local entity resolver to handle the security-policy DTD public id.
        */
        private static class LocalResolver implements EntityResolver
        {
                private static final String SECURITY_POLICY_PUBLIC_ID = "-//JBoss//DTD 
JAAS SecurityPolicy//EN";
                private static final String SECURITY_POLICY_DTD_NAME = 
"security-policy.dtd";
  
                public InputSource resolveEntity(String publicId, String systemId)
                {
                        InputSource is = null;
                        if( publicId.equals(SECURITY_POLICY_PUBLIC_ID) )
                        {
                                try
                                {
                                        InputStream dtdStream = 
getClass().getResourceAsStream(SECURITY_POLICY_DTD_NAME);
                                        is = new InputSource(dtdStream);
                                }
                                catch(Exception ex )
                                {
                                }
                        }
                        return is;
                }
        }
  }
  
  
  

Reply via email to