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();
}
}