/* * Copyright 2006 The Apache Software Foundation. * * 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. */ /* * XSEC * * XKMSRevokeRequestImpl := Implementation for RegisterRequest Messages * * $Id:$ * */ // XSEC Includes #include #include #include #include #include #include #include #include "XKMSRevokeRequestImpl.hpp" #include "XKMSRevokeKeyBindingImpl.hpp" #include "XKMSAuthenticationImpl.hpp" #include #include XERCES_CPP_NAMESPACE_USE // -------------------------------------------------------------------------------- // Construct/Destruct // -------------------------------------------------------------------------------- XKMSRevokeRequestImpl::XKMSRevokeRequestImpl(const XSECEnv * env) : m_request(env), m_msg(m_request.m_msg), mp_authentication(NULL), mp_revokeKeyBinding(NULL), mp_revocationCodeElement(NULL) { } XKMSRevokeRequestImpl::XKMSRevokeRequestImpl(const XSECEnv * env, DOMElement * node) : m_request(env, node), m_msg(m_request.m_msg), mp_authentication(NULL), mp_revokeKeyBinding(NULL), mp_revocationCodeElement(NULL) { } XKMSRevokeRequestImpl::~XKMSRevokeRequestImpl() { if (mp_authentication != NULL) delete mp_authentication; if (mp_revokeKeyBinding != NULL) delete mp_revokeKeyBinding; } // -------------------------------------------------------------------------------- // Load // -------------------------------------------------------------------------------- void XKMSRevokeRequestImpl::load(void) { if (m_msg.mp_messageAbstractTypeElement == NULL) { // Attempt to load an empty element throw XSECException(XSECException::XKMSError, "XKMSRevokeRequest::load - called on empty DOM"); } if (!strEquals(getXKMSLocalName(m_msg.mp_messageAbstractTypeElement), XKMSConstants::s_tagRevokeRequest)) { throw XSECException(XSECException::XKMSError, "XKMSRevokeRequest::load - called on incorrect node"); } // Load the base message m_request.load(); // Now check for any RevokeKeyBinding elements DOMElement * tmpElt = findFirstElementChild(m_msg.mp_messageAbstractTypeElement); while (tmpElt != NULL && !strEquals(getXKMSLocalName(tmpElt), XKMSConstants::s_tagRevokeKeyBinding)) { tmpElt = findNextElementChild(tmpElt); } if (tmpElt != NULL) { XSECnew(mp_revokeKeyBinding, XKMSRevokeKeyBindingImpl(m_msg.mp_env, tmpElt)); mp_revokeKeyBinding->load(); tmpElt = findNextElementChild(tmpElt); } else { throw XSECException(XSECException::ExpectedXKMSChildNotFound, "XKMSRevokeRequest::load - Expected RevokeKeyBinding node"); } // Authentication Element | RevocationCode Element if (tmpElt != NULL && strEquals(getXKMSLocalName(tmpElt), XKMSConstants::s_tagAuthentication)) { XSECnew(mp_authentication, XKMSAuthenticationImpl(m_msg.mp_env, tmpElt)); mp_authentication->load(mp_revokeKeyBinding->getId()); } else if (tmpElt != NULL && strEquals(getXKMSLocalName(tmpElt), XKMSConstants::s_tagRevocationCode)) { mp_revocationCodeElement = tmpElt; } else { throw XSECException(XSECException::ExpectedXKMSChildNotFound, "XKMSRevokeRequest::load - Expected Authentication or RevocationCode nodes"); } } // -------------------------------------------------------------------------------- // Create // -------------------------------------------------------------------------------- DOMElement * XKMSRevokeRequestImpl:: createBlankRevokeRequest(const XMLCh * service, const XMLCh * id) { return m_request.createBlankRequestAbstractType( XKMSConstants::s_tagRevokeRequest, service, id); } // -------------------------------------------------------------------------------- // MessageType // -------------------------------------------------------------------------------- XKMSMessageAbstractType::messageType XKMSRevokeRequestImpl::getMessageType(void) { return XKMSMessageAbstractTypeImpl::RevokeRequest; } // -------------------------------------------------------------------------------- // Get Methods // -------------------------------------------------------------------------------- XKMSRevokeKeyBinding * XKMSRevokeRequestImpl::getRevokeKeyBinding(void) const { return mp_revokeKeyBinding; } XKMSAuthentication * XKMSRevokeRequestImpl::getAuthentication (void) const { return mp_authentication; } const XMLCh * XKMSRevokeRequestImpl::getRevocationCode(void) const { if (mp_revocationCodeElement == NULL) return NULL; DOMNode * t = findFirstChildOfType(mp_revocationCodeElement, DOMNode::TEXT_NODE); if (t == NULL) { throw XSECException(XSECException::ExpectedXKMSChildNotFound, "XKMSRevokeRequestImpl::getRevocationCode - expected TEXT node"); } return t->getNodeValue(); } // -------------------------------------------------------------------------------- // Set Methods // -------------------------------------------------------------------------------- XKMSRevokeKeyBinding * XKMSRevokeRequestImpl::addRevokeKeyBinding(XKMSStatus::StatusValue status) { if (mp_revokeKeyBinding != NULL) return mp_revokeKeyBinding; // OK - Nothing exists, so we need to create from scratch XSECnew(mp_revokeKeyBinding, XKMSRevokeKeyBindingImpl(m_msg.mp_env)); DOMElement * elt = mp_revokeKeyBinding->createBlankRevokeKeyBinding(status); // Insert DOMElement * be = findFirstElementChild(m_msg.mp_messageAbstractTypeElement); while (be != NULL && !strEquals(getXKMSLocalName(be), XKMSConstants::s_tagAuthentication) && !strEquals(getXKMSLocalName(be), XKMSConstants::s_tagRevocationCode)) { be = findNextElementChild(be); } if (be == NULL) { m_msg.mp_env->doPrettyPrint(m_msg.mp_messageAbstractTypeElement); m_msg.mp_messageAbstractTypeElement->appendChild(elt); m_msg.mp_env->doPrettyPrint(m_msg.mp_messageAbstractTypeElement); return mp_revokeKeyBinding; } m_msg.mp_messageAbstractTypeElement->insertBefore(elt, be); if (m_msg.mp_env->getPrettyPrintFlag() == true) { m_msg.mp_messageAbstractTypeElement->insertBefore( m_msg.mp_env->getParentDocument()->createTextNode(DSIGConstants::s_unicodeStrNL), be); } return mp_revokeKeyBinding; } XKMSAuthentication * XKMSRevokeRequestImpl::addAuthentication(void) { if (mp_authentication != NULL) return mp_authentication; if (mp_revokeKeyBinding == NULL) { throw XSECException(XSECException::XKMSError, "XKMSRevokeRequestImpl::addAuthentication - called prior to key infos being added"); } XSECnew(mp_authentication, XKMSAuthenticationImpl(m_msg.mp_env)); DOMElement * e = mp_authentication->createBlankAuthentication(mp_revokeKeyBinding->getId()); DOMElement * be = findFirstElementChild(m_msg.mp_messageAbstractTypeElement); while (be != NULL && !strEquals(getXKMSLocalName(be), XKMSConstants::s_tagRevocationCode)) be = findNextElementChild(be); if (be == NULL) { m_msg.mp_env->doPrettyPrint(m_msg.mp_messageAbstractTypeElement); m_msg.mp_messageAbstractTypeElement->appendChild(e); m_msg.mp_env->doPrettyPrint(m_msg.mp_messageAbstractTypeElement); return mp_authentication; } m_msg.mp_messageAbstractTypeElement->insertBefore(e, be); if (m_msg.mp_env->getPrettyPrintFlag() == true) { m_msg.mp_messageAbstractTypeElement->insertBefore( m_msg.mp_env->getParentDocument()->createTextNode(DSIGConstants::s_unicodeStrNL), be); } return mp_authentication; } void XKMSRevokeRequestImpl::addRevocationCode(const XMLCh * code) { safeBuffer str; DOMDocument *doc = m_msg.mp_env->getParentDocument(); const XMLCh * prefix = m_msg.mp_env->getXKMSNSPrefix(); makeQName(str, prefix, XKMSConstants::s_tagRevocationCode); mp_revocationCodeElement = doc->createElementNS(XKMSConstants::s_unicodeStrURIXKMS, str.rawXMLChBuffer()); m_msg.mp_messageAbstractTypeElement->appendChild(mp_revocationCodeElement); m_msg.mp_env->doPrettyPrint(m_msg.mp_messageAbstractTypeElement); mp_revocationCodeElement->appendChild( m_msg.mp_env->getParentDocument()->createTextNode(code)); }