package org.apereo.cas.support.saml.authentication.principal; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.io.FileUtils; import org.apereo.cas.authentication.principal.Response; import org.apereo.cas.authentication.principal.Service; import org.apereo.cas.authentication.principal.WebApplicationService; import org.apereo.cas.support.saml.AbstractOpenSamlTests; import org.apereo.cas.support.saml.SamlProtocolConstants; import org.apereo.cas.web.support.DefaultArgumentExtractor; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import java.io.File; import java.io.IOException; import static org.junit.Assert.*; /** * Test cases for {@link SamlService}. * * @author Scott Battaglia * @since 3.1 */ public class SamlServiceTests extends AbstractOpenSamlTests { private static final File JSON_FILE = new File(FileUtils.getTempDirectoryPath(), "samlService.json"); private static final ObjectMapper MAPPER = new ObjectMapper(); @Test public void verifyResponse() { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setParameter(SamlProtocolConstants.CONST_PARAM_TARGET, "service"); final SamlService impl = new SamlServiceFactory().createService(request); final Response response = new SamlServiceResponseBuilder().build(impl, "ticketId"); assertNotNull(response); assertEquals(Response.ResponseType.REDIRECT, response.getResponseType()); assertTrue(response.getUrl().contains(SamlProtocolConstants.CONST_PARAM_ARTIFACT.concat("="))); } @Test public void verifyResponseForJsession() { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setParameter(SamlProtocolConstants.CONST_PARAM_TARGET, "http://www.cnn.com/;jsession=test"); final SamlService impl = new SamlServiceFactory().createService(request); assertEquals("http://www.cnn.com/", impl.getId()); } @Test public void verifyResponseWithNoTicket() { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setParameter(SamlProtocolConstants.CONST_PARAM_TARGET, "service"); final SamlService impl = new SamlServiceFactory().createService(request); final Response response = new SamlServiceResponseBuilder().build(impl, null); assertNotNull(response); assertEquals(Response.ResponseType.REDIRECT, response.getResponseType()); assertFalse(response.getUrl().contains(SamlProtocolConstants.CONST_PARAM_ARTIFACT.concat("="))); } @Test public void verifyRequestBody() { final String body = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Header/><SOAP-ENV:Body><samlp:Request xmlns:samlp=\"urn:oasis:names:tc:SAML:1.0:protocol\" MajorVersion=\"1\" " + "MinorVersion=\"1\" RequestID=\"_192.168.16.51.1024506224022\" IssueInstant=\"2002-06-19T17:03:44.022Z\">" + "<samlp:AssertionArtifact>artifact</samlp:AssertionArtifact></samlp:Request></SOAP-ENV:Body></SOAP-ENV:Envelope>"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContent(body.getBytes()); final SamlService impl = new SamlServiceFactory().createService(request); assertEquals("artifact", impl.getArtifactId()); assertEquals("_192.168.16.51.1024506224022", impl.getRequestID()); } @Test public void verifyTargetMatchesingSamlService() { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setParameter(SamlProtocolConstants.CONST_PARAM_TARGET, "https://some.service.edu/path/to/app"); final WebApplicationService service = new DefaultArgumentExtractor(new SamlServiceFactory()).extractService(request); final Service impl = new DefaultArgumentExtractor(new SamlServiceFactory()).extractService(request); assertTrue(impl.matches(service)); } @Test public void verifyTargetMatchesNoSamlService() { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setParameter(SamlProtocolConstants.CONST_PARAM_TARGET, "https://some.service.edu/path/to/app"); final Service impl = new DefaultArgumentExtractor(new SamlServiceFactory()).extractService(request); final MockHttpServletRequest request2 = new MockHttpServletRequest(); request2.setParameter(SamlProtocolConstants.CONST_PARAM_TARGET, "https://some.SERVICE.edu"); final WebApplicationService service = new DefaultArgumentExtractor(new SamlServiceFactory()).extractService(request2); assertFalse(impl.matches(service)); } @Test public void verifySerializeASamlServiceToJson() throws IOException { final String body = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Header/><SOAP-ENV:Body><samlp:Request xmlns:samlp=\"urn:oasis:names:tc:SAML:1.0:protocol\" MajorVersion=\"1\" " + "MinorVersion=\"1\" RequestID=\"_192.168.16.51.1024506224022\" IssueInstant=\"2002-06-19T17:03:44.022Z\">" + "<samlp:AssertionArtifact>artifact</samlp:AssertionArtifact></samlp:Request></SOAP-ENV:Body></SOAP-ENV:Envelope>"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContent(body.getBytes()); final SamlService serviceWritten = new SamlServiceFactory().createService(request); MAPPER.writeValue(JSON_FILE, serviceWritten); final SamlService serviceRead = MAPPER.readValue(JSON_FILE, SamlService.class); assertEquals(serviceWritten, serviceRead); } }