blob: b4bc1ab0db3e5a787cf729bb601bf7aa2739d65d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* XKMSMessageAbstractType := Interface for base schema of XKMS messages
*
* $Id$
*
*/
#ifndef XKMSMESSAGEABSTRACTTYPE_INCLUDE
#define XKMSMESSAGEABSTRACTTYPE_INCLUDE
// XSEC Includes
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/dsig/DSIGConstants.hpp>
#ifdef XSEC_XKMS_ENABLED
class DSIGSignature;
XSEC_DECLARE_XERCES_CLASS(DOMElement);
/**
* @ingroup xkms
*/
/**
* @brief Interface definition for the MessageAbstractType
*
* The \<MessageAbstractType\> is an abstract type on which all
* other XKMS messages are built. All request/response messages
* have :
* <ul>
* <li><b>Id</b> The unique ID of this message</li>
* <li><b>Service</b> The URI of the service for which this message is
* destined or comes from.</li>
* <li><b>Nonce</b> (Optional) Random data used to defend against replay attacks.
* </ul>
*
* In addition, such messages may have :
*
* <ul>
* <li><b>Signature</b> Validating authenticity of this message</li>
* <li><b>MessageExtension</b> Used for extensibility</li>
* <li><b>OpaqueClientData</b> Used for application specific info</li>
* </ul>
*
* The schema definition for MessageAbstractType is as follows :
*
* \verbatim
<!-- MessageAbstractType -->
<complexType name="MessageAbstractType" abstract="true">
<sequence>
<element ref="ds:Signature" minOccurs="0"/>
<element ref="xkms:MessageExtension" minOccurs="0"
maxOccurs="unbounded"/>
<element ref="xkms:OpaqueClientData" minOccurs="0"/>
</sequence>
<attribute name="Id" type="ID" use="required"/>
<attribute name="Service" type="anyURI" use="required"/>
<attribute name="Nonce" type="base64Binary" use="optional"/>
</complexType>
<!-- /MessageAbstractType -->
\endverbatim
*/
class XSEC_EXPORT XKMSMessageAbstractType {
/** @name Constructors and Destructors */
//@{
protected:
XKMSMessageAbstractType() {};
public:
enum messageType {
None, /** A default value that indicates something hasn't been set */
/* X-KISS messages */
CompoundRequest, /** A CompoundRequest message - holding multiple requests */
CompoundResult, /** A CompoundResult message - holding multiple results */
LocateRequest, /** A LocateRequest message */
LocateResult, /** A LocateResult message */
ValidateRequest, /** A ValidateRequest message */
ValidateResult, /** A ValidateResult message */
PendingRequest, /** A PendingRequest message (Asynchronous protocol) */
StatusRequest, /** A StatusRequest message (Asynchronous protocol) */
StatusResult, /** A StatusResult message (Asynchronous protocol) */
Result, /** A non-specific result message */
/* X-KRSS messages */
RegisterRequest, /** A RegisterReqeust message */
RegisterResult, /** A RegisterResult message */
RevokeRequest, /** A RevokeRequest message */
RevokeResult, /** A RevokeResult message */
RecoverRequest, /** A RecoverRequest message */
RecoverResult, /** A RecoverResult message */
ReissueRequest, /** A ReissueRequest message */
ReissueResult /** A ReissueResult message */
};
virtual ~XKMSMessageAbstractType() {};
/** @name Message Manipulation Methods */
//@{
virtual messageType getMessageType(void) = 0;
/** @name Getter Interface Methods */
//@{
/**
* \brief Find out whether this is a signed Message
*
* @returns true if the message is signed
*/
virtual bool isSigned(void) const = 0;
/**
* \brief Retrieve the Signature information (if any is attached)
*
* All XKMS messages MAY have a \<Signature\> node that is used
* to attest to the validity of the message.
*
* @returns The DSIGSignature object associated with this Message,
* or NULL if none is defined
*/
virtual DSIGSignature * getSignature(void) const = 0;
/*
* \brief Obtain the base Element for this structure
*
* @returns the Element node at the head of the DOM structure
*/
virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * getElement(void) const = 0;
/**
* \brief Get the Id for the Message
*
* All messages are required to have an Id attribute that uniquely
* identifies the message. This method is used to retrieve a pointer
* to the Id string.
*
* @returns a pointer to the Id string (owned by the library)
*/
virtual const XMLCh * getId(void) const = 0;
/**
* \brief Get the Service identifier for this message
*
* All Messages are associated with a particular XKMS service. This
* method can be used to retrieve the Service URI for a particular
* message.
*
* @returns a pointer to the Service URI string (owned by the library)
*
*/
virtual const XMLCh * getService(void) const = 0;
/**
* \brief Get the Nonce of the message
*
* All messages MAY have a nonce, used to provide cryptographically
* random data that will help defend against a replay attack.
*
* @returns A string (owned by the library) providing the nonce data in
* base64 encoded form. If no Nonce is set, NULL is returned.
*/
virtual const XMLCh * getNonce(void) const = 0;
//@}
/** @name Setter interface methods */
//@{
/**
* \brief Set the Id URI for the Message
*
* Allows a calling application to set a new Id for the
* message
*
* Note: Great care should be taken on resetting Id attributes, as
* they are used to track a particular transaction through its
* liefcycle.
*
* @param id The Id to set
*/
virtual void setId(const XMLCh * id) = 0;
/**
* \brief Set the Service for the Message
*
* Used to set a new service URI for a particular message. In general,
* the service attribute would not be expected to change.
*
*
* @param service String to set in the Service attribute.
*/
virtual void setService(const XMLCh * service) = 0;
/**
* \brief Set the Nonce value
*
* Allows the application to set a new Nonce value (overwriting any
* that is currently set).
*
* @param uri String (base64 encoded data) to set in the Nonce attribute.
* @note no checking of this string is done by the library - it
* is assumed that it is a valid base64 encoding.
*/
virtual void setNonce(const XMLCh * uri) = 0;
/**
* \brief Add a signature to the message
*
* Allows an application to sign the message
*
* @returns the new Signature structure
*/
virtual DSIGSignature * addSignature(
const XMLCh* c14nAlgorithm,
const XMLCh* signatureAlgorithm,
const XMLCh* hashAlgorithm) = 0;
//@}
/** @name Opaque client data handling */
//@{
/**
* \brief Find the number of \<OpaqueData\> elements
*
* The \<OpaqueClientData\> element can have multiple
* \<OpaqueData\> children. This method allows an application
* to determine how many such children exist
*
* @return Number of \<OpaqueData\> elements
*/
virtual int getOpaqueClientDataSize(void) = 0;
/*
* \brief Get the nth item in the OpaqueClientData list
*
* @param item The item to return
* @returns the string of the nth item in the OpaqueClientData list.
*
*/
virtual const XMLCh * getOpaqueClientDataItemStr(int item) = 0;
/*
* \brief Append an item to the OpaqueClientData list
*
* @param item Base64 string to append to the list. Will be
* wrapped in a OpaqueData element.
*/
virtual void appendOpaqueClientDataItem(const XMLCh * item) = 0;
//@}
private:
// Unimplemented
XKMSMessageAbstractType(const XKMSMessageAbstractType &);
XKMSMessageAbstractType & operator = (const XKMSMessageAbstractType &);
};
#endif /* XSEC_XKMS_ENABLED */
#endif /* XKMSMESSAGEABSTRACTTYPE_INCLUDE */