|  | @@ -21,15 +21,17 @@ import org.springframework.security.AuthenticationServiceException;
 | 
	
		
			
				|  |  |  import org.springframework.security.GrantedAuthority;
 | 
	
		
			
				|  |  |  import org.springframework.security.GrantedAuthorityImpl;
 | 
	
		
			
				|  |  |  import org.springframework.security.MockApplicationEventPublisher;
 | 
	
		
			
				|  |  | +import org.springframework.security.AccountStatusException;
 | 
	
		
			
				|  |  |  import org.springframework.security.concurrent.ConcurrentSessionControllerImpl;
 | 
	
		
			
				|  |  |  import org.springframework.security.concurrent.NullConcurrentSessionController;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import junit.framework.TestCase;
 | 
	
		
			
				|  |  | +import org.springframework.security.concurrent.ConcurrentLoginException;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.util.Arrays;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.Vector;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import org.junit.Test;
 | 
	
		
			
				|  |  | +import static org.junit.Assert.*;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Tests {@link ProviderManager}.
 | 
	
	
		
			
				|  | @@ -37,60 +39,22 @@ import java.util.Vector;
 | 
	
		
			
				|  |  |   * @author Ben Alex
 | 
	
		
			
				|  |  |   * @version $Id$
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  | -    //~ Constructors ===================================================================================================
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public ProviderManagerTests() {
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public ProviderManagerTests(String arg0) {
 | 
	
		
			
				|  |  | -        super(arg0);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +public class ProviderManagerTests {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      //~ Methods ========================================================================================================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private ProviderManager makeProviderManager() throws Exception {
 | 
	
		
			
				|  |  | -        MockProvider provider1 = new MockProvider();
 | 
	
		
			
				|  |  | -        List providers = new Vector();
 | 
	
		
			
				|  |  | -        providers.add(provider1);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        ProviderManager mgr = new ProviderManager();
 | 
	
		
			
				|  |  | -        mgr.setProviders(providers);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        mgr.afterPropertiesSet();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return mgr;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private ProviderManager makeProviderManagerWithMockProviderWhichReturnsNullInList() {
 | 
	
		
			
				|  |  | -        MockProviderWhichReturnsNull provider1 = new MockProviderWhichReturnsNull();
 | 
	
		
			
				|  |  | -        MockProvider provider2 = new MockProvider();
 | 
	
		
			
				|  |  | -        List providers = new Vector();
 | 
	
		
			
				|  |  | -        providers.add(provider1);
 | 
	
		
			
				|  |  | -        providers.add(provider2);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        ProviderManager mgr = new ProviderManager();
 | 
	
		
			
				|  |  | -        mgr.setProviders(providers);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return mgr;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public void testAuthenticationFails() throws Exception {
 | 
	
		
			
				|  |  | +    @Test(expected=ProviderNotFoundException.class)
 | 
	
		
			
				|  |  | +    public void authenticationFailsWithUnsupportedToken() throws Exception {
 | 
	
		
			
				|  |  |          UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("Test", "Password",
 | 
	
		
			
				|  |  |                  new GrantedAuthority[] {new GrantedAuthorityImpl("ROLE_ONE"), new GrantedAuthorityImpl("ROLE_TWO")});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          ProviderManager mgr = makeProviderManager();
 | 
	
		
			
				|  |  |          mgr.setApplicationEventPublisher(new MockApplicationEventPublisher(true));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            mgr.authenticate(token);
 | 
	
		
			
				|  |  | -            fail("Should have thrown ProviderNotFoundException");
 | 
	
		
			
				|  |  | -        } catch (ProviderNotFoundException expected) {
 | 
	
		
			
				|  |  | -            assertTrue(true);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        mgr.authenticate(token);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void testAuthenticationSuccess() throws Exception {
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void authenticationSucceedsWithSupportedTokenAndReturnsExpectedObject() throws Exception {
 | 
	
		
			
				|  |  |          TestingAuthenticationToken token = new TestingAuthenticationToken("Test", "Password",
 | 
	
		
			
				|  |  |                  new GrantedAuthority[] {new GrantedAuthorityImpl("ROLE_ONE"), new GrantedAuthorityImpl("ROLE_TWO")});
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -110,7 +74,8 @@ public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  |          assertEquals("ROLE_TWO", castResult.getAuthorities()[1].getAuthority());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void testAuthenticationSuccessWhenFirstProviderReturnsNullButSecondAuthenticates() {
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void authenticationSuccessWhenFirstProviderReturnsNullButSecondAuthenticates() {
 | 
	
		
			
				|  |  |          TestingAuthenticationToken token = new TestingAuthenticationToken("Test", "Password",
 | 
	
		
			
				|  |  |                  new GrantedAuthority[] {new GrantedAuthorityImpl("ROLE_ONE"), new GrantedAuthorityImpl("ROLE_TWO")});
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -130,7 +95,8 @@ public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  |          assertEquals("ROLE_TWO", castResult.getAuthorities()[1].getAuthority());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void testConcurrentSessionControllerConfiguration() throws Exception {
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void concurrentSessionControllerConfiguration() throws Exception {
 | 
	
		
			
				|  |  |          ProviderManager target = new ProviderManager();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //The NullConcurrentSessionController should be the default
 | 
	
	
		
			
				|  | @@ -142,52 +108,34 @@ public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  |          assertEquals(impl, target.getSessionController());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void testStartupFailsIfProviderListDoesNotContainingProviders() throws Exception {
 | 
	
		
			
				|  |  | +    @Test(expected=IllegalArgumentException.class)
 | 
	
		
			
				|  |  | +    public void startupFailsIfProviderListDoesNotContainProviders() throws Exception {
 | 
	
		
			
				|  |  |          List providers = new Vector();
 | 
	
		
			
				|  |  |          providers.add("THIS_IS_NOT_A_PROVIDER");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          ProviderManager mgr = new ProviderManager();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            mgr.setProviders(providers);
 | 
	
		
			
				|  |  | -            fail("Should have thrown IllegalArgumentException");
 | 
	
		
			
				|  |  | -        } catch (IllegalArgumentException expected) {
 | 
	
		
			
				|  |  | -            assertTrue(true);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        mgr.setProviders(providers);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void testStartupFailsIfProviderListNotSet() throws Exception {
 | 
	
		
			
				|  |  | +    @Test(expected=IllegalArgumentException.class)
 | 
	
		
			
				|  |  | +    public void startupFailsIfProviderListNotSet() throws Exception {
 | 
	
		
			
				|  |  |          ProviderManager mgr = new ProviderManager();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            mgr.afterPropertiesSet();
 | 
	
		
			
				|  |  | -            fail("Should have thrown IllegalArgumentException");
 | 
	
		
			
				|  |  | -        } catch (IllegalArgumentException expected) {
 | 
	
		
			
				|  |  | -            assertTrue(true);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        mgr.afterPropertiesSet();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Test(expected=IllegalArgumentException.class)
 | 
	
		
			
				|  |  |      public void testStartupFailsIfProviderListNull() throws Exception {
 | 
	
		
			
				|  |  |          ProviderManager mgr = new ProviderManager();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            mgr.setProviders(null);
 | 
	
		
			
				|  |  | -            fail("Should have thrown IllegalArgumentException");
 | 
	
		
			
				|  |  | -        } catch (IllegalArgumentException expected) {
 | 
	
		
			
				|  |  | -            assertTrue(true);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        mgr.setProviders(null);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void testSuccessfulStartup() throws Exception {
 | 
	
		
			
				|  |  | -        ProviderManager mgr = makeProviderManager();
 | 
	
		
			
				|  |  | -        mgr.afterPropertiesSet();
 | 
	
		
			
				|  |  | -        assertTrue(true);
 | 
	
		
			
				|  |  | -        assertEquals(1, mgr.getProviders().size());
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public void testDetailsAreNotSetOnAuthenticationTokenIfAlreadySetByProvider() throws Exception {
 | 
	
		
			
				|  |  | -        Object requestDetails = new String("(Request Details)");
 | 
	
		
			
				|  |  | -        final Object resultDetails = new String("(Result Details)");
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void detailsAreNotSetOnAuthenticationTokenIfAlreadySetByProvider() throws Exception {
 | 
	
		
			
				|  |  | +        Object requestDetails = "(Request Details)";
 | 
	
		
			
				|  |  | +        final Object resultDetails = "(Result Details)";
 | 
	
		
			
				|  |  |          ProviderManager authMgr = makeProviderManager();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          AuthenticationProvider provider = new AuthenticationProvider() {
 | 
	
	
		
			
				|  | @@ -201,7 +149,7 @@ public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        authMgr.setProviders(Arrays.asList(new AuthenticationProvider[] {provider}));
 | 
	
		
			
				|  |  | +        authMgr.setProviders(Arrays.asList(provider));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          TestingAuthenticationToken request = createAuthenticationToken();
 | 
	
		
			
				|  |  |          request.setDetails(requestDetails);
 | 
	
	
		
			
				|  | @@ -210,7 +158,8 @@ public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  |          assertEquals(resultDetails, result.getDetails());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void testDetailsAreSetOnAuthenticationTokenIfNotAlreadySetByProvider() throws Exception {
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void detailsAreSetOnAuthenticationTokenIfNotAlreadySetByProvider() throws Exception {
 | 
	
		
			
				|  |  |          Object details = new Object();
 | 
	
		
			
				|  |  |          ProviderManager authMgr = makeProviderManager();
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -221,10 +170,57 @@ public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  |          assertEquals(details, result.getDetails());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    // SEC-546
 | 
	
		
			
				|  |  | +    @Test(expected=AccountStatusException.class)
 | 
	
		
			
				|  |  | +    public void accountStatusExceptionPreventsCallsToSubsequentProviders() throws Exception {
 | 
	
		
			
				|  |  | +        ProviderManager authMgr = makeProviderManager();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        authMgr.setProviders(Arrays.asList(new MockProviderWhichThrowsAccountStatusException(),
 | 
	
		
			
				|  |  | +                new MockProviderWhichThrowsConcurrentLoginException()) );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        authMgr.authenticate(createAuthenticationToken());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Test(expected=ConcurrentLoginException.class)
 | 
	
		
			
				|  |  | +    public void concurrentLoginExceptionPreventsCallsToSubsequentProviders() throws Exception {
 | 
	
		
			
				|  |  | +        ProviderManager authMgr = makeProviderManager();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        authMgr.setProviders(Arrays.asList(new MockProviderWhichThrowsConcurrentLoginException(),
 | 
	
		
			
				|  |  | +                new MockProviderWhichThrowsAccountStatusException()) );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        authMgr.authenticate(createAuthenticationToken());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private TestingAuthenticationToken createAuthenticationToken() {
 | 
	
		
			
				|  |  |          return new TestingAuthenticationToken("name", "password", new GrantedAuthorityImpl[0]);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private ProviderManager makeProviderManager() throws Exception {
 | 
	
		
			
				|  |  | +        MockProvider provider1 = new MockProvider();
 | 
	
		
			
				|  |  | +        List providers = new Vector();
 | 
	
		
			
				|  |  | +        providers.add(provider1);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        ProviderManager mgr = new ProviderManager();
 | 
	
		
			
				|  |  | +        mgr.setProviders(providers);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        mgr.afterPropertiesSet();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return mgr;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private ProviderManager makeProviderManagerWithMockProviderWhichReturnsNullInList() {
 | 
	
		
			
				|  |  | +        MockProviderWhichReturnsNull provider1 = new MockProviderWhichReturnsNull();
 | 
	
		
			
				|  |  | +        MockProvider provider2 = new MockProvider();
 | 
	
		
			
				|  |  | +        List providers = new Vector();
 | 
	
		
			
				|  |  | +        providers.add(provider1);
 | 
	
		
			
				|  |  | +        providers.add(provider2);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        ProviderManager mgr = new ProviderManager();
 | 
	
		
			
				|  |  | +        mgr.setProviders(providers);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return mgr;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      //~ Inner Classes ==================================================================================================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private class MockProvider implements AuthenticationProvider {
 | 
	
	
		
			
				|  | @@ -262,4 +258,25 @@ public class ProviderManagerTests extends TestCase {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private class MockProviderWhichThrowsAccountStatusException implements AuthenticationProvider {
 | 
	
		
			
				|  |  | +        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
 | 
	
		
			
				|  |  | +            throw new AccountStatusException("xxx") {};
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public boolean supports(Class authentication) {
 | 
	
		
			
				|  |  | +            return true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private class MockProviderWhichThrowsConcurrentLoginException implements AuthenticationProvider {
 | 
	
		
			
				|  |  | +        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
 | 
	
		
			
				|  |  | +            throw new ConcurrentLoginException("xxx") {};
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public boolean supports(Class authentication) {
 | 
	
		
			
				|  |  | +            return true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |