/** * 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 * * XSECDOMUtils:= Utilities to manipulate DOM within XML-SECURITY * * Author(s): Berin Lautenbach * * $Id$ * */ #ifndef XSECDOMUTILS_HEADER #define XSECDOMUTILS_HEADER // XSEC #include #include #include // Xerces #include #include #define COMPARE_STRING_LENGTH 256 // -------------------------------------------------------------------------------- // "Quick" Transcode Class (low performance) // -------------------------------------------------------------------------------- class XSEC_EXPORT XMLT { public: XMLT(const char * str); ~XMLT(void); XMLCh * getUnicodeStr(void); private: XMLCh * mp_unicodeStr; XMLT(); }; #define MAKE_UNICODE_STRING(str) XMLT(str).getUnicodeStr() // -------------------------------------------------------------------------------- // Utilities to manipulate namespaces // -------------------------------------------------------------------------------- const XMLCh XSEC_EXPORT * getDSIGLocalName(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node); const XMLCh XSEC_EXPORT * getDSIG11LocalName(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node); const XMLCh XSEC_EXPORT * getECLocalName(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node); const XMLCh XSEC_EXPORT * getXPFLocalName(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node); const XMLCh XSEC_EXPORT * getXENCLocalName(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node); const XMLCh XSEC_EXPORT * getXENC11LocalName(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node); #ifdef XSEC_XKMS_ENABLED const XMLCh XSEC_EXPORT * getXKMSLocalName(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node); #endif // -------------------------------------------------------------------------------- // Do UTF-8 <-> UTF-16 transcoding // -------------------------------------------------------------------------------- XMLCh XSEC_EXPORT * transcodeFromUTF8(const unsigned char * src); char XSEC_EXPORT * transcodeToUTF8(const XMLCh * src); // -------------------------------------------------------------------------------- // Find a nominated DSIG/XENC node in a document // -------------------------------------------------------------------------------- XERCES_CPP_NAMESPACE_QUALIFIER DOMNode XSEC_EXPORT * findDSIGNode(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n, const char * nodeName); XERCES_CPP_NAMESPACE_QUALIFIER DOMNode XSEC_EXPORT * findXENCNode(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n, const char * nodeName); // -------------------------------------------------------------------------------- // Find particular type of node child // -------------------------------------------------------------------------------- XERCES_CPP_NAMESPACE_QUALIFIER DOMNode XSEC_EXPORT * findFirstChildOfType(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n, XERCES_CPP_NAMESPACE_QUALIFIER DOMNode::NodeType t); XERCES_CPP_NAMESPACE_QUALIFIER DOMNode XSEC_EXPORT * findNextChildOfType(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n, XERCES_CPP_NAMESPACE_QUALIFIER DOMNode::NodeType t); XERCES_CPP_NAMESPACE_QUALIFIER DOMElement XSEC_EXPORT * findFirstElementChild(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n); XERCES_CPP_NAMESPACE_QUALIFIER DOMElement XSEC_EXPORT * findNextElementChild(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n); // -------------------------------------------------------------------------------- // Make a QName // -------------------------------------------------------------------------------- safeBuffer XSEC_EXPORT &makeQName(safeBuffer & qname, safeBuffer &prefix, const char * localName); safeBuffer XSEC_EXPORT &makeQName(safeBuffer & qname, const XMLCh *prefix, const char * localName); safeBuffer XSEC_EXPORT &makeQName(safeBuffer & qname, const XMLCh *prefix, const XMLCh * localName); // -------------------------------------------------------------------------------- // Gather text from children // -------------------------------------------------------------------------------- void XSEC_EXPORT gatherChildrenText(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * parent, safeBuffer &output); // -------------------------------------------------------------------------------- // String decode/encode // -------------------------------------------------------------------------------- /* * Distinguished names have a particular encoding that needs to be performed prior * to enclusion in the DOM */ XMLCh * encodeDName(const XMLCh * toEncode); XMLCh * decodeDName(const XMLCh * toDecode); // -------------------------------------------------------------------------------- // Generate Ids // -------------------------------------------------------------------------------- XMLCh XSEC_EXPORT * generateId(unsigned int bytes = 16); // -------------------------------------------------------------------------------- // String Functions // -------------------------------------------------------------------------------- // Remove escape (%XX) characters from URIs and return a new buffer containing the // "cleaned" string XMLCh * cleanURIEscapes(const XMLCh * str); inline bool strEquals (const XMLCh * str1, const XMLCh *str2) { return (XMLString::compareString(str1, str2) == 0); } inline bool strEquals (const char * str1, const char *str2) { return (XMLString::compareString(str1, str2) == 0); } inline bool strEquals (const char * str1, const XMLCh * str2) { bool ret; XMLCh * str1XMLCh = XMLString::transcode(str1); if (str1XMLCh != NULL) { ret = (XMLString::compareString(str1XMLCh, str2) == 0); XSEC_RELEASE_XMLCH(str1XMLCh); } else ret = false; return ret; } inline bool strEquals (const XMLCh * str1, const char * str2) { bool ret; XMLCh * str2XMLCh = XMLString::transcode(str2); if (str2XMLCh != NULL) { ret = (XMLString::compareString(str1, str2XMLCh) == 0); XSEC_RELEASE_XMLCH(str2XMLCh); } else ret = false; return ret; } #endif /* XSECDOMUTILS_HEADER */