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 our configuration management which represents 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 our refcount ...
1065 	++m_nRefCount;
1066 	// ... and initialize our 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 our refcount.
1081 	--m_nRefCount;
1082 	// If last instance was deleted ...
1083 	// we must destroy our 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 our class will be faster than 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