Kaydet (Commit) 5246fa26 authored tarafından Michael Stahl's avatar Michael Stahl

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 af34774d )

Change-Id: I4701401f35171139fc2fe8d225d13d4e533091a0
üst 5ca4b9d5
......@@ -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;
};
......
......@@ -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
......
......@@ -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 )
......
......@@ -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 )
{
......
......@@ -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))
......
......@@ -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")
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment