basic/source/inc/namecont.hxx | 4 ++ basic/source/inc/scriptcont.hxx | 1 basic/source/uno/namecont.cxx | 17 +++++++--- basic/source/uno/scriptcont.cxx | 6 +++ sw/CppunitTest_sw_macros_test.mk | 62 ++++++++++++++++++++------------------- sw/qa/core/data/odt/fdo68983.odt |binary sw/qa/core/macros-test.cxx | 48 ++++++++++++++++++++++++++++++ 7 files changed, 103 insertions(+), 35 deletions(-)
New commits: commit 9d2b0fd3424eaf8a685728aa7788e1148159714d Author: Michael Stahl <mst...@redhat.com> Date: Wed May 21 22:26:05 2014 +0200 fdo#68983: basic: if the library is not loaded fully, copy source storage Also fixes fdo#42899 and fdo#67685 in a different way; the previous fix for fdo#42899 caused the problem with password-protected libraries for which the password is not known: only the binary representation of the BAISC module was stored, not the source code; by simply copying from the source storage the problem can be avoided. It would be possible to ask for the password when storing, but that would not work when non-interactive (called via API). An alternative fix would be to pass in the SfxObjectShell::IsSetModifyEnabled() flag and actually reset the BASIC library's modify flag correctly, but that requires adding a parameter to XStorageBasedLibraryContainer::storeLibrariesToStorage(). (regression from af34774d260a68fc02cd78ba90dd8d4afaf1a2a4 ) (cherry picked from commit 5246fa262450f686674850c53df666422f441c86) Conflicts: basic/source/inc/namecont.hxx basic/source/inc/scriptcont.hxx basic/source/uno/namecont.cxx sw/CppunitTest_sw_macros_test.mk sw: use xsec_xmlsec.windows on WNT (cherry picked from commit 3e69b7bcd3e4a9cb1a29360c905e7fba96365999) Change-Id: I4701401f35171139fc2fe8d225d13d4e533091a0 Reviewed-on: https://gerrit.libreoffice.org/9437 Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/basic/source/inc/namecont.hxx b/basic/source/inc/namecont.hxx index 0568a981..6a04d9d 100644 --- a/basic/source/inc/namecont.hxx +++ b/basic/source/inc/namecont.hxx @@ -582,7 +582,9 @@ private: sal_Bool mbReadOnlyLink; sal_Bool mbPreload; +protected: sal_Bool mbPasswordProtected; +private: sal_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 357c663..d9abeb5 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 ); virtual void storeResourcesToStorage( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XStorage >& xStorage ); + virtual bool isLoadedStorable() SAL_OVERRIDE; public: SfxScriptLibrary diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx index 20e2bb3..28efa64 100644 --- a/basic/source/uno/namecont.cxx +++ b/basic/source/uno/namecont.cxx @@ -1920,8 +1920,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 @@ -1932,9 +1930,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 { @@ -1947,7 +1950,6 @@ void SfxLibraryContainer::storeLibraries_Impl( const uno::Reference< embed::XSto } } else -#endif { uno::Reference< embed::XStorage > xLibraryStor; if( bStorage ) @@ -3051,6 +3053,11 @@ SfxLibrary::SfxLibrary( ModifiableHelper& _rModifiable, const Type& aType, { } +bool SfxLibrary::isLoadedStorable() +{ + return mbLoaded && (!mbPasswordProtected || mbPasswordVerified); +} + void SfxLibrary::implSetModified( sal_Bool _bIsModified ) { if ( mbIsModified == _bIsModified ) diff --git a/basic/source/uno/scriptcont.cxx b/basic/source/uno/scriptcont.cxx index e8c92cf..e1f0c9d 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 sal_Bool SfxScriptLibrary::isModified( void ) { diff --git a/sw/CppunitTest_sw_macros_test.mk b/sw/CppunitTest_sw_macros_test.mk index 819e0f8..8cda906 100644 --- a/sw/CppunitTest_sw_macros_test.mk +++ b/sw/CppunitTest_sw_macros_test.mk @@ -68,36 +68,38 @@ $(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 \ - sax/source/fastparser/fastsax \ - 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 \ + 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/$(if $(filter WNT,$(OS)),xsec_xmlsec.windows,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 new file mode 100644 index 0000000..01df104 Binary files /dev/null and b/sw/qa/core/data/odt/fdo68983.odt differ diff --git a/sw/qa/core/macros-test.cxx b/sw/qa/core/macros-test.cxx index f99885b..4e254c0 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 testStarBasic(); void testVba(); 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(); @@ -186,6 +193,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") {
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits