From 080405b4c03b74814db1834d2bdd901d4abd7248 Mon Sep 17 00:00:00 2001 From: tsschmidt Date: Wed, 23 Jan 2019 08:26:35 -0800 Subject: [PATCH] Extract inlined CAS attributes in protocol 3 Ticket Validator --- .../Cas30ServiceTicketValidator.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java index 236ea6e..160c0ab 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java @@ -18,6 +18,14 @@ */ package org.jasig.cas.client.validation; +import org.jasig.cas.client.util.XmlUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.HashMap; +import java.util.Map; + /** * Service tickets validation service for the CAS protocol v3. * @@ -34,4 +42,31 @@ public class Cas30ServiceTicketValidator extends Cas20ServiceTicketValidator { protected String getUrlSuffix() { return "p3/serviceValidate"; } + + /** + * Custom attribute extractor that will account for inlined CAS attributes. Useful when CAS is acting as + * as SAML 2 IdP and returns SAML attributes with names that contains namespaces. + * + * @param xml the XML to parse. + * @return - Map of attributes + */ + @Override + protected Map extractCustomAttributes(String xml) { + final Document document = XmlUtils.newDocument(xml); + final HashMap attributes = new HashMap(); + + NodeList attributeList = document.getElementsByTagName("cas:attribute"); + + for (int i = 0; i < attributeList.getLength(); i++) { + final Node attribute = attributeList.item(i); + if (attribute.getAttributes().getLength() > 0) { + attributes.put(attribute.getAttributes().getNamedItem("name").getNodeValue(), + attribute.getAttributes().getNamedItem("value").getNodeValue()); + } else { + attributes.put(attribute.getLocalName(), attribute.getNodeValue()); + } + } + + return attributes; + } }