Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

XSECC14n20010315.hpp

Go to the documentation of this file.
00001 /*
00002  * The Apache Software License, Version 1.1
00003  *
00004  * Copyright (c) 2002 Berin Lautenbach.  All rights reserved.
00005  *
00006  * Redistribution and use in source and binary forms, with or without
00007  * modification, are permitted provided that the following conditions
00008  * are met:
00009  *
00010  * 1. Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *
00013  * 2. Redistributions in binary form must reproduce the above copyright
00014  *    notice, this list of conditions and the following disclaimer in
00015  *    the documentation and/or other materials provided with the
00016  *    distribution.
00017  *
00018  * 3. The end-user documentation included with the redistribution,
00019  *    if any, must include the following acknowledgment:
00020  *       "This product includes software developed by
00021  *                   Berin Lautenbach"
00022  *    Alternately, this acknowledgment may appear in the software itself,
00023  *    if and wherever such third-party acknowledgments normally appear.
00024  *
00025  * 4. The names "XSEC", "xml-security-c" and Berin Lautenbach must
00026  *    not be used to endorse or promote products derived from this
00027  *    software without prior written permission. For written
00028  *    permission, please contact berin@users.sourceforge.net.
00029  *
00030  * 5. Products derived from this software may not be called "xml-security-c",
00031  *    nor may "xml-security-c" appear in their name, without prior written
00032  *    permission of Berin Lautenbach.
00033  *
00034  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
00035  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00036  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00037  * DISCLAIMED.  IN NO EVENT SHALL BERIN LAUTENBACH OR OTHER
00038  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00039  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00040  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
00041  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00042  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00043  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
00044  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00045  * SUCH DAMAGE.
00046  * ====================================================================
00047  */
00048 
00049 /*
00050  * XSEC
00051  *
00052  * XSECC14n20010315 := Canonicaliser object to process XML document in line with
00053  *                       RFC 3076
00054  *
00055  */
00056 
00057 #ifndef XSECC14n20010315_INCLUDE
00058 #define XSECC14n20010315_INCLUDE
00059 
00060 //XSEC includes
00061 #include <xsec/framework/XSECDefs.hpp>
00062 #include <xsec/utils/XSECSafeBuffer.hpp>
00063 #include <xsec/utils/XSECXPathNodeList.hpp>
00064 #include <xsec/canon/XSECCanon.hpp>
00065 
00066 // Xerces includes
00067 #include <xercesc/framework/XMLFormatter.hpp>
00068 
00069 // General includes
00070 #include <memory.h>
00071 #include <vector>
00072 
00073 // --------------------------------------------------------------------------------
00074 //           Object definitions needed for formatting Xerces objects
00075 // --------------------------------------------------------------------------------
00076 
00077 
00078 class c14nFormatTarget : public XMLFormatTarget
00079 {
00080 public:
00081     
00082     safeBuffer * buffer;        // Buffer to write to
00083 
00084     c14nFormatTarget()  {};
00085     ~c14nFormatTarget() {};
00086 
00087     void setBuffer (safeBuffer * toSet) {buffer = toSet;};
00088 
00089 
00090     // -----------------------------------------------------------------------
00091     //  Implementations of the format target interface
00092     // -----------------------------------------------------------------------
00093 
00094     void writeChars(const   XMLByte* const  toWrite,
00095                     const   unsigned int    count,
00096                             XMLFormatter * const formatter)
00097     {
00098         // Surprisingly, Solaris was the only platform on which
00099         // required the char* cast to print out the string correctly.
00100         // Without the cast, it was pinting the pointer value in hex.
00101         // Quite annoying, considering every other platform printed
00102         // the string with the explicit cast to char* below.
00103         buffer->sbMemcpyIn((char *) toWrite, (int) count);
00104         (*buffer)[count] = '\0';
00105     };
00106 
00107 private:
00108     // -----------------------------------------------------------------------
00109     //  Unimplemented methods.
00110     // -----------------------------------------------------------------------
00111     c14nFormatTarget(const c14nFormatTarget& other);
00112     void operator=(const c14nFormatTarget& rhs);
00113 
00114     
00115 };
00116 
00117 // --------------------------------------------------------------------------------
00118 //           Simple structure for holding a list of nodes
00119 // --------------------------------------------------------------------------------
00120 
00121 // NOTE: We don't use NamedNodeMap or DOMNodeList as we are unsure what might happen
00122 // to them in the future.  Also, to add items we would have to delve into the inards
00123 // of Xerces (and use the "...impl" classes).  Such an approach might not be supported
00124 // in the future.
00125 
00126 struct XSECNodeListElt {
00127 
00128     DOMNode     *element;           // Element referred to
00129     safeBuffer  sortString;         // The string that is used to sort the nodes
00130 
00131     XSECNodeListElt     *next,
00132                         *last;      // For the list
00133 
00134 };
00135 
00136 // Used for the sorting function
00137 
00138 #define XMLNS_PREFIX        "a"
00139 #define ATTRIBUTE_PREFIX    "b"
00140 
00141 // --------------------------------------------------------------------------------
00142 //           XSECC14n20010315 Object definition
00143 // --------------------------------------------------------------------------------
00144 
00145 class CANON_EXPORT XSECC14n20010315 : public XSECCanon {
00146 
00147 #if defined(XALAN_NO_NAMESPACES)
00148     typedef vector<char *>              CharListVectorType;
00149 #else
00150     typedef std::vector<char *>         CharListVectorType;
00151 #endif
00152 
00153 #if defined(XALAN_SIZE_T_IN_NAMESPACE_STD)
00154     typedef std::size_t     size_type;
00155 #else
00156     typedef size_t          size_type;
00157 #endif
00158 
00159 
00160 public:
00161 
00162     // Constructors
00163     XSECC14n20010315();
00164     XSECC14n20010315(DOMDocument *newDoc);
00165     XSECC14n20010315(DOMDocument *newDoc, DOMNode *newStartNode);
00166     virtual ~XSECC14n20010315();
00167 
00168     // XPath processor
00169 
00170     int XPathSelectNodes(const char * XPathExpr);
00171     void setXPathMap(const XSECXPathNodeList & map);
00172 
00173     // Comments processing
00174     void setCommentsProcessing(bool onoff);
00175     bool getCommentsProcessing(void);
00176 
00177     // Exclusive processing
00178     void setExclusive(void);
00179     void setExclusive(char * xmlnsList);
00180 
00181 protected:
00182 
00183     // Implementation of virtual function
00184     int processNextNode();
00185 
00186     // Test whether a name space is in the non-exclusive list
00187     bool inNonExclNSList(safeBuffer &ns);
00188 
00189 private:
00190 
00191     void XSECC14n20010315::init();
00192     bool checkRenderNameSpaceNode(DOMNode *e, DOMNode *a);
00193 
00194     // For formatting the buffers
00195     c14nFormatTarget *c14ntarget;
00196     XMLFormatter *formatter;
00197     safeBuffer formatBuffer;
00198 
00199     // For holding state whilst walking the DOM tree
00200     XSECNodeListElt * mp_attributes,                // Start of list
00201                     * mp_currentAttribute,          // Where we currently are in list
00202                     * mp_firstNonNsAttribute;       // First NON XMLNS element in list
00203     DOMNode         * mp_attributeParent;           // To return up the tree
00204     bool m_returnedFromChild;                       // Did we get to this node from below?
00205     DOMNode         * mp_firstElementNode;          // The root element of the document
00206     bool            m_firstElementProcessed;        // Has the first node been handled?
00207     unsigned char   * mp_charBuffer;
00208 
00209     // For XPath evaluation
00210     bool              m_XPathSelection;             // Are we doing an XPath?
00211     XSECXPathNodeList m_XPathMap;                   // The elements in the XPath
00212 
00213     // For comment processing
00214     bool            m_processComments;              // Whether comments are in or out (in by default)
00215 
00216     // For exclusive canonicalisation
00217     CharListVectorType      m_exclNSList;
00218     bool                    m_exclusive;
00219     bool                    m_exclusiveDefault;
00220 
00221 
00222 
00223 };
00224 
00225 
00226 #endif /* XSECC14n20010315_INCLUDE */
00227 
00228 

Generated on Sat Jan 11 20:34:07 2003 for XML-Security-C by doxygen1.2.15