/* * Copyright 2016 Red Hat, Inc. and/or its affiliates * and other contributors as indicated by the @author tags. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.keycloak.saml.processing.core.parsers.saml; import javax.xml.namespace.QName; import javax.xml.stream.XMLEventReader; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import org.keycloak.dom.saml.v2.protocol.ExtensionsType; import org.keycloak.saml.common.PicketLinkLogger; import org.keycloak.saml.common.PicketLinkLoggerFactory; import org.keycloak.saml.common.constants.JBossSAMLConstants; import org.keycloak.saml.common.constants.JBossSAMLURIConstants; import org.keycloak.saml.common.exceptions.ParsingException; import org.keycloak.saml.common.parsers.ParserNamespaceSupport; import org.keycloak.saml.common.util.StaxParserUtil; /** * Parses <samlp:Extensions> SAML2 element into series of DOM nodes. * * @author hmlnarik */ public class SAMLExtensionsParser implements ParserNamespaceSupport { private static final String EXTENSIONS = JBossSAMLConstants.EXTENSIONS.get(); private static final PicketLinkLogger logger = PicketLinkLoggerFactory.getLogger(); @Override public ExtensionsType parse(XMLEventReader xmlEventReader) throws ParsingException { // Get the startelement StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader); StaxParserUtil.validate(startElement, EXTENSIONS); ExtensionsType extensions = new ExtensionsType(); while (xmlEventReader.hasNext()) { XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader); if (xmlEvent instanceof EndElement) { EndElement endElement = (EndElement) xmlEvent; if (StaxParserUtil.matches(endElement, EXTENSIONS)) { endElement = StaxParserUtil.getNextEndElement(xmlEventReader); break; } else throw logger.parserUnknownEndElement(StaxParserUtil.getEndElementName(endElement)); } startElement = StaxParserUtil.peekNextStartElement(xmlEventReader); if (startElement == null) break; extensions.addExtension(StaxParserUtil.getDOMElement(xmlEventReader)); } return extensions; } @Override public boolean supports(QName qname) { String nsURI = qname.getNamespaceURI(); String localPart = qname.getLocalPart(); return nsURI.equals(JBossSAMLURIConstants.PROTOCOL_NSURI.get()) && localPart.equals(JBossSAMLConstants.EXTENSIONS.get()); } }