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