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