1   /* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
2    *
3    * Licensed under the Apache License, Version 2.0 (the "License");
4    * you may not use this file except in compliance with the License.
5    * You may obtain a copy of the License at
6    *
7    *     http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  package org.acegisecurity.ui.webapp;
17  
18  import junit.framework.TestCase;
19  
20  import org.acegisecurity.MockPortResolver;
21  
22  import org.acegisecurity.util.PortMapperImpl;
23  
24  import org.springframework.mock.web.MockHttpServletRequest;
25  import org.springframework.mock.web.MockHttpServletResponse;
26  
27  import java.util.HashMap;
28  import java.util.Map;
29  
30  
31  /**
32   * Tests {@link AuthenticationProcessingFilterEntryPoint}.
33   *
34   * @author Ben Alex
35   * @author colin sampaleanu
36   * @version $Id: AuthenticationProcessingFilterEntryPointTests.java 1496 2006-05-23 13:38:33Z benalex $
37   */
38  public class AuthenticationProcessingFilterEntryPointTests extends TestCase {
39      //~ Methods ========================================================================================================
40  
41      public static void main(String[] args) {
42          junit.textui.TestRunner.run(AuthenticationProcessingFilterEntryPointTests.class);
43      }
44  
45      public final void setUp() throws Exception {
46          super.setUp();
47      }
48  
49      public void testDetectsMissingLoginFormUrl() throws Exception {
50          AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
51          ep.setPortMapper(new PortMapperImpl());
52          ep.setPortResolver(new MockPortResolver(80, 443));
53  
54          try {
55              ep.afterPropertiesSet();
56              fail("Should have thrown IllegalArgumentException");
57          } catch (IllegalArgumentException expected) {
58              assertEquals("loginFormUrl must be specified", expected.getMessage());
59          }
60      }
61  
62      public void testDetectsMissingPortMapper() throws Exception {
63          AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
64          ep.setLoginFormUrl("xxx");
65          ep.setPortMapper(null);
66  
67          try {
68              ep.afterPropertiesSet();
69              fail("Should have thrown IllegalArgumentException");
70          } catch (IllegalArgumentException expected) {
71              assertEquals("portMapper must be specified", expected.getMessage());
72          }
73      }
74  
75      public void testDetectsMissingPortResolver() throws Exception {
76          AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
77          ep.setLoginFormUrl("xxx");
78          ep.setPortResolver(null);
79  
80          try {
81              ep.afterPropertiesSet();
82              fail("Should have thrown IllegalArgumentException");
83          } catch (IllegalArgumentException expected) {
84              assertEquals("portResolver must be specified", expected.getMessage());
85          }
86      }
87  
88      public void testGettersSetters() {
89          AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
90          ep.setLoginFormUrl("/hello");
91          ep.setPortMapper(new PortMapperImpl());
92          ep.setPortResolver(new MockPortResolver(8080, 8443));
93          assertEquals("/hello", ep.getLoginFormUrl());
94          assertTrue(ep.getPortMapper() != null);
95          assertTrue(ep.getPortResolver() != null);
96  
97          ep.setForceHttps(false);
98          assertFalse(ep.getForceHttps());
99          ep.setForceHttps(true);
100         assertTrue(ep.getForceHttps());
101     }
102 
103     public void testHttpsOperationFromOriginalHttpUrl()
104         throws Exception {
105         MockHttpServletRequest request = new MockHttpServletRequest();
106         request.setRequestURI("/some_path");
107         request.setScheme("http");
108         request.setServerName("www.example.com");
109         request.setContextPath("/bigWebApp");
110         request.setServerPort(80);
111 
112         MockHttpServletResponse response = new MockHttpServletResponse();
113 
114         AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
115         ep.setLoginFormUrl("/hello");
116         ep.setPortMapper(new PortMapperImpl());
117         ep.setForceHttps(true);
118         ep.setPortMapper(new PortMapperImpl());
119         ep.setPortResolver(new MockPortResolver(80, 443));
120         ep.afterPropertiesSet();
121 
122         ep.commence(request, response, null);
123         assertEquals("https://www.example.com/bigWebApp/hello", response.getRedirectedUrl());
124 
125         request.setServerPort(8080);
126         response = new MockHttpServletResponse();
127         ep.setPortResolver(new MockPortResolver(8080, 8443));
128         ep.commence(request, response, null);
129         assertEquals("https://www.example.com:8443/bigWebApp/hello", response.getRedirectedUrl());
130 
131         // Now test an unusual custom HTTP:HTTPS is handled properly
132         request.setServerPort(8888);
133         response = new MockHttpServletResponse();
134         ep.commence(request, response, null);
135         assertEquals("https://www.example.com:8443/bigWebApp/hello", response.getRedirectedUrl());
136 
137         PortMapperImpl portMapper = new PortMapperImpl();
138         Map map = new HashMap();
139         map.put("8888", "9999");
140         portMapper.setPortMappings(map);
141         response = new MockHttpServletResponse();
142 
143         ep = new AuthenticationProcessingFilterEntryPoint();
144         ep.setLoginFormUrl("/hello");
145         ep.setPortMapper(new PortMapperImpl());
146         ep.setForceHttps(true);
147         ep.setPortMapper(portMapper);
148         ep.setPortResolver(new MockPortResolver(8888, 9999));
149         ep.afterPropertiesSet();
150 
151         ep.commence(request, response, null);
152         assertEquals("https://www.example.com:9999/bigWebApp/hello", response.getRedirectedUrl());
153     }
154 
155     public void testHttpsOperationFromOriginalHttpsUrl()
156         throws Exception {
157         MockHttpServletRequest request = new MockHttpServletRequest();
158         request.setRequestURI("/some_path");
159         request.setScheme("https");
160         request.setServerName("www.example.com");
161         request.setContextPath("/bigWebApp");
162         request.setServerPort(443);
163 
164         MockHttpServletResponse response = new MockHttpServletResponse();
165 
166         AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
167         ep.setLoginFormUrl("/hello");
168         ep.setPortMapper(new PortMapperImpl());
169         ep.setForceHttps(true);
170         ep.setPortMapper(new PortMapperImpl());
171         ep.setPortResolver(new MockPortResolver(80, 443));
172         ep.afterPropertiesSet();
173 
174         ep.commence(request, response, null);
175         assertEquals("https://www.example.com/bigWebApp/hello", response.getRedirectedUrl());
176 
177         request.setServerPort(8443);
178         response = new MockHttpServletResponse();
179         ep.setPortResolver(new MockPortResolver(8080, 8443));
180         ep.commence(request, response, null);
181         assertEquals("https://www.example.com:8443/bigWebApp/hello", response.getRedirectedUrl());
182     }
183 
184     public void testNormalOperation() throws Exception {
185         AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
186         ep.setLoginFormUrl("/hello");
187         ep.setPortMapper(new PortMapperImpl());
188         ep.setPortResolver(new MockPortResolver(80, 443));
189         ep.afterPropertiesSet();
190 
191         MockHttpServletRequest request = new MockHttpServletRequest();
192         request.setRequestURI("/some_path");
193         request.setContextPath("/bigWebApp");
194         request.setScheme("http");
195         request.setServerName("www.example.com");
196         request.setContextPath("/bigWebApp");
197         request.setServerPort(80);
198 
199         MockHttpServletResponse response = new MockHttpServletResponse();
200 
201         ep.afterPropertiesSet();
202         ep.commence(request, response, null);
203         assertEquals("http://www.example.com/bigWebApp/hello", response.getRedirectedUrl());
204     }
205 
206     public void testOperationWhenHttpsRequestsButHttpsPortUnknown()
207         throws Exception {
208         AuthenticationProcessingFilterEntryPoint ep = new AuthenticationProcessingFilterEntryPoint();
209         ep.setLoginFormUrl("/hello");
210         ep.setPortMapper(new PortMapperImpl());
211         ep.setPortResolver(new MockPortResolver(8888, 1234));
212         ep.setForceHttps(true);
213         ep.afterPropertiesSet();
214 
215         MockHttpServletRequest request = new MockHttpServletRequest();
216         request.setRequestURI("/some_path");
217         request.setContextPath("/bigWebApp");
218         request.setScheme("http");
219         request.setServerName("www.example.com");
220         request.setContextPath("/bigWebApp");
221         request.setServerPort(8888); // NB: Port we can't resolve
222 
223         MockHttpServletResponse response = new MockHttpServletResponse();
224 
225         ep.afterPropertiesSet();
226         ep.commence(request, response, null);
227 
228         // Response doesn't switch to HTTPS, as we didn't know HTTP port 8888 to HTTP port mapping
229         assertEquals("http://www.example.com:8888/bigWebApp/hello", response.getRedirectedUrl());
230     }
231 }