//************************************************************************** // Filename : TsToken.java, WSSE Toolkit 2005 // // Author : Denis Pilipchuk // // Purpose : Represents Timestamp elements. New timestamps are always // created - there is no option for creation from XML. // // Disclaimer: This software is provided "as-is" and does not imply // any warranty or responsibility. //**************************************************************************** package wsse.Toolkit.Tokens.Wss; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; // W3C DOM includes import org.w3c.dom.Element; import org.w3c.dom.NodeList; import wsse.Toolkit.Tokens.WsTokenException; import wsse.Toolkit.Tokens.WsTokenHelper; import wsse.Toolkit.Utils.Xml.XmlQName; import wsse.Toolkit.Utils.Xml.XmlConstants; public class TsToken extends WsuIDToken { private static final String TS_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; // Default duration is expected in minutes, Java's Date class works with ms private static final int DURATION_RATIO = 60000; // Timestamp token always creates a fresh TS element // Duration is specified in minutes public TsToken(int duration) { m_duration = duration; m_sdf.setTimeZone(TimeZone.getTimeZone("GMT")); } protected Element GenerateTokenXml() throws WsTokenException { // Generate and return a new TS element WsTokenHelper tokenHelper = GetTokenHelper(); assert null != tokenHelper : "Token helper should be set"; Element token = tokenHelper.CreateXmlElement( new XmlQName(XmlConstants.WSU_TIMESTAMP_ELEM_NAME, XmlConstants.WSSEC_WSU_NAMESPACE_URI, XmlConstants.WSSEC_WSU_NAMESPACE_PREFIX)); return token; } protected void RefreshTokenXml(Element token) throws WsTokenException { // Refresh contents of an existing TS element - change its creation and expiration times assert null != token : "Element to be refreshed should not be null"; // Get rid of any existing nodes NodeList nodes = token.getElementsByTagNameNS(XmlConstants.WSSEC_WSU_NAMESPACE_URI, XmlConstants.WSU_CREATED_ELEM_NAME); if (null != nodes) { for(int i = 0; i < nodes.getLength(); i++) { token.removeChild(nodes.item(i)); } } nodes = token.getElementsByTagNameNS(XmlConstants.WSSEC_WSU_NAMESPACE_URI, XmlConstants.WSU_EXPIRES_ELEM_NAME); if (null != nodes) { for(int i = 0; i < nodes.getLength(); i++) { token.removeChild(nodes.item(i)); } } // Set up new Created element WsTokenHelper tokenHelper = GetTokenHelper(); assert null != tokenHelper : "Token helper should be set"; Date created = new Date(); Element elmCreated = tokenHelper.CreateXmlElement( new XmlQName(XmlConstants.WSU_CREATED_ELEM_NAME, XmlConstants.WSSEC_WSU_NAMESPACE_URI, XmlConstants.WSSEC_WSU_NAMESPACE_PREFIX),m_sdf.format(created)); token.appendChild(elmCreated); if (m_duration > 0) { Date expires = new Date(created.getTime() + m_duration * TsToken.DURATION_RATIO); Element elmExpires = tokenHelper.CreateXmlElement( new XmlQName(XmlConstants.WSU_EXPIRES_ELEM_NAME, XmlConstants.WSSEC_WSU_NAMESPACE_URI, XmlConstants.WSSEC_WSU_NAMESPACE_PREFIX),m_sdf.format(expires)); token.appendChild(elmExpires); } } protected void VerifyElement(Element token) throws WsTokenException { assert null != token : "Validated element should not be null"; // TODO: shallow verification of validity of the passed TS token } private int m_duration; private SimpleDateFormat m_sdf = new SimpleDateFormat(TsToken.TS_FORMAT); }