diff options
-rw-r--r-- | basic/source/inc/namecont.hxx | 4 | ||||
-rw-r--r-- | basic/source/inc/scriptcont.hxx | 1 | ||||
-rw-r--r-- | basic/source/uno/namecont.cxx | 17 | ||||
-rw-r--r-- | basic/source/uno/scriptcont.cxx | 6 | ||||
-rw-r--r-- | sw/CppunitTest_sw_macros_test.mk | 62 | ||||
-rw-r--r-- | sw/qa/core/data/odt/fdo68983.odt | bin | 0 -> 10510 bytes | |||
-rw-r--r-- | sw/qa/core/macros-test.cxx | 48 |
7 files changed, 104 insertions, 34 deletions
diff --git a/basic/source/inc/namecont.hxx b/basic/source/inc/namecont.hxx index 109835a84927..6355549bd162 100644 --- a/basic/source/inc/namecont.hxx +++ b/basic/source/inc/namecont.hxx @@ -582,7 +582,9 @@ private: bool mbReadOnlyLink; bool mbPreload; +protected: bool mbPasswordProtected; +private: bool mbPasswordVerified; bool mbDoc50Password; OUString maPassword; @@ -702,6 +704,8 @@ public: } protected: + virtual bool isLoadedStorable(); + virtual bool SAL_CALL isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const = 0; }; diff --git a/basic/source/inc/scriptcont.hxx b/basic/source/inc/scriptcont.hxx index ea09a910a8e8..0a331b9cf7f9 100644 --- a/basic/source/inc/scriptcont.hxx +++ b/basic/source/inc/scriptcont.hxx @@ -154,6 +154,7 @@ class SfxScriptLibrary : public SfxLibrary, public SfxScriptLibrary_BASE const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) SAL_OVERRIDE; virtual void storeResourcesToStorage( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XStorage >& xStorage ) SAL_OVERRIDE; + virtual bool isLoadedStorable() SAL_OVERRIDE; public: SfxScriptLibrary diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx index c3329d1c47e5..52d3494f23ef 100644 --- a/basic/source/uno/namecont.cxx +++ b/basic/source/uno/namecont.cxx @@ -1909,8 +1909,6 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto if( pImplLib->implIsModified() || bComplete ) { -// For the moment don't copy storage (as an optimisation ) -// but instead always write to storage from memory. // Testing pImplLib->implIsModified() is not reliable, // IMHO the value of pImplLib->implIsModified() should // reflect whether the library ( in-memory ) model @@ -1921,9 +1919,14 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto // temp storage when saving ( and later sets the root storage of the // library container ) and similar madness in dbaccess means some surgery // is required to make it possible to successfully use this optimisation -#if 0 +// It would be possible to do the implSetModified() call below only +// conditionally, but that would require an additional boolean to be +// passed in via the XStorageBasedDocument::storeLibrariesToStorage()... +// fdo#68983: If there's a password and the password is not known, only +// copying the storage works! // Can we simply copy the storage? - if( !mbOldInfoFormat && !pImplLib->implIsModified() && !mbOasis2OOoFormat && xSourceLibrariesStor.is() ) + if (!mbOldInfoFormat && !pImplLib->isLoadedStorable() && + !mbOasis2OOoFormat && xSourceLibrariesStor.is()) { try { @@ -1936,7 +1939,6 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto } } else -#endif { uno::Reference< embed::XStorage > xLibraryStor; if( bStorage ) @@ -3037,6 +3039,11 @@ SfxLibrary::SfxLibrary( ModifiableHelper& _rModifiable, const Type& aType, { } +bool SfxLibrary::isLoadedStorable() +{ + return mbLoaded && (!mbPasswordProtected || mbPasswordVerified); +} + void SfxLibrary::implSetModified( bool _bIsModified ) { if ( mbIsModified == _bIsModified ) diff --git a/basic/source/uno/scriptcont.cxx b/basic/source/uno/scriptcont.cxx index 574af686555d..1606bfc7b556 100644 --- a/basic/source/uno/scriptcont.cxx +++ b/basic/source/uno/scriptcont.cxx @@ -1259,6 +1259,12 @@ SfxScriptLibrary::SfxScriptLibrary( ModifiableHelper& _rModifiable, { } +bool SfxScriptLibrary::isLoadedStorable() +{ + // note: mbLoadedSource can only be true for password-protected lib! + return SfxLibrary::isLoadedStorable() && (!mbPasswordProtected || mbLoadedSource); +} + // Provide modify state including resources bool SfxScriptLibrary::isModified( void ) { diff --git a/sw/CppunitTest_sw_macros_test.mk b/sw/CppunitTest_sw_macros_test.mk index 385e0c196e7e..7b68efff6919 100644 --- a/sw/CppunitTest_sw_macros_test.mk +++ b/sw/CppunitTest_sw_macros_test.mk @@ -66,35 +66,39 @@ $(eval $(call gb_CppunitTest_use_api,sw_macros_test,\ $(eval $(call gb_CppunitTest_use_ure,sw_macros_test)) $(eval $(call gb_CppunitTest_use_components,sw_macros_test,\ - basic/util/sb \ - comphelper/util/comphelp \ - configmgr/source/configmgr \ - dbaccess/util/dba \ - filter/source/config/cache/filterconfig1 \ - forms/util/frm \ - framework/util/fwk \ - i18npool/util/i18npool \ - oox/util/oox \ - package/source/xstor/xstor \ - package/util/package2 \ - sax/source/expatwrap/expwrap \ - sw/util/sw \ - sw/util/swd \ - sw/util/msword \ - sw/util/vbaswobj \ - scripting/source/basprov/basprov \ - scripting/util/scriptframe \ - sfx2/util/sfx \ - sot/util/sot \ - svl/source/fsstor/fsstorage \ - svtools/util/svt \ - toolkit/util/tk \ - ucb/source/core/ucb1 \ - ucb/source/ucp/file/ucpfile1 \ - ucb/source/ucp/tdoc/ucptdoc1 \ - unotools/util/utl \ - unoxml/source/rdf/unordf \ - unoxml/source/service/unoxml \ + basic/util/sb \ + embeddedobj/util/embobj \ + comphelper/util/comphelp \ + configmgr/source/configmgr \ + dbaccess/util/dba \ + filter/source/config/cache/filterconfig1 \ + filter/source/storagefilterdetect/storagefd \ + forms/util/frm \ + framework/util/fwk \ + i18npool/util/i18npool \ + oox/util/oox \ + package/source/xstor/xstor \ + package/util/package2 \ + sax/source/expatwrap/expwrap \ + scripting/source/basprov/basprov \ + scripting/util/scriptframe \ + sfx2/util/sfx \ + sot/util/sot \ + svl/source/fsstor/fsstorage \ + svtools/util/svt \ + sw/util/msword \ + sw/util/sw \ + sw/util/swd \ + sw/util/vbaswobj \ + toolkit/util/tk \ + ucb/source/core/ucb1 \ + ucb/source/ucp/file/ucpfile1 \ + ucb/source/ucp/tdoc/ucptdoc1 \ + unotools/util/utl \ + unoxml/source/rdf/unordf \ + unoxml/source/service/unoxml \ + xmloff/util/xo \ + xmlsecurity/util/xsec_xmlsec \ )) $(eval $(call gb_CppunitTest_use_configuration,sw_macros_test)) diff --git a/sw/qa/core/data/odt/fdo68983.odt b/sw/qa/core/data/odt/fdo68983.odt Binary files differnew file mode 100644 index 000000000000..01df104407ed --- /dev/null +++ b/sw/qa/core/data/odt/fdo68983.odt diff --git a/sw/qa/core/macros-test.cxx b/sw/qa/core/macros-test.cxx index d8ad1410878f..f5565bc2264c 100644 --- a/sw/qa/core/macros-test.cxx +++ b/sw/qa/core/macros-test.cxx @@ -20,7 +20,11 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/frame/XComponentLoader.hpp> +#include <com/sun/star/frame/XStorable.hpp> #include <com/sun/star/document/MacroExecMode.hpp> +#include <com/sun/star/document/XEmbeddedScripts.hpp> +#include <com/sun/star/script/XLibraryContainer.hpp> +#include <com/sun/star/script/XLibraryContainerPassword.hpp> #include <com/sun/star/drawing/XDrawPageSupplier.hpp> #include <com/sun/star/drawing/XShapes.hpp> #include <com/sun/star/drawing/XShape.hpp> @@ -35,6 +39,7 @@ #include <comphelper/processfactory.hxx> #include <basic/sbxdef.hxx> +#include <unotools/tempfile.hxx> #include <doc.hxx> #include "docsh.hxx" @@ -63,6 +68,7 @@ public: void testVba(); #endif void testFdo55289(); + void testFdo68983(); CPPUNIT_TEST_SUITE(SwMacrosTest); #if !defined(MACOSX) && !defined(WNT) //enable this test if you want to play with star basic macros in unit tests @@ -71,6 +77,7 @@ public: CPPUNIT_TEST(testVba); #endif CPPUNIT_TEST(testFdo55289); + CPPUNIT_TEST(testFdo68983); CPPUNIT_TEST_SUITE_END(); @@ -190,6 +197,47 @@ void SwMacrosTest::testFdo55289() xShapeContent->attach(xEnd); } +void SwMacrosTest::testFdo68983() +{ + const OUString aFileNameBase("StarBasic."); + OUString aFileName; + createFileURL("fdo68983.", "odt", aFileName); + Reference< com::sun::star::lang::XComponent > xComponent = + loadFromDesktop(aFileName, "com.sun.star.text.TextDocument"); + + CPPUNIT_ASSERT_MESSAGE("Failed to load StarBasic.ods", xComponent.is()); + + Reference< frame::XStorable > xDocStorable(xComponent, UNO_QUERY_THROW); + CPPUNIT_ASSERT(xDocStorable.is()); + + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + Sequence<beans::PropertyValue> desc(1); + desc[0].Name = "FilterName"; + desc[0].Value <<= OUString("writer8"); + xDocStorable->storeAsURL(aTempFile.GetURL(), desc); + + Reference<util::XCloseable>(xComponent, UNO_QUERY_THROW)->close(false); + + // re-load + xComponent = loadFromDesktop(aTempFile.GetURL(), "com.sun.star.text.TextDocument"); + + // check that password-protected library survived store and re-load + Reference<document::XEmbeddedScripts> xDocScr(xComponent, UNO_QUERY_THROW); + Reference<script::XStorageBasedLibraryContainer> xStorBasLib(xDocScr->getBasicLibraries()); + Reference<script::XLibraryContainer> xBasLib(xStorBasLib, UNO_QUERY_THROW); + Reference<script::XLibraryContainerPassword> xBasLibPwd(xStorBasLib, UNO_QUERY_THROW); + CPPUNIT_ASSERT(xBasLibPwd->isLibraryPasswordProtected("Library1")); + CPPUNIT_ASSERT(xBasLibPwd->verifyLibraryPassword("Library1", "foo")); + xBasLib->loadLibrary("Library1"); + CPPUNIT_ASSERT(xBasLib->isLibraryLoaded("Library1")); + + // close + Reference<util::XCloseable> xDocCloseable(xComponent, UNO_QUERY_THROW); + xDocCloseable->close(false); +} + + SwMacrosTest::SwMacrosTest() : m_aBaseString("/sw/qa/core/data") { |