/* -*- 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: */