From dfb13e5397c5fdf68b389ed3d207435de7f8af89 Mon Sep 17 00:00:00 2001 From: Misagh Moayyed Date: Thu, 18 May 2017 14:09:11 -0700 Subject: [PATCH] add test cases --- .../json/Cas30JsonProxyTicketValidator.java | 7 +- .../json/Cas30JsonServiceTicketValidator.java | 4 +- .../json/JsonValidationResponseParser.java | 18 ++-- .../json/TicketValidationJsonResponse.java | 45 ++++++---- .../Cas30JsonServiceTicketValidatorTests.java | 90 +++++++++++++++++++ 5 files changed, 136 insertions(+), 28 deletions(-) create mode 100644 cas-client-core/src/test/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidatorTests.java diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonProxyTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonProxyTicketValidator.java index 48ff1f3..0cd5ec0 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonProxyTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonProxyTicketValidator.java @@ -4,6 +4,7 @@ import org.jasig.cas.client.validation.Assertion; import org.jasig.cas.client.validation.Cas30ProxyTicketValidator; import org.jasig.cas.client.validation.TicketValidationException; +import java.util.Collections; import java.util.List; /** @@ -15,7 +16,7 @@ import java.util.List; public class Cas30JsonProxyTicketValidator extends Cas30ProxyTicketValidator { public Cas30JsonProxyTicketValidator(final String casServerUrlPrefix) { super(casServerUrlPrefix); - getCustomParameters().put("format", "JSON"); + setCustomParameters(Collections.singletonMap("format", "JSON")); } @Override @@ -33,9 +34,9 @@ public class Cas30JsonProxyTicketValidator extends Cas30ProxyTicketValidator { protected List parseProxiesFromResponse(final String response) { try { final TicketValidationJsonResponse json = new JsonValidationResponseParser().parse(response); - return json.getAuthenticationSuccess().getProxies(); + return json.getServiceResponse().getAuthenticationSuccess().getProxies(); } catch (final Exception e) { - logger.warn("Unable to locate proxies from the JSON response"); + logger.warn("Unable to locate proxies from the JSON response", e); return super.parseProxiesFromResponse(response); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidator.java index f53a0be..6b4418d 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidator.java @@ -19,7 +19,7 @@ public class Cas30JsonServiceTicketValidator extends Cas30ServiceTicketValidator public Cas30JsonServiceTicketValidator(final String casServerUrlPrefix) { super(casServerUrlPrefix); - getCustomParameters().put("format", "JSON"); + setCustomParameters(Collections.singletonMap("format", "JSON")); } @Override @@ -28,7 +28,7 @@ public class Cas30JsonServiceTicketValidator extends Cas30ServiceTicketValidator final TicketValidationJsonResponse json = new JsonValidationResponseParser().parse(response); return json.getAssertion(getProxyGrantingTicketStorage(), getProxyRetriever()); } catch (final Exception e) { - logger.warn("Unable parse the JSON response"); + logger.warn("Unable parse the JSON response", e); return super.parseResponseFromServer(response); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/JsonValidationResponseParser.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/JsonValidationResponseParser.java index 8d37d15..5dd3abd 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/JsonValidationResponseParser.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/JsonValidationResponseParser.java @@ -19,20 +19,26 @@ final class JsonValidationResponseParser { public TicketValidationJsonResponse parse(final String response) throws TicketValidationException { try { + if (CommonUtils.isBlank(response)) { + throw new TicketValidationException("Invalid JSON response; The response is empty"); + } + final TicketValidationJsonResponse json = this.objectMapper.readValue(response, TicketValidationJsonResponse.class); - if (json == null || json.getAuthenticationFailure() != null && json.getAuthenticationSuccess() != null) { - throw new TicketValidationException("Invalid JSON response; either the response is empty or it indicates both a success " + final TicketValidationJsonResponse.CasServiceResponseAuthentication serviceResponse = json.getServiceResponse(); + if (serviceResponse.getAuthenticationFailure() != null + && serviceResponse.getAuthenticationSuccess() != null) { + throw new TicketValidationException("Invalid JSON response; It indicates both a success " + "and a failure event, which is indicative of a server error. The actual response is " + response); } - if (json.getAuthenticationFailure() != null) { - final String error = json.getAuthenticationFailure().getDescription() - + " - " + json.getAuthenticationFailure().getDescription(); + if (serviceResponse.getAuthenticationFailure() != null) { + final String error = json.getServiceResponse().getAuthenticationFailure().getCode() + + " - " + serviceResponse.getAuthenticationFailure().getDescription(); throw new TicketValidationException(error); } - final String principal = json.getAuthenticationSuccess().getUser(); + final String principal = json.getServiceResponse().getAuthenticationSuccess().getUser(); if (CommonUtils.isEmpty(principal)) { throw new TicketValidationException("No principal was found in the response from the CAS server."); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/TicketValidationJsonResponse.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/TicketValidationJsonResponse.java index e806470..c880667 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/TicketValidationJsonResponse.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/json/TicketValidationJsonResponse.java @@ -17,28 +17,19 @@ import java.util.Map; * @author Misagh Moayyed */ final class TicketValidationJsonResponse { - private CasServiceResponseAuthenticationFailure authenticationFailure; - private CasServiceResponseAuthenticationSuccess authenticationSuccess; + private CasServiceResponseAuthentication serviceResponse; - public CasServiceResponseAuthenticationFailure getAuthenticationFailure() { - return this.authenticationFailure; + public void setServiceResponse(final CasServiceResponseAuthentication serviceResponse) { + this.serviceResponse = serviceResponse; } - public void setAuthenticationFailure(final CasServiceResponseAuthenticationFailure authenticationFailure) { - this.authenticationFailure = authenticationFailure; - } - - public CasServiceResponseAuthenticationSuccess getAuthenticationSuccess() { - return this.authenticationSuccess; - } - - public void setAuthenticationSuccess(final CasServiceResponseAuthenticationSuccess authenticationSuccess) { - this.authenticationSuccess = authenticationSuccess; + public CasServiceResponseAuthentication getServiceResponse() { + return serviceResponse; } Assertion getAssertion(final ProxyGrantingTicketStorage proxyGrantingTicketStorage, final ProxyRetriever proxyRetriever) { - final String proxyGrantingTicketIou = getAuthenticationSuccess().getProxyGrantingTicket(); + final String proxyGrantingTicketIou = getServiceResponse().getAuthenticationSuccess().getProxyGrantingTicket(); final String proxyGrantingTicket; if (CommonUtils.isBlank(proxyGrantingTicketIou) || proxyGrantingTicketStorage == null) { proxyGrantingTicket = null; @@ -47,8 +38,8 @@ final class TicketValidationJsonResponse { } final Assertion assertion; - final Map attributes = getAuthenticationSuccess().getAttributes(); - final String principal = getAuthenticationSuccess().getUser(); + final Map attributes = getServiceResponse().getAuthenticationSuccess().getAttributes(); + final String principal = getServiceResponse().getAuthenticationSuccess().getUser(); if (CommonUtils.isNotBlank(proxyGrantingTicket)) { final AttributePrincipal attributePrincipal = new AttributePrincipalImpl(principal, attributes, proxyGrantingTicket, proxyRetriever); @@ -59,6 +50,26 @@ final class TicketValidationJsonResponse { return assertion; } + static class CasServiceResponseAuthentication { + private CasServiceResponseAuthenticationFailure authenticationFailure; + private CasServiceResponseAuthenticationSuccess authenticationSuccess; + + public CasServiceResponseAuthenticationFailure getAuthenticationFailure() { + return this.authenticationFailure; + } + + public void setAuthenticationFailure(final CasServiceResponseAuthenticationFailure authenticationFailure) { + this.authenticationFailure = authenticationFailure; + } + + public CasServiceResponseAuthenticationSuccess getAuthenticationSuccess() { + return this.authenticationSuccess; + } + + public void setAuthenticationSuccess(final CasServiceResponseAuthenticationSuccess authenticationSuccess) { + this.authenticationSuccess = authenticationSuccess; + } + } static class CasServiceResponseAuthenticationSuccess { private String user; diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidatorTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidatorTests.java new file mode 100644 index 0000000..1163331 --- /dev/null +++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/json/Cas30JsonServiceTicketValidatorTests.java @@ -0,0 +1,90 @@ +package org.jasig.cas.client.validation.json; + +import org.jasig.cas.client.PublicTestHttpServer; +import org.jasig.cas.client.proxy.ProxyGrantingTicketStorage; +import org.jasig.cas.client.proxy.ProxyGrantingTicketStorageImpl; +import org.jasig.cas.client.proxy.ProxyRetriever; +import org.jasig.cas.client.validation.AbstractTicketValidatorTests; +import org.jasig.cas.client.validation.Assertion; +import org.jasig.cas.client.validation.TicketValidationException; +import org.junit.Before; +import org.junit.Test; +import junit.framework.Assert; + +public class Cas30JsonServiceTicketValidatorTests extends AbstractTicketValidatorTests { + private static final PublicTestHttpServer server = PublicTestHttpServer.instance(8088); + private ProxyGrantingTicketStorage proxyGrantingTicketStorage; + + private Cas30JsonServiceTicketValidator ticketValidator; + + @Before + public void setUp() throws Exception { + this.proxyGrantingTicketStorage = getProxyGrantingTicketStorage(); + this.ticketValidator = new Cas30JsonServiceTicketValidator(CONST_CAS_SERVER_URL_PREFIX + "8088"); + this.ticketValidator.setProxyCallbackUrl("test"); + this.ticketValidator.setProxyGrantingTicketStorage(getProxyGrantingTicketStorage()); + this.ticketValidator.setProxyRetriever(getProxyRetriever()); + this.ticketValidator.setRenew(true); + } + + private ProxyGrantingTicketStorage getProxyGrantingTicketStorage() { + return new ProxyGrantingTicketStorageImpl(); + } + + private ProxyRetriever getProxyRetriever() { + return new ProxyRetriever() { + + /** Unique Id for serialization. */ + private static final long serialVersionUID = 1L; + + public String getProxyTicketIdFor(final String proxyGrantingTicketId, final String targetService) { + return "test"; + } + }; + } + + @Test + public void testSuccessfulJsonResponse() throws Exception { + final String RESPONSE = "{ " + + "\"serviceResponse\" : { " + + "\"authenticationSuccess\" : { " + + "\"user\" : \"casuser\", " + + "\"proxyGrantingTicket\" : \"PGTIOU-84678-8a9d\" ," + + "\"attributes\" : { " + + "\"cn\" : [ \"Name\" ] " + + '}' + + '}' + + '}' + + '}'; + + server.content = RESPONSE.getBytes(server.encoding); + final Assertion assertion = ticketValidator.validate("test", "test"); + Assert.assertEquals(assertion.getPrincipal().getName(), "casuser"); + Assert.assertTrue(assertion.getPrincipal().getAttributes().containsKey("cn")); + } + + @Test(expected = TicketValidationException.class) + public void testFailingJsonResponse() throws Exception { + final String RESPONSE = "{ " + + "\"serviceResponse\" : { " + + "\"authenticationFailure\" : { " + + "\"code\" : \"INVALID_TICKET\", " + + "\"description\" : \"Description\" " + + '}' + + '}' + + '}'; + + server.content = RESPONSE.getBytes(server.encoding); + ticketValidator.validate("test", "test"); + + } + + + @Test + public void testSuccessfulXmlResponseWithJson() throws Exception { + final String RESPONSE = "" + + "testPGTIOU"; + server.content = RESPONSE.getBytes(server.encoding); + ticketValidator.validate("test", "test"); + } +}