From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- oox/source/crypto/DocumentEncryption.cxx | 103 +++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 oox/source/crypto/DocumentEncryption.cxx (limited to 'oox/source/crypto/DocumentEncryption.cxx') diff --git a/oox/source/crypto/DocumentEncryption.cxx b/oox/source/crypto/DocumentEncryption.cxx new file mode 100644 index 000000000..6b8854929 --- /dev/null +++ b/oox/source/crypto/DocumentEncryption.cxx @@ -0,0 +1,103 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace oox::crypto { + +using namespace css::io; +using namespace css::uno; +using namespace css::beans; + +DocumentEncryption::DocumentEncryption(const Reference< XComponentContext >& rxContext, + Reference const & xDocumentStream, + oox::ole::OleStorage& rOleStorage, + const Sequence& rMediaEncData) + : mxContext(rxContext) + , mxDocumentStream(xDocumentStream) + , mrOleStorage(rOleStorage) + , mMediaEncData(rMediaEncData) +{ + // Select engine + for (int i = 0; i < rMediaEncData.getLength(); i++) + { + if (rMediaEncData[i].Name == "CryptoType") + { + OUString sCryptoType; + rMediaEncData[i].Value >>= sCryptoType; + + if (sCryptoType == "Standard") + sCryptoType = "StrongEncryptionDataSpace"; + + Sequence aArguments; + mxPackageEncryption.set( + mxContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.oox.crypto." + sCryptoType, aArguments, mxContext), css::uno::UNO_QUERY); + + if (!mxPackageEncryption.is()) + { + SAL_WARN("oox", "Requested encryption method \"" << sCryptoType << "\" is not supported"); + } + + break; + } + } +} + +bool DocumentEncryption::encrypt() +{ + if (!mxPackageEncryption.is()) + return false; + + Reference xInputStream (mxDocumentStream->getInputStream(), UNO_SET_THROW); + Reference xSeekable(xInputStream, UNO_QUERY); + + if (!xSeekable.is()) + return false; + + xSeekable->seek(0); // seek to begin of the document stream + + if (!mrOleStorage.isStorage()) + return false; + + mxPackageEncryption->setupEncryption(mMediaEncData); + + Sequence aStreams = mxPackageEncryption->encrypt(xInputStream); + + for (const NamedValue & aStream : std::as_const(aStreams)) + { + Reference xOutputStream(mrOleStorage.openOutputStream(aStream.Name), UNO_SET_THROW); + BinaryXOutputStream aBinaryOutputStream(xOutputStream, true); + + css::uno::Sequence aStreamSequence; + aStream.Value >>= aStreamSequence; + + aBinaryOutputStream.writeData(aStreamSequence); + + aBinaryOutputStream.close(); + } + + return true; +} + +} // namespace oox::crypto + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3