xref: /trunk/main/svtools/source/misc/linkpolicy.cxx (revision 137931e43899a1545869cb6af6ea936d8cee4956)
1*137931e4SPeter /**************************************************************
2*137931e4SPeter  *
3*137931e4SPeter  * Licensed to the Apache Software Foundation (ASF) under one
4*137931e4SPeter  * or more contributor license agreements.  See the NOTICE file
5*137931e4SPeter  * distributed with this work for additional information
6*137931e4SPeter  * regarding copyright ownership.  The ASF licenses this file
7*137931e4SPeter  * to you under the Apache License, Version 2.0 (the
8*137931e4SPeter  * "License"); you may not use this file except in compliance
9*137931e4SPeter  * with the License.  You may obtain a copy of the License at
10*137931e4SPeter  *
11*137931e4SPeter  *   http://www.apache.org/licenses/LICENSE-2.0
12*137931e4SPeter  *
13*137931e4SPeter  * Unless required by applicable law or agreed to in writing,
14*137931e4SPeter  * software distributed under the License is distributed on an
15*137931e4SPeter  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*137931e4SPeter  * KIND, either express or implied.  See the License for the
17*137931e4SPeter  * specific language governing permissions and limitations
18*137931e4SPeter  * under the License.
19*137931e4SPeter  *
20*137931e4SPeter  *************************************************************/
21*137931e4SPeter 
22*137931e4SPeter // MARKER(update_precomp.py): autogen include statement, do not remove
23*137931e4SPeter #include "precompiled_svtools.hxx"
24*137931e4SPeter 
25*137931e4SPeter #include <com/sun/star/document/XLinkAuthorizer.hpp>
26*137931e4SPeter #include <com/sun/star/frame/XController.hpp>
27*137931e4SPeter #include <com/sun/star/frame/XDesktop.hpp>
28*137931e4SPeter #include <com/sun/star/frame/XFrame.hpp>
29*137931e4SPeter #include <com/sun/star/frame/XModel.hpp>
30*137931e4SPeter #include <com/sun/star/lang/XMultiServiceFactory.hpp>
31*137931e4SPeter #include <com/sun/star/uno/Reference.hxx>
32*137931e4SPeter #include <ucbhelper/contentbroker.hxx>
33*137931e4SPeter 
34*137931e4SPeter #include <svtools/linkpolicy.hxx>
35*137931e4SPeter 
36*137931e4SPeter using namespace ::com::sun::star;
37*137931e4SPeter 
38*137931e4SPeter namespace svt { namespace linkpolicy {
39*137931e4SPeter 
mayFollowDocumentLink(::rtl::OUString const & rUrl)40*137931e4SPeter bool mayFollowDocumentLink( ::rtl::OUString const & rUrl )
41*137931e4SPeter {
42*137931e4SPeter     if ( rUrl.getLength() == 0 )
43*137931e4SPeter         return false;
44*137931e4SPeter 
45*137931e4SPeter     // These schemes reach process state or the object model; no permission
46*137931e4SPeter     // makes them a sensible target for document content.
47*137931e4SPeter     if ( isVendorUrl( rUrl ) )
48*137931e4SPeter         return false;
49*137931e4SPeter 
50*137931e4SPeter     /* Ask the current document, which needs a ServiceManager to reach.
51*137931e4SPeter        Because utl::UcbStreamHelper relies on the ::ucbhelper::ContentBroker
52*137931e4SPeter        instance, use its ServiceManager. */
53*137931e4SPeter     ::ucbhelper::ContentBroker* pBroker = ::ucbhelper::ContentBroker::get();
54*137931e4SPeter     if ( pBroker )
55*137931e4SPeter     {
56*137931e4SPeter         uno::Reference< lang::XMultiServiceFactory > xFactory =
57*137931e4SPeter             pBroker->getServiceManager();
58*137931e4SPeter         if ( xFactory.is() )
59*137931e4SPeter         {
60*137931e4SPeter             uno::Any desktop( xFactory->createInstance(
61*137931e4SPeter                 ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ) );
62*137931e4SPeter             uno::Reference< frame::XDesktop > xDesktop( desktop, uno::UNO_QUERY );
63*137931e4SPeter             if ( xDesktop.is() )
64*137931e4SPeter             {
65*137931e4SPeter                 uno::Reference< frame::XFrame > xFrame( xDesktop->getCurrentFrame() );
66*137931e4SPeter                 if ( xFrame.is() )
67*137931e4SPeter                 {
68*137931e4SPeter                     uno::Reference< frame::XController > xController(
69*137931e4SPeter                         xFrame->getController() );
70*137931e4SPeter                     if ( xController.is() )
71*137931e4SPeter                     {
72*137931e4SPeter                         uno::Reference< frame::XModel > xModel(
73*137931e4SPeter                             xController->getModel() );
74*137931e4SPeter                         if ( xModel.is() )
75*137931e4SPeter                         {
76*137931e4SPeter                             uno::Reference< document::XLinkAuthorizer >
77*137931e4SPeter                                 xLinkAuthorizer( xModel, uno::UNO_QUERY );
78*137931e4SPeter                             if ( xLinkAuthorizer.is() )
79*137931e4SPeter                                 return xLinkAuthorizer->authorizeLinks( rUrl );
80*137931e4SPeter                         }
81*137931e4SPeter                     }
82*137931e4SPeter                 }
83*137931e4SPeter             }
84*137931e4SPeter         }
85*137931e4SPeter     }
86*137931e4SPeter 
87*137931e4SPeter     // No document to ask: behave as the linked-graphic loader always has.
88*137931e4SPeter     return true;
89*137931e4SPeter }
90*137931e4SPeter 
91*137931e4SPeter } }
92