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

xmlsecurity: extract final signature export logic from DigitalSignaturesDialog

To be able to unit-test this later without creating a vcl dialog.

Change-Id: I4794e212ffefc2efa3bddaf58e6c6bf2a4ea8d9a
üst e451b03e
...@@ -57,6 +57,8 @@ public: ...@@ -57,6 +57,8 @@ public:
void remove(sal_uInt16 nPosition); void remove(sal_uInt16 nPosition);
/// Read signatures from either a temp stream or the real storage. /// Read signatures from either a temp stream or the real storage.
void read(bool bUseTempStream, bool bCacheLastSignature = true); void read(bool bUseTempStream, bool bCacheLastSignature = true);
/// Write signatures back to the persistent storage.
void write();
}; };
#endif // INCLUDED_XMLSECURITY_INC_XMLSECURITY_DOCUMENTSIGNATUREMANAGER_HXX #endif // INCLUDED_XMLSECURITY_INC_XMLSECURITY_DOCUMENTSIGNATUREMANAGER_HXX
......
...@@ -24,12 +24,7 @@ ...@@ -24,12 +24,7 @@
#include <sax/tools/converter.hxx> #include <sax/tools/converter.hxx>
#include <com/sun/star/embed/XStorage.hpp> #include <com/sun/star/embed/XStorage.hpp>
#include <com/sun/star/embed/StorageFormats.hpp>
#include <com/sun/star/embed/ElementModes.hpp> #include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/io/XSeekable.hpp>
#include <com/sun/star/io/XTruncate.hpp>
#include <com/sun/star/io/TempFile.hpp>
#include <com/sun/star/embed/XTransactedObject.hpp>
#include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/lang/XComponent.hpp> #include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/security/NoPasswordException.hpp> #include <com/sun/star/security/NoPasswordException.hpp>
...@@ -333,44 +328,7 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, SignatureHighlightHdl, SvTreeList ...@@ -333,44 +328,7 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, SignatureHighlightHdl, SvTreeList
IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, OKButtonHdl, Button*, void) IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, OKButtonHdl, Button*, void)
{ {
// Export all other signatures... maSignatureManager.write();
SignatureStreamHelper aStreamHelper = maSignatureManager.ImplOpenSignatureStream(embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE, false);
if (aStreamHelper.xSignatureStream.is() && aStreamHelper.nStorageFormat != embed::StorageFormats::OFOPXML)
{
// ODF
uno::Reference< io::XOutputStream > xOutputStream(
aStreamHelper.xSignatureStream, uno::UNO_QUERY );
uno::Reference< com::sun::star::xml::sax::XWriter> xSaxWriter =
maSignatureManager.maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
uno::Reference< xml::sax::XDocumentHandler> xDocumentHandler(xSaxWriter, UNO_QUERY_THROW);
size_t nInfos = maSignatureManager.maCurrentSignatureInformations.size();
for( size_t n = 0 ; n < nInfos ; ++n )
XMLSignatureHelper::ExportSignature(
xDocumentHandler, maSignatureManager.maCurrentSignatureInformations[ n ] );
XMLSignatureHelper::CloseDocumentHandler( xDocumentHandler);
}
else if (aStreamHelper.xSignatureStorage.is() && aStreamHelper.nStorageFormat == embed::StorageFormats::OFOPXML)
{
// OOXML
size_t nSignatureCount = maSignatureManager.maCurrentSignatureInformations.size();
maSignatureManager.maSignatureHelper.ExportSignatureContentTypes(maSignatureManager.mxStore, nSignatureCount);
maSignatureManager.maSignatureHelper.ExportSignatureRelations(aStreamHelper.xSignatureStorage, nSignatureCount);
for (size_t i = 0; i < nSignatureCount; ++i)
maSignatureManager.maSignatureHelper.ExportOOXMLSignature(maSignatureManager.mxStore, aStreamHelper.xSignatureStorage, maSignatureManager.maCurrentSignatureInformations[i], i + 1);
}
// If stream was not provided, we are responsible for committing it....
if ( !maSignatureManager.mxSignatureStream.is() )
{
uno::Reference< embed::XTransactedObject > xTrans(
aStreamHelper.xSignatureStorage, uno::UNO_QUERY );
xTrans->commit();
}
EndDialog(RET_OK); EndDialog(RET_OK);
} }
......
...@@ -69,12 +69,12 @@ bool DocumentSignatureManager::isXML(const OUString& rURI) ...@@ -69,12 +69,12 @@ bool DocumentSignatureManager::isXML(const OUString& rURI)
for (int i = 0; i < m_manifest.getLength(); i++) for (int i = 0; i < m_manifest.getLength(); i++)
{ {
const uno::Sequence<css::beans::PropertyValue>& entry = m_manifest[i]; const uno::Sequence<beans::PropertyValue>& entry = m_manifest[i];
OUString sPath, sMediaType; OUString sPath, sMediaType;
bool bEncrypted = false; bool bEncrypted = false;
for (int j = 0; j < entry.getLength(); j++) for (int j = 0; j < entry.getLength(); j++)
{ {
const css::beans::PropertyValue& prop = entry[j]; const beans::PropertyValue& prop = entry[j];
if (prop.Name.equals(sPropFullPath)) if (prop.Name.equals(sPropFullPath))
prop.Value >>= sPath; prop.Value >>= sPath;
...@@ -127,10 +127,10 @@ SignatureStreamHelper DocumentSignatureManager::ImplOpenSignatureStream(sal_Int3 ...@@ -127,10 +127,10 @@ SignatureStreamHelper DocumentSignatureManager::ImplOpenSignatureStream(sal_Int3
if (bTempStream) if (bTempStream)
{ {
if (nStreamOpenMode & css::embed::ElementModes::TRUNCATE) if (nStreamOpenMode & embed::ElementModes::TRUNCATE)
{ {
//We write always into a new temporary stream. //We write always into a new temporary stream.
mxTempSignatureStream.set(css::io::TempFile::create(mxContext), uno::UNO_QUERY_THROW); mxTempSignatureStream.set(io::TempFile::create(mxContext), uno::UNO_QUERY_THROW);
if (aHelper.nStorageFormat != embed::StorageFormats::OFOPXML) if (aHelper.nStorageFormat != embed::StorageFormats::OFOPXML)
aHelper.xSignatureStream = mxTempSignatureStream; aHelper.xSignatureStream = mxTempSignatureStream;
else else
...@@ -167,11 +167,11 @@ SignatureStreamHelper DocumentSignatureManager::ImplOpenSignatureStream(sal_Int3 ...@@ -167,11 +167,11 @@ SignatureStreamHelper DocumentSignatureManager::ImplOpenSignatureStream(sal_Int3
} }
} }
if (nStreamOpenMode & css::embed::ElementModes::TRUNCATE) if (nStreamOpenMode & embed::ElementModes::TRUNCATE)
{ {
if (aHelper.xSignatureStream.is() && aHelper.nStorageFormat != embed::StorageFormats::OFOPXML) if (aHelper.xSignatureStream.is() && aHelper.nStorageFormat != embed::StorageFormats::OFOPXML)
{ {
css::uno::Reference<css::io::XTruncate> xTruncate(aHelper.xSignatureStream, uno::UNO_QUERY_THROW); uno::Reference<io::XTruncate> xTruncate(aHelper.xSignatureStream, uno::UNO_QUERY_THROW);
xTruncate->truncate(); xTruncate->truncate();
} }
} }
...@@ -338,7 +338,7 @@ void DocumentSignatureManager::read(bool bUseTempStream, bool bCacheLastSignatur ...@@ -338,7 +338,7 @@ void DocumentSignatureManager::read(bool bUseTempStream, bool bCacheLastSignatur
maSignatureHelper.StartMission(); maSignatureHelper.StartMission();
SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(css::embed::ElementModes::READ, bUseTempStream); SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(embed::ElementModes::READ, bUseTempStream);
if (aStreamHelper.nStorageFormat != embed::StorageFormats::OFOPXML && aStreamHelper.xSignatureStream.is()) if (aStreamHelper.nStorageFormat != embed::StorageFormats::OFOPXML && aStreamHelper.xSignatureStream.is())
{ {
uno::Reference< io::XInputStream > xInputStream(aStreamHelper.xSignatureStream, uno::UNO_QUERY); uno::Reference< io::XInputStream > xInputStream(aStreamHelper.xSignatureStream, uno::UNO_QUERY);
...@@ -351,4 +351,42 @@ void DocumentSignatureManager::read(bool bUseTempStream, bool bCacheLastSignatur ...@@ -351,4 +351,42 @@ void DocumentSignatureManager::read(bool bUseTempStream, bool bCacheLastSignatur
maCurrentSignatureInformations = maSignatureHelper.GetSignatureInformations(); maCurrentSignatureInformations = maSignatureHelper.GetSignatureInformations();
} }
void DocumentSignatureManager::write()
{
// Export all other signatures...
SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE, false);
if (aStreamHelper.xSignatureStream.is() && aStreamHelper.nStorageFormat != embed::StorageFormats::OFOPXML)
{
// ODF
uno::Reference< io::XOutputStream > xOutputStream(aStreamHelper.xSignatureStream, uno::UNO_QUERY);
uno::Reference<xml::sax::XWriter> xSaxWriter = maSignatureHelper.CreateDocumentHandlerWithHeader(xOutputStream);
uno::Reference< xml::sax::XDocumentHandler> xDocumentHandler(xSaxWriter, uno::UNO_QUERY_THROW);
size_t nInfos = maCurrentSignatureInformations.size();
for (size_t n = 0 ; n < nInfos ; ++n)
XMLSignatureHelper::ExportSignature(xDocumentHandler, maCurrentSignatureInformations[n]);
XMLSignatureHelper::CloseDocumentHandler(xDocumentHandler);
}
else if (aStreamHelper.xSignatureStorage.is() && aStreamHelper.nStorageFormat == embed::StorageFormats::OFOPXML)
{
// OOXML
size_t nSignatureCount = maCurrentSignatureInformations.size();
maSignatureHelper.ExportSignatureContentTypes(mxStore, nSignatureCount);
maSignatureHelper.ExportSignatureRelations(aStreamHelper.xSignatureStorage, nSignatureCount);
for (size_t i = 0; i < nSignatureCount; ++i)
maSignatureHelper.ExportOOXMLSignature(mxStore, aStreamHelper.xSignatureStorage, maCurrentSignatureInformations[i], i + 1);
}
// If stream was not provided, we are responsible for committing it....
if (!mxSignatureStream.is())
{
uno::Reference<embed::XTransactedObject> xTrans(aStreamHelper.xSignatureStorage, uno::UNO_QUERY);
xTrans->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