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