added support for parsing custom attributes.  Added a basic model that is easily overrideable.
This commit is contained in:
Scott Battaglia 2008-05-29 21:10:25 +00:00
parent fe8e8d8bb3
commit 56d0d2e023
3 changed files with 69 additions and 3 deletions

View File

@ -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;

View File

@ -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("<cas:attributes>");
final int pos2 = xml.indexOf("</cas:attributes>");
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.

View File

@ -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 = "<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'><cas:authenticationSuccess><cas:user>"
+ USERNAME
+ "</cas:user><cas:proxyGrantingTicket>"
+ PGTIOU
+ "</cas:proxyGrantingTicket><cas:attributes>\n<cas:password>test</cas:password>\n<cas:eduPersonId>id</cas:eduPersonId>\n</cas:attributes></cas:authenticationSuccess></cas:serviceResponse>";
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 = "<root />";