package org.jboss.seam.security.external.saml; import java.io.StringWriter; import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeConstants; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.jboss.seam.security.external.jaxb.samlv2.assertion.AssertionType; import org.jboss.seam.security.external.jaxb.samlv2.assertion.ConditionsType; import org.w3c.dom.Document; /** * @author Marcel Kolsteren */ public class SamlUtils { public static XMLGregorianCalendar getXMLGregorianCalendarNow() { return getXMLGregorianCalendar(new GregorianCalendar()); } public static XMLGregorianCalendar getXMLGregorianCalendarNowPlusDuration(int field, int amount) { GregorianCalendar gregorianCalendar = new GregorianCalendar(); gregorianCalendar.add(field, amount); return getXMLGregorianCalendar(gregorianCalendar); } private static XMLGregorianCalendar getXMLGregorianCalendar(GregorianCalendar gregorianCalendar) { try { DatatypeFactory dtf = DatatypeFactory.newInstance(); return dtf.newXMLGregorianCalendar(gregorianCalendar); } catch (DatatypeConfigurationException e) { throw new RuntimeException(e); } } public static boolean hasAssertionExpired(AssertionType assertion) { ConditionsType conditionsType = assertion.getConditions(); if (conditionsType != null) { XMLGregorianCalendar now = getXMLGregorianCalendarNow(); XMLGregorianCalendar notBefore = conditionsType.getNotBefore(); XMLGregorianCalendar notOnOrAfter = conditionsType.getNotOnOrAfter(); if (notBefore != null) { int val = notBefore.compare(now); if (val == DatatypeConstants.INDETERMINATE || val == DatatypeConstants.GREATER) { return true; } } if (notOnOrAfter != null) { int val = notOnOrAfter.compare(now); if (val != DatatypeConstants.GREATER) { return true; } } return false; } else { return false; } } public static String getDocumentAsString(Document document) { Source source = new DOMSource(document); StringWriter sw = new StringWriter(); Result streamResult = new StreamResult(sw); try { Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.INDENT, "no"); transformer.transform(source, streamResult); } catch (TransformerException e) { throw new RuntimeException(e); } return sw.toString(); } }