From 56d0d2e0234c0043399673c6c15570122a817e70 Mon Sep 17 00:00:00 2001 From: Scott Battaglia Date: Thu, 29 May 2008 21:10:25 +0000 Subject: [PATCH] CASC-54 added support for parsing custom attributes. Added a basic model that is easily overrideable. --- .../validation/Cas20ProxyTicketValidator.java | 2 +- .../Cas20ServiceTicketValidator.java | 50 ++++++++++++++++++- .../Cas20ServiceTicketValidatorTests.java | 20 ++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java index 6c794fd..682bcbc 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java @@ -16,7 +16,7 @@ import java.util.List; * @version $Revision$ $Date$ * @since 3.1 */ -public final class Cas20ProxyTicketValidator extends Cas20ServiceTicketValidator { +public class Cas20ProxyTicketValidator extends Cas20ServiceTicketValidator { private boolean acceptAnyProxy; diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java index 2cf15db..bfdc23e 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java @@ -13,6 +13,14 @@ import org.jasig.cas.client.proxy.ProxyRetriever; import org.jasig.cas.client.util.CommonUtils; import org.jasig.cas.client.util.XmlUtils; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; /** @@ -75,17 +83,55 @@ public class Cas20ServiceTicketValidator extends AbstractCasProtocolUrlBasedTick } final Assertion assertion; + final Map attributes = extractCustomAttributes(response); if (CommonUtils.isNotBlank(proxyGrantingTicket)) { - final AttributePrincipal attributePrincipal = new AttributePrincipalImpl(principal, proxyGrantingTicket, this.proxyRetriever); + final AttributePrincipal attributePrincipal = new AttributePrincipalImpl(principal, attributes, proxyGrantingTicket, this.proxyRetriever); assertion = new AssertionImpl(attributePrincipal); } else { - assertion = new AssertionImpl(principal); + assertion = new AssertionImpl(new AttributePrincipalImpl(principal, attributes)); } customParseResponse(response, assertion); return assertion; } + + protected Map extractCustomAttributes(final String xml) { + final int pos1 = xml.indexOf(""); + final int pos2 = xml.indexOf(""); + + if (pos1 == -1) { + return Collections.EMPTY_MAP; + } + + final String attributesText = xml.substring(pos1+16, pos2); + + final Map attributes = new HashMap(); + final BufferedReader br = new BufferedReader(new StringReader(attributesText)); + + String line; + final List attributeNames = new ArrayList(); + try { + while ((line = br.readLine()) != null) { + final String trimmedLine = line.trim(); + if (trimmedLine.length() > 0) { + final int leftPos = trimmedLine.indexOf(":"); + final int rightPos = trimmedLine.indexOf(">"); + attributeNames.add(trimmedLine.substring(leftPos+1, rightPos)); + } + } + br.close(); + } catch (final IOException e) { + //ignore + } + + for (final Iterator iter = attributeNames.iterator(); iter.hasNext();) { + final String name = (String) iter.next(); + attributes.put(name, XmlUtils.getTextForElement(xml, name)); + } + + return attributes; + } /** * Template method if additional custom parsing (such as Proxying) needs to be done. diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java index 03211e9..e1d73c5 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java @@ -111,6 +111,26 @@ public final class Cas20ServiceTicketValidatorTests extends assertEquals(USERNAME, assertion.getPrincipal().getName()); // assertEquals(PGT, assertion.getProxyGrantingTicketId()); } + + public void testGetAttributes() throws TicketValidationException, + UnsupportedEncodingException { + final String USERNAME = "username"; + final String PGTIOU = "testPgtIou"; + final String RESPONSE = "" + + USERNAME + + "" + + PGTIOU + + "\ntest\nid\n"; + + PublicTestHttpServer.instance().content = RESPONSE + .getBytes(PublicTestHttpServer.instance().encoding); + + final Assertion assertion = this.ticketValidator.validate("test", "test"); + assertEquals(USERNAME, assertion.getPrincipal().getName()); + assertEquals("test", assertion.getPrincipal().getAttributes().get("password")); + assertEquals("id", assertion.getPrincipal().getAttributes().get("eduPersonId")); + //assertEquals(PGT, assertion.getProxyGrantingTicketId()); + } public void testInvalidResponse() throws Exception { final String RESPONSE = "";