Coverage Report - org.mule.extras.jaas.JaasSimpleAuthenticationProvider
 
Classes in this File Line Coverage Branch Coverage Complexity
JaasSimpleAuthenticationProvider
0%
0/68
0%
0/7
1.95
JaasSimpleAuthenticationProvider$JaasConfig
0%
0/17
0%
0/2
1.95
 
 1  
 /*
 2  
  * $Id: JaasSimpleAuthenticationProvider.java 7976 2007-08-21 14:26:13Z dirk.olmes $
 3  
  * --------------------------------------------------------------------------------------
 4  
  * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
 5  
  *
 6  
  * The software in this package is published under the terms of the CPAL v1.0
 7  
  * license, a copy of which has been included with this distribution in the
 8  
  * LICENSE.txt file.
 9  
  */
 10  
 
 11  
 package org.mule.extras.jaas;
 12  
 
 13  
 import org.mule.config.i18n.CoreMessages;
 14  
 import org.mule.impl.security.MuleAuthentication;
 15  
 import org.mule.umo.lifecycle.InitialisationException;
 16  
 import org.mule.umo.security.UMOAuthentication;
 17  
 import org.mule.umo.security.UMOSecurityContext;
 18  
 import org.mule.umo.security.UMOSecurityContextFactory;
 19  
 import org.mule.umo.security.UMOSecurityProvider;
 20  
 import org.mule.umo.security.UnauthorisedException;
 21  
 import org.mule.umo.security.UnknownAuthenticationTypeException;
 22  
 
 23  
 import java.io.IOException;
 24  
 import java.security.Security;
 25  
 import java.util.HashMap;
 26  
 import java.util.Map;
 27  
 
 28  
 import javax.security.auth.login.AppConfigurationEntry;
 29  
 import javax.security.auth.login.Configuration;
 30  
 import javax.security.auth.login.LoginContext;
 31  
 import javax.security.auth.login.LoginException;
 32  
 
 33  
 /**
 34  
  * @author Marie.Rizzo This is the Provider for Mule's Jaas Security
 35  
  */
 36  0
 public class JaasSimpleAuthenticationProvider implements UMOSecurityProvider
 37  
 {
 38  
 
 39  
     private String loginConfig;
 40  
     private String loginContextName;
 41  
     private String credentials;
 42  
     private String loginModule;
 43  0
     private String defaultModule = "org.mule.extras.jaas.loginmodule.DefaultLoginModule";
 44  
     private String name;
 45  
     private UMOSecurityContextFactory factory;
 46  
 
 47  
     // ~ Getters and Setters
 48  
     // ================================================================
 49  
 
 50  
     /**
 51  
      * Sets the login Configuration
 52  
      * 
 53  
      * @param loginConfig
 54  
      */
 55  
     public final void setLoginConfig(String loginConfig)
 56  
     {
 57  0
         this.loginConfig = loginConfig;
 58  0
     }
 59  
 
 60  
     /**
 61  
      * Gets the Login Configuration
 62  
      * 
 63  
      * @return loginConfig
 64  
      */
 65  
     public final String getLoginConfig()
 66  
     {
 67  0
         return loginConfig;
 68  
     }
 69  
 
 70  
     /**
 71  
      * Sets the Login Context name
 72  
      * 
 73  
      * @param loginContextName
 74  
      */
 75  
     public final void setLoginContextName(String loginContextName)
 76  
     {
 77  0
         this.loginContextName = loginContextName;
 78  0
     }
 79  
 
 80  
     /**
 81  
      * Gets the Login Context Name
 82  
      * 
 83  
      * @return loginContextName
 84  
      */
 85  
     public final String getLoginContextName()
 86  
     {
 87  0
         return loginContextName;
 88  
     }
 89  
 
 90  
     /**
 91  
      * Gets the user's credentials, i.e. the username and password
 92  
      * 
 93  
      * @return credentials
 94  
      */
 95  
     public final String getCredentials()
 96  
     {
 97  0
         return credentials;
 98  
     }
 99  
 
 100  
     /**
 101  
      * Sets the user's credentials.
 102  
      * 
 103  
      * @param credentials
 104  
      */
 105  
     public final void setCredentials(String credentials)
 106  
     {
 107  0
         this.credentials = credentials;
 108  0
     }
 109  
 
 110  
     /**
 111  
      * Gets the login module name
 112  
      * 
 113  
      * @return loginModule
 114  
      */
 115  
     public final String getLoginModule()
 116  
     {
 117  0
         return loginModule;
 118  
     }
 119  
 
 120  
     /**
 121  
      * sets the login module name
 122  
      * 
 123  
      * @param loginModule
 124  
      */
 125  
     public final void setLoginModule(String loginModule)
 126  
     {
 127  0
         this.loginModule = loginModule;
 128  0
     }
 129  
 
 130  
     /**
 131  
      * @return name
 132  
      */
 133  
     public final String getName()
 134  
     {
 135  0
         return name;
 136  
     }
 137  
 
 138  
     /**
 139  
      * @param name
 140  
      */
 141  
     public final void setName(String name)
 142  
     {
 143  0
         this.name = name;
 144  0
     }
 145  
 
 146  
     // ~ Methods ================================================================
 147  
 
 148  
     /**
 149  
      * @throws IOException The configureJaas method gets the resource path of the
 150  
      *             jaas configuration file and constructs the URL for the login
 151  
      *             configuration.
 152  
      */
 153  
     private void configureJaas() throws IOException
 154  
     {
 155  
 
 156  0
         String loginConfigUrl = "file://"
 157  
                                 + org.mule.util.FileUtils.getResourcePath(loginConfig,
 158  0
                                     JaasSimpleAuthenticationProvider.class);
 159  
 
 160  0
         boolean alreadySet = false;
 161  
 
 162  0
         int n = 1;
 163  0
         String prefix = "login.config.url.";
 164  0
         String existing = null;
 165  
 
 166  0
         while ((existing = Security.getProperty(prefix + n)) != null)
 167  
         {
 168  0
             alreadySet = existing.equals(loginConfigUrl);
 169  
 
 170  0
             if (alreadySet)
 171  
             {
 172  0
                 break;
 173  
             }
 174  0
             n++;
 175  
         }
 176  
 
 177  0
         if (!alreadySet)
 178  
         {
 179  0
             String key = prefix + n;
 180  0
             Security.setProperty(key, loginConfigUrl);
 181  
         }
 182  0
     }
 183  
 
 184  
     /**
 185  
      * The authenticate method first creates the jaas Login Context using the
 186  
      * callback handler and the name of the class or directory to prtect. If the
 187  
      * Login Context is successfully created, it will then attempt to login.
 188  
      * 
 189  
      * @param UMOAuthentication
 190  
      * @return UMOAuthentication
 191  
      * @throws org.mule.umo.security.SecurityException
 192  
      */
 193  
     public final UMOAuthentication authenticate(UMOAuthentication authentication)
 194  
         throws org.mule.umo.security.SecurityException
 195  
     {
 196  
 
 197  
         LoginContext loginContext;
 198  0
         MuleAuthentication auth = (MuleAuthentication)authentication;
 199  
 
 200  
         // Create the Mule Callback Handler
 201  0
         MuleCallbackHandler cbh = new MuleCallbackHandler(auth);
 202  
 
 203  
         // Create the LoginContext object, and pass it to the CallbackHandler
 204  
         try
 205  
         {
 206  0
             loginContext = new LoginContext(loginContextName, cbh);
 207  
         }
 208  0
         catch (LoginException e)
 209  
         {
 210  0
             throw new org.mule.umo.security.UnauthorisedException(
 211  
                 CoreMessages.cannotLoadFromClasspath(loginContextName));
 212  0
         }
 213  
 
 214  
         // Attempt to login the user
 215  
         try
 216  
         {
 217  0
             loginContext.login();
 218  
         }
 219  0
         catch (LoginException le)
 220  
         {
 221  0
             throw new UnauthorisedException(CoreMessages.authFailedForUser(auth.getPrincipal()));
 222  0
         }
 223  
 
 224  0
         auth.setAuthenticated(true);
 225  
 
 226  0
         return auth;
 227  
     }
 228  
 
 229  
     /**
 230  
      * checks whether the class is supported.
 231  
      * 
 232  
      * @return
 233  
      * @param aClass
 234  
      */
 235  
     public final boolean supports(Class aClass)
 236  
     {
 237  0
         return UMOAuthentication.class.isAssignableFrom(aClass);
 238  
     }
 239  
 
 240  
     /**
 241  
      * @throws UnknownAuthenticationTypeException This occurs when the Security
 242  
      *             Factory cannot be created
 243  
      * @return
 244  
      */
 245  
     public final UMOSecurityContext createSecurityContext(UMOAuthentication auth)
 246  
         throws UnknownAuthenticationTypeException
 247  
     {
 248  0
         return factory.create(auth);
 249  
     }
 250  
 
 251  
     /**
 252  
      * The initialise method checks whether a jaas configuration file exists. If it
 253  
      * exists, it will call the configureJaas() method to create the context URL of
 254  
      * that file. If such a configuration file is not present, it will then try to
 255  
      * configure jaas programmatically. It also attempts to create the
 256  
      * JaasSecurityContextFactory.
 257  
      * 
 258  
      * @throws InitialisationException
 259  
      */
 260  
     public final void initialise() throws InitialisationException
 261  
     {
 262  
         // configure jaas from properties passed to the provider from the Mule XML
 263  
         // configuration file
 264  0
         if (loginConfig == null)
 265  
         {
 266  
             try
 267  
             {
 268  0
                 AppConfigurationEntry entry = null;
 269  0
                 JaasConfig.init();
 270  
 
 271  0
                 HashMap options = new HashMap();
 272  0
                 options.put("credentials", credentials);
 273  
 
 274  
                 // if a custom login module is not found, it will use the Default
 275  
                 // Login Module
 276  0
                 if (loginModule != null)
 277  
                 {
 278  0
                     entry = new AppConfigurationEntry(loginModule,
 279  
                         AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
 280  
                 }
 281  
                 else
 282  
                 {
 283  0
                     entry = new AppConfigurationEntry(defaultModule,
 284  
                         AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
 285  
                 }
 286  
 
 287  0
                 JaasConfig.addApplicationConfigEntry(loginContextName, entry);
 288  
             }
 289  0
             catch (Exception e)
 290  
             {
 291  0
                 throw new InitialisationException(e, this);
 292  0
             }
 293  
         }
 294  
         else
 295  
         {
 296  
             // configure jaas from a jaas configuration file
 297  
             try
 298  
             {
 299  0
                 configureJaas();
 300  
             }
 301  0
             catch (IOException e)
 302  
             {
 303  0
                 throw new InitialisationException(e, this);
 304  0
             }
 305  
         }
 306  
 
 307  
         // create the Jaas SecurityContext Factory
 308  
         try
 309  
         {
 310  0
             factory = new JaasSecurityContextFactory();
 311  
         }
 312  0
         catch (Exception e)
 313  
         {
 314  0
             throw new InitialisationException(CoreMessages.failedToCreate("JaasProvider"), e);
 315  0
         }
 316  0
     }
 317  
 
 318  
     /**
 319  
      * The JaasConfig class extends the Jaas Configuration in order to be able to
 320  
      * configure the jaas security programmatically.
 321  
      */
 322  0
     public static class JaasConfig extends Configuration
 323  
     {
 324  
 
 325  0
         private static Map appConfigEntries = new HashMap();
 326  
         private static JaasConfig jaasConfig;
 327  
 
 328  
         /**
 329  
          * Initializes and sets the Jaas Configuration
 330  
          */
 331  
         public static void init()
 332  
         {
 333  0
             jaasConfig = new JaasConfig();
 334  0
             Configuration.setConfiguration(jaasConfig);
 335  0
         }
 336  
 
 337  
         /**
 338  
          * Returns the Jas Configuration
 339  
          * 
 340  
          * @return jaasConfig
 341  
          */
 342  
         public static JaasConfig getJaasConfig()
 343  
         {
 344  0
             return jaasConfig;
 345  
         }
 346  
 
 347  
         /**
 348  
          * Adds the Configuration Entries
 349  
          * 
 350  
          * @param name
 351  
          * @param entry
 352  
          */
 353  
         public static void addApplicationConfigEntry(String name, AppConfigurationEntry entry)
 354  
         {
 355  0
             appConfigEntries.put(name, entry);
 356  0
         }
 357  
 
 358  
         /**
 359  
          * Gets the configuration entries using the application Name
 360  
          * 
 361  
          * @param applicationName
 362  
          * @return
 363  
          */
 364  
         public final AppConfigurationEntry[] getAppConfigurationEntry(String applicationName)
 365  
         {
 366  
 
 367  0
             if (applicationName == null)
 368  
             {
 369  0
                 throw new IllegalArgumentException("applicationName passed in was null.");
 370  
             }
 371  
 
 372  0
             AppConfigurationEntry entry = (AppConfigurationEntry)appConfigEntries.get(applicationName);
 373  0
             if (entry == null)
 374  
             {
 375  0
                 return new AppConfigurationEntry[]{};
 376  
             }
 377  
             else
 378  
             {
 379  0
                 AppConfigurationEntry e[] = new AppConfigurationEntry[1];
 380  0
                 e[0] = entry;
 381  0
                 return e;
 382  
             }
 383  
         }
 384  
 
 385  
         public void refresh()
 386  
         {
 387  
             // Nothing to do here
 388  0
         }
 389  
     }
 390  
 }