This is an automated email from the ASF dual-hosted git repository. ardovm pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/openoffice.git
commit 68281b3f07af4696861c62e9efad368fb5607c0d 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 --- main/offapi/UnoApi_offapi.mk | 1 + .../com/sun/star/document/XLinkAuthorizer.idl | 51 ++++++++++++++++++++++ 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, 214 insertions(+), 17 deletions(-) diff --git a/main/offapi/UnoApi_offapi.mk b/main/offapi/UnoApi_offapi.mk index 3bdbf22e65..4ceb959c56 100644 --- a/main/offapi/UnoApi_offapi.mk +++ b/main/offapi/UnoApi_offapi.mk @@ -1818,6 +1818,7 @@ $(eval $(call gb_UnoApiTarget_add_idlfiles,offapi,\ offapi/com/sun/star/document/XImporter \ offapi/com/sun/star/document/XInteractionFilterOptions \ offapi/com/sun/star/document/XInteractionFilterSelect \ + offapi/com/sun/star/document/XLinkAuthorizer \ offapi/com/sun/star/document/XLinkTargetSupplier \ offapi/com/sun/star/document/XMimeTypeInfo \ offapi/com/sun/star/document/XOOXMLDocumentPropertiesImporter \ 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..a8a4298598 --- /dev/null +++ b/main/offapi/com/sun/star/document/XLinkAuthorizer.idl @@ -0,0 +1,51 @@ +/************************************************************** + * + * 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__ + +//============================================================================= + +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/sc/inc/docuno.hxx b/main/sc/inc/docuno.hxx index 2d4ac4e1a9..f9dee234d0 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 ef1b1481a4..b2607a315d 100644 --- a/main/sc/source/ui/unoobj/docuno.cxx +++ b/main/sc/source/ui/unoobj/docuno.cxx @@ -34,6 +34,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> @@ -460,6 +462,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 ) @@ -518,7 +521,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); @@ -531,11 +534,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++) @@ -1301,6 +1305,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 759df49ab1..6fa5ef2d53 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 f92359c80c..57b2243c57 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 85634051a5..8f08395040 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 { // The FileObject sends a SvData with the FormatId to notify the link about @@ -59,6 +64,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 a2aebb0558..6a6c3414a2 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> @@ -538,6 +542,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 321c0c563a..2b784165b3 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 12fdadcf07..c56766b0b3 100644 --- a/main/sw/source/ui/uno/unotxdoc.cxx +++ b/main/sw/source/ui/uno/unotxdoc.cxx @@ -2374,6 +2374,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------------------- --------------------------------------------------*/
