X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsignature%2FContentReference.cpp;h=e430fb46bd68517f9c2224d5249a324c5bc4a3fb;hb=961aeb6e484bd2b884860b8161df8bdd85279547;hp=92df01271e34187cbb133ed85483ba3ff1ae3542;hpb=ace93f70a29a03825d2c9cebf60ee89693b5c3a7;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/signature/ContentReference.cpp b/saml/signature/ContentReference.cpp index 92df012..e430fb4 100644 --- a/saml/signature/ContentReference.cpp +++ b/saml/signature/ContentReference.cpp @@ -1,17 +1,21 @@ -/* - * Copyright 2001-2010 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 +/** + * Licensed to the University Corporation for Advanced Internet + * Development, Inc. (UCAID) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + * + * UCAID 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 + * 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. + * 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. */ /** @@ -34,6 +38,25 @@ using namespace opensaml; using namespace xmltooling; using namespace std; +void SignableObject::declareNonVisibleNamespaces() const +{ + ContentReference* cr = getSignature() ? dynamic_cast(getSignature()->getContentReference()) : nullptr; + + // Compute inclusive prefix set. + map decls; + XMLHelper::getNonVisiblyUsedPrefixes(*this, decls); + + for (map::const_iterator decl = decls.begin(); decl != decls.end(); ++decl) { + + // Pin it to the object root. An existing copy of the prefix on the root will take precedence. + addNamespace(Namespace(decl->second.c_str(), decl->first.c_str(), true, Namespace::NonVisiblyUsed)); + + // Add to content reference, if any. + if (cr) + cr->addInclusivePrefix(decl->first.c_str()); + } +} + ContentReference::ContentReference(const SignableObject& signableObject) : m_signableObject(signableObject), m_digest(nullptr), m_c14n(nullptr) { @@ -46,6 +69,7 @@ ContentReference::~ContentReference() void ContentReference::createReferences(DSIGSignature* sig) { DSIGReference* ref = nullptr; + sig->setIdByAttributeName(false); const XMLCh* id=m_signableObject.getXMLID(); if (!id || !*id) ref=sig->createReference(&chNull, m_digest ? m_digest : DSIGConstants::s_unicodeStrURISHA1); // whole doc reference @@ -68,21 +92,16 @@ void ContentReference::createReferences(DSIGSignature* sig) 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) { - // Compute inclusive prefix set. - set prefix_set; - XMLHelper::getNonVisiblyUsedPrefixes(m_signableObject, prefix_set); - prefix_set.insert(m_prefixes.begin(), m_prefixes.end()); - // Build up the string of prefixes. xstring prefixes; static const XMLCh _default[] = { chPound, chLatin_d, chLatin_e, chLatin_f, chLatin_a, chLatin_u, chLatin_l, chLatin_t, chNull }; - for (set::const_iterator p = prefix_set.begin(); p != prefix_set.end(); ++p) { + for (set::const_iterator p = m_prefixes.begin(); p != m_prefixes.end(); ++p) { prefixes += (p->empty() ? _default : p->c_str()); prefixes += chSpace; } if (!prefixes.empty()) { prefixes.erase(prefixes.begin() + prefixes.size() - 1); - c14n->setInclusiveNamespaces(prefixes.c_str()); + c14n->setInclusiveNamespaces(const_cast(prefixes.c_str())); } } }