User: starksm 
  Date: 02/03/22 19:12:55

  Added:       src/main/org/jboss/security/auth/login
                        AuthenticationInfo.java XMLLoginConfig.java
                        XMLLoginConfigMBean.java
  Log:
  A concrete implementation of the javax.security.auth.login.Configuration that
  uses an xml configuration format.
  
  Revision  Changes    Path
  1.1                  
jbosssx/src/main/org/jboss/security/auth/login/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.auth.login;
  
  import javax.security.auth.AuthPermission;
  import javax.security.auth.callback.CallbackHandler;
  import javax.security.auth.login.AppConfigurationEntry;
  
  /** The login module configuration information.
   
   @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()
     {
        SecurityManager sm = System.getSecurityManager();
        if( sm != null )
           sm.checkPermission(GET_CONFIG_ENTRY_PERM);
        return loginModules;
     }
     /** Set an application authentication configuration. This requires an
      AuthPermission("setLoginConfiguration") access.
      */
     public void setAppConfigurationEntry(AppConfigurationEntry[] loginModules)
     {
        SecurityManager sm = System.getSecurityManager();
        if( sm != null )
           sm.checkPermission(SET_CONFIG_ENTRY_PERM);
        this.loginModules = loginModules;
     }
  
     /**
      */
     public CallbackHandler getAppCallbackHandler()
     {
        return callbackHandler;
     }
     public void setAppCallbackHandler(CallbackHandler handler)
     {
        this.callbackHandler = handler;
     }
  }
  
  
  
  1.1                  
jbosssx/src/main/org/jboss/security/auth/login/XMLLoginConfig.java
  
  Index: XMLLoginConfig.java
  ===================================================================
  
  /*
   * JBoss, the OpenSource J2EE WebOS
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.security.auth.login;
  
  import java.io.InputStream;
  import java.net.URL;
  import java.util.ArrayList;
  import java.util.HashMap;
  import javax.security.auth.AuthPermission;
  import javax.security.auth.login.Configuration;
  import javax.security.auth.login.AppConfigurationEntry;
  import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.parsers.DocumentBuilder;
  
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  import org.xml.sax.InputSource;
  import org.xml.sax.EntityResolver;
  
  import org.jboss.logging.Logger;
  
  /** An concrete implementation of the javax.security.auth.login.Configuration
   class that parses an xml configuration of the form:
   
   <policy>
      <application-policy name = "test-domain">
         <authentication>
            <login-module code = 
"org.jboss.security.plugins.samples.IdentityLoginModule"
            flag = "required">
            <module-option name = "principal">starksm</module-option>
            </login-module>
         </authentication>
      </application-policy>
   </policy>
   
   @see javax.security.auth.login.Configuration
   
   @author [EMAIL PROTECTED]
   @version $Revision: 1.1 $
   */
  public class XMLLoginConfig extends Configuration
     implements XMLLoginConfigMBean
  {
     private static final String DEFAULT_APP_CONFIG_NAME = "other";
     private static final AuthPermission REFRESH_PERM = new 
AuthPermission("refreshPolicy");
     private static Logger log = Logger.getLogger(XMLLoginConfig.class);
  
     /** A mapping of application name to AppConfigurationEntry[] */
     private HashMap appConfigs = new HashMap();
     private int state = XMLLoginConfigMBean.STOPPED;
     private URL xmlConfig;
     private Configuration parentConfig;
  
     public XMLLoginConfig()
     {
     }
     
     public void refresh()
     {
        SecurityManager sm = System.getSecurityManager();
        if( sm != null )
           sm.checkPermission(REFRESH_PERM);
     }
     
     public AppConfigurationEntry[] getAppConfigurationEntry(String appName)
     {
        AppConfigurationEntry[] entry = null;
        AuthenticationInfo authInfo = (AuthenticationInfo) appConfigs.get(appName);
        if( authInfo != null )
        {
           entry = authInfo.getAppConfigurationEntry();
        }
        else
        {
           if( parentConfig != null )
              entry = parentConfig.getAppConfigurationEntry(appName);
           if( entry == null )
              authInfo = (AuthenticationInfo) appConfigs.get(DEFAULT_APP_CONFIG_NAME);
           if( authInfo != null )
              entry = authInfo.getAppConfigurationEntry();
        }
  
        return entry;
     }
     
     public void setConfig(URL xmlConfig)
     {
        this.xmlConfig = xmlConfig;
     }
  
     /** Add an application configuration
      */
     public Configuration getConfiguration(Configuration prevConfig)
     {
        parentConfig = prevConfig;
        return this;
     }
  
     // Begin ServiceMBean interface methods
     /**
      * create the service, do expensive operations etc
      */
     public void create() throws Exception
     {
        
     }
     
     public String getName()
     {
        return "XMLLoginConfig";
     }
     
     public int getState()
     {
        return state;
     }
     
     public String getStateString()
     {
        return XMLLoginConfigMBean.states[state];
     }
     
     /**
      * start the service, create is already called
      */
     public void start() throws Exception
     {
        if (getState() != XMLLoginConfigMBean.STOPPED && getState() != 
XMLLoginConfigMBean.FAILED)
           return;
        
        state = XMLLoginConfigMBean.STARTING;
        loadConfig(xmlConfig);
        state = XMLLoginConfigMBean.STARTED;
     }
     
     /**
      * stop the service
      */
     public void stop()
     {
        state = XMLLoginConfigMBean.STOPPING;
        state = XMLLoginConfigMBean.STOPPED;
     }
     
     /**
      * destroy the service, tear down
      */
     public void destroy()
     {
     }
     
     // End ServiceMBean interface methods
     
     private void loadConfig(URL xmlConfig) throws Exception
     {
        log.trace("Loading xmlConfig="+xmlConfig);
        Document doc = loadURL(xmlConfig);
        Element root = doc.getDocumentElement();
        NodeList apps = root.getElementsByTagName("application-policy");
        for(int n = 0; n < apps.getLength(); n ++)
        {
           Element appPolicy = (Element) apps.item(n);
           String appName = appPolicy.getAttribute("name");
           log.trace("Parsing application-policy="+appName);
  
           try
           {
              AuthenticationInfo authInfo = parseAuthentication(appPolicy);
              if( authInfo != null )
                 appConfigs.put(appName, authInfo);
           }
           catch(Exception e)
           {
              e.printStackTrace();
           }
        }
     }
     
     private Document loadURL(URL xmlConfig) throws Exception
     {
        InputStream is = xmlConfig.openStream();
        DocumentBuilderFactory docBuilderFactory = 
DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        EntityResolver resolver = new LocalResolver();
        docBuilder.setEntityResolver(resolver);
        Document doc = docBuilder.parse(is);
        return doc;
     }
     
     /** Parse the application-policy/authentication element
      @param policy, the application-policy/authentication element
      */
     private AuthenticationInfo parseAuthentication(Element policy) throws Exception
     {
        // Parse the permissions
        NodeList authentication = policy.getElementsByTagName("authentication");
        if( authentication.getLength() == 0 )
        {
           return null;
        }
  
        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 module = (Element) modules.item(n);
           parseModule(module, tmp);
        }
        AppConfigurationEntry[] entries = new AppConfigurationEntry[tmp.size()];
        tmp.toArray(entries);
        AuthenticationInfo info = new AuthenticationInfo();
        info.setAppConfigurationEntry(entries);
        return 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);
        }
        AppConfigurationEntry entry = new AppConfigurationEntry(className, 
controlFlag, options);
        entries.add(entry);
     }
     
     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.trim();
        }
        return content;
     }
  
     /** Local entity resolver to handle the security-policy DTD public id.
      */
     private static class LocalResolver implements EntityResolver
     {
        private static final String LOGIN_CIONFIG_PUBLIC_ID = "-//JBoss//DTD JAAS 
LoginConfig//EN";
        private static final String LOGIN_CIONFIG_DTD_NAME = "login-config.dtd";
        
        public InputSource resolveEntity(String publicId, String systemId)
        {
           InputSource is = null;
           if( publicId.equals(LOGIN_CIONFIG_PUBLIC_ID) )
           {
              try
              {
                 InputStream dtdStream = 
getClass().getResourceAsStream(LOGIN_CIONFIG_DTD_NAME);
                 is = new InputSource(dtdStream);
              }
              catch(Exception ex )
              {
              }
           }
           return is;
        }
     }
  }
  
  
  
  1.1                  
jbosssx/src/main/org/jboss/security/auth/login/XMLLoginConfigMBean.java
  
  Index: XMLLoginConfigMBean.java
  ===================================================================
  package org.jboss.security.auth.login;
  
  import javax.security.auth.login.Configuration;
  
  import org.jboss.system.ServiceMBean;
  
  /**
   *
   * @author  [EMAIL PROTECTED]
   */
  public interface XMLLoginConfigMBean extends ServiceMBean
  {
     /** Add an application configuration
      */
     public Configuration getConfiguration(Configuration prevConfig);
  }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to