summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-05-21 22:26:05 +0200
committerMichael Stahl <mstahl@redhat.com>2014-05-22 13:12:55 +0200
commit5246fa262450f686674850c53df666422f441c86 (patch)
tree2793175c788f1a097d0ff02cefcb0acff56ef8d5
parent5ca4b9d51046b9b6a36b91c9abd0cc1e7c04b480 (diff)
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 ) Change-Id: I4701401f35171139fc2fe8d225d13d4e533091a0
-rw-r--r--basic/source/inc/namecont.hxx4
-rw-r--r--basic/source/inc/scriptcont.hxx1
-rw-r--r--basic/source/uno/namecont.cxx17
-rw-r--r--basic/source/uno/scriptcont.cxx6
-rw-r--r--sw/CppunitTest_sw_macros_test.mk62
-rw-r--r--sw/qa/core/data/odt/fdo68983.odtbin0 -> 10510 bytes
-rw-r--r--sw/qa/core/macros-test.cxx48
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
new file mode 100644
index 000000000000..01df104407ed
--- /dev/null
+++ b/sw/qa/core/data/odt/fdo68983.odt
Binary files differ
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")
{