package org.esigate.cas; import java.util.Map; import java.util.Properties; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.ProtocolVersion; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.entity.StringEntity; import org.apache.http.message.BasicHttpResponse; import org.apache.http.util.EntityUtils; import org.esigate.Driver; import org.esigate.Parameters; import org.esigate.cookie.CookieManager; import org.esigate.events.EventManager; import org.esigate.events.impl.FragmentEvent; import org.esigate.extension.ExtensionFactory; import org.esigate.http.BasicCloseableHttpResponse; import org.esigate.http.HttpClientRequestExecutor; import org.esigate.http.IncomingRequest; import org.esigate.http.OutgoingRequest; import org.esigate.impl.DriverRequest; import org.esigate.test.TestUtils; import org.esigate.test.conn.MockConnectionManager; import org.jasig.cas.client.authentication.AttributePrincipal; import junit.framework.TestCase; /** * CasAuthenticationHandlerTest */ public class CasAuthenticationHandlerTest extends TestCase { private Driver driver1; private CasAuthenticationHandler handler; private HttpClientRequestExecutor httpClientRequestExecutor; private MockConnectionManager mockConnectionManager; private HttpResponse createMockResponse(String entity) throws Exception { HttpResponse response = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), HttpStatus.SC_OK, "OK"); HttpEntity httpEntity = new StringEntity(entity); response.setEntity(httpEntity); return response; } @Override public void setUp() { Properties properties = new Properties(); properties.put(Parameters.REMOTE_URL_BASE, "http://localhost:8080"); properties.put(CasAuthenticationHandler.CAS_LOGIN_URL, "/loginurl"); mockConnectionManager = new MockConnectionManager(); driver1 = Driver.builder() .setName("driver1") .setProperties(properties) .setRequestExecutorBuilder( HttpClientRequestExecutor .builder() .setConnectionManager(mockConnectionManager) .setCookieManager( (CookieManager) ExtensionFactory.getExtension(properties, Parameters.COOKIE_MANAGER, null))).build(); httpClientRequestExecutor = (HttpClientRequestExecutor) driver1.getRequestExecutor(); handler = new CasAuthenticationHandler(); handler.init(driver1, properties); } public void testCasAuthenticationKo() throws Exception { DriverRequest driverRequest = TestUtils.createDriverRequest(driver1); OutgoingRequest outgoingRequest = httpClientRequestExecutor.createOutgoingRequest(driverRequest, "http://localhost:8080", true); FragmentEvent event = new FragmentEvent(driverRequest.getOriginalRequest(), outgoingRequest, outgoingRequest.getContext()); CloseableHttpResponse httpResponse = BasicCloseableHttpResponse.adapt(createMockResponse("0")); httpResponse.setHeader("Location", "http://localhost/loginurl?service=http"); event.setHttpResponse(httpResponse); HttpResponse responseOnceAuthenticated = createMockResponse("1"); mockConnectionManager.setResponse(responseOnceAuthenticated); handler.event(EventManager.EVENT_FRAGMENT_POST, event); // No extra request should be sent assertNull(mockConnectionManager.getSentRequest()); // The response should be "unauthorized" as we cannot send the CAS ticket assertEquals(401, event.getHttpResponse().getStatusLine().getStatusCode()); } public void testCasAuthenticationOk() throws Exception { AttributePrincipal userPrincipal = new AttributePrincipal() { private static final long serialVersionUID = 1L; @Override public Map<String, Object> getAttributes() { return null; } @Override public String getName() { return "test"; } @Override public String getProxyTicketFor(String arg0) { return "proxy_ticket"; } }; IncomingRequest incomingRequest = TestUtils.createIncomingRequest().setUserPrincipal(userPrincipal).build(); DriverRequest driverRequest = new DriverRequest(incomingRequest, driver1, "/"); OutgoingRequest outgoingRequest = httpClientRequestExecutor.createOutgoingRequest(driverRequest, "http://localhost:8080", true); FragmentEvent event = new FragmentEvent(driverRequest.getOriginalRequest(), outgoingRequest, outgoingRequest.getContext()); CloseableHttpResponse httpResponse = BasicCloseableHttpResponse.adapt(createMockResponse("0")); httpResponse.setHeader("Location", "http://localhost/loginurl?service=http"); event.setHttpResponse(httpResponse); HttpResponse responseOnceAuthenticated = createMockResponse("1"); mockConnectionManager.setResponse(responseOnceAuthenticated); handler.event(EventManager.EVENT_FRAGMENT_POST, event); // A new request should have been sent with the proxy ticket assertNotNull(mockConnectionManager.getSentRequest()); assertEquals("/?ticket=proxy_ticket", mockConnectionManager.getSentRequest().getRequestLine().getUri()); assertEquals(200, event.getHttpResponse().getStatusLine().getStatusCode()); assertEquals("1", EntityUtils.toString(event.getHttpResponse().getEntity())); } public void testNoCasAuthenticationRequired() throws Exception { DriverRequest driverRequest = TestUtils.createDriverRequest(driver1); OutgoingRequest outgoingRequest = httpClientRequestExecutor.createOutgoingRequest(driverRequest, "http://localhost:8080", true); FragmentEvent event = new FragmentEvent(driverRequest.getOriginalRequest(), outgoingRequest, outgoingRequest.getContext()); CloseableHttpResponse httpResponse = BasicCloseableHttpResponse.adapt(createMockResponse("0")); event.setHttpResponse(httpResponse); handler.event(EventManager.EVENT_FRAGMENT_POST, event); // No extra request should be sent assertNull(mockConnectionManager.getSentRequest()); } }