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 = "";