summaryrefslogtreecommitdiffstats
path: root/xmlsecurity/source/helper/xmlsignaturehelper.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-03-07 10:57:45 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-03-07 15:00:14 +0100
commit57e6b9f3f4861f6283841e24a189eae3c02db9e8 (patch)
tree0b1aa76d1f855b7498e13b14386d7e38bdc59e80 /xmlsecurity/source/helper/xmlsignaturehelper.cxx
parentxmlsecurity OOXML export: don't write signature relations when all ... (diff)
downloadcore-57e6b9f3f4861f6283841e24a189eae3c02db9e8.tar.gz
core-57e6b9f3f4861f6283841e24a189eae3c02db9e8.zip
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.cxx35
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);