|  | @@ -0,0 +1,124 @@
 | 
	
		
			
				|  |  | +package org.springframework.security.ui;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import static org.junit.Assert.*;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.io.IOException;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import javax.servlet.FilterChain;
 | 
	
		
			
				|  |  | +import javax.servlet.ServletRequest;
 | 
	
		
			
				|  |  | +import javax.servlet.ServletResponse;
 | 
	
		
			
				|  |  | +import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  | +import javax.servlet.http.HttpServletResponse;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import org.junit.After;
 | 
	
		
			
				|  |  | +import org.junit.Test;
 | 
	
		
			
				|  |  | +import org.springframework.mock.web.MockFilterChain;
 | 
	
		
			
				|  |  | +import org.springframework.mock.web.MockHttpServletRequest;
 | 
	
		
			
				|  |  | +import org.springframework.mock.web.MockHttpServletResponse;
 | 
	
		
			
				|  |  | +import org.springframework.security.context.SecurityContextHolder;
 | 
	
		
			
				|  |  | +import org.springframework.security.providers.TestingAuthenticationToken;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * @author Luke Taylor
 | 
	
		
			
				|  |  | + * @version $Id$
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +public class SessionFixationProtectionFilterTests {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @After
 | 
	
		
			
				|  |  | +    public void clearContext() {
 | 
	
		
			
				|  |  | +        SecurityContextHolder.clearContext();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void newSessionShouldNotBeCreatedIfNoSessionExists() throws Exception {
 | 
	
		
			
				|  |  | +        SessionFixationProtectionFilter filter = new SessionFixationProtectionFilter();
 | 
	
		
			
				|  |  | +        HttpServletRequest request = new MockHttpServletRequest();
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        filter.doFilter(request, new MockHttpServletResponse(), new MockFilterChain());
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        assertNull(request.getSession(false));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void newSessionShouldNotBeCreatedIfUserIsAuthenticated() throws Exception {
 | 
	
		
			
				|  |  | +        SessionFixationProtectionFilter filter = new SessionFixationProtectionFilter();
 | 
	
		
			
				|  |  | +        HttpServletRequest request = new MockHttpServletRequest();
 | 
	
		
			
				|  |  | +        String sessionId = request.getSession().getId();
 | 
	
		
			
				|  |  | +//        SecurityContextHolder.getContext().setAuthentication(new TestingAuthenticationToken("user", "pass", null));
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        filter.doFilter(request, new MockHttpServletResponse(), new MockFilterChain());
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        assertEquals(sessionId, request.getSession().getId());
 | 
	
		
			
				|  |  | +    }    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void newSessionShouldNotBeCreatedIfSessionExistsAndUserIsNotAuthenticated() throws Exception {
 | 
	
		
			
				|  |  | +        SessionFixationProtectionFilter filter = new SessionFixationProtectionFilter();
 | 
	
		
			
				|  |  | +        HttpServletRequest request = new MockHttpServletRequest();
 | 
	
		
			
				|  |  | +        String sessionId = request.getSession().getId();
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        filter.doFilter(request, new MockHttpServletResponse(), new MockFilterChain());
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        assertEquals(sessionId, request.getSession().getId());
 | 
	
		
			
				|  |  | +    }    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void newSessionShouldNotBeCreatedIfUserIsAlreadyAuthenticated() throws Exception {
 | 
	
		
			
				|  |  | +        SessionFixationProtectionFilter filter = new SessionFixationProtectionFilter();
 | 
	
		
			
				|  |  | +        HttpServletRequest request = new MockHttpServletRequest();
 | 
	
		
			
				|  |  | +        String sessionId = request.getSession().getId();
 | 
	
		
			
				|  |  | +        SecurityContextHolder.getContext().setAuthentication(new TestingAuthenticationToken("user", "pass", null));
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        filter.doFilter(request, new MockHttpServletResponse(), new MockFilterChain());
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        assertEquals(sessionId, request.getSession().getId());
 | 
	
		
			
				|  |  | +    }    
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void newSessionShouldBeCreatedIfAuthenticationOccursDuringRequest() throws Exception {
 | 
	
		
			
				|  |  | +        SessionFixationProtectionFilter filter = new SessionFixationProtectionFilter();
 | 
	
		
			
				|  |  | +        HttpServletRequest request = new MockHttpServletRequest();
 | 
	
		
			
				|  |  | +        String sessionId = request.getSession().getId();
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        filter.doFilter(request, new MockHttpServletResponse(), new UserAuthenticatingFilterChain());
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        assertFalse("Session Id should have changed", sessionId.equals(request.getSession().getId()));         
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    @Test
 | 
	
		
			
				|  |  | +    public void newSessionShouldBeCreatedIfAuthenticationAndRedirectOccursDuringRequest() throws Exception {
 | 
	
		
			
				|  |  | +        SessionFixationProtectionFilter filter = new SessionFixationProtectionFilter();
 | 
	
		
			
				|  |  | +        HttpServletRequest request = new MockHttpServletRequest();
 | 
	
		
			
				|  |  | +        String sessionId = request.getSession().getId();
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        AuthenticateAndRedirectFilterChain chain = new AuthenticateAndRedirectFilterChain();
 | 
	
		
			
				|  |  | +        filter.doFilter(request, new MockHttpServletResponse(), chain);
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        assertTrue(chain.getResponse() instanceof 
 | 
	
		
			
				|  |  | +                SessionFixationProtectionFilter.SessionFixationProtectionResponseWrapper);
 | 
	
		
			
				|  |  | +        assertTrue("New session should have been created by session wrapper",
 | 
	
		
			
				|  |  | +                ((SessionFixationProtectionFilter.SessionFixationProtectionResponseWrapper)chain.getResponse()).isNewSessionStarted());
 | 
	
		
			
				|  |  | +        assertFalse("Session Id should have changed", sessionId.equals(request.getSession().getId()));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    private class UserAuthenticatingFilterChain implements FilterChain {
 | 
	
		
			
				|  |  | +        public void doFilter(ServletRequest request, ServletResponse response) throws IOException {           
 | 
	
		
			
				|  |  | +            SecurityContextHolder.getContext().setAuthentication(new TestingAuthenticationToken("user", "pass", null));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    private class AuthenticateAndRedirectFilterChain extends UserAuthenticatingFilterChain{
 | 
	
		
			
				|  |  | +        HttpServletResponse response;
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        public void doFilter(ServletRequest request, ServletResponse response) throws IOException {
 | 
	
		
			
				|  |  | +            super.doFilter(request, response);
 | 
	
		
			
				|  |  | +            this.response = (HttpServletResponse)response;
 | 
	
		
			
				|  |  | +            this.response.sendRedirect("/someUrl");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public HttpServletResponse getResponse() {
 | 
	
		
			
				|  |  | +            return response;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |