This is an automated email from the ASF dual-hosted git repository. ardovm pushed a commit to branch AOO41X in repository https://gitbox.apache.org/repos/asf/openoffice.git
commit 61066e41ac407bc3858ba99f269bf2d7c10f7aec Author: Arrigo Marchiori <[email protected]> AuthorDate: Mon Apr 7 23:11:02 2025 +0200 UNO interface com::sun::star::document::XLinkAuthorizer sfx2::LinkManager improve URL categorization Writer, Calc and Draw/Impress XModel implementations also implement XLinkAuthorizer (cherry picked and adapted from commit 68281b3f07af4696861c62e9efad368fb5607c0d) --- .../com/sun/star/document/XLinkAuthorizer.idl | 56 ++++++++++++++++++++++ main/offapi/com/sun/star/document/makefile.mk | 1 + main/sc/inc/docuno.hxx | 4 ++ main/sc/source/ui/unoobj/docuno.cxx | 41 +++++++++++++--- main/sd/source/ui/inc/unomodel.hxx | 5 ++ main/sd/source/ui/unoidl/unomodel.cxx | 30 +++++++++++- main/sfx2/inc/sfx2/linkmgr.hxx | 15 ++++++ main/sfx2/source/appl/linkmgr2.cxx | 36 ++++++++++++++ main/sw/inc/unotxdoc.hxx | 26 ++++++---- main/sw/source/ui/uno/unotxdoc.cxx | 22 +++++++++ 10 files changed, 219 insertions(+), 17 deletions(-) diff --git a/main/offapi/com/sun/star/document/XLinkAuthorizer.idl b/main/offapi/com/sun/star/document/XLinkAuthorizer.idl new file mode 100644 index 0000000000..8d8e4845a3 --- /dev/null +++ b/main/offapi/com/sun/star/document/XLinkAuthorizer.idl @@ -0,0 +1,56 @@ +/************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + *************************************************************/ + + +#ifndef __com_sun_star_document_XLinkAuthorizer_idl__ +#define __com_sun_star_document_XLinkAuthorizer_idl__ + +#ifndef __com_sun_star_uno_XInterface_idl__ +#include <com/sun/star/uno/XInterface.idl> +#endif + + +//============================================================================= + +module com { module sun { module star { module document { + +//============================================================================= +/** gives the authorization to follow links and update them. + + */ +published interface XLinkAuthorizer: com::sun::star::uno::XInterface +{ + /** request for authorization to follow or update links. + + @param url if empty, means any link. If indicated, the URL is checked + against "private" protocols that it makes no sense to disallow. + + @returns true if links can be followed or updated. + */ + boolean authorizeLinks( [in] string url ); + +}; + +//============================================================================= + +}; }; }; }; + +#endif diff --git a/main/offapi/com/sun/star/document/makefile.mk b/main/offapi/com/sun/star/document/makefile.mk index c5f41553cd..529cdfc722 100644 --- a/main/offapi/com/sun/star/document/makefile.mk +++ b/main/offapi/com/sun/star/document/makefile.mk @@ -97,6 +97,7 @@ IDLFILES=\ XInteractionFilterOptions.idl\ XInteractionFilterSelect.idl\ XLinkTargetSupplier.idl\ + XLinkAuthorizer.idl\ XMimeTypeInfo.idl\ XOOXMLDocumentPropertiesImporter.idl\ XRedlinesSupplier.idl \ diff --git a/main/sc/inc/docuno.hxx b/main/sc/inc/docuno.hxx index 7c43fbcc8c..c71be9448b 100644 --- a/main/sc/inc/docuno.hxx +++ b/main/sc/inc/docuno.hxx @@ -31,6 +31,7 @@ #include <com/sun/star/view/XRenderable.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/document/XActionLockable.hpp> +#include <com/sun/star/document/XLinkAuthorizer.hpp> #include <com/sun/star/document/XLinkTargetSupplier.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> #include <com/sun/star/drawing/XDrawPages.hpp> @@ -82,6 +83,7 @@ class SC_DLLPUBLIC ScModelObj : public SfxBaseModel, public com::sun::star::sheet::XDocumentAuditing, public com::sun::star::style::XStyleFamiliesSupplier, public com::sun::star::view::XRenderable, + public com::sun::star::document::XLinkAuthorizer, public com::sun::star::document::XLinkTargetSupplier, public com::sun::star::beans::XPropertySet, public SvxFmMSFactory, // derived from XMultiServiceFactory @@ -175,6 +177,8 @@ public: throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + //XLinkAuthorizer + virtual sal_Bool SAL_CALL authorizeLinks( const ::rtl::OUString& rURL ) throw( ::com::sun::star::uno::RuntimeException ); // XLinkTargetSupplier virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getLinks() throw(::com::sun::star::uno::RuntimeException); diff --git a/main/sc/source/ui/unoobj/docuno.cxx b/main/sc/source/ui/unoobj/docuno.cxx index bce973c8d7..362f64d66e 100644 --- a/main/sc/source/ui/unoobj/docuno.cxx +++ b/main/sc/source/ui/unoobj/docuno.cxx @@ -36,6 +36,8 @@ #include <svl/smplhint.hxx> #include <unotools/undoopt.hxx> #include <unotools/moduleoptions.hxx> +#include <sfx2/docfile.hxx> +#include <sfx2/linkmgr.hxx> #include <sfx2/printer.hxx> #include <sfx2/bindings.hxx> #include <vcl/pdfextoutdevdata.hxx> @@ -462,6 +464,7 @@ uno::Any SAL_CALL ScModelObj::queryInterface( const uno::Type& rType ) SC_QUERYINTERFACE( sheet::XDocumentAuditing ) SC_QUERYINTERFACE( style::XStyleFamiliesSupplier ) SC_QUERYINTERFACE( view::XRenderable ) + SC_QUERYINTERFACE( document::XLinkAuthorizer ) SC_QUERYINTERFACE( document::XLinkTargetSupplier ) SC_QUERYINTERFACE( beans::XPropertySet ) SC_QUERYINTERFACE( lang::XMultiServiceFactory ) @@ -520,7 +523,7 @@ uno::Sequence<uno::Type> SAL_CALL ScModelObj::getTypes() throw(uno::RuntimeExcep long nAggLen = aAggTypes.getLength(); const uno::Type* pAggPtr = aAggTypes.getConstArray(); - const long nThisLen = 15; + const long nThisLen = 16; aTypes.realloc( nParentLen + nAggLen + nThisLen ); uno::Type* pPtr = aTypes.getArray(); pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheetDocument>*)0); @@ -533,11 +536,12 @@ uno::Sequence<uno::Type> SAL_CALL ScModelObj::getTypes() throw(uno::RuntimeExcep pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XDocumentAuditing>*)0); pPtr[nParentLen + 8] = getCppuType((const uno::Reference<style::XStyleFamiliesSupplier>*)0); pPtr[nParentLen + 9] = getCppuType((const uno::Reference<view::XRenderable>*)0); - pPtr[nParentLen +10] = getCppuType((const uno::Reference<document::XLinkTargetSupplier>*)0); - pPtr[nParentLen +11] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); - pPtr[nParentLen +12] = getCppuType((const uno::Reference<lang::XMultiServiceFactory>*)0); - pPtr[nParentLen +13] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0); - pPtr[nParentLen +14] = getCppuType((const uno::Reference<util::XChangesNotifier>*)0); + pPtr[nParentLen +10] = getCppuType((const uno::Reference<document::XLinkAuthorizer>*)0); + pPtr[nParentLen +11] = getCppuType((const uno::Reference<document::XLinkTargetSupplier>*)0); + pPtr[nParentLen +12] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); + pPtr[nParentLen +13] = getCppuType((const uno::Reference<lang::XMultiServiceFactory>*)0); + pPtr[nParentLen +14] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0); + pPtr[nParentLen +15] = getCppuType((const uno::Reference<util::XChangesNotifier>*)0); long i; for (i=0; i<nParentLen; i++) @@ -1303,6 +1307,31 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec delete pDrawView; } +// XLinkAuthorizer + +sal_Bool ScModelObj::authorizeLinks( const ::rtl::OUString& rURL ) throw( uno::RuntimeException ) +{ + ScUnoGuard aGuard; + ScDocument *doc = pDocShell->GetDocument(); + if ( doc ) { + // The following access to the window is copied from SwDoc::UpdateLinks() + SfxMedium* pMedium = pDocShell->GetMedium(); + SfxFrame* pFrm = pMedium ? pMedium->GetLoadTargetFrame() : 0; + sfx2::LinkManager *pLinkMgr = doc->GetLinkManager(); + if ( pLinkMgr->urlIsSafe( rURL ) ) { + return sal_True; + } + Window* pDlgParent = 0; + if ( pFrm ) + pDlgParent = &pFrm->GetWindow(); + if ( !pDlgParent ) + pDlgParent = pDocShell->GetDialogParent( pMedium ); + if ( pDlgParent ) + return pLinkMgr->GetUserAllowsLinkUpdate( pDlgParent ); + } + return sal_False; +} + // XLinkTargetSupplier uno::Reference<container::XNameAccess> SAL_CALL ScModelObj::getLinks() throw(uno::RuntimeException) diff --git a/main/sd/source/ui/inc/unomodel.hxx b/main/sd/source/ui/inc/unomodel.hxx index 2771fe6e02..44fff9cdf1 100644 --- a/main/sd/source/ui/inc/unomodel.hxx +++ b/main/sd/source/ui/inc/unomodel.hxx @@ -24,6 +24,7 @@ #define SD_UNO_MODEL_HXX #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> +#include <com/sun/star/document/XLinkAuthorizer.hpp> #include <com/sun/star/document/XLinkTargetSupplier.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> #include <com/sun/star/drawing/XDrawPageSummarizer.hpp> @@ -76,6 +77,7 @@ class SdXImpressDocument : public SfxBaseModel, // implements SfxListener, OWEAK public ::com::sun::star::drawing::XDrawPagesSupplier, public ::com::sun::star::presentation::XPresentationSupplier, public ::com::sun::star::presentation::XCustomPresentationSupplier, + public ::com::sun::star::document::XLinkAuthorizer, public ::com::sun::star::document::XLinkTargetSupplier, public ::com::sun::star::beans::XPropertySet, public ::com::sun::star::style::XStyleFamiliesSupplier, @@ -201,6 +203,9 @@ public: virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + // XLinkAuthorizer + virtual sal_Bool SAL_CALL authorizeLinks( const ::rtl::OUString &url ) throw(::com::sun::star::uno::RuntimeException); + // XLinkTargetSupplier virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getLinks( ) throw(::com::sun::star::uno::RuntimeException); diff --git a/main/sd/source/ui/unoidl/unomodel.cxx b/main/sd/source/ui/unoidl/unomodel.cxx index e0baaec632..8af6f31834 100644 --- a/main/sd/source/ui/unoidl/unomodel.cxx +++ b/main/sd/source/ui/unoidl/unomodel.cxx @@ -45,7 +45,9 @@ #include <editeng/unofield.hxx> #include <unomodel.hxx> #include <sfx2/dispatch.hxx> +#include <sfx2/docfile.hxx> #include <sfx2/bindings.hxx> +#include <sfx2/linkmgr.hxx> #include <vcl/svapp.hxx> #include <editeng/UnoForbiddenCharsTable.hxx> #include <svx/svdoutl.hxx> @@ -301,6 +303,7 @@ uno::Any SAL_CALL SdXImpressDocument::queryInterface( const uno::Type & rType ) else QUERYINT(drawing::XMasterPagesSupplier); else QUERYINT(drawing::XDrawPagesSupplier); else QUERYINT(presentation::XHandoutMasterSupplier); + else QUERYINT(document::XLinkAuthorizer); else QUERYINT(document::XLinkTargetSupplier); else QUERYINT(style::XStyleFamiliesSupplier); else QUERYINT(com::sun::star::ucb::XAnyCompareFactory); @@ -395,7 +398,7 @@ uno::Sequence< uno::Type > SAL_CALL SdXImpressDocument::getTypes( ) throw(uno:: const sal_Int32 nBaseTypes = aBaseTypes.getLength(); const uno::Type* pBaseTypes = aBaseTypes.getConstArray(); - const sal_Int32 nOwnTypes = mbImpressDoc ? 14 : 11; // !DANGER! Keep this updated! + const sal_Int32 nOwnTypes = mbImpressDoc ? 15 : 12; // !DANGER! Keep this updated! maTypeSequence.realloc( nBaseTypes + nOwnTypes ); uno::Type* pTypes = maTypeSequence.getArray(); @@ -407,6 +410,7 @@ uno::Sequence< uno::Type > SAL_CALL SdXImpressDocument::getTypes( ) throw(uno:: *pTypes++ = ITYPE(drawing::XLayerSupplier); *pTypes++ = ITYPE(drawing::XMasterPagesSupplier); *pTypes++ = ITYPE(drawing::XDrawPagesSupplier); + *pTypes++ = ITYPE(document::XLinkAuthorizer); *pTypes++ = ITYPE(document::XLinkTargetSupplier); *pTypes++ = ITYPE(style::XStyleFamiliesSupplier); *pTypes++ = ITYPE(com::sun::star::ucb::XAnyCompareFactory); @@ -1424,6 +1428,30 @@ void SAL_CALL SdXImpressDocument::removePropertyChangeListener( const OUString& void SAL_CALL SdXImpressDocument::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} void SAL_CALL SdXImpressDocument::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} +// XLinkAuthorizer +sal_Bool SAL_CALL SdXImpressDocument::authorizeLinks( const ::rtl::OUString &url ) + throw(uno::RuntimeException) +{ + OGuard aGuard( Application::GetSolarMutex() ); + if ( mpDoc ) { + // The following access to the window is copied from SwDoc::UpdateLinks() + SfxMedium* pMedium = mpDocShell->GetMedium(); + SfxFrame* pFrm = pMedium ? pMedium->GetLoadTargetFrame() : 0; + sfx2::LinkManager *pLinkMgr = mpDoc->GetLinkManager(); + if ( pLinkMgr->urlIsSafe( url ) ) { + return sal_True; + } + Window* pDlgParent = 0; + if ( pFrm ) + pDlgParent = &pFrm->GetWindow(); + if ( !pDlgParent ) + pDlgParent = mpDocShell->GetDialogParent( pMedium ); + if ( pDlgParent ) + return pLinkMgr->GetUserAllowsLinkUpdate( pDlgParent ); + } + return sal_False; +} + // XLinkTargetSupplier uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getLinks() throw(uno::RuntimeException) diff --git a/main/sfx2/inc/sfx2/linkmgr.hxx b/main/sfx2/inc/sfx2/linkmgr.hxx index d70bf00656..8df200b4f3 100644 --- a/main/sfx2/inc/sfx2/linkmgr.hxx +++ b/main/sfx2/inc/sfx2/linkmgr.hxx @@ -33,6 +33,11 @@ class SfxObjectShell; class Graphic; class Size; +namespace com { namespace sun { namespace star { namespace util { + class URL; + class XURLTransformer; +} } } } + namespace sfx2 { // Damit der Link ueber den Status der zu ladenen Grafik informierten werden @@ -60,6 +65,8 @@ class SFX2_DLLPUBLIC LinkManager sal_Bool mUpdateAsked; sal_Bool mAllowUpdate; + com::sun::star::uno::Reference< com::sun::star::util::XURLTransformer > xURLTransformer; + void SetUserAllowsLinkUpdate(SvBaseLink *pLink, sal_Bool allows); protected: sal_Bool InsertLink( SvBaseLink* pLink, sal_uInt16 nObjType, sal_uInt16 nUpdateType, @@ -155,6 +162,14 @@ public: const ::com::sun::star::uno::Any & rValue, Graphic& rGrf ); + // Check whether a link URL must be subject to authorization + // + // An empty url is considered unsafe + sal_Bool urlIsSafe( const ::rtl::OUString &url ); + + // Check whether a link URL must be subject to authorization + sal_Bool urlIsSafe( const ::com::sun::star::util::URL &url ); + private: LinkManager( const LinkManager& ); LinkManager& operator=( const LinkManager& ); diff --git a/main/sfx2/source/appl/linkmgr2.cxx b/main/sfx2/source/appl/linkmgr2.cxx index 4c47a6178a..669bab32be 100644 --- a/main/sfx2/source/appl/linkmgr2.cxx +++ b/main/sfx2/source/appl/linkmgr2.cxx @@ -24,6 +24,9 @@ #include <sfx2/linkmgr.hxx> #include <com/sun/star/document/UpdateDocMode.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/util/XURLTransformer.hpp> + #include <sfx2/objsh.hxx> #include <svl/urihelper.hxx> #include <sot/formats.hxx> @@ -38,6 +41,7 @@ #include <svl/eitem.hxx> #include <svl/intitem.hxx> #include <unotools/localfilehelper.hxx> +#include <comphelper/processfactory.hxx> #include <i18npool/mslangid.hxx> #include <sfx2/request.hxx> #include <vcl/dibtools.hxx> @@ -540,6 +544,38 @@ sal_Bool LinkManager::GetGraphicFromAny( const String& rMimeType, return bRet; } +sal_Bool LinkManager::urlIsSafe( const ::rtl::OUString &url ) +{ + if ( url.getLength() == 0 ) { + return sal_False; + } + if ( !xURLTransformer.is() ) { + const com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > xContext ( ::comphelper::getProcessComponentContext() ); + com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiComponentFactory > xFactory ( xContext->getServiceManager(), ::com::sun::star::uno::UNO_QUERY ); + if ( !xFactory.is() ) { + return sal_False; + } + xURLTransformer.set( xFactory->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.util.URLTransformer" ), xContext), com::sun::star::uno::UNO_QUERY ); + if ( !xURLTransformer.is() ) { + return sal_False; + } + } + com::sun::star::util::URL aURL; + aURL.Complete = url; + sal_Bool b = xURLTransformer->parseSmart( aURL, ::rtl::OUString() ); + if ( !b ) { + return sal_False; + } + return urlIsSafe( aURL ); +} + +sal_Bool LinkManager::urlIsSafe( const ::com::sun::star::util::URL &url ) +{ + sal_Bool result = ( url.Path.getLength() == 0 ) && + ( url.Server.getLength() == 0); + return result; +} + // ---------------------------------------------------------------------- String lcl_DDE_RelToAbs( const String& rTopic, const String& rBaseURL ) diff --git a/main/sw/inc/unotxdoc.hxx b/main/sw/inc/unotxdoc.hxx index 22a7fccb88..905d47117b 100644 --- a/main/sw/inc/unotxdoc.hxx +++ b/main/sw/inc/unotxdoc.hxx @@ -30,6 +30,7 @@ #include <com/sun/star/beans/PropertyValues.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/style/XAutoStylesSupplier.hpp> +#include <com/sun/star/document/XLinkAuthorizer.hpp> #include <com/sun/star/document/XLinkTargetSupplier.hpp> #include <com/sun/star/document/XRedlinesSupplier.hpp> #include <com/sun/star/text/XNumberingRulesSupplier.hpp> @@ -76,22 +77,22 @@ #include <viewopt.hxx> -#define __IFC32 Ifc1, Ifc2, Ifc3, Ifc4, Ifc5, Ifc6, Ifc7, Ifc8, Ifc9, Ifc10, Ifc11, Ifc12, Ifc13, Ifc14, Ifc15, Ifc16, \ -Ifc17, Ifc18, Ifc19, Ifc20, Ifc21, Ifc22, Ifc23, Ifc24, Ifc25, Ifc26, Ifc27, Ifc28, Ifc29, Ifc30, Ifc31, Ifc32 +#define __IFC33 Ifc1, Ifc2, Ifc3, Ifc4, Ifc5, Ifc6, Ifc7, Ifc8, Ifc9, Ifc10, Ifc11, Ifc12, Ifc13, Ifc14, Ifc15, Ifc16, \ +Ifc17, Ifc18, Ifc19, Ifc20, Ifc21, Ifc22, Ifc23, Ifc24, Ifc25, Ifc26, Ifc27, Ifc28, Ifc29, Ifc30, Ifc31, Ifc32, Ifc33 -#define __CLASS_IFC32 class Ifc1, class Ifc2, class Ifc3, class Ifc4, class Ifc5, class Ifc6, class Ifc7, \ +#define __CLASS_IFC33 class Ifc1, class Ifc2, class Ifc3, class Ifc4, class Ifc5, class Ifc6, class Ifc7, \ class Ifc8, class Ifc9, class Ifc10, class Ifc11, class Ifc12, class Ifc13, class Ifc14, class Ifc15, class Ifc16, \ class Ifc17, class Ifc18, class Ifc19, class Ifc20, class Ifc21, class Ifc22, class Ifc23, class Ifc24,\ -class Ifc25, class Ifc26, class Ifc27, class Ifc28, class Ifc29, class Ifc30, class Ifc31 , class Ifc32 +class Ifc25, class Ifc26, class Ifc27, class Ifc28, class Ifc29, class Ifc30, class Ifc31 , class Ifc32, class Ifc33 -#define __PUBLIC_IFC32 public Ifc1, public Ifc2, public Ifc3, public Ifc4, public Ifc5, public Ifc6, public Ifc7, public Ifc8, public Ifc9, public Ifc10, public Ifc11, public Ifc12, \ +#define __PUBLIC_IFC33 public Ifc1, public Ifc2, public Ifc3, public Ifc4, public Ifc5, public Ifc6, public Ifc7, public Ifc8, public Ifc9, public Ifc10, public Ifc11, public Ifc12, \ public Ifc13, public Ifc14, public Ifc15, public Ifc16, public Ifc17, public Ifc18, \ public Ifc19, public Ifc20, public Ifc21, public Ifc22, public Ifc23, public Ifc24, \ public Ifc25, public Ifc26, public Ifc27, public Ifc28, public Ifc29, public Ifc30, \ -public Ifc31, public Ifc32 +public Ifc31, public Ifc32, public Ifc33 #include <cppuhelper/implbase_ex.hxx> #include <cppuhelper/implbase_ex_pre.hxx> -#define __IFC_EX_TYPE_INIT32( class_cast ) \ +#define __IFC_EX_TYPE_INIT33( class_cast ) \ __IFC_EX_TYPE_INIT( class_cast, 1 ), __IFC_EX_TYPE_INIT( class_cast, 2 ), \ __IFC_EX_TYPE_INIT( class_cast, 3 ), __IFC_EX_TYPE_INIT( class_cast, 4 ), \ __IFC_EX_TYPE_INIT( class_cast, 5 ), __IFC_EX_TYPE_INIT( class_cast, 6 ), \ @@ -107,10 +108,11 @@ public Ifc31, public Ifc32 __IFC_EX_TYPE_INIT( class_cast, 25 ), __IFC_EX_TYPE_INIT( class_cast, 26 ), \ __IFC_EX_TYPE_INIT( class_cast, 27 ), __IFC_EX_TYPE_INIT( class_cast, 28 ), \ __IFC_EX_TYPE_INIT( class_cast, 29 ), __IFC_EX_TYPE_INIT( class_cast, 30 ), \ - __IFC_EX_TYPE_INIT( class_cast, 31 ), __IFC_EX_TYPE_INIT( class_cast, 32) + __IFC_EX_TYPE_INIT( class_cast, 31 ), __IFC_EX_TYPE_INIT( class_cast, 32 ), \ + __IFC_EX_TYPE_INIT( class_cast, 33 ) #include <cppuhelper/implbase_ex_post.hxx> -__DEF_IMPLHELPER_EX( 32 ) +__DEF_IMPLHELPER_EX( 33 ) namespace css = ::com::sun::star; @@ -136,7 +138,7 @@ SV_DECL_PTRARR(ActionContextArr, UnoActionContextPtr, 4, 4) ******************************************************************************/ -typedef cppu::WeakImplHelper32 +typedef cppu::WeakImplHelper33 < css::text::XTextDocument, css::text::XLineNumberingProperties, @@ -161,6 +163,7 @@ typedef cppu::WeakImplHelper32 css::text::XDocumentIndexesSupplier, css::beans::XPropertySet, css::beans::XPropertyState, + css::document::XLinkAuthorizer, css::document::XLinkTargetSupplier, css::document::XRedlinesSupplier, css::util::XRefreshable, @@ -391,6 +394,9 @@ public: virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& rPropertyName ) throw (css::beans::UnknownPropertyException, css::uno::RuntimeException); virtual css::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& rPropertyName ) throw (css::beans::UnknownPropertyException, css::lang::WrappedTargetException, css::uno::RuntimeException); + //XLinkAuthorizer + virtual sal_Bool SAL_CALL authorizeLinks( const ::rtl::OUString& rURL ) throw( css::uno::RuntimeException ); + //XLinkTargetSupplier virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLinks(void) throw( css::uno::RuntimeException ); diff --git a/main/sw/source/ui/uno/unotxdoc.cxx b/main/sw/source/ui/uno/unotxdoc.cxx index 6831c1dd72..ee0c8244eb 100644 --- a/main/sw/source/ui/uno/unotxdoc.cxx +++ b/main/sw/source/ui/uno/unotxdoc.cxx @@ -2358,6 +2358,28 @@ void SwXTextDocument::removeVetoableChangeListener(const OUString& /*PropertyNam { DBG_WARNING("not implemented"); } + +sal_Bool SwXTextDocument::authorizeLinks( const ::rtl::OUString& rURL ) throw( RuntimeException ) +{ + SwDoc *doc = pDocShell->GetDoc(); + if ( doc ) { + // The following access to the window is copied from SwDoc::UpdateLinks() + SfxMedium* pMedium = pDocShell->GetMedium(); + SfxFrame* pFrm = pMedium ? pMedium->GetLoadTargetFrame() : 0; + sfx2::LinkManager &pLinkMgr = doc->GetLinkManager(); + if ( pLinkMgr.urlIsSafe( rURL ) ) { + return sal_True; + } + Window* pDlgParent = 0; + if ( pFrm ) + pDlgParent = &pFrm->GetWindow(); + if ( !pDlgParent ) + pDlgParent = pDocShell->GetDialogParent( pMedium ); + if ( pDlgParent ) + return pLinkMgr.GetUserAllowsLinkUpdate( pDlgParent ); + } + return sal_False; +} /* -----------------25.10.99 10:42------------------- --------------------------------------------------*/
