X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsignature%2FContentReference.cpp;h=452ee09fb145b09eea70b60d80ba9986ea1a9d1b;hb=f3a43f14f9dd53428f9e879bb489d6a4cf2674a8;hp=1b452e8d96a2e00165706742f02bb370170f73fe;hpb=bb6f92163780b968239c19fdfbe22c0a0a4cd35a;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/signature/ContentReference.cpp b/saml/signature/ContentReference.cpp index 1b452e8..452ee09 100644 --- a/saml/signature/ContentReference.cpp +++ b/saml/signature/ContentReference.cpp @@ -1,67 +1,109 @@ -/* - * Copyright 2001-2006 Internet2 - * - * 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. - */ - -/** - * ContentReference.cpp - * - * SAML-specific signature reference profile - */ - -#include "internal.h" -#include "signature/ContentReference.h" -#include "signature/SignableObject.h" - -#include -#include -#include -#include - -using namespace opensaml; -using namespace std; - -class _addprefix : public binary_function { -public: - void operator()(DSIGTransformC14n* t, const string& s) const { - if (s.empty()) - t->addInclusiveNamespace("#default"); - else - t->addInclusiveNamespace(s.c_str()); - } -}; - -void ContentReference::createReferences(DSIGSignature* sig) -{ - const XMLCh* id=m_signableObject.getId(); - if (!id || !*id) - throw xmlsignature::SignatureException("Cannot create Signature reference to SAML object without an identifier."); - - DSIGReference* ref=NULL; - XMLCh* buf=new XMLCh[XMLString::stringLen(id) + 2]; - buf[0]=chPound; - buf[1]=chNull; - XMLString::catString(buf,id); - try { - ref=sig->createReference(buf); - delete[] buf; - } - catch(...) { - delete[] buf; - throw; - } - ref->appendEnvelopedSignatureTransform(); - DSIGTransformC14n* c14n=ref->appendCanonicalizationTransform(CANON_C14NE_NOC); - for_each(m_prefixes.begin(), m_prefixes.end(), bind1st(_addprefix(),c14n)); -} +/* + * Copyright 2001-2007 Internet2 + * + * 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. + */ + +/** + * ContentReference.cpp + * + * SAML-specific signature reference profile + */ + +#include "internal.h" +#include "signature/ContentReference.h" +#include "signature/SignableObject.h" + +#include +#include +#include +#include + +using namespace opensaml; +using namespace xmltooling; +using namespace std; + +void ContentReference::createReferences(DSIGSignature* sig) +{ + DSIGReference* ref=NULL; + const XMLCh* id=m_signableObject.getXMLID(); + if (!id || !*id) + ref=sig->createReference(&chNull); // whole doc reference + else { + XMLCh* buf=new XMLCh[XMLString::stringLen(id) + 2]; + buf[0]=chPound; + buf[1]=chNull; + XMLString::catString(buf,id); + try { + ref=sig->createReference(buf, m_digest ? m_digest : DSIGConstants::s_unicodeStrURISHA1); + delete[] buf; + } + catch(...) { + delete[] buf; + throw; + } + } + + ref->appendEnvelopedSignatureTransform(); + DSIGTransformC14n* c14n=ref->appendCanonicalizationTransform(m_c14n ? m_c14n : DSIGConstants::s_unicodeStrURIEXC_C14N_NOC); + if (!m_c14n || m_c14n == DSIGConstants::s_unicodeStrURIEXC_C14N_NOC || m_c14n == DSIGConstants::s_unicodeStrURIEXC_C14N_COM) { + //addPrefixes(m_signableObject); +#ifdef HAVE_GOOD_STL + xstring prefixes; + for (set::const_iterator p = m_prefixes.begin(); p!=m_prefixes.end(); ++p) + prefixes += *p + chSpace; + if (!prefixes.empty()) { + prefixes.erase(prefixes.begin() + prefixes.size() - 1); + c14n->setInclusiveNamespaces(XMLString::replicate(prefixes.c_str())); + } +#else + for (set::const_iterator p = m_prefixes.begin(); p!=m_prefixes.end(); ++p) + c14n->addInclusiveNamespace(p->c_str()); +#endif + } +} + +void ContentReference::addInclusivePrefix(const XMLCh* prefix) +{ + static const XMLCh _default[] = { chPound, chLatin_d, chLatin_e, chLatin_f, chLatin_a, chLatin_u, chLatin_l, chLatin_t, chNull }; + +#ifdef HAVE_GOOD_STL + if (prefix && *prefix) + m_prefixes.insert(prefix); + else + m_prefixes.insert(_default); +#else + if (prefix && *prefix) { + auto_ptr_char p(prefix); + m_prefixes.insert(p.get()); + } + else + m_prefixes.insert("#default"); +#endif +} + +void ContentReference::addPrefixes(const std::set& namespaces) +{ + for (set::const_iterator n = namespaces.begin(); n!=namespaces.end(); ++n) + addInclusivePrefix(n->getNamespacePrefix()); +} + +void ContentReference::addPrefixes(const XMLObject& xmlObject) +{ + addPrefixes(xmlObject.getNamespaces()); + const list& children = xmlObject.getOrderedChildren(); + for (list::const_iterator child = children.begin(); child!=children.end(); ++child) { + if (*child) + addPrefixes(*(*child)); + } +}