LCOV - code coverage report
Current view: top level - unotools/source/config - securityoptions.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 129 491 26.3 %
Date: 2014-04-11 Functions: 16 55 29.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <unotools/securityoptions.hxx>
      21             : #include <unotools/configmgr.hxx>
      22             : #include <unotools/configitem.hxx>
      23             : #include <unotools/ucbhelper.hxx>
      24             : #include <tools/debug.hxx>
      25             : #include <com/sun/star/uno/Any.hxx>
      26             : #include <com/sun/star/uno/Sequence.hxx>
      27             : 
      28             : #include <com/sun/star/beans/PropertyValue.hpp>
      29             : #include <comphelper/sequenceasvector.hxx>
      30             : #include <tools/urlobj.hxx>
      31             : 
      32             : #include <unotools/pathoptions.hxx>
      33             : 
      34             : #include "itemholder1.hxx"
      35             : 
      36             : //  namespaces
      37             : 
      38             : using namespace ::utl;
      39             : using namespace ::rtl;
      40             : using namespace ::osl;
      41             : using namespace ::com::sun::star::uno;
      42             : 
      43             : #define ROOTNODE_SECURITY               OUString("Office.Common/Security/Scripting")
      44             : #define DEFAULT_SECUREURL               Sequence< OUString >()
      45             : #define DEFAULT_TRUSTEDAUTHORS          Sequence< SvtSecurityOptions::Certificate >()
      46             : 
      47             : // xmlsec05 deprecated
      48             : #define DEFAULT_STAROFFICEBASIC         eALWAYS_EXECUTE
      49             : 
      50             : #define PROPERTYNAME_SECUREURL                  "SecureURL"
      51             : #define PROPERTYNAME_DOCWARN_SAVEORSEND         "WarnSaveOrSendDoc"
      52             : #define PROPERTYNAME_DOCWARN_SIGNING            "WarnSignDoc"
      53             : #define PROPERTYNAME_DOCWARN_PRINT              "WarnPrintDoc"
      54             : #define PROPERTYNAME_DOCWARN_CREATEPDF          "WarnCreatePDF"
      55             : #define PROPERTYNAME_DOCWARN_REMOVEPERSONALINFO "RemovePersonalInfoOnSaving"
      56             : #define PROPERTYNAME_DOCWARN_RECOMMENDPASSWORD  "RecommendPasswordProtection"
      57             : #define PROPERTYNAME_CTRLCLICK_HYPERLINK        "HyperlinksWithCtrlClick"
      58             : #define PROPERTYNAME_BLOCKUNTRUSTEDREFERERLINKS "BlockUntrustedRefererLinks"
      59             : #define PROPERTYNAME_MACRO_SECLEVEL             "MacroSecurityLevel"
      60             : #define PROPERTYNAME_MACRO_TRUSTEDAUTHORS       "TrustedAuthors"
      61             : #define PROPERTYNAME_MACRO_DISABLE              "DisableMacrosExecution"
      62             : #define PROPERTYNAME_TRUSTEDAUTHOR_SUBJECTNAME  "SubjectName"
      63             : #define PROPERTYNAME_TRUSTEDAUTHOR_SERIALNUMBER "SerialNumber"
      64             : #define PROPERTYNAME_TRUSTEDAUTHOR_RAWDATA      "RawData"
      65             : 
      66             : // xmlsec05 deprecated
      67             : #define PROPERTYNAME_STAROFFICEBASIC    "OfficeBasic"
      68             : #define PROPERTYNAME_EXECUTEPLUGINS     "ExecutePlugins"
      69             : #define PROPERTYNAME_WARNINGENABLED     "Warning"
      70             : #define PROPERTYNAME_CONFIRMATIONENABLED "Confirmation"
      71             : // xmlsec05 deprecated
      72             : 
      73             : #define PROPERTYHANDLE_SECUREURL                    0
      74             : 
      75             : // xmlsec05 deprecated
      76             : #define PROPERTYHANDLE_STAROFFICEBASIC  1
      77             : #define PROPERTYHANDLE_EXECUTEPLUGINS   2
      78             : #define PROPERTYHANDLE_WARNINGENABLED   3
      79             : #define PROPERTYHANDLE_CONFIRMATIONENABLED 4
      80             : // xmlsec05 deprecated
      81             : 
      82             : #define PROPERTYHANDLE_DOCWARN_SAVEORSEND           5
      83             : #define PROPERTYHANDLE_DOCWARN_SIGNING              6
      84             : #define PROPERTYHANDLE_DOCWARN_PRINT                7
      85             : #define PROPERTYHANDLE_DOCWARN_CREATEPDF            8
      86             : #define PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO   9
      87             : #define PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD    10
      88             : #define PROPERTYHANDLE_CTRLCLICK_HYPERLINK          11
      89             : #define PROPERTYHANDLE_BLOCKUNTRUSTEDREFERERLINKS   12
      90             : #define PROPERTYHANDLE_MACRO_SECLEVEL               13
      91             : #define PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS         14
      92             : #define PROPERTYHANDLE_MACRO_DISABLE                15
      93             : 
      94             : #define PROPERTYCOUNT                               16
      95             : #define PROPERTYHANDLE_INVALID                      -1
      96             : 
      97             : #define CFG_READONLY_DEFAULT                        false
      98             : 
      99             : //  private declarations!
     100             : 
     101             : class SvtSecurityOptions_Impl : public ConfigItem
     102             : {
     103             : 
     104             :     //  public methods
     105             : 
     106             :     public:
     107             : 
     108             :         //  constructor / destructor
     109             : 
     110             :          SvtSecurityOptions_Impl();
     111             :         virtual ~SvtSecurityOptions_Impl();
     112             : 
     113             :         //  overloaded methods of baseclass
     114             : 
     115             :         /*-****************************************************************************************************
     116             :             @short      called for notify of configmanager
     117             :             @descr      These method is called from the ConfigManager before application ends or from the
     118             :                          PropertyChangeListener if the sub tree broadcasts changes. You must update your
     119             :                         internal values.
     120             : 
     121             :             @seealso    baseclass ConfigItem
     122             : 
     123             :             @param      "seqPropertyNames" is the list of properties which should be updated.
     124             :         *//*-*****************************************************************************************************/
     125             : 
     126             :         virtual void Notify( const Sequence< OUString >& seqPropertyNames ) SAL_OVERRIDE;
     127             : 
     128             :         /*-****************************************************************************************************
     129             :             @short      write changes to configuration
     130             :             @descr      These method writes the changed values into the sub tree
     131             :                         and should always called in our destructor to guarantee consistency of config data.
     132             : 
     133             :             @seealso    baseclass ConfigItem
     134             :         *//*-*****************************************************************************************************/
     135             : 
     136             :         virtual void Commit() SAL_OVERRIDE;
     137             : 
     138             :         //  public interface
     139             : 
     140             :         bool                IsReadOnly      ( SvtSecurityOptions::EOption eOption                   ) const;
     141             : 
     142             :         Sequence< OUString >    GetSecureURLs   (                                                       ) const;
     143             :         void                    SetSecureURLs   (   const   Sequence< OUString >&   seqURLList          );
     144             :         inline sal_Int32        GetMacroSecurityLevel   (                                               ) const;
     145             :         void                    SetMacroSecurityLevel   ( sal_Int32 _nLevel                             );
     146             : 
     147             :         inline bool         IsMacroDisabled         (                                               ) const;
     148             : 
     149             :         Sequence< SvtSecurityOptions::Certificate > GetTrustedAuthors       (                                                                                       ) const;
     150             :         void                                        SetTrustedAuthors       ( const Sequence< SvtSecurityOptions::Certificate >& rAuthors                           );
     151             : 
     152             :         bool                IsOptionSet     ( SvtSecurityOptions::EOption eOption                   ) const;
     153             :         bool                SetOption       ( SvtSecurityOptions::EOption eOption, bool bValue  );
     154             :         bool                IsOptionEnabled ( SvtSecurityOptions::EOption eOption                   ) const;
     155             : 
     156             :         /*-****************************************************************************************************
     157             :             @short      return list of key names of our configuration management which represent our module tree
     158             :             @descr      These methods return a static const list of key names. We need it to get needed values from our
     159             :                         configuration management.
     160             :             @return     A list of needed configuration keys is returned.
     161             :         *//*-*****************************************************************************************************/
     162             : 
     163             :         void                    SetProperty( sal_Int32 nHandle, const Any& rValue, bool bReadOnly );
     164             :         void                    LoadAuthors( void );
     165             :         static sal_Int32        GetHandle( const OUString& rPropertyName );
     166             :         bool                    GetOption( SvtSecurityOptions::EOption eOption, bool*& rpValue, bool*& rpRO );
     167             : 
     168             :         static Sequence< OUString > GetPropertyNames();
     169             : 
     170             :         Sequence< OUString >                        m_seqSecureURLs;
     171             :         bool                                    m_bSaveOrSend;
     172             :         bool                                    m_bSigning;
     173             :         bool                                    m_bPrint;
     174             :         bool                                    m_bCreatePDF;
     175             :         bool                                    m_bRemoveInfo;
     176             :         bool                                    m_bRecommendPwd;
     177             :         bool                                    m_bCtrlClickHyperlink;
     178             :         bool                                    m_bBlockUntrustedRefererLinks;
     179             :         sal_Int32                                   m_nSecLevel;
     180             :         Sequence< SvtSecurityOptions::Certificate > m_seqTrustedAuthors;
     181             :         bool                                    m_bDisableMacros;
     182             : 
     183             :         bool                                    m_bROSecureURLs;
     184             :         bool                                    m_bROSaveOrSend;
     185             :         bool                                    m_bROSigning;
     186             :         bool                                    m_bROPrint;
     187             :         bool                                    m_bROCreatePDF;
     188             :         bool                                    m_bRORemoveInfo;
     189             :         bool                                    m_bRORecommendPwd;
     190             :         bool                                    m_bROCtrlClickHyperlink;
     191             :         bool                                    m_bROBlockUntrustedRefererLinks;
     192             :         bool                                    m_bROSecLevel;
     193             :         bool                                    m_bROTrustedAuthors;
     194             :         bool                                    m_bRODisableMacros;
     195             : 
     196             :         // xmlsec05 deprecated
     197             :         EBasicSecurityMode      m_eBasicMode;
     198             :         bool                m_bExecutePlugins;
     199             :         bool                m_bWarning;
     200             :         bool                m_bConfirmation;
     201             : 
     202             :         bool                m_bROConfirmation;
     203             :         bool                m_bROWarning;
     204             :         bool                m_bROExecutePlugins;
     205             :         bool                m_bROBasicMode;
     206             :         public:
     207             :         bool IsWarningEnabled() const;
     208             :         void SetWarningEnabled( bool bSet );
     209             :         bool IsConfirmationEnabled() const;
     210             :         void SetConfirmationEnabled( bool bSet );
     211             :         bool    IsExecutePlugins() const;
     212             :         void        SetExecutePlugins( bool bSet );
     213             :         EBasicSecurityMode      GetBasicMode    (                                               ) const;
     214             :         void                    SetBasicMode    (           EBasicSecurityMode      eMode       );
     215             : };
     216             : 
     217             : //  constructor
     218             : 
     219          91 : SvtSecurityOptions_Impl::SvtSecurityOptions_Impl()
     220             :     :ConfigItem             ( ROOTNODE_SECURITY         )
     221             :     ,m_seqSecureURLs        ( DEFAULT_SECUREURL         )
     222             :     ,m_bSaveOrSend          ( true                  )
     223             :     ,m_bSigning             ( true                  )
     224             :     ,m_bPrint               ( true                  )
     225             :     ,m_bCreatePDF           ( true                  )
     226             :     ,m_bRemoveInfo          ( true                  )
     227             :     ,m_bRecommendPwd(false)
     228             :     ,m_bCtrlClickHyperlink(false)
     229             :     ,m_bBlockUntrustedRefererLinks(false)
     230             :     ,m_nSecLevel            ( sal_True                  )
     231             :     ,m_seqTrustedAuthors    ( DEFAULT_TRUSTEDAUTHORS    )
     232             :     ,m_bDisableMacros       ( false                 )
     233             :     ,m_bROSecureURLs        ( CFG_READONLY_DEFAULT      )
     234             :     ,m_bROSaveOrSend        ( CFG_READONLY_DEFAULT      )
     235             :     ,m_bROSigning           ( CFG_READONLY_DEFAULT      )
     236             :     ,m_bROPrint             ( CFG_READONLY_DEFAULT      )
     237             :     ,m_bROCreatePDF         ( CFG_READONLY_DEFAULT      )
     238             :     ,m_bRORemoveInfo        ( CFG_READONLY_DEFAULT      )
     239             :     ,m_bRORecommendPwd(CFG_READONLY_DEFAULT)
     240             :     ,m_bROCtrlClickHyperlink(CFG_READONLY_DEFAULT)
     241             :     ,m_bROBlockUntrustedRefererLinks(CFG_READONLY_DEFAULT)
     242             :     ,m_bROSecLevel          ( CFG_READONLY_DEFAULT      )
     243             :     ,m_bROTrustedAuthors    ( CFG_READONLY_DEFAULT      )
     244             :     ,m_bRODisableMacros     ( true                  ) // currently is not intended to be changed
     245             : 
     246             :     // xmlsec05 deprecated
     247             :     ,   m_eBasicMode        ( DEFAULT_STAROFFICEBASIC )
     248             :     ,   m_bExecutePlugins   ( true                )
     249             :     ,   m_bWarning          ( true                )
     250             :     ,   m_bConfirmation     ( true                )
     251             :     ,   m_bROConfirmation   ( CFG_READONLY_DEFAULT    )
     252             :     ,   m_bROWarning        ( CFG_READONLY_DEFAULT    )
     253             :     ,   m_bROExecutePlugins ( CFG_READONLY_DEFAULT    )
     254          91 :     ,   m_bROBasicMode      ( CFG_READONLY_DEFAULT    )
     255             :     // xmlsec05 deprecated
     256             : 
     257             : {
     258          91 :     Sequence< OUString >    seqNames    = GetPropertyNames  (           );
     259         182 :     Sequence< Any >         seqValues   = GetProperties     ( seqNames  );
     260         182 :     Sequence< sal_Bool >    seqRO       = GetReadOnlyStates ( seqNames  );
     261             : 
     262             :     // Safe impossible cases.
     263             :     // We need values from ALL configuration keys.
     264             :     // Follow assignment use order of values in relation to our list of key names!
     265             :     DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtSecurityOptions_Impl::SvtSecurityOptions_Impl()\nI miss some values of configuration keys!\n" );
     266             : 
     267             :     // Copy values from list in right order to our internal member.
     268          91 :     sal_Int32               nPropertyCount = seqValues.getLength();
     269        1547 :     for( sal_Int32 nProperty = 0; nProperty < nPropertyCount; ++nProperty )
     270        1456 :         SetProperty( nProperty, seqValues[ nProperty ], seqRO[ nProperty ] );
     271             : 
     272          91 :     LoadAuthors();
     273             : 
     274             :     // Enable notification mechanism of our baseclass.
     275             :     // We need it to get information about changes outside these class on our used configuration keys!*/
     276             : 
     277         182 :     EnableNotification( seqNames );
     278          91 : }
     279             : 
     280             : //  destructor
     281             : 
     282         270 : SvtSecurityOptions_Impl::~SvtSecurityOptions_Impl()
     283             : {
     284          90 :     if( IsModified() )
     285           0 :         Commit();
     286         180 : }
     287             : 
     288        1456 : void SvtSecurityOptions_Impl::SetProperty( sal_Int32 nProperty, const Any& rValue, bool bRO )
     289             : {
     290        1456 :     switch( nProperty )
     291             :     {
     292             :         case PROPERTYHANDLE_SECUREURL:
     293             :         {
     294          91 :             m_seqSecureURLs.realloc( 0 );
     295          91 :             rValue >>= m_seqSecureURLs;
     296          91 :             SvtPathOptions  aOpt;
     297          91 :             sal_uInt32      nCount = m_seqSecureURLs.getLength();
     298          91 :             for( sal_uInt32 nItem = 0; nItem < nCount; ++nItem )
     299           0 :                 m_seqSecureURLs[ nItem ] = aOpt.SubstituteVariable( m_seqSecureURLs[ nItem ] );
     300          91 :             m_bROSecureURLs = bRO;
     301             :         }
     302          91 :         break;
     303             : 
     304             :         case PROPERTYHANDLE_DOCWARN_SAVEORSEND:
     305             :         {
     306          91 :             rValue >>= m_bSaveOrSend;
     307          91 :             m_bROSaveOrSend = bRO;
     308             :         }
     309          91 :         break;
     310             : 
     311             :         case PROPERTYHANDLE_DOCWARN_SIGNING:
     312             :         {
     313          91 :             rValue >>= m_bSigning;
     314          91 :             m_bROSigning = bRO;
     315             :         }
     316          91 :         break;
     317             : 
     318             :         case PROPERTYHANDLE_DOCWARN_PRINT:
     319             :         {
     320          91 :             rValue >>= m_bPrint;
     321          91 :             m_bROPrint = bRO;
     322             :         }
     323          91 :         break;
     324             : 
     325             :         case PROPERTYHANDLE_DOCWARN_CREATEPDF:
     326             :         {
     327          91 :             rValue >>= m_bCreatePDF;
     328          91 :             m_bROCreatePDF = bRO;
     329             :         }
     330          91 :         break;
     331             : 
     332             :         case PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO:
     333             :         {
     334          91 :             rValue >>= m_bRemoveInfo;
     335          91 :             m_bRORemoveInfo = bRO;
     336             :         }
     337          91 :         break;
     338             : 
     339             :         case PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD:
     340             :         {
     341          91 :             rValue >>= m_bRecommendPwd;
     342          91 :             m_bRORecommendPwd = bRO;
     343             :         }
     344          91 :         break;
     345             : 
     346             :         case PROPERTYHANDLE_CTRLCLICK_HYPERLINK:
     347             :         {
     348          91 :             rValue >>= m_bCtrlClickHyperlink;
     349          91 :             m_bROCtrlClickHyperlink = bRO;
     350             :         }
     351          91 :         break;
     352             : 
     353             :         case PROPERTYHANDLE_BLOCKUNTRUSTEDREFERERLINKS:
     354             :         {
     355          91 :             rValue >>= m_bBlockUntrustedRefererLinks;
     356          91 :             m_bROBlockUntrustedRefererLinks = bRO;
     357             :         }
     358          91 :         break;
     359             : 
     360             :         case PROPERTYHANDLE_MACRO_SECLEVEL:
     361             :         {
     362          91 :             rValue >>= m_nSecLevel;
     363          91 :             m_bROSecLevel = bRO;
     364             :         }
     365          91 :         break;
     366             : 
     367             :         case PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS:
     368             :         {
     369             :             // don't care about value here...
     370          91 :             m_bROTrustedAuthors = bRO;
     371             :         }
     372          91 :         break;
     373             : 
     374             :         case PROPERTYHANDLE_MACRO_DISABLE:
     375             :         {
     376          91 :             rValue >>= m_bDisableMacros;
     377          91 :             m_bRODisableMacros = bRO;
     378             :         }
     379          91 :         break;
     380             : 
     381             :         // xmlsec05 deprecated
     382             :         case PROPERTYHANDLE_STAROFFICEBASIC:
     383             :         {
     384          91 :             sal_Int32 nMode = 0;
     385          91 :             rValue >>= nMode;
     386          91 :             m_eBasicMode = (EBasicSecurityMode)nMode;
     387          91 :             m_bROBasicMode = bRO;
     388             :         }
     389          91 :         break;
     390             :         case PROPERTYHANDLE_EXECUTEPLUGINS:
     391             :         {
     392          91 :             rValue >>= m_bExecutePlugins;
     393          91 :             m_bROExecutePlugins = bRO;
     394             :         }
     395          91 :         break;
     396             :         case PROPERTYHANDLE_WARNINGENABLED:
     397             :         {
     398          91 :             rValue >>= m_bWarning;
     399          91 :             m_bROWarning = bRO;
     400             :         }
     401          91 :         break;
     402             :         case PROPERTYHANDLE_CONFIRMATIONENABLED:
     403             :         {
     404          91 :             rValue >>= m_bConfirmation;
     405          91 :             m_bROConfirmation = bRO;
     406             :         }
     407          91 :         break;
     408             :         // xmlsec05 deprecated
     409             : 
     410             :         #if OSL_DEBUG_LEVEL > 1
     411             :         default:
     412             :             DBG_ASSERT( false, "SvtSecurityOptions_Impl::SetProperty()\nUnknown property!\n" );
     413             :         #endif
     414             :     }
     415        1456 : }
     416             : 
     417          91 : void SvtSecurityOptions_Impl::LoadAuthors( void )
     418             : {
     419          91 :     m_seqTrustedAuthors.realloc( 0 );       // first clear
     420          91 :     Sequence< OUString >    lAuthors = GetNodeNames( PROPERTYNAME_MACRO_TRUSTEDAUTHORS );
     421          91 :     sal_Int32               c1 = lAuthors.getLength();
     422          91 :     if( c1 )
     423             :     {
     424           0 :         sal_Int32               c2 = c1 * 3;                // 3 Properties inside Struct TrustedAuthor
     425           0 :         Sequence< OUString >    lAllAuthors( c2 );
     426             : 
     427             :         sal_Int32               i1;
     428             :         sal_Int32               i2;
     429           0 :         OUString                aSep( "/" );
     430           0 :         for( i1 = 0, i2 = 0; i1 < c1; ++i1 )
     431             :         {
     432           0 :             lAllAuthors[ i2 ] = PROPERTYNAME_MACRO_TRUSTEDAUTHORS + aSep + lAuthors[ i1 ] + aSep + PROPERTYNAME_TRUSTEDAUTHOR_SUBJECTNAME;
     433           0 :             ++i2;
     434           0 :             lAllAuthors[ i2 ] = PROPERTYNAME_MACRO_TRUSTEDAUTHORS + aSep + lAuthors[ i1 ] + aSep + PROPERTYNAME_TRUSTEDAUTHOR_SERIALNUMBER;
     435           0 :             ++i2;
     436           0 :             lAllAuthors[ i2 ] = PROPERTYNAME_MACRO_TRUSTEDAUTHORS + aSep + lAuthors[ i1 ] + aSep + PROPERTYNAME_TRUSTEDAUTHOR_RAWDATA;
     437           0 :             ++i2;
     438             :         }
     439             : 
     440           0 :         Sequence< Any >         lValues = GetProperties( lAllAuthors );
     441           0 :         if( lValues.getLength() == c2 )
     442             :         {
     443           0 :             comphelper::SequenceAsVector< SvtSecurityOptions::Certificate > v;
     444           0 :             SvtSecurityOptions::Certificate aCert( 3 );
     445           0 :             for( i1 = 0, i2 = 0; i1 < c1; ++i1 )
     446             :             {
     447           0 :                 lValues[ i2 ] >>= aCert[ 0 ];
     448           0 :                 ++i2;
     449           0 :                 lValues[ i2 ] >>= aCert[ 1 ];
     450           0 :                 ++i2;
     451           0 :                 lValues[ i2 ] >>= aCert[ 2 ];
     452           0 :                 ++i2;
     453             :                 // Filter out TrustedAuthor entries with empty RawData, which
     454             :                 // would cause an unexpected std::bad_alloc in
     455             :                 // SecurityEnvironment_NssImpl::createCertificateFromAscii and
     456             :                 // have been observed in the wild (fdo#55019):
     457           0 :                 if( !aCert[ 2 ].isEmpty() )
     458             :                 {
     459           0 :                     v.push_back( aCert );
     460             :                 }
     461             :             }
     462           0 :             m_seqTrustedAuthors = v.getAsConstList();
     463           0 :         }
     464          91 :     }
     465          91 : }
     466             : 
     467           0 : sal_Int32 SvtSecurityOptions_Impl::GetHandle( const OUString& rName )
     468             : {
     469             :     sal_Int32   nHandle;
     470             : 
     471           0 :     if( rName == PROPERTYNAME_SECUREURL )
     472           0 :         nHandle = PROPERTYHANDLE_SECUREURL;
     473           0 :     else if( rName == PROPERTYNAME_DOCWARN_SAVEORSEND )
     474           0 :         nHandle = PROPERTYHANDLE_DOCWARN_SAVEORSEND;
     475           0 :     else if( rName == PROPERTYNAME_DOCWARN_SIGNING )
     476           0 :         nHandle = PROPERTYHANDLE_DOCWARN_SIGNING;
     477           0 :     else if( rName == PROPERTYNAME_DOCWARN_PRINT )
     478           0 :         nHandle = PROPERTYHANDLE_DOCWARN_PRINT;
     479           0 :     else if( rName == PROPERTYNAME_DOCWARN_CREATEPDF )
     480           0 :         nHandle = PROPERTYHANDLE_DOCWARN_CREATEPDF;
     481           0 :     else if( rName == PROPERTYNAME_DOCWARN_REMOVEPERSONALINFO )
     482           0 :         nHandle = PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO;
     483           0 :     else if( rName == PROPERTYNAME_DOCWARN_RECOMMENDPASSWORD )
     484           0 :         nHandle = PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD;
     485           0 :     else if( rName == PROPERTYNAME_CTRLCLICK_HYPERLINK )
     486           0 :         nHandle = PROPERTYHANDLE_CTRLCLICK_HYPERLINK;
     487           0 :     else if( rName == PROPERTYNAME_BLOCKUNTRUSTEDREFERERLINKS )
     488           0 :         nHandle = PROPERTYHANDLE_BLOCKUNTRUSTEDREFERERLINKS;
     489           0 :     else if( rName == PROPERTYNAME_MACRO_SECLEVEL )
     490           0 :         nHandle = PROPERTYHANDLE_MACRO_SECLEVEL;
     491           0 :     else if( rName == PROPERTYNAME_MACRO_TRUSTEDAUTHORS )
     492           0 :         nHandle = PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS;
     493           0 :     else if( rName == PROPERTYNAME_MACRO_DISABLE )
     494           0 :         nHandle = PROPERTYHANDLE_MACRO_DISABLE;
     495             : 
     496             :     // xmlsec05 deprecated
     497           0 :     else if( rName == PROPERTYNAME_STAROFFICEBASIC )
     498           0 :         nHandle = PROPERTYHANDLE_STAROFFICEBASIC;
     499           0 :     else if( rName == PROPERTYNAME_EXECUTEPLUGINS )
     500           0 :         nHandle = PROPERTYHANDLE_EXECUTEPLUGINS;
     501           0 :     else if( rName == PROPERTYNAME_WARNINGENABLED )
     502           0 :         nHandle = PROPERTYHANDLE_WARNINGENABLED;
     503           0 :     else if( rName == PROPERTYNAME_CONFIRMATIONENABLED )
     504           0 :         nHandle = PROPERTYHANDLE_CONFIRMATIONENABLED;
     505             :     // xmlsec05 deprecated
     506             : 
     507             :     else
     508           0 :         nHandle = PROPERTYHANDLE_INVALID;
     509             : 
     510           0 :     return nHandle;
     511             : }
     512             : 
     513        5354 : bool SvtSecurityOptions_Impl::GetOption( SvtSecurityOptions::EOption eOption, bool*& rpValue, bool*& rpRO )
     514             : {
     515        5354 :     switch( eOption )
     516             :     {
     517             :         case SvtSecurityOptions::E_DOCWARN_SAVEORSEND:
     518           0 :             rpValue = &m_bSaveOrSend;
     519           0 :             rpRO = &m_bROSaveOrSend;
     520           0 :             break;
     521             :         case SvtSecurityOptions::E_DOCWARN_SIGNING:
     522           0 :             rpValue = &m_bSigning;
     523           0 :             rpRO = &m_bROSigning;
     524           0 :             break;
     525             :         case SvtSecurityOptions::E_DOCWARN_PRINT:
     526           0 :             rpValue = &m_bPrint;
     527           0 :             rpRO = &m_bROPrint;
     528           0 :             break;
     529             :         case SvtSecurityOptions::E_DOCWARN_CREATEPDF:
     530           0 :             rpValue = &m_bCreatePDF;
     531           0 :             rpRO = &m_bROCreatePDF;
     532           0 :             break;
     533             :         case SvtSecurityOptions::E_DOCWARN_REMOVEPERSONALINFO:
     534          73 :             rpValue = &m_bRemoveInfo;
     535          73 :             rpRO = &m_bRORemoveInfo;
     536          73 :             break;
     537             :         case SvtSecurityOptions::E_DOCWARN_RECOMMENDPASSWORD:
     538           0 :             rpValue = &m_bRecommendPwd;
     539           0 :             rpRO = &m_bRORecommendPwd;
     540           0 :             break;
     541             :         case SvtSecurityOptions::E_CTRLCLICK_HYPERLINK:
     542        1222 :             rpValue = &m_bCtrlClickHyperlink;
     543        1222 :             rpRO = &m_bROCtrlClickHyperlink;
     544        1222 :             break;
     545             :         case SvtSecurityOptions::E_BLOCKUNTRUSTEDREFERERLINKS:
     546        4059 :             rpValue = &m_bBlockUntrustedRefererLinks;
     547        4059 :             rpRO = &m_bROBlockUntrustedRefererLinks;
     548        4059 :             break;
     549             :         default:
     550           0 :             rpValue = NULL;
     551           0 :             rpRO = NULL;
     552           0 :             break;
     553             :     }
     554             : 
     555        5354 :     return rpValue != NULL;
     556             : }
     557             : 
     558           0 : void SvtSecurityOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
     559             : {
     560             :     // Use given list of updated properties to get his values from configuration directly!
     561           0 :     Sequence< Any >         seqValues = GetProperties( seqPropertyNames );
     562           0 :     Sequence< sal_Bool >    seqRO = GetReadOnlyStates( seqPropertyNames );
     563             :     // Safe impossible cases.
     564             :     // We need values from ALL notified configuration keys.
     565             :     DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtSecurityOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );
     566             :     // Step over list of property names and get right value from coreesponding value list to set it on internal members!
     567           0 :     sal_Int32               nCount = seqPropertyNames.getLength();
     568           0 :     for( sal_Int32 nProperty = 0; nProperty < nCount; ++nProperty )
     569           0 :         SetProperty( GetHandle( seqPropertyNames[ nProperty ] ), seqValues[ nProperty ], seqRO[ nProperty ] );
     570             : 
     571             :     // read set of trusted authors separately
     572           0 :     LoadAuthors();
     573           0 : }
     574             : 
     575           0 : void SvtSecurityOptions_Impl::Commit()
     576             : {
     577             :     // Get names of supported properties, create a list for values and copy current values to it.
     578           0 :     Sequence< OUString >    lOrgNames = GetPropertyNames();
     579           0 :     sal_Int32               nOrgCount = lOrgNames.getLength();
     580             : 
     581           0 :     Sequence< OUString >    lNames(nOrgCount);
     582           0 :     Sequence< Any >         lValues(nOrgCount);
     583           0 :     sal_Int32               nRealCount = 0;
     584             :     bool                    bDone;
     585             : 
     586           0 :     ClearNodeSet( PROPERTYNAME_MACRO_TRUSTEDAUTHORS );
     587             : 
     588           0 :     for( sal_Int32 nProperty = 0; nProperty < nOrgCount; ++nProperty )
     589             :     {
     590           0 :         switch( nProperty )
     591             :         {
     592             :             case PROPERTYHANDLE_SECUREURL:
     593             :             {
     594           0 :                 bDone = !m_bROSecureURLs;
     595           0 :                 if( bDone )
     596             :                 {
     597           0 :                     Sequence< OUString >    lURLs( m_seqSecureURLs );
     598           0 :                     SvtPathOptions          aOpt;
     599           0 :                     sal_Int32               nURLsCnt = lURLs.getLength();
     600           0 :                     for( sal_Int32 nItem = 0; nItem < nURLsCnt; ++nItem )
     601           0 :                         lURLs[ nItem ] = aOpt.UseVariable( lURLs[ nItem ] );
     602           0 :                     lValues[ nRealCount ] <<= lURLs;
     603             :                 }
     604             :             }
     605           0 :             break;
     606             : 
     607             :             case PROPERTYHANDLE_DOCWARN_SAVEORSEND:
     608             :             {
     609           0 :                 bDone = !m_bROSaveOrSend;
     610           0 :                 if( bDone )
     611           0 :                     lValues[ nRealCount ] <<= m_bSaveOrSend;
     612             :             }
     613           0 :             break;
     614             : 
     615             :             case PROPERTYHANDLE_DOCWARN_SIGNING:
     616             :             {
     617           0 :                 bDone = !m_bROSigning;
     618           0 :                 if( bDone )
     619           0 :                     lValues[ nRealCount ] <<= m_bSigning;
     620             :             }
     621           0 :             break;
     622             : 
     623             :             case PROPERTYHANDLE_DOCWARN_PRINT:
     624             :             {
     625           0 :                 bDone = !m_bROPrint;
     626           0 :                 if( bDone )
     627           0 :                     lValues[ nRealCount ] <<= m_bPrint;
     628             :             }
     629           0 :             break;
     630             : 
     631             :             case PROPERTYHANDLE_DOCWARN_CREATEPDF:
     632             :             {
     633           0 :                 bDone = !m_bROCreatePDF;
     634           0 :                 if( bDone )
     635           0 :                     lValues[ nRealCount ] <<= m_bCreatePDF;
     636             :             }
     637           0 :             break;
     638             : 
     639             :             case PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO:
     640             :             {
     641           0 :                 bDone = !m_bRORemoveInfo;
     642           0 :                 if( bDone )
     643           0 :                     lValues[ nRealCount ] <<= m_bRemoveInfo;
     644             :             }
     645           0 :             break;
     646             : 
     647             :             case PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD:
     648             :             {
     649           0 :                 bDone = !m_bRORecommendPwd;
     650           0 :                 if( bDone )
     651           0 :                     lValues[ nRealCount ] <<= m_bRecommendPwd;
     652             :             }
     653           0 :             break;
     654             : 
     655             :             case PROPERTYHANDLE_CTRLCLICK_HYPERLINK:
     656             :             {
     657           0 :                 bDone = !m_bROCtrlClickHyperlink;
     658           0 :                 if( bDone )
     659           0 :                     lValues[ nRealCount ] <<= m_bCtrlClickHyperlink;
     660             :             }
     661           0 :             break;
     662             : 
     663             :             case PROPERTYHANDLE_BLOCKUNTRUSTEDREFERERLINKS:
     664             :             {
     665           0 :                 bDone = !m_bROBlockUntrustedRefererLinks;
     666           0 :                 if( bDone )
     667           0 :                     lValues[ nRealCount ] <<= m_bBlockUntrustedRefererLinks;
     668             :             }
     669           0 :             break;
     670             : 
     671             :             case PROPERTYHANDLE_MACRO_SECLEVEL:
     672             :             {
     673           0 :                 bDone = !m_bROSecLevel;
     674           0 :                 if( bDone )
     675           0 :                     lValues[ nRealCount ] <<= m_nSecLevel;
     676             :             }
     677           0 :             break;
     678             : 
     679             :             case PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS:
     680             :             {
     681           0 :                 bDone = !m_bROTrustedAuthors;
     682           0 :                 if( bDone )
     683             :                 {
     684           0 :                     sal_Int32   nCnt = m_seqTrustedAuthors.getLength();
     685           0 :                     if( nCnt )
     686             :                     {
     687           0 :                         for( sal_Int32 i = 0; i < nCnt; ++i )
     688             :                         {
     689             :                             OUString aPrefix(
     690             :                                 PROPERTYNAME_MACRO_TRUSTEDAUTHORS "/a"
     691           0 :                                 + OUString::number(i) + "/");
     692           0 :                             Sequence< com::sun::star::beans::PropertyValue >    lPropertyValues( 3 );
     693           0 :                             lPropertyValues[ 0 ].Name = aPrefix + PROPERTYNAME_TRUSTEDAUTHOR_SUBJECTNAME;
     694           0 :                             lPropertyValues[ 0 ].Value <<= m_seqTrustedAuthors[ i ][0];
     695           0 :                             lPropertyValues[ 1 ].Name = aPrefix + PROPERTYNAME_TRUSTEDAUTHOR_SERIALNUMBER;
     696           0 :                             lPropertyValues[ 1 ].Value <<= m_seqTrustedAuthors[ i ][1];
     697           0 :                             lPropertyValues[ 2 ].Name = aPrefix + PROPERTYNAME_TRUSTEDAUTHOR_RAWDATA;
     698           0 :                             lPropertyValues[ 2 ].Value <<= m_seqTrustedAuthors[ i ][2];
     699             : 
     700           0 :                             SetSetProperties( PROPERTYNAME_MACRO_TRUSTEDAUTHORS, lPropertyValues );
     701           0 :                         }
     702             : 
     703           0 :                         bDone = false;      // because we save in loop above!
     704             :                     }
     705             :                     else
     706           0 :                         bDone = false;
     707             :                 }
     708             :             }
     709           0 :             break;
     710             : 
     711             :             case PROPERTYHANDLE_MACRO_DISABLE:
     712             :             {
     713           0 :                 bDone = !m_bRODisableMacros;
     714           0 :                 if( bDone )
     715           0 :                     lValues[ nRealCount ] <<= m_bDisableMacros;
     716             :             }
     717           0 :             break;
     718             : 
     719             :             // xmlsec05 deprecated
     720             :             case PROPERTYHANDLE_STAROFFICEBASIC:
     721             :             {
     722           0 :                 bDone = !m_bROBasicMode;
     723           0 :                 if( bDone )
     724           0 :                     lValues[ nRealCount ] <<= (sal_Int32)m_eBasicMode;
     725             :             }
     726           0 :             break;
     727             :             case PROPERTYHANDLE_EXECUTEPLUGINS:
     728             :             {
     729           0 :                 bDone = !m_bROExecutePlugins;
     730           0 :                 if( bDone )
     731           0 :                     lValues[ nRealCount ] <<= m_bExecutePlugins;
     732             :             }
     733           0 :             break;
     734             :             case PROPERTYHANDLE_WARNINGENABLED:
     735             :             {
     736           0 :                 bDone = !m_bROWarning;
     737           0 :                 if( bDone )
     738           0 :                     lValues[ nRealCount ] <<= m_bWarning;
     739             :             }
     740           0 :             break;
     741             :             case PROPERTYHANDLE_CONFIRMATIONENABLED:
     742             :             {
     743           0 :                 bDone = !m_bROConfirmation;
     744           0 :                 if( bDone )
     745           0 :                     lValues[ nRealCount ] <<= m_bConfirmation;
     746             :             }
     747           0 :             break;
     748             :             // xmlsec05 deprecated
     749             : 
     750             :             default:
     751           0 :                 bDone = false;
     752             :         }
     753             : 
     754           0 :         if( bDone )
     755             :         {
     756           0 :             lNames[ nRealCount ] = lOrgNames[ nProperty ];
     757           0 :             ++nRealCount;
     758             :         }
     759             :     }
     760             :     // Set properties in configuration.
     761           0 :     lNames.realloc(nRealCount);
     762           0 :     lValues.realloc(nRealCount);
     763           0 :     PutProperties( lNames, lValues );
     764           0 : }
     765             : 
     766           0 : bool SvtSecurityOptions_Impl::IsReadOnly( SvtSecurityOptions::EOption eOption ) const
     767             : {
     768             :     bool    bReadonly;
     769           0 :     switch(eOption)
     770             :     {
     771             :         case SvtSecurityOptions::E_SECUREURLS :
     772           0 :             bReadonly = m_bROSecureURLs;
     773           0 :             break;
     774             :         case SvtSecurityOptions::E_DOCWARN_SAVEORSEND:
     775           0 :             bReadonly = m_bROSaveOrSend;
     776           0 :             break;
     777             :         case SvtSecurityOptions::E_DOCWARN_SIGNING:
     778           0 :             bReadonly = m_bROSigning;
     779           0 :             break;
     780             :         case SvtSecurityOptions::E_DOCWARN_PRINT:
     781           0 :             bReadonly = m_bROPrint;
     782           0 :             break;
     783             :         case SvtSecurityOptions::E_DOCWARN_CREATEPDF:
     784           0 :             bReadonly = m_bROCreatePDF;
     785           0 :             break;
     786             :         case SvtSecurityOptions::E_DOCWARN_REMOVEPERSONALINFO:
     787           0 :             bReadonly = m_bRORemoveInfo;
     788           0 :             break;
     789             :         case SvtSecurityOptions::E_DOCWARN_RECOMMENDPASSWORD:
     790           0 :             bReadonly = m_bRORecommendPwd;
     791           0 :             break;
     792             :         case SvtSecurityOptions::E_MACRO_SECLEVEL:
     793           0 :             bReadonly = m_bROSecLevel;
     794           0 :             break;
     795             :         case SvtSecurityOptions::E_MACRO_TRUSTEDAUTHORS:
     796           0 :             bReadonly = m_bROTrustedAuthors;
     797           0 :             break;
     798             :         case SvtSecurityOptions::E_MACRO_DISABLE:
     799           0 :             bReadonly = m_bRODisableMacros;
     800           0 :             break;
     801             :         case SvtSecurityOptions::E_CTRLCLICK_HYPERLINK:
     802           0 :             bReadonly = m_bROCtrlClickHyperlink;
     803           0 :             break;
     804             :         case SvtSecurityOptions::E_BLOCKUNTRUSTEDREFERERLINKS:
     805           0 :             bReadonly = m_bROBlockUntrustedRefererLinks;
     806           0 :             break;
     807             : 
     808             :         // xmlsec05 deprecated
     809             :         case SvtSecurityOptions::E_BASICMODE:
     810           0 :             bReadonly = m_bROBasicMode;
     811           0 :             break;
     812             :         case SvtSecurityOptions::E_EXECUTEPLUGINS:
     813           0 :             bReadonly = m_bROExecutePlugins;
     814           0 :             break;
     815             :         case SvtSecurityOptions::E_WARNING:
     816           0 :             bReadonly = m_bROWarning;
     817           0 :             break;
     818             :         case SvtSecurityOptions::E_CONFIRMATION:
     819           0 :             bReadonly = m_bROConfirmation;
     820           0 :             break;
     821             :         // xmlsec05 deprecated
     822             : 
     823             :         default:
     824           0 :             bReadonly = true;
     825             :     }
     826             : 
     827           0 :     return bReadonly;
     828             : }
     829             : 
     830           0 : Sequence< OUString > SvtSecurityOptions_Impl::GetSecureURLs() const
     831             : {
     832           0 :     return m_seqSecureURLs;
     833             : }
     834             : 
     835           0 : void SvtSecurityOptions_Impl::SetSecureURLs( const Sequence< OUString >& seqURLList )
     836             : {
     837             :     DBG_ASSERT(!m_bROSecureURLs, "SvtSecurityOptions_Impl::SetSecureURLs()\nYou tried to write on a readonly value!\n");
     838           0 :     if (!m_bROSecureURLs && m_seqSecureURLs!=seqURLList)
     839             :     {
     840           0 :         m_seqSecureURLs = seqURLList;
     841           0 :         SetModified();
     842             :     }
     843           0 : }
     844             : 
     845           0 : inline sal_Int32 SvtSecurityOptions_Impl::GetMacroSecurityLevel() const
     846             : {
     847           0 :     return m_nSecLevel;
     848             : }
     849             : 
     850        3795 : inline bool SvtSecurityOptions_Impl::IsMacroDisabled() const
     851             : {
     852        3795 :     return m_bDisableMacros;
     853             : }
     854             : 
     855           0 : void SvtSecurityOptions_Impl::SetMacroSecurityLevel( sal_Int32 _nLevel )
     856             : {
     857           0 :     if( !m_bROSecLevel )
     858             :     {
     859           0 :         if( _nLevel > 3 || _nLevel < 0 )
     860           0 :             _nLevel = 3;
     861             : 
     862           0 :         if( m_nSecLevel != _nLevel )
     863             :         {
     864           0 :             m_nSecLevel = _nLevel;
     865           0 :             SetModified();
     866             :         }
     867             :     }
     868           0 : }
     869             : 
     870           0 : Sequence< SvtSecurityOptions::Certificate > SvtSecurityOptions_Impl::GetTrustedAuthors() const
     871             : {
     872           0 :     return m_seqTrustedAuthors;
     873             : }
     874             : 
     875           0 : void SvtSecurityOptions_Impl::SetTrustedAuthors( const Sequence< SvtSecurityOptions::Certificate >& rAuthors )
     876             : {
     877             :     DBG_ASSERT(!m_bROTrustedAuthors, "SvtSecurityOptions_Impl::SetTrustedAuthors()\nYou tried to write on a readonly value!\n");
     878           0 :     if( !m_bROTrustedAuthors && rAuthors != m_seqTrustedAuthors )
     879             :     {
     880           0 :         m_seqTrustedAuthors = rAuthors;
     881           0 :         SetModified();
     882             :     }
     883           0 : }
     884             : 
     885        5354 : bool SvtSecurityOptions_Impl::IsOptionSet( SvtSecurityOptions::EOption eOption ) const
     886             : {
     887             :     bool*   pValue;
     888             :     bool*   pRO;
     889        5354 :     bool    bRet = false;
     890             : 
     891        5354 :     if( ( const_cast< SvtSecurityOptions_Impl* >( this ) )->GetOption( eOption, pValue, pRO ) )
     892        5354 :         bRet = *pValue;
     893             : 
     894        5354 :     return bRet;
     895             : }
     896             : 
     897           0 : bool SvtSecurityOptions_Impl::SetOption( SvtSecurityOptions::EOption eOption, bool bValue )
     898             : {
     899             :     bool*   pValue;
     900             :     bool*   pRO;
     901           0 :     bool    bRet = false;
     902             : 
     903           0 :     if( GetOption( eOption, pValue, pRO ) )
     904             :     {
     905           0 :         if( !*pRO )
     906             :         {
     907           0 :             bRet = true;
     908           0 :             if( *pValue != bValue )
     909             :             {
     910           0 :                 *pValue = bValue;
     911           0 :                 SetModified();
     912             :             }
     913             :         }
     914             :     }
     915             : 
     916           0 :     return bRet;
     917             : }
     918             : 
     919           0 : bool SvtSecurityOptions_Impl::IsOptionEnabled( SvtSecurityOptions::EOption eOption ) const
     920             : {
     921             :     bool*   pValue;
     922             :     bool*   pRO;
     923           0 :     bool    bRet = false;
     924             : 
     925           0 :     if( ( const_cast< SvtSecurityOptions_Impl* >( this ) )->GetOption( eOption, pValue, pRO ) )
     926           0 :         bRet = !*pRO;
     927             : 
     928           0 :     return bRet;
     929             : }
     930             : 
     931          91 : Sequence< OUString > SvtSecurityOptions_Impl::GetPropertyNames()
     932             : {
     933             :     // Build static list of configuration key names.
     934             :     const OUString pProperties[] =
     935             :     {
     936             :         OUString(PROPERTYNAME_SECUREURL),
     937             :         OUString(PROPERTYNAME_STAROFFICEBASIC),
     938             :         OUString(PROPERTYNAME_EXECUTEPLUGINS),
     939             :         OUString(PROPERTYNAME_WARNINGENABLED),
     940             :         OUString(PROPERTYNAME_CONFIRMATIONENABLED),
     941             :         OUString(PROPERTYNAME_DOCWARN_SAVEORSEND),
     942             :         OUString(PROPERTYNAME_DOCWARN_SIGNING),
     943             :         OUString(PROPERTYNAME_DOCWARN_PRINT),
     944             :         OUString(PROPERTYNAME_DOCWARN_CREATEPDF),
     945             :         OUString(PROPERTYNAME_DOCWARN_REMOVEPERSONALINFO),
     946             :         OUString(PROPERTYNAME_DOCWARN_RECOMMENDPASSWORD),
     947             :         OUString(PROPERTYNAME_CTRLCLICK_HYPERLINK),
     948             :         OUString(PROPERTYNAME_BLOCKUNTRUSTEDREFERERLINKS),
     949             :         OUString(PROPERTYNAME_MACRO_SECLEVEL),
     950             :         OUString(PROPERTYNAME_MACRO_TRUSTEDAUTHORS),
     951             :         OUString(PROPERTYNAME_MACRO_DISABLE)
     952        1547 :     };
     953             :     // Initialize return sequence with these list ...
     954          91 :     const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
     955             :     // ... and return it.
     956        1547 :     return seqPropertyNames;
     957             : }
     958             : 
     959             : //  initialize static member
     960             : //  DON'T DO IT IN YOUR HEADER!
     961             : //  see definition for further information
     962             : 
     963             : SvtSecurityOptions_Impl*    SvtSecurityOptions::m_pDataContainer    = NULL;
     964             : sal_Int32                   SvtSecurityOptions::m_nRefCount         = 0;
     965             : 
     966        9240 : SvtSecurityOptions::SvtSecurityOptions()
     967             : {
     968             :     // Global access, must be guarded (multithreading!).
     969        9240 :     MutexGuard aGuard( GetInitMutex() );
     970             :     // Increase our refcount ...
     971        9240 :     ++m_nRefCount;
     972             :     // ... and initialize our data container only if it not already exist!
     973        9240 :     if( m_pDataContainer == NULL )
     974             :     {
     975          91 :         m_pDataContainer = new SvtSecurityOptions_Impl;
     976             : 
     977          91 :         ItemHolder1::holdConfigItem(E_SECURITYOPTIONS);
     978        9240 :     }
     979        9240 : }
     980             : 
     981       18568 : SvtSecurityOptions::~SvtSecurityOptions()
     982             : {
     983             :     // Global access, must be guarded (multithreading!)
     984        9239 :     MutexGuard aGuard( GetInitMutex() );
     985             :     // Decrease our refcount.
     986        9239 :     --m_nRefCount;
     987             :     // If last instance was deleted ...
     988             :     // we must destroy our static data container!
     989        9239 :     if( m_nRefCount <= 0 )
     990             :     {
     991          90 :         delete m_pDataContainer;
     992          90 :         m_pDataContainer = NULL;
     993        9239 :     }
     994        9329 : }
     995             : 
     996           0 : bool SvtSecurityOptions::IsReadOnly( EOption eOption ) const
     997             : {
     998           0 :     MutexGuard aGuard( GetInitMutex() );
     999           0 :     return m_pDataContainer->IsReadOnly(eOption);
    1000             : }
    1001             : 
    1002           0 : Sequence< OUString > SvtSecurityOptions::GetSecureURLs() const
    1003             : {
    1004           0 :     MutexGuard aGuard( GetInitMutex() );
    1005           0 :     return m_pDataContainer->GetSecureURLs();
    1006             : }
    1007             : 
    1008           0 : void SvtSecurityOptions::SetSecureURLs( const Sequence< OUString >& seqURLList )
    1009             : {
    1010           0 :     MutexGuard aGuard( GetInitMutex() );
    1011           0 :     m_pDataContainer->SetSecureURLs( seqURLList );
    1012           0 : }
    1013             : 
    1014           0 : bool SvtSecurityOptions::isSecureMacroUri(
    1015             :     OUString const & uri, OUString const & referer) const
    1016             : {
    1017           0 :     switch (INetURLObject(uri).GetProtocol()) {
    1018             :     case INET_PROT_MACRO:
    1019           0 :         if (uri.startsWithIgnoreAsciiCase("macro:///")) {
    1020             :             // Denotes an App-BASIC macro (see SfxMacroLoader::loadMacro), which
    1021             :             // is considered safe:
    1022           0 :             return true;
    1023             :         }
    1024             :         // fall through
    1025             :     case INET_PROT_SLOT:
    1026           0 :         return referer.equalsIgnoreAsciiCase("private:user")
    1027           0 :             || isTrustedLocationUri(referer);
    1028             :     default:
    1029           0 :         return true;
    1030             :     }
    1031             : }
    1032             : 
    1033        4059 : bool SvtSecurityOptions::isUntrustedReferer(OUString const & referer) const {
    1034        4059 :     MutexGuard g(GetInitMutex());
    1035        4059 :     return m_pDataContainer->IsOptionSet(E_BLOCKUNTRUSTEDREFERERLINKS)
    1036        4059 :         && !(referer.isEmpty() || referer.startsWithIgnoreAsciiCase("private:")
    1037        4059 :              || isTrustedLocationUri(referer));
    1038             : }
    1039             : 
    1040           0 : bool SvtSecurityOptions::isTrustedLocationUri(OUString const & uri) const {
    1041           0 :     MutexGuard g(GetInitMutex());
    1042           0 :     for (sal_Int32 i = 0; i != m_pDataContainer->m_seqSecureURLs.getLength();
    1043             :          ++i)
    1044             :     {
    1045           0 :         if (UCBContentHelper::IsSubPath(
    1046           0 :                 m_pDataContainer->m_seqSecureURLs[i], uri))
    1047             :         {
    1048           0 :             return true;
    1049             :         }
    1050             :     }
    1051           0 :     return false;
    1052             : }
    1053             : 
    1054           0 : sal_Int32 SvtSecurityOptions::GetMacroSecurityLevel() const
    1055             : {
    1056           0 :     MutexGuard aGuard( GetInitMutex() );
    1057           0 :     return m_pDataContainer->GetMacroSecurityLevel();
    1058             : }
    1059             : 
    1060           0 : void SvtSecurityOptions::SetMacroSecurityLevel( sal_Int32 _nLevel )
    1061             : {
    1062           0 :     MutexGuard aGuard( GetInitMutex() );
    1063           0 :     m_pDataContainer->SetMacroSecurityLevel( _nLevel );
    1064           0 : }
    1065             : 
    1066        3795 : bool SvtSecurityOptions::IsMacroDisabled() const
    1067             : {
    1068        3795 :     MutexGuard aGuard( GetInitMutex() );
    1069        3795 :     return m_pDataContainer->IsMacroDisabled();
    1070             : }
    1071             : 
    1072           0 : Sequence< SvtSecurityOptions::Certificate > SvtSecurityOptions::GetTrustedAuthors() const
    1073             : {
    1074           0 :     MutexGuard aGuard( GetInitMutex() );
    1075           0 :     return m_pDataContainer->GetTrustedAuthors();
    1076             : }
    1077             : 
    1078           0 : void SvtSecurityOptions::SetTrustedAuthors( const Sequence< Certificate >& rAuthors )
    1079             : {
    1080           0 :     MutexGuard aGuard( GetInitMutex() );
    1081           0 :     m_pDataContainer->SetTrustedAuthors( rAuthors );
    1082           0 : }
    1083             : 
    1084        1295 : bool SvtSecurityOptions::IsOptionSet( EOption eOption ) const
    1085             : {
    1086        1295 :     MutexGuard aGuard( GetInitMutex() );
    1087        1295 :     return m_pDataContainer->IsOptionSet( eOption );
    1088             : }
    1089             : 
    1090           0 : bool SvtSecurityOptions::SetOption( EOption eOption, bool bValue )
    1091             : {
    1092           0 :     MutexGuard aGuard( GetInitMutex() );
    1093           0 :     return m_pDataContainer->SetOption( eOption, bValue );
    1094             : }
    1095             : 
    1096           0 : bool SvtSecurityOptions::IsOptionEnabled( EOption eOption ) const
    1097             : {
    1098           0 :     MutexGuard aGuard( GetInitMutex() );
    1099           0 :     return m_pDataContainer->IsOptionEnabled( eOption );
    1100             : }
    1101             : 
    1102             : namespace
    1103             : {
    1104             :     class theSecurityOptionsMutex : public rtl::Static<osl::Mutex, theSecurityOptionsMutex>{};
    1105             : }
    1106             : 
    1107       27628 : Mutex& SvtSecurityOptions::GetInitMutex()
    1108             : {
    1109       27628 :     return theSecurityOptionsMutex::get();
    1110             : }
    1111             : 
    1112             : // xmlsec05 deprecated
    1113             : 
    1114           0 : EBasicSecurityMode SvtSecurityOptions_Impl::GetBasicMode() const
    1115             : {
    1116           0 :     return m_eBasicMode;
    1117             : }
    1118             : 
    1119           0 : void SvtSecurityOptions_Impl::SetBasicMode( EBasicSecurityMode eMode )
    1120             : {
    1121             :     DBG_ASSERT(!m_bROBasicMode, "SvtSecurityOptions_Impl::SetBasicMode()\nYou tried to write on a readonly value!\n");
    1122           0 :     if (!m_bROBasicMode && m_eBasicMode!=eMode)
    1123             :     {
    1124           0 :         m_eBasicMode = eMode;
    1125           0 :         SetModified();
    1126             :     }
    1127           0 : }
    1128             : 
    1129           0 : bool SvtSecurityOptions_Impl::IsExecutePlugins() const
    1130             : {
    1131           0 :     return m_bExecutePlugins;
    1132             : }
    1133             : 
    1134           0 : void SvtSecurityOptions_Impl::SetExecutePlugins( bool bSet )
    1135             : {
    1136             :     DBG_ASSERT(!m_bROExecutePlugins, "SvtSecurityOptions_Impl::SetExecutePlugins()\nYou tried to write on a readonly value!\n");
    1137           0 :     if (!m_bROExecutePlugins && m_bExecutePlugins!=bSet)
    1138             :     {
    1139           0 :         m_bExecutePlugins = bSet;
    1140           0 :         SetModified();
    1141             :     }
    1142           0 : }
    1143             : 
    1144           0 : bool SvtSecurityOptions_Impl::IsWarningEnabled() const
    1145             : {
    1146           0 :     return m_bWarning;
    1147             : }
    1148             : 
    1149           0 : void SvtSecurityOptions_Impl::SetWarningEnabled( bool bSet )
    1150             : {
    1151             :     DBG_ASSERT(!m_bROWarning, "SvtSecurityOptions_Impl::SetWarningEnabled()\nYou tried to write on a readonly value!\n");
    1152           0 :     if (!m_bROWarning && m_bWarning!=bSet)
    1153             :     {
    1154           0 :         m_bWarning = bSet;
    1155           0 :         SetModified();
    1156             :     }
    1157           0 : }
    1158             : 
    1159           0 : bool SvtSecurityOptions_Impl::IsConfirmationEnabled() const
    1160             : {
    1161           0 :     return m_bConfirmation;
    1162             : }
    1163             : 
    1164           0 : void SvtSecurityOptions_Impl::SetConfirmationEnabled( bool bSet )
    1165             : {
    1166             :     DBG_ASSERT(!m_bROConfirmation, "SvtSecurityOptions_Impl::SetConfirmationEnabled()\nYou tried to write on a readonly value!\n");
    1167           0 :     if (!m_bROConfirmation && m_bConfirmation!=bSet)
    1168             :     {
    1169           0 :         m_bConfirmation = bSet;
    1170           0 :         SetModified();
    1171             :     }
    1172           0 : }
    1173             : 
    1174           0 : bool SvtSecurityOptions::IsExecutePlugins() const
    1175             : {
    1176           0 :     MutexGuard aGuard( GetInitMutex() );
    1177           0 :     return m_pDataContainer->IsExecutePlugins();
    1178             : }
    1179             : 
    1180           0 : void SvtSecurityOptions::SetExecutePlugins( bool bSet )
    1181             : {
    1182           0 :     MutexGuard aGuard( GetInitMutex() );
    1183           0 :     m_pDataContainer->SetExecutePlugins( bSet );
    1184           0 : }
    1185             : 
    1186           0 : bool SvtSecurityOptions::IsWarningEnabled() const
    1187             : {
    1188           0 :     MutexGuard aGuard( GetInitMutex() );
    1189           0 :     return m_pDataContainer->IsWarningEnabled();
    1190             : }
    1191             : 
    1192           0 : void SvtSecurityOptions::SetWarningEnabled( bool bSet )
    1193             : {
    1194           0 :     MutexGuard aGuard( GetInitMutex() );
    1195           0 :     m_pDataContainer->SetWarningEnabled( bSet );
    1196           0 : }
    1197             : 
    1198           0 : bool SvtSecurityOptions::IsConfirmationEnabled() const
    1199             : {
    1200           0 :     MutexGuard aGuard( GetInitMutex() );
    1201           0 :     return m_pDataContainer->IsConfirmationEnabled();
    1202             : }
    1203             : 
    1204           0 : void SvtSecurityOptions::SetConfirmationEnabled( bool bSet )
    1205             : {
    1206           0 :     MutexGuard aGuard( GetInitMutex() );
    1207           0 :     m_pDataContainer->SetConfirmationEnabled( bSet );
    1208           0 : }
    1209             : 
    1210           0 : void SvtSecurityOptions::SetBasicMode( EBasicSecurityMode eMode )
    1211             : {
    1212           0 :     MutexGuard aGuard( GetInitMutex() );
    1213           0 :     m_pDataContainer->SetBasicMode( eMode );
    1214           0 : }
    1215             : 
    1216           0 : EBasicSecurityMode SvtSecurityOptions::GetBasicMode() const
    1217             : {
    1218           0 :     MutexGuard aGuard( GetInitMutex() );
    1219           0 :     return m_pDataContainer->GetBasicMode();
    1220             : }
    1221             : 
    1222             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10