diff options
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/notify/eventsupplier.cxx | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/sfx2/source/notify/eventsupplier.cxx b/sfx2/source/notify/eventsupplier.cxx index 356d28c1430a..fffe1fe39de0 100644 --- a/sfx2/source/notify/eventsupplier.cxx +++ b/sfx2/source/notify/eventsupplier.cxx @@ -19,11 +19,13 @@ #include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/document/XEmbeddedScripts.hpp> +#include <com/sun/star/document/XScriptInvocationContext.hpp> #include <com/sun/star/util/URL.hpp> - #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/util/URLTransformer.hpp> #include <com/sun/star/util/XURLTransformer.hpp> +#include <com/sun/star/uno/XInterface.hpp> #include <tools/urlobj.hxx> #include <tools/diagnose_ex.h> #include <svl/macitem.hxx> @@ -48,6 +50,8 @@ #include <macroloader.hxx> using namespace css; +using namespace ::com::sun::star; + // --- XNameReplace --- @@ -151,6 +155,29 @@ sal_Bool SAL_CALL SfxEvents_Impl::hasElements() return maEventNames.hasElements(); } +namespace +{ + bool lcl_isScriptAccessAllowed_nothrow(const uno::Reference<uno::XInterface>& rxScriptContext) + { + try + { + uno::Reference<document::XEmbeddedScripts> xScripts(rxScriptContext, uno::UNO_QUERY); + if (!xScripts.is()) + { + uno::Reference<document::XScriptInvocationContext> xContext(rxScriptContext, uno::UNO_QUERY_THROW); + xScripts.set(xContext->getScriptContainer(), uno::UNO_SET_THROW); + } + + return xScripts->getAllowMacroExecution(); + } + catch( const uno::Exception& ) + { + DBG_UNHANDLED_EXCEPTION("sfx.doc"); + } + return false; + } +} + void SfxEvents_Impl::Execute( uno::Any const & aEventData, const document::DocumentEvent& aTrigger, SfxObjectShell* pDoc ) { uno::Sequence < beans::PropertyValue > aProperties; @@ -189,6 +216,12 @@ void SfxEvents_Impl::Execute( uno::Any const & aEventData, const document::Docum if (aScript.isEmpty()) return; + if (!pDoc) + pDoc = SfxObjectShell::Current(); + + if (pDoc && !lcl_isScriptAccessAllowed_nothrow(pDoc->GetModel())) + return; + if (aType == STAR_BASIC) { uno::Any aAny; @@ -206,9 +239,7 @@ void SfxEvents_Impl::Execute( uno::Any const & aEventData, const document::Docum if (bAllowed) { - SfxViewFrame* pView = pDoc ? - SfxViewFrame::GetFirst( pDoc ) : - SfxViewFrame::Current(); + SfxViewFrame* pView = SfxViewFrame::GetFirst(pDoc); uno::Reference < frame::XDispatchProvider > xProv; |