Kaydet (Commit) f2601953 authored tarafından Miklos Vajna's avatar Miklos Vajna

xmlsecurity: write OOXML signature relations on export

_rels/origin.sigs.rels of the _xmlsignatures temporary storage now
contains references to the individual signature streams.

Change-Id: I619bd81989e3b62fc4282e0e72fbfa780d1fb8bd
üst e35f3b6a
...@@ -185,7 +185,7 @@ public: ...@@ -185,7 +185,7 @@ public:
/// Adds an OOXML digital signature relation to _rels/.rels if there wasn't any before. /// Adds an OOXML digital signature relation to _rels/.rels if there wasn't any before.
void EnsureSignaturesRelation(css::uno::Reference<css::embed::XStorage> xStorage); void EnsureSignaturesRelation(css::uno::Reference<css::embed::XStorage> xStorage);
/// Given that xStorage is an OOXML _xmlsignatures storage, create origin.sigs and its relations. /// Given that xStorage is an OOXML _xmlsignatures storage, create origin.sigs and its relations.
static void ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureCount); void ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureCount);
}; };
#endif // INCLUDED_XMLSECURITY_INC_XMLSECURITY_XMLSIGNATUREHELPER_HXX #endif // INCLUDED_XMLSECURITY_INC_XMLSECURITY_XMLSIGNATUREHELPER_HXX
......
...@@ -515,11 +515,12 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, AddButtonHdl, Button*, void) ...@@ -515,11 +515,12 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, AddButtonHdl, Button*, void)
else else
{ {
// OOXML // OOXML
maSignatureHelper.EnsureSignaturesRelation(mxStore);
// Handle relations.
maSignatureHelper.EnsureSignaturesRelation(mxStore);
// Old signatures + the new one. // Old signatures + the new one.
int nSignatureCount = maCurrentSignatureInformations.size() + 1; int nSignatureCount = maCurrentSignatureInformations.size() + 1;
XMLSignatureHelper::ExportSignatureRelations(aStreamHelper.xSignatureStorage, nSignatureCount); maSignatureHelper.ExportSignatureRelations(aStreamHelper.xSignatureStorage, nSignatureCount);
// Flush objects. // Flush objects.
uno::Reference<embed::XTransactedObject> xTransact(aStreamHelper.xSignatureStorage, uno::UNO_QUERY); uno::Reference<embed::XTransactedObject> xTransact(aStreamHelper.xSignatureStorage, uno::UNO_QUERY);
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#define NS_DOCUMENTSIGNATURES "http://openoffice.org/2004/documentsignatures" #define NS_DOCUMENTSIGNATURES "http://openoffice.org/2004/documentsignatures"
#define NS_DOCUMENTSIGNATURES_ODF_1_2 "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0" #define NS_DOCUMENTSIGNATURES_ODF_1_2 "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0"
#define OOXML_SIGNATURE_ORIGIN "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin" #define OOXML_SIGNATURE_ORIGIN "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin"
#define OOXML_SIGNATURE_SIGNATURE "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature"
using namespace ::com::sun::star; using namespace ::com::sun::star;
using namespace ::com::sun::star::uno; using namespace ::com::sun::star::uno;
...@@ -352,7 +353,7 @@ namespace ...@@ -352,7 +353,7 @@ namespace
{ {
bool lcl_isSignatureType(const beans::StringPair& rPair) bool lcl_isSignatureType(const beans::StringPair& rPair)
{ {
return rPair.First == "Type" && rPair.Second == "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature"; return rPair.First == "Type" && rPair.Second == OOXML_SIGNATURE_SIGNATURE;
} }
bool lcl_isSignatureOriginType(const beans::StringPair& rPair) bool lcl_isSignatureOriginType(const beans::StringPair& rPair)
{ {
...@@ -465,13 +466,30 @@ void XMLSignatureHelper::EnsureSignaturesRelation(css::uno::Reference<css::embed ...@@ -465,13 +466,30 @@ void XMLSignatureHelper::EnsureSignaturesRelation(css::uno::Reference<css::embed
xTransact->commit(); xTransact->commit();
} }
void XMLSignatureHelper::ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int /*nSignatureCount*/) void XMLSignatureHelper::ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureCount)
{ {
// Write the empty file, its relations will be the signatures.
sal_Int32 nOpenMode = embed::ElementModes::READWRITE; sal_Int32 nOpenMode = embed::ElementModes::READWRITE;
uno::Reference<io::XOutputStream> xOriginStream(xStorage->openStreamElement("origin.sigs", nOpenMode), uno::UNO_QUERY); uno::Reference<io::XOutputStream> xOriginStream(xStorage->openStreamElement("origin.sigs", nOpenMode), uno::UNO_QUERY);
uno::Reference<io::XTruncate> xTruncate(xOriginStream, uno::UNO_QUERY); uno::Reference<io::XTruncate> xTruncate(xOriginStream, uno::UNO_QUERY);
xTruncate->truncate(); xTruncate->truncate();
xOriginStream->closeOutput(); xOriginStream->closeOutput();
// Write the relations.
uno::Reference<embed::XStorage> xSubStorage(xStorage->openStorageElement("_rels", nOpenMode), uno::UNO_QUERY);
uno::Reference<io::XOutputStream> xRelStream(xSubStorage->openStreamElement("origin.sigs.rels", nOpenMode), uno::UNO_QUERY);
std::vector< uno::Sequence<beans::StringPair> > aRelations;
for (int i = 0; i < nSignatureCount; ++i)
{
std::vector<beans::StringPair> aRelation;
aRelation.push_back(beans::StringPair("Id", "rId" + OUString::number(i + 1)));
aRelation.push_back(beans::StringPair("Type", OOXML_SIGNATURE_SIGNATURE));
aRelation.push_back(beans::StringPair("Target", "sig" + OUString::number(i + 1) + ".xml"));
aRelations.push_back(comphelper::containerToSequence(aRelation));
}
comphelper::OFOPXMLHelper::WriteRelationsInfoSequence(xRelStream, comphelper::containerToSequence(aRelations), mxCtx);
uno::Reference<embed::XTransactedObject> xTransact(xSubStorage, uno::UNO_QUERY);
xTransact->commit();
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment