diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-03-07 10:57:45 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-03-07 15:00:14 +0100 |
commit | 57e6b9f3f4861f6283841e24a189eae3c02db9e8 (patch) | |
tree | 0b1aa76d1f855b7498e13b14386d7e38bdc59e80 /xmlsecurity/source/helper/xmlsignaturehelper.cxx | |
parent | 64f86c7fec0a0e88d7d91703ea1aab68714608d1 (diff) |
xmlsecurity OOXML export: remove signature relation with the last signature
The signature relation refers to _xmlsignatures/origin.sigs, but
that's not written when all signatures are removed.
Change-Id: I5ee1c8849962cba4b338e6f43243bcf89aedad36
Diffstat (limited to 'xmlsecurity/source/helper/xmlsignaturehelper.cxx')
-rw-r--r-- | xmlsecurity/source/helper/xmlsignaturehelper.cxx | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx b/xmlsecurity/source/helper/xmlsignaturehelper.cxx index 4b60731cf0e8..aeee71a0bfa8 100644 --- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx +++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx @@ -487,7 +487,7 @@ bool XMLSignatureHelper::ReadAndVerifySignatureStorageStream(const css::uno::Ref return !mbError; } -void XMLSignatureHelper::EnsureSignaturesRelation(css::uno::Reference<css::embed::XStorage> xStorage) +void XMLSignatureHelper::EnsureSignaturesRelation(css::uno::Reference<css::embed::XStorage> xStorage, bool bAdd) { sal_Int32 nOpenMode = embed::ElementModes::READWRITE; uno::Reference<embed::XStorage> xSubStorage = xStorage->openStorageElement("_rels", nOpenMode); @@ -496,21 +496,40 @@ void XMLSignatureHelper::EnsureSignaturesRelation(css::uno::Reference<css::embed aRelationsInfo = comphelper::sequenceToContainer< std::vector< uno::Sequence<beans::StringPair> > >(comphelper::OFOPXMLHelper::ReadRelationsInfoSequence(xRelStream, ".rels", mxCtx)); // Do we have a relation already? + bool bHaveRelation = false; int nCount = 0; for (const uno::Sequence<beans::StringPair>& rRelation : aRelationsInfo) { auto aRelation = comphelper::sequenceToContainer< std::vector<beans::StringPair> >(rRelation); if (std::find_if(aRelation.begin(), aRelation.end(), lcl_isSignatureOriginType) != aRelation.end()) - return; + { + bHaveRelation = true; + break; + } ++nCount; } - // No, then add one. - std::vector<beans::StringPair> aRelation; - aRelation.push_back(beans::StringPair("Id", "rId" + OUString::number(++nCount))); - aRelation.push_back(beans::StringPair("Type", OOXML_SIGNATURE_ORIGIN)); - aRelation.push_back(beans::StringPair("Target", "_xmlsignatures/origin.sigs")); - aRelationsInfo.push_back(comphelper::containerToSequence(aRelation)); + if (!bHaveRelation && bAdd) + { + // No, and have to add one. + std::vector<beans::StringPair> aRelation; + aRelation.push_back(beans::StringPair("Id", "rId" + OUString::number(++nCount))); + aRelation.push_back(beans::StringPair("Type", OOXML_SIGNATURE_ORIGIN)); + aRelation.push_back(beans::StringPair("Target", "_xmlsignatures/origin.sigs")); + aRelationsInfo.push_back(comphelper::containerToSequence(aRelation)); + } + else if (bHaveRelation && !bAdd) + { + // Yes, and need to remove it. + for (std::vector< uno::Sequence<beans::StringPair> >::iterator it = aRelationsInfo.begin(); it != aRelationsInfo.end();) + { + auto aRelation = comphelper::sequenceToContainer< std::vector<beans::StringPair> >(*it); + if (std::find_if(aRelation.begin(), aRelation.end(), lcl_isSignatureOriginType) != aRelation.end()) + it = aRelationsInfo.erase(it); + else + ++it; + } + } // Write it back. uno::Reference<io::XTruncate> xTruncate(xRelStream, uno::UNO_QUERY); |