diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2020-10-16 18:15:21 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2020-12-03 02:20:16 +0100 |
commit | f1cbd0a764511db9a32e986dec39880ff477148f (patch) | |
tree | 83fd3bfdd25cc9ff52df12fd8827fa7218e193a7 /vcl | |
parent | 033b5925ace262b19c89b60fbfdd836761c3f955 (diff) |
vcl pdf tokenizer: fix handling of dict -> array -> dict tokens
Needed to be able to parse the /Reference key of signatures.
(cherry picked from commit 056c1284d6a68525002c54bef10834cc135385db)
Conflicts:
vcl/qa/cppunit/filter/ipdf/ipdf.cxx
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105626
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 8f46af565680bef0ff8ca32781e6d813a7446543)
Change-Id: I6b81089a3f58a2de461ad92ca5a891c284f8686a
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/CppunitTest_vcl_filter_ipdf.mk | 49 | ||||
-rw-r--r-- | vcl/Module_vcl.mk | 6 | ||||
-rw-r--r-- | vcl/qa/cppunit/filter/ipdf/data/dict-array-dict.pdf | 55 | ||||
-rw-r--r-- | vcl/qa/cppunit/filter/ipdf/ipdf.cxx | 81 | ||||
-rw-r--r-- | vcl/source/filter/ipdf/pdfdocument.cxx | 13 |
5 files changed, 202 insertions, 2 deletions
diff --git a/vcl/CppunitTest_vcl_filter_ipdf.mk b/vcl/CppunitTest_vcl_filter_ipdf.mk new file mode 100644 index 000000000000..403836ac781a --- /dev/null +++ b/vcl/CppunitTest_vcl_filter_ipdf.mk @@ -0,0 +1,49 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# 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/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,vcl_filter_ipdf)) + +$(eval $(call gb_CppunitTest_use_externals,vcl_filter_ipdf,\ + boost_headers \ + pdfium \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,vcl_filter_ipdf, \ + vcl/qa/cppunit/filter/ipdf/ipdf \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,vcl_filter_ipdf, \ + comphelper \ + cppu \ + sal \ + sfx \ + svx \ + test \ + tl \ + unotest \ + utl \ + vcl \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,vcl_filter_ipdf)) + +$(eval $(call gb_CppunitTest_use_ure,vcl_filter_ipdf)) +$(eval $(call gb_CppunitTest_use_vcl,vcl_filter_ipdf)) + +$(eval $(call gb_CppunitTest_use_rdb,vcl_filter_ipdf,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,vcl_filter_ipdf,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,vcl_filter_ipdf)) + +# vim: set noet sw=4 ts=4: diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index a739d5988716..1fc7cee42322 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -242,4 +242,10 @@ $(eval $(call gb_Module_add_screenshot_targets,vcl,\ CppunitTest_vcl_dialogs_test \ )) +ifneq (,$(filter PDFIUM,$(BUILD_TYPE))) +$(eval $(call gb_Module_add_slowcheck_targets,vcl,\ + CppunitTest_vcl_filter_ipdf \ +)) +endif + # vim: set noet sw=4 ts=4: diff --git a/vcl/qa/cppunit/filter/ipdf/data/dict-array-dict.pdf b/vcl/qa/cppunit/filter/ipdf/data/dict-array-dict.pdf new file mode 100644 index 000000000000..73de3117b9a6 --- /dev/null +++ b/vcl/qa/cppunit/filter/ipdf/data/dict-array-dict.pdf @@ -0,0 +1,55 @@ +%PDF-1.7 +% +1 0 obj << + /Type /Catalog + /Pages 2 0 R +>> +endobj +2 0 obj << + /Type /Pages + /MediaBox [0 0 200 300] + /Count 1 + /Kids [3 0 R] +>> +endobj +3 0 obj << + /Type /Page + /Parent 2 0 R + /Contents 4 0 R + /Key[<</InnerKey 42>>] +>> +endobj +4 0 obj << + /Length 188 +>> +stream +q +0 0 0 rg +0 290 10 10 re B* +10 150 50 30 re B* +0 0 1 rg +190 290 10 10 re B* +70 232 50 30 re B* +0 1 0 rg +190 0 10 10 re B* +130 150 50 30 re B* +1 0 0 rg +0 0 10 10 re B* +70 67 50 30 re B* +Q +endstream +endobj +xref +0 5 +0000000000 65535 f +0000000015 00000 n +0000000068 00000 n +0000000157 00000 n +0000000251 00000 n +trailer << + /Root 1 0 R + /Size 5 +>> +startxref +491 +%%EOF diff --git a/vcl/qa/cppunit/filter/ipdf/ipdf.cxx b/vcl/qa/cppunit/filter/ipdf/ipdf.cxx new file mode 100644 index 000000000000..917630265a0f --- /dev/null +++ b/vcl/qa/cppunit/filter/ipdf/ipdf.cxx @@ -0,0 +1,81 @@ +/* -*- 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 <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/drawing/XDrawPagesSupplier.hpp> +#include <com/sun/star/drawing/XDrawView.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/security/XCertificate.hpp> +#include <com/sun/star/view/XSelectionSupplier.hpp> +#include <com/sun/star/xml/crypto/SEInitializer.hpp> + +#include <comphelper/propertyvalue.hxx> +#include <osl/file.hxx> +#include <unotools/tempfile.hxx> +#include <sfx2/sfxbasemodel.hxx> +#include <svx/svdview.hxx> +#include <sfx2/viewsh.hxx> +#include <sfx2/objsh.hxx> +#include <vcl/filter/PDFiumLibrary.hxx> +#include <vcl/filter/pdfdocument.hxx> + +using namespace ::com::sun::star; + +namespace +{ +char const DATA_DIRECTORY[] = "/vcl/qa/cppunit/filter/ipdf/data/"; +} + +/// Covers vcl/source/filter/ipdf/ fixes. +class VclFilterIpdfTest : public test::BootstrapFixture, public unotest::MacrosTest +{ +public: + void setUp() override; + + void testDictArrayDict(); + + CPPUNIT_TEST_SUITE(VclFilterIpdfTest); + CPPUNIT_TEST(testDictArrayDict); + CPPUNIT_TEST_SUITE_END(); +}; + +void VclFilterIpdfTest::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(m_xContext)); +} + +void VclFilterIpdfTest::testDictArrayDict() +{ + // Load a file that has markup like this: + // 3 0 obj << + // /Key[<</InnerKey 42>>] + // >> + OUString aSourceURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "dict-array-dict.pdf"; + SvFileStream aFile(aSourceURL, StreamMode::READ); + vcl::filter::PDFDocument aDocument; + CPPUNIT_ASSERT(aDocument.Read(aFile)); + std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages(); + CPPUNIT_ASSERT(!aPages.empty()); + vcl::filter::PDFObjectElement* pPage = aPages[0]; + auto pKey = dynamic_cast<vcl::filter::PDFArrayElement*>(pPage->Lookup("Key")); + + // Without the accompanying fix in place, this test would have failed, because the value of Key + // was a dictionary element, not an array element. + CPPUNIT_ASSERT(pKey); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(VclFilterIpdfTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/filter/ipdf/pdfdocument.cxx b/vcl/source/filter/ipdf/pdfdocument.cxx index 291f30387094..1df53c9d14f9 100644 --- a/vcl/source/filter/ipdf/pdfdocument.cxx +++ b/vcl/source/filter/ipdf/pdfdocument.cxx @@ -2228,8 +2228,17 @@ size_t PDFDictionaryElement::Parse(const std::vector<std::unique_ptr<PDFElement> if (nexti >= i) // ensure we go forwards and not endlessly loop { i = nexti; - rDictionary[aName] = pDictionary; - aName.clear(); + if (pArray) + { + // Dictionary value inside an array. + pArray->PushBack(pDictionary); + } + else + { + // Dictionary toplevel value. + rDictionary[aName] = pDictionary; + aName.clear(); + } } } } |