/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_unotools.hxx"
#ifndef GCC
#endif

//_________________________________________________________________________________________________________________
//	includes
//_________________________________________________________________________________________________________________

#include <unotools/securityoptions.hxx>
#include <unotools/configmgr.hxx>
#include <unotools/configitem.hxx>
#include <tools/debug.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>

#include <com/sun/star/beans/PropertyValue.hpp>
#include <tools/urlobj.hxx>
#include <tools/wldcrd.hxx>

#include <unotools/pathoptions.hxx>

#include <rtl/logfile.hxx>
#include "itemholder1.hxx"

//_________________________________________________________________________________________________________________
//	namespaces
//_________________________________________________________________________________________________________________

using namespace ::utl					;
using namespace ::rtl					;
using namespace ::osl					;
using namespace ::com::sun::star::uno	;

//_________________________________________________________________________________________________________________
//	const
//_________________________________________________________________________________________________________________

#define	ROOTNODE_SECURITY				OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/Security/Scripting"))
#define	DEFAULT_SECUREURL				Sequence< OUString >()
#define	DEFAULT_SECLEVEL				3
#define DEFAULT_TRUSTEDAUTHORS			Sequence< SvtSecurityOptions::Certificate >()

// xmlsec05 depricated
#define	DEFAULT_STAROFFICEBASIC			eALWAYS_EXECUTE

#define	CSTR_SECUREURL					"SecureURL"
#define CSTR_DOCWARN_SAVEORSEND			"WarnSaveOrSendDoc"
#define CSTR_DOCWARN_SIGNING			"WarnSignDoc"
#define CSTR_DOCWARN_PRINT				"WarnPrintDoc"
#define CSTR_DOCWARN_CREATEPDF			"WarnCreatePDF"
#define CSTR_DOCWARN_REMOVEPERSONALINFO	"RemovePersonalInfoOnSaving"
#define CSTR_DOCWARN_RECOMMENDPASSWORD	"RecommendPasswordProtection"
#define CSTR_CTRLCLICK_HYPERLINK        "HyperlinksWithCtrlClick"
#define CSTR_MACRO_SECLEVEL				"MacroSecurityLevel"
#define CSTR_MACRO_TRUSTEDAUTHORS		"TrustedAuthors"
#define CSTR_MACRO_DISABLE				"DisableMacrosExecution"
#define CSTR_TRUSTEDAUTHOR_SUBJECTNAME	"SubjectName"
#define CSTR_TRUSTEDAUTHOR_SERIALNUMBER	"SerialNumber"
#define CSTR_TRUSTEDAUTHOR_RAWDATA		"RawData"

#define	PROPERTYNAME_SECUREURL					OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_SECUREURL						))
#define PROPERTYNAME_DOCWARN_SAVEORSEND			OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_DOCWARN_SAVEORSEND			))
#define PROPERTYNAME_DOCWARN_SIGNING			OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_DOCWARN_SIGNING				))
#define PROPERTYNAME_DOCWARN_PRINT				OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_DOCWARN_PRINT					))
#define PROPERTYNAME_DOCWARN_CREATEPDF			OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_DOCWARN_CREATEPDF				))
#define PROPERTYNAME_DOCWARN_REMOVEPERSONALINFO	OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_DOCWARN_REMOVEPERSONALINFO	))
#define PROPERTYNAME_DOCWARN_RECOMMENDPASSWORD  OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_DOCWARN_RECOMMENDPASSWORD     ))
#define PROPERTYNAME_CTRLCLICK_HYPERLINK        OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_CTRLCLICK_HYPERLINK           ))
#define PROPERTYNAME_MACRO_SECLEVEL				OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_MACRO_SECLEVEL				))
#define PROPERTYNAME_MACRO_TRUSTEDAUTHORS		OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_MACRO_TRUSTEDAUTHORS			))
#define PROPERTYNAME_MACRO_DISABLE				OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_MACRO_DISABLE					))
#define PROPERTYNAME_TRUSTEDAUTHOR_SUBJECTNAME	OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_TRUSTEDAUTHOR_SUBJECTNAME))
#define PROPERTYNAME_TRUSTEDAUTHOR_SERIALNUMBER	OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_TRUSTEDAUTHOR_SERIALNUMBER))
#define PROPERTYNAME_TRUSTEDAUTHOR_RAWDATA		OUString(RTL_CONSTASCII_USTRINGPARAM(CSTR_TRUSTEDAUTHOR_RAWDATA))

// xmlsec05 depricated
#define	PROPERTYNAME_STAROFFICEBASIC	OUString(RTL_CONSTASCII_USTRINGPARAM("OfficeBasic"	))
#define PROPERTYNAME_EXECUTEPLUGINS     OUString(RTL_CONSTASCII_USTRINGPARAM("ExecutePlugins"  ))
#define PROPERTYNAME_WARNINGENABLED     OUString(RTL_CONSTASCII_USTRINGPARAM("Warning"  ))
#define PROPERTYNAME_CONFIRMATIONENABLED OUString(RTL_CONSTASCII_USTRINGPARAM("Confirmation"  ))
// xmlsec05 depricated


#define	PROPERTYHANDLE_SECUREURL					0

// xmlsec05 depricated
#define	PROPERTYHANDLE_STAROFFICEBASIC	1
#define PROPERTYHANDLE_EXECUTEPLUGINS   2
#define PROPERTYHANDLE_WARNINGENABLED   3
#define PROPERTYHANDLE_CONFIRMATIONENABLED 4
// xmlsec05 depricated

#define PROPERTYHANDLE_DOCWARN_SAVEORSEND			5
#define PROPERTYHANDLE_DOCWARN_SIGNING				6
#define PROPERTYHANDLE_DOCWARN_PRINT				7
#define PROPERTYHANDLE_DOCWARN_CREATEPDF			8
#define PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO	9
#define PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD    10
#define PROPERTYHANDLE_CTRLCLICK_HYPERLINK          11
#define PROPERTYHANDLE_MACRO_SECLEVEL               12
#define PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS         13
#define PROPERTYHANDLE_MACRO_DISABLE                14

#define PROPERTYCOUNT                               15
#define PROPERTYHANDLE_INVALID						-1

#define CFG_READONLY_DEFAULT						sal_False

//_________________________________________________________________________________________________________________
//	private declarations!
//_________________________________________________________________________________________________________________

class SvtSecurityOptions_Impl : public ConfigItem
{
	//-------------------------------------------------------------------------------------------------------------
	//	public methods
	//-------------------------------------------------------------------------------------------------------------

	public:

		//---------------------------------------------------------------------------------------------------------
		//	constructor / destructor
		//---------------------------------------------------------------------------------------------------------

		 SvtSecurityOptions_Impl();
		~SvtSecurityOptions_Impl();

		//---------------------------------------------------------------------------------------------------------
		//	overloaded methods of baseclass
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		called for notify of configmanager
			@descr		These method is called from the ConfigManager before application ends or from the
			 			PropertyChangeListener if the sub tree broadcasts changes. You must update your
						internal values.

			@seealso	baseclass ConfigItem

			@param		"seqPropertyNames" is the list of properties which should be updated.
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void Notify( const Sequence< OUString >& seqPropertyNames );

		/*-****************************************************************************************************//**
			@short		write changes to configuration
			@descr		These method writes the changed values into the sub tree
						and should always called in our destructor to guarantee consistency of config data.

			@seealso	baseclass ConfigItem

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

    	virtual void Commit();

		//---------------------------------------------------------------------------------------------------------
		//	public interface
		//---------------------------------------------------------------------------------------------------------

		sal_Bool				IsReadOnly		( SvtSecurityOptions::EOption eOption					) const	;

		Sequence< OUString >	GetSecureURLs	(														) const	;
		void					SetSecureURLs	(	const	Sequence< OUString >&	seqURLList			)		;
		sal_Bool				IsSecureURL		(	const	OUString&				sURL,
													const	OUString&				sReferer			) const	;
		inline sal_Int32		GetMacroSecurityLevel	(												) const	;
		void					SetMacroSecurityLevel	( sal_Int32 _nLevel								)		;

		inline sal_Bool			IsMacroDisabled			(												) const	;

		Sequence< SvtSecurityOptions::Certificate >	GetTrustedAuthors		(																						) const	;
		void										SetTrustedAuthors		( const Sequence< SvtSecurityOptions::Certificate >& rAuthors							)		;
		sal_Bool									IsTrustedAuthorsEnabled	(																						)		;

		sal_Bool				IsOptionSet		( SvtSecurityOptions::EOption eOption					) const	;
		sal_Bool				SetOption		( SvtSecurityOptions::EOption eOption, sal_Bool bValue	)		;
		sal_Bool				IsOptionEnabled	( SvtSecurityOptions::EOption eOption					) const	;
private:

		/*-****************************************************************************************************//**
			@short		return list of key names of ouer configuration management which represent our module tree
			@descr		These methods return a static const list of key names. We need it to get needed values from our
						configuration management.

			@seealso	-

			@param		-
			@return		A list of needed configuration keys is returned.

			@onerror	-
		*//*-*****************************************************************************************************/

		void					SetProperty( sal_Int32 nHandle, const Any& rValue, sal_Bool bReadOnly );
		void					LoadAuthors( void );
		static sal_Int32		GetHandle( const OUString& rPropertyName );
		bool					GetOption( SvtSecurityOptions::EOption eOption, sal_Bool*& rpValue, sal_Bool*& rpRO );

		static Sequence< OUString > GetPropertyNames();

        Sequence< OUString >					    m_seqSecureURLs;
		sal_Bool									m_bSaveOrSend;
		sal_Bool									m_bSigning;
		sal_Bool									m_bPrint;
		sal_Bool									m_bCreatePDF;
		sal_Bool									m_bRemoveInfo;
        sal_Bool                                    m_bRecommendPwd;
        sal_Bool                                    m_bCtrlClickHyperlink;
		sal_Int32									m_nSecLevel;
		Sequence< SvtSecurityOptions::Certificate >	m_seqTrustedAuthors;
		sal_Bool									m_bDisableMacros;

        sal_Bool                					m_bROSecureURLs;
		sal_Bool									m_bROSaveOrSend;
		sal_Bool									m_bROSigning;
		sal_Bool									m_bROPrint;
		sal_Bool									m_bROCreatePDF;
		sal_Bool									m_bRORemoveInfo;
        sal_Bool                                    m_bRORecommendPwd;
        sal_Bool                                    m_bROCtrlClickHyperlink;
		sal_Bool									m_bROSecLevel;
		sal_Bool									m_bROTrustedAuthors;
		sal_Bool									m_bRODisableMacros;


		// xmlsec05 depricated
        EBasicSecurityMode      m_eBasicMode;
        sal_Bool                m_bExecutePlugins;
        sal_Bool                m_bWarning;
        sal_Bool                m_bConfirmation;

        sal_Bool                m_bROConfirmation;
        sal_Bool                m_bROWarning;
        sal_Bool                m_bROExecutePlugins;
        sal_Bool                m_bROBasicMode;
		public:
        sal_Bool IsWarningEnabled() const;
        void SetWarningEnabled( sal_Bool bSet );
        sal_Bool IsConfirmationEnabled() const;
        void SetConfirmationEnabled( sal_Bool bSet );
        sal_Bool    IsExecutePlugins() const;
        void        SetExecutePlugins( sal_Bool bSet );
		EBasicSecurityMode		GetBasicMode	(												) const	;
		void					SetBasicMode	(			EBasicSecurityMode		eMode		)		;
};

//_________________________________________________________________________________________________________________
//	definitions
//_________________________________________________________________________________________________________________

//*****************************************************************************************************************
//	constructor
//*****************************************************************************************************************
SvtSecurityOptions_Impl::SvtSecurityOptions_Impl()
	:ConfigItem				( ROOTNODE_SECURITY			)
	,m_seqSecureURLs		( DEFAULT_SECUREURL			)
	,m_bSaveOrSend			( sal_True					)
	,m_bSigning				( sal_True					)
	,m_bPrint				( sal_True					)
	,m_bCreatePDF			( sal_True					)
	,m_bRemoveInfo			( sal_True					)
	,m_nSecLevel			( sal_True					)
	,m_seqTrustedAuthors	( DEFAULT_TRUSTEDAUTHORS	)
	,m_bDisableMacros		( sal_False					)
	,m_bROSecureURLs		( CFG_READONLY_DEFAULT		)
	,m_bROSaveOrSend		( CFG_READONLY_DEFAULT		)
	,m_bROSigning			( CFG_READONLY_DEFAULT		)
	,m_bROPrint				( CFG_READONLY_DEFAULT		)
	,m_bROCreatePDF			( CFG_READONLY_DEFAULT		)
	,m_bRORemoveInfo		( CFG_READONLY_DEFAULT		)
	,m_bROSecLevel			( CFG_READONLY_DEFAULT		)
	,m_bROTrustedAuthors	( CFG_READONLY_DEFAULT		)
	,m_bRODisableMacros		( sal_True					) // currently is not intended to be changed

	// xmlsec05 depricated
    ,   m_eBasicMode        ( DEFAULT_STAROFFICEBASIC )
    ,   m_bExecutePlugins   ( sal_True                )
    ,   m_bWarning          ( sal_True                )
    ,   m_bConfirmation     ( sal_True                )
    ,   m_bROConfirmation   ( CFG_READONLY_DEFAULT    )
    ,   m_bROWarning        ( CFG_READONLY_DEFAULT    )
    ,   m_bROExecutePlugins ( CFG_READONLY_DEFAULT    )
    ,   m_bROBasicMode      ( CFG_READONLY_DEFAULT    )
	// xmlsec05 depricated

{
	Sequence< OUString >	seqNames	= GetPropertyNames	(			);
	Sequence< Any >			seqValues	= GetProperties		( seqNames	);
	Sequence< sal_Bool >	seqRO		= GetReadOnlyStates	( seqNames	);

	// Safe impossible cases.
	// We need values from ALL configuration keys.
	// Follow assignment use order of values in relation to our list of key names!
	DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtSecurityOptions_Impl::SvtSecurityOptions_Impl()\nI miss some values of configuration keys!\n" );

	// Copy values from list in right order to our internal member.
	sal_Int32				nPropertyCount = seqValues.getLength();
	for( sal_Int32 nProperty = 0 ; nProperty < nPropertyCount ; ++nProperty )
		SetProperty( nProperty, seqValues[ nProperty ], seqRO[ nProperty ] );

	LoadAuthors();

	// Enable notification mechanism of our baseclass.
	// We need it to get information about changes outside these class on our used configuration keys!*/

	EnableNotification( seqNames );
}

//*****************************************************************************************************************
//	destructor
//*****************************************************************************************************************
SvtSecurityOptions_Impl::~SvtSecurityOptions_Impl()
{
	if( IsModified() )
		Commit();
}

void SvtSecurityOptions_Impl::SetProperty( sal_Int32 nProperty, const Any& rValue, sal_Bool bRO )
{
	switch( nProperty )
	{
		case PROPERTYHANDLE_SECUREURL:
		{
			m_seqSecureURLs.realloc( 0 );
			rValue >>= m_seqSecureURLs;
			SvtPathOptions	aOpt;
        	sal_uInt32		nCount = m_seqSecureURLs.getLength();
        	for( sal_uInt32 nItem = 0 ; nItem < nCount ; ++nItem )
				m_seqSecureURLs[ nItem ] = aOpt.SubstituteVariable( m_seqSecureURLs[ nItem ] );
			m_bROSecureURLs = bRO;
		}
		break;

		case PROPERTYHANDLE_DOCWARN_SAVEORSEND:
		{
			rValue >>= m_bSaveOrSend;
			m_bROSaveOrSend = bRO;
		}
		break;

		case PROPERTYHANDLE_DOCWARN_SIGNING:
		{
			rValue >>= m_bSigning;
			m_bROSigning = bRO;
		}
		break;

		case PROPERTYHANDLE_DOCWARN_PRINT:
		{
			rValue >>= m_bPrint;
			m_bROPrint = bRO;
		}
		break;

		case PROPERTYHANDLE_DOCWARN_CREATEPDF:
		{
			rValue >>= m_bCreatePDF;
			m_bROCreatePDF = bRO;
		}
		break;

		case PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO:
		{
			rValue >>= m_bRemoveInfo;
			m_bRORemoveInfo = bRO;
		}
		break;

        case PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD:
        {
            rValue >>= m_bRecommendPwd;
            m_bRORecommendPwd = bRO;
        }
		break;

        case PROPERTYHANDLE_CTRLCLICK_HYPERLINK:
        {
            rValue >>= m_bCtrlClickHyperlink;
            m_bROCtrlClickHyperlink = bRO;
        }
		break;

		case PROPERTYHANDLE_MACRO_SECLEVEL:
		{
			rValue >>= m_nSecLevel;
			m_bROSecLevel = bRO;
		}
		break;

		case PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS:
        {
			// don't care about value here...
            m_bROTrustedAuthors = bRO;
        }
		break;

		case PROPERTYHANDLE_MACRO_DISABLE:
		{
			rValue >>= m_bDisableMacros;
			m_bRODisableMacros = bRO;
		}
		break;


		// xmlsec05 depricated
        case PROPERTYHANDLE_STAROFFICEBASIC:
		{
			sal_Int32 nMode = 0;
			rValue >>= nMode;
			m_eBasicMode = (EBasicSecurityMode)nMode;
            m_bROBasicMode = bRO;
		}
		break;
        case PROPERTYHANDLE_EXECUTEPLUGINS:
		{
			rValue >>= m_bExecutePlugins;
			m_bROExecutePlugins = bRO;
		}
		break;
        case PROPERTYHANDLE_WARNINGENABLED:
		{
			rValue >>= m_bWarning;
			m_bROWarning = bRO;
		}
		break;
        case PROPERTYHANDLE_CONFIRMATIONENABLED:
		{
			rValue >>= m_bConfirmation;
			m_bROConfirmation = bRO;
		}
		break;
		// xmlsec05 depricated


		#if OSL_DEBUG_LEVEL > 1
		default:
			DBG_ASSERT( false, "SvtSecurityOptions_Impl::SetProperty()\nUnkown property!\n" );
		#endif
	}
}

void SvtSecurityOptions_Impl::LoadAuthors( void )
{
	m_seqTrustedAuthors.realloc( 0 );		// first clear
	Sequence< OUString >	lAuthors = GetNodeNames( PROPERTYNAME_MACRO_TRUSTEDAUTHORS );
	sal_Int32				c1 = lAuthors.getLength();
	if( c1 )
	{
		sal_Int32				c2 = c1 * 3;				// 3 Properties inside Struct TrustedAuthor
		Sequence< OUString >	lAllAuthors( c2 );

		sal_Int32				i1;
		sal_Int32				i2;
		OUString				aSep( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
		for( i1 = 0, i2 = 0 ; i1 < c1 ; ++i1 )
		{
			lAllAuthors[ i2 ] = PROPERTYNAME_MACRO_TRUSTEDAUTHORS + aSep + lAuthors[ i1 ] + aSep + PROPERTYNAME_TRUSTEDAUTHOR_SUBJECTNAME;
			++i2;
			lAllAuthors[ i2 ] = PROPERTYNAME_MACRO_TRUSTEDAUTHORS + aSep + lAuthors[ i1 ] + aSep + PROPERTYNAME_TRUSTEDAUTHOR_SERIALNUMBER;
			++i2;
			lAllAuthors[ i2 ] = PROPERTYNAME_MACRO_TRUSTEDAUTHORS + aSep + lAuthors[ i1 ] + aSep + PROPERTYNAME_TRUSTEDAUTHOR_RAWDATA;
			++i2;
		}

		Sequence< Any >			lValues = GetProperties( lAllAuthors );
		if( lValues.getLength() == c2 )
		{
			m_seqTrustedAuthors.realloc( c1 );
			SvtSecurityOptions::Certificate aCert( 3 );
			for( i1 = 0, i2 = 0 ; i1 < c1 ; ++i1 )
			{
				lValues[ i2 ] >>= aCert[ 0 ];
				++i2;
				lValues[ i2 ] >>= aCert[ 1 ];
				++i2;
				lValues[ i2 ] >>= aCert[ 2 ];
				++i2;
				m_seqTrustedAuthors[ i1 ] = aCert;
			}
		}
	}
}

sal_Int32 SvtSecurityOptions_Impl::GetHandle( const OUString& rName )
{
	sal_Int32	nHandle;

	if( rName.compareToAscii( CSTR_SECUREURL ) == 0 )
		nHandle = PROPERTYHANDLE_SECUREURL;
	else if( rName.compareToAscii( CSTR_DOCWARN_SAVEORSEND ) == 0 )
		nHandle = PROPERTYHANDLE_DOCWARN_SAVEORSEND;
	else if( rName.compareToAscii( CSTR_DOCWARN_SIGNING ) == 0 )
		nHandle = PROPERTYHANDLE_DOCWARN_SIGNING;
	else if( rName.compareToAscii( CSTR_DOCWARN_PRINT ) == 0 )
		nHandle = PROPERTYHANDLE_DOCWARN_PRINT;
	else if( rName.compareToAscii( CSTR_DOCWARN_CREATEPDF ) == 0 )
		nHandle = PROPERTYHANDLE_DOCWARN_CREATEPDF;
	else if( rName.compareToAscii( CSTR_DOCWARN_REMOVEPERSONALINFO ) == 0 )
		nHandle = PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO;
    else if( rName.compareToAscii( CSTR_DOCWARN_RECOMMENDPASSWORD ) == 0 )
        nHandle = PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD;
    else if( rName.compareToAscii( CSTR_CTRLCLICK_HYPERLINK ) == 0 )
        nHandle = PROPERTYHANDLE_CTRLCLICK_HYPERLINK;
	else if( rName.compareToAscii( CSTR_MACRO_SECLEVEL ) == 0 )
		nHandle = PROPERTYHANDLE_MACRO_SECLEVEL;
	else if( rName.compareToAscii( CSTR_MACRO_TRUSTEDAUTHORS ) == 0 )
		nHandle = PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS;
	else if( rName.compareToAscii( CSTR_MACRO_DISABLE ) == 0 )
		nHandle = PROPERTYHANDLE_MACRO_DISABLE;

	// xmlsec05 depricated
	else if( rName == PROPERTYNAME_STAROFFICEBASIC )
		nHandle = PROPERTYHANDLE_STAROFFICEBASIC;
	else if( rName == PROPERTYNAME_EXECUTEPLUGINS )
		nHandle = PROPERTYHANDLE_EXECUTEPLUGINS;
	else if( rName == PROPERTYNAME_WARNINGENABLED )
		nHandle = PROPERTYHANDLE_WARNINGENABLED;
	else if( rName == PROPERTYNAME_CONFIRMATIONENABLED )
		nHandle = PROPERTYHANDLE_CONFIRMATIONENABLED;
	// xmlsec05 depricated

	else
		nHandle = PROPERTYHANDLE_INVALID;

	return nHandle;
}

bool SvtSecurityOptions_Impl::GetOption( SvtSecurityOptions::EOption eOption, sal_Bool*& rpValue, sal_Bool*& rpRO )
{
	switch( eOption )
	{
		case SvtSecurityOptions::E_DOCWARN_SAVEORSEND:
			rpValue = &m_bSaveOrSend;
			rpRO = &m_bROSaveOrSend;
			break;
		case SvtSecurityOptions::E_DOCWARN_SIGNING:
			rpValue = &m_bSigning;
			rpRO = &m_bROSigning;
			break;
		case SvtSecurityOptions::E_DOCWARN_PRINT:
			rpValue = &m_bPrint;
			rpRO = &m_bROPrint;
			break;
		case SvtSecurityOptions::E_DOCWARN_CREATEPDF:
			rpValue = &m_bCreatePDF;
			rpRO = &m_bROCreatePDF;
			break;
		case SvtSecurityOptions::E_DOCWARN_REMOVEPERSONALINFO:
			rpValue = &m_bRemoveInfo;
			rpRO = &m_bRORemoveInfo;
			break;
        case SvtSecurityOptions::E_DOCWARN_RECOMMENDPASSWORD:
            rpValue = &m_bRecommendPwd;
            rpRO = &m_bRORecommendPwd;
            break;
        case SvtSecurityOptions::E_CTRLCLICK_HYPERLINK:
            rpValue = &m_bCtrlClickHyperlink;
            rpRO = &m_bROCtrlClickHyperlink;
            break;
		default:
			rpValue = NULL;
			rpRO = NULL;
			break;
	}

	return rpValue != NULL;
}

void SvtSecurityOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
{
	// Use given list of updated properties to get his values from configuration directly!
	Sequence< Any >			seqValues = GetProperties( seqPropertyNames );
    Sequence< sal_Bool >	seqRO = GetReadOnlyStates( seqPropertyNames );
	// Safe impossible cases.
	// We need values from ALL notified configuration keys.
	DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtSecurityOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );
	// Step over list of property names and get right value from coreesponding value list to set it on internal members!
	sal_Int32				nCount = seqPropertyNames.getLength();
	for( sal_Int32 nProperty = 0 ; nProperty < nCount ; ++nProperty )
		SetProperty( GetHandle( seqPropertyNames[ nProperty ] ), seqValues[ nProperty ], seqRO[ nProperty ] );

	// read set of trusted authors separately
	LoadAuthors();
}

void SvtSecurityOptions_Impl::Commit()
{
	// Get names of supported properties, create a list for values and copy current values to it.
    Sequence< OUString >    lOrgNames = GetPropertyNames();
    sal_Int32               nOrgCount = lOrgNames.getLength();

    Sequence< OUString >    lNames(nOrgCount);
    Sequence< Any >         lValues(nOrgCount);
    sal_Int32               nRealCount = 0;
	bool					bDone;

	ClearNodeSet( PROPERTYNAME_MACRO_TRUSTEDAUTHORS );

    for( sal_Int32 nProperty = 0 ; nProperty < nOrgCount ; ++nProperty )
	{
        switch( nProperty )
        {
            case PROPERTYHANDLE_SECUREURL:
			{
				bDone = !m_bROSecureURLs;
				if( bDone )
				{
					Sequence< OUString >	lURLs( m_seqSecureURLs );
					SvtPathOptions			aOpt;
					sal_Int32				nURLsCnt = lURLs.getLength();
					for( sal_Int32 nItem = 0 ; nItem < nURLsCnt ; ++nItem )
						lURLs[ nItem ] = aOpt.UseVariable( lURLs[ nItem ] );
					lValues[ nRealCount ] <<= lURLs;
				}
			}
			break;

			case PROPERTYHANDLE_DOCWARN_SAVEORSEND:
			{
				bDone = !m_bROSaveOrSend;
				if( bDone )
					lValues[ nRealCount ] <<= m_bSaveOrSend;
			}
			break;

			case PROPERTYHANDLE_DOCWARN_SIGNING:
			{
				bDone = !m_bROSigning;
				if( bDone )
					lValues[ nRealCount ] <<= m_bSigning;
			}
			break;

			case PROPERTYHANDLE_DOCWARN_PRINT:
			{
				bDone = !m_bROPrint;
				if( bDone )
					lValues[ nRealCount ] <<= m_bPrint;
			}
			break;

			case PROPERTYHANDLE_DOCWARN_CREATEPDF:
			{
				bDone = !m_bROCreatePDF;
				if( bDone )
					lValues[ nRealCount ] <<= m_bCreatePDF;
			}
			break;

			case PROPERTYHANDLE_DOCWARN_REMOVEPERSONALINFO:
			{
				bDone = !m_bRORemoveInfo;
				if( bDone )
					lValues[ nRealCount ] <<= m_bRemoveInfo;
			}
			break;

            case PROPERTYHANDLE_DOCWARN_RECOMMENDPASSWORD:
            {
                bDone = !m_bRORecommendPwd;
                if( bDone )
                    lValues[ nRealCount ] <<= m_bRecommendPwd;
            }
            break;

            case PROPERTYHANDLE_CTRLCLICK_HYPERLINK:
            {
                bDone = !m_bROCtrlClickHyperlink;
                if( bDone )
                    lValues[ nRealCount ] <<= m_bCtrlClickHyperlink;
            }
            break;

            case PROPERTYHANDLE_MACRO_SECLEVEL:
			{
				bDone = !m_bROSecLevel;
				if( bDone )
					lValues[ nRealCount ] <<= m_nSecLevel;
			}
			break;

            case PROPERTYHANDLE_MACRO_TRUSTEDAUTHORS:
			{
				bDone = !m_bROTrustedAuthors;
				if( bDone )
				{
					sal_Int32	nCnt = m_seqTrustedAuthors.getLength();
					if( nCnt )
					{
						String	s;
						s.AppendAscii( CSTR_MACRO_TRUSTEDAUTHORS );
						s.AppendAscii( "/a" );

						Sequence< Sequence< com::sun::star::beans::PropertyValue > > lPropertyValuesSeq( nCnt );
						for( sal_Int32 i = 0 ; i < nCnt ; ++i )
						{
							String	aPrefix( s );
							aPrefix += String::CreateFromInt32( i );
							aPrefix.AppendAscii( "/" );
							Sequence< com::sun::star::beans::PropertyValue >	lPropertyValues( 3 );
							lPropertyValues[ 0 ].Name = aPrefix + PROPERTYNAME_TRUSTEDAUTHOR_SUBJECTNAME;
							lPropertyValues[ 0 ].Value <<= m_seqTrustedAuthors[ i ][0];
							lPropertyValues[ 1 ].Name = aPrefix + PROPERTYNAME_TRUSTEDAUTHOR_SERIALNUMBER;
							lPropertyValues[ 1 ].Value <<= m_seqTrustedAuthors[ i ][1];
							lPropertyValues[ 2 ].Name = aPrefix + PROPERTYNAME_TRUSTEDAUTHOR_RAWDATA;
							lPropertyValues[ 2 ].Value <<= m_seqTrustedAuthors[ i ][2];


							SetSetProperties( PROPERTYNAME_MACRO_TRUSTEDAUTHORS, lPropertyValues );
						}

						bDone = false;		// because we save in loop above!
					}
					else
						bDone = false;
				}
			}
			break;

            case PROPERTYHANDLE_MACRO_DISABLE:
			{
				bDone = !m_bRODisableMacros;
				if( bDone )
					lValues[ nRealCount ] <<= (sal_Bool)m_bDisableMacros;
			}
			break;


			// xmlsec05 depricated
            case PROPERTYHANDLE_STAROFFICEBASIC:
			{
				bDone = !m_bROBasicMode;
				if( bDone )
					lValues[ nRealCount ] <<= (sal_Int32)m_eBasicMode;
			}
			break;
            case PROPERTYHANDLE_EXECUTEPLUGINS:
			{
				bDone = !m_bROExecutePlugins;
				if( bDone )
					lValues[ nRealCount ] <<= m_bExecutePlugins;
			}
			break;
            case PROPERTYHANDLE_WARNINGENABLED:
			{
				bDone = !m_bROWarning;
				if( bDone )
					lValues[ nRealCount ] <<= m_bWarning;
			}
			break;
            case PROPERTYHANDLE_CONFIRMATIONENABLED:
			{
				bDone = !m_bROConfirmation;
				if( bDone )
					lValues[ nRealCount ] <<= m_bConfirmation;
			}
			break;
			// xmlsec05 depricated


			default:
				bDone = false;
		}

		if( bDone )
		{
			lNames[ nRealCount ] = lOrgNames[ nProperty ];
			++nRealCount;
		}
	}
	// Set properties in configuration.
    lNames.realloc(nRealCount);
    lValues.realloc(nRealCount);
    PutProperties( lNames, lValues );
}

sal_Bool SvtSecurityOptions_Impl::IsReadOnly( SvtSecurityOptions::EOption eOption ) const
{
    sal_Bool	bReadonly;
    switch(eOption)
    {
        case SvtSecurityOptions::E_SECUREURLS :
            bReadonly = m_bROSecureURLs;
            break;
		case SvtSecurityOptions::E_DOCWARN_SAVEORSEND:
			bReadonly = m_bROSaveOrSend;
			break;
		case SvtSecurityOptions::E_DOCWARN_SIGNING:
			bReadonly = m_bROSigning;
			break;
		case SvtSecurityOptions::E_DOCWARN_PRINT:
			bReadonly = m_bROPrint;
			break;
		case SvtSecurityOptions::E_DOCWARN_CREATEPDF:
			bReadonly = m_bROCreatePDF;
			break;
		case SvtSecurityOptions::E_DOCWARN_REMOVEPERSONALINFO:
			bReadonly = m_bRORemoveInfo;
			break;
        case SvtSecurityOptions::E_DOCWARN_RECOMMENDPASSWORD:
            bReadonly = m_bRORecommendPwd;
            break;
		case SvtSecurityOptions::E_MACRO_SECLEVEL:
			bReadonly = m_bROSecLevel;
			break;
		case SvtSecurityOptions::E_MACRO_TRUSTEDAUTHORS:
			bReadonly = m_bROTrustedAuthors;
			break;
		case SvtSecurityOptions::E_MACRO_DISABLE:
			bReadonly = m_bRODisableMacros;
			break;
        case SvtSecurityOptions::E_CTRLCLICK_HYPERLINK:
            bReadonly = m_bROCtrlClickHyperlink;
            break;


		// xmlsec05 depricated
		case SvtSecurityOptions::E_BASICMODE:
			bReadonly = m_bROBasicMode;
			break;
		case SvtSecurityOptions::E_EXECUTEPLUGINS:
			bReadonly = m_bROExecutePlugins;
			break;
		case SvtSecurityOptions::E_WARNING:
			bReadonly = m_bROWarning;
			break;
		case SvtSecurityOptions::E_CONFIRMATION:
			bReadonly = m_bROConfirmation;
			break;
		// xmlsec05 depricated


		default:
			bReadonly = sal_True;
    }

    return bReadonly;
}

Sequence< OUString > SvtSecurityOptions_Impl::GetSecureURLs() const
{
	return m_seqSecureURLs;
}

void SvtSecurityOptions_Impl::SetSecureURLs( const Sequence< OUString >& seqURLList )
{
    DBG_ASSERT(!m_bROSecureURLs, "SvtSecurityOptions_Impl::SetSecureURLs()\nYou tried to write on a readonly value!\n");
    if (!m_bROSecureURLs && m_seqSecureURLs!=seqURLList)
    {
        m_seqSecureURLs = seqURLList;
        SetModified();
    }
}

sal_Bool SvtSecurityOptions_Impl::IsSecureURL(	const	OUString&	sURL	,
												const	OUString&	sReferer) const
{
	sal_Bool bState = sal_False;

    // Check for uncritical protocols first
    // All protocols different from "macro..." and "slot..." are secure per definition and must not be checked.
    // "macro://#..." means AppBasic macros that are considered safe
    INetURLObject   aURL        ( sURL );
    INetProtocol    aProtocol   = aURL.GetProtocol();

    // All other URLs must checked in combination with referer and internal information about security
    if ( (aProtocol != INET_PROT_MACRO && aProtocol !=  INET_PROT_SLOT) ||
         aURL.GetMainURL( INetURLObject::NO_DECODE ).matchIgnoreAsciiCaseAsciiL( "macro:///", 9 ) == 0)
    {
        // security check only for "macro" ( without app basic ) or "slot" protocols
        bState = sal_True;
    }
    else
	{
        //  check list of allowed URL patterns
        // Trusted referer given?
        // NO  => bState will be false per default
        // YES => search for it in our internal url list
        if( sReferer.getLength() > 0 )
        {
            // Search in internal list
            ::rtl::OUString sRef = sReferer.toAsciiLowerCase();
            sal_uInt32 nCount = m_seqSecureURLs.getLength();
            for( sal_uInt32 nItem=0; nItem<nCount; ++nItem )
            {
                OUString sCheckURL = m_seqSecureURLs[nItem].toAsciiLowerCase();
                sCheckURL += OUString(RTL_CONSTASCII_USTRINGPARAM("*"));
                if( WildCard( sCheckURL ).Matches( sRef ) == sal_True )
                {
                    bState = sal_True;
                    break;
                }
            }

            if ( !bState )
                bState = sRef.compareToAscii("private:user") == COMPARE_EQUAL;
        }
	}

	// Return result of operation.
	return bState;
}

inline sal_Int32 SvtSecurityOptions_Impl::GetMacroSecurityLevel() const
{
	return m_nSecLevel;
}

inline sal_Bool SvtSecurityOptions_Impl::IsMacroDisabled() const
{
	return m_bDisableMacros;
}

void SvtSecurityOptions_Impl::SetMacroSecurityLevel( sal_Int32 _nLevel )
{
	if( !m_bROSecLevel )
	{
		if( _nLevel > 3 || _nLevel < 0 )
			_nLevel = 3;

		if( m_nSecLevel != _nLevel )
		{
			m_nSecLevel = _nLevel;
			SetModified();
		}
	}
}

Sequence< SvtSecurityOptions::Certificate > SvtSecurityOptions_Impl::GetTrustedAuthors() const
{
	return m_seqTrustedAuthors;
}

void SvtSecurityOptions_Impl::SetTrustedAuthors( const Sequence< SvtSecurityOptions::Certificate >& rAuthors )
{
    DBG_ASSERT(!m_bROTrustedAuthors, "SvtSecurityOptions_Impl::SetTrustedAuthors()\nYou tried to write on a readonly value!\n");
	if( !m_bROTrustedAuthors && rAuthors != m_seqTrustedAuthors )
	{
		m_seqTrustedAuthors = rAuthors;
		SetModified();
	}
}

sal_Bool SvtSecurityOptions_Impl::IsTrustedAuthorsEnabled()
{
	return m_bROTrustedAuthors;
}

sal_Bool SvtSecurityOptions_Impl::IsOptionSet( SvtSecurityOptions::EOption eOption ) const
{
	sal_Bool*	pValue;
	sal_Bool*	pRO;
	sal_Bool	bRet = sal_False;

	if( ( const_cast< SvtSecurityOptions_Impl* >( this ) )->GetOption( eOption, pValue, pRO ) )
		bRet = *pValue;

	return bRet;
}

sal_Bool SvtSecurityOptions_Impl::SetOption( SvtSecurityOptions::EOption eOption, sal_Bool bValue )
{
	sal_Bool*	pValue;
	sal_Bool*	pRO;
	sal_Bool	bRet = sal_False;

	if( GetOption( eOption, pValue, pRO ) )
	{
		if( !*pRO )
		{
			bRet = sal_True;
			if( *pValue != bValue )
			{
				*pValue = bValue;
				SetModified();
			}
		}
	}

	return bRet;
}

sal_Bool SvtSecurityOptions_Impl::IsOptionEnabled( SvtSecurityOptions::EOption eOption ) const
{
	sal_Bool*	pValue;
	sal_Bool*	pRO;
	sal_Bool	bRet = sal_False;

	if( ( const_cast< SvtSecurityOptions_Impl* >( this ) )->GetOption( eOption, pValue, pRO ) )
		bRet = !*pRO;

	return bRet;
}

Sequence< OUString > SvtSecurityOptions_Impl::GetPropertyNames()
{
	// Build static list of configuration key names.
	static const OUString pProperties[] =
	{
		PROPERTYNAME_SECUREURL,
		PROPERTYNAME_STAROFFICEBASIC,
		PROPERTYNAME_EXECUTEPLUGINS,
		PROPERTYNAME_WARNINGENABLED,
		PROPERTYNAME_CONFIRMATIONENABLED,
		PROPERTYNAME_DOCWARN_SAVEORSEND,
		PROPERTYNAME_DOCWARN_SIGNING,
		PROPERTYNAME_DOCWARN_PRINT,
		PROPERTYNAME_DOCWARN_CREATEPDF,
		PROPERTYNAME_DOCWARN_REMOVEPERSONALINFO,
        PROPERTYNAME_DOCWARN_RECOMMENDPASSWORD,
        PROPERTYNAME_CTRLCLICK_HYPERLINK,
		PROPERTYNAME_MACRO_SECLEVEL,
		PROPERTYNAME_MACRO_TRUSTEDAUTHORS,
		PROPERTYNAME_MACRO_DISABLE
	};
	// Initialize return sequence with these list ...
	static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
	// ... and return it.
	return seqPropertyNames;
}

//*****************************************************************************************************************
//	initialize static member
//	DON'T DO IT IN YOUR HEADER!
//	see definition for further informations
//*****************************************************************************************************************
SvtSecurityOptions_Impl*	SvtSecurityOptions::m_pDataContainer	= NULL	;
sal_Int32					SvtSecurityOptions::m_nRefCount			= 0		;

SvtSecurityOptions::SvtSecurityOptions()
{
    // Global access, must be guarded (multithreading!).
    MutexGuard aGuard( GetInitMutex() );
	// Increase ouer refcount ...
	++m_nRefCount;
	// ... and initialize ouer data container only if it not already exist!
    if( m_pDataContainer == NULL )
	{
        RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtSecurityOptions_Impl::ctor()");
        m_pDataContainer = new SvtSecurityOptions_Impl;

        ItemHolder1::holdConfigItem(E_SECURITYOPTIONS);
	}
}

SvtSecurityOptions::~SvtSecurityOptions()
{
    // Global access, must be guarded (multithreading!)
    MutexGuard aGuard( GetInitMutex() );
	// Decrease ouer refcount.
	--m_nRefCount;
	// If last instance was deleted ...
	// we must destroy ouer static data container!
    if( m_nRefCount <= 0 )
	{
		delete m_pDataContainer;
		m_pDataContainer = NULL;
	}
}

sal_Bool SvtSecurityOptions::IsReadOnly( EOption eOption ) const
{
    MutexGuard aGuard( GetInitMutex() );
    return m_pDataContainer->IsReadOnly(eOption);
}

Sequence< OUString > SvtSecurityOptions::GetSecureURLs() const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->GetSecureURLs();
}

void SvtSecurityOptions::SetSecureURLs( const Sequence< OUString >& seqURLList )
{
    MutexGuard aGuard( GetInitMutex() );
	m_pDataContainer->SetSecureURLs( seqURLList );
}

sal_Bool SvtSecurityOptions::IsSecureURL(	const	OUString&	sURL		,
											const	OUString&	sReferer	) const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->IsSecureURL( sURL, sReferer );
}

sal_Int32 SvtSecurityOptions::GetMacroSecurityLevel() const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->GetMacroSecurityLevel();
}

void SvtSecurityOptions::SetMacroSecurityLevel( sal_Int32 _nLevel )
{
    MutexGuard aGuard( GetInitMutex() );
	m_pDataContainer->SetMacroSecurityLevel( _nLevel );
}

sal_Bool SvtSecurityOptions::IsMacroDisabled() const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->IsMacroDisabled();
}

Sequence< SvtSecurityOptions::Certificate > SvtSecurityOptions::GetTrustedAuthors() const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->GetTrustedAuthors();
}

void SvtSecurityOptions::SetTrustedAuthors( const Sequence< Certificate >& rAuthors	)
{
    MutexGuard aGuard( GetInitMutex() );
	m_pDataContainer->SetTrustedAuthors( rAuthors );
}

sal_Bool SvtSecurityOptions::IsTrustedAuthorsEnabled()
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->IsTrustedAuthorsEnabled();
}

bool SvtSecurityOptions::IsOptionSet( EOption eOption ) const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->IsOptionSet( eOption );
}

bool SvtSecurityOptions::SetOption( EOption eOption, bool bValue )
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->SetOption( eOption, bValue );
}

bool SvtSecurityOptions::IsOptionEnabled( EOption eOption ) const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->IsOptionEnabled( eOption );
}

Mutex& SvtSecurityOptions::GetInitMutex()
{
	// Initialize static mutex only for one time!
    static Mutex* pMutex = NULL;
	// If these method first called (Mutex not already exist!) ...
    if( pMutex == NULL )
    {
		// ... we must create a new one. Protect follow code with the global mutex -
		// It must be - we create a static variable!
        MutexGuard aGuard( Mutex::getGlobalMutex() );
		// We must check our pointer again - because it can be that another instance of ouer class will be faster then these!
        if( pMutex == NULL )
        {
			// Create the new mutex and set it for return on static variable.
            static Mutex aMutex;
            pMutex = &aMutex;
        }
    }
	// Return new created or already existing mutex object.
    return *pMutex;
}




// xmlsec05 depricated

EBasicSecurityMode SvtSecurityOptions_Impl::GetBasicMode() const
{
	return m_eBasicMode;
}

void SvtSecurityOptions_Impl::SetBasicMode( EBasicSecurityMode eMode )
{
    DBG_ASSERT(!m_bROBasicMode, "SvtSecurityOptions_Impl::SetBasicMode()\nYou tried to write on a readonly value!\n");
    if (!m_bROBasicMode && m_eBasicMode!=eMode)
    {
        m_eBasicMode = eMode;
        SetModified();
    }
}

sal_Bool SvtSecurityOptions_Impl::IsExecutePlugins() const
{
    return m_bExecutePlugins;
}

void SvtSecurityOptions_Impl::SetExecutePlugins( sal_Bool bSet )
{
    DBG_ASSERT(!m_bROExecutePlugins, "SvtSecurityOptions_Impl::SetExecutePlugins()\nYou tried to write on a readonly value!\n");
    if (!m_bROExecutePlugins && m_bExecutePlugins!=bSet)
    {
        m_bExecutePlugins = bSet;
        SetModified();
    }
}

sal_Bool SvtSecurityOptions_Impl::IsWarningEnabled() const
{
    return m_bWarning;
}

void SvtSecurityOptions_Impl::SetWarningEnabled( sal_Bool bSet )
{
    DBG_ASSERT(!m_bROWarning, "SvtSecurityOptions_Impl::SetWarningEnabled()\nYou tried to write on a readonly value!\n");
    if (!m_bROWarning && m_bWarning!=bSet)
    {
        m_bWarning = bSet;
        SetModified();
    }
}

sal_Bool SvtSecurityOptions_Impl::IsConfirmationEnabled() const
{
    return m_bConfirmation;
}

void SvtSecurityOptions_Impl::SetConfirmationEnabled( sal_Bool bSet )
{
    DBG_ASSERT(!m_bROConfirmation, "SvtSecurityOptions_Impl::SetConfirmationEnabled()\nYou tried to write on a readonly value!\n");
    if (!m_bROConfirmation && m_bConfirmation!=bSet)
    {
        m_bConfirmation = bSet;
        SetModified();
    }
}


sal_Bool SvtSecurityOptions::IsExecutePlugins() const
{
    MutexGuard aGuard( GetInitMutex() );
    return m_pDataContainer->IsExecutePlugins();
}

void SvtSecurityOptions::SetExecutePlugins( sal_Bool bSet )
{
    MutexGuard aGuard( GetInitMutex() );
    m_pDataContainer->SetExecutePlugins( bSet );
}

sal_Bool SvtSecurityOptions::IsWarningEnabled() const
{
    MutexGuard aGuard( GetInitMutex() );
    return m_pDataContainer->IsWarningEnabled();
}

void SvtSecurityOptions::SetWarningEnabled( sal_Bool bSet )
{
    MutexGuard aGuard( GetInitMutex() );
    m_pDataContainer->SetWarningEnabled( bSet );
}

sal_Bool SvtSecurityOptions::IsConfirmationEnabled() const
{
    MutexGuard aGuard( GetInitMutex() );
    return m_pDataContainer->IsConfirmationEnabled();
}

void SvtSecurityOptions::SetConfirmationEnabled( sal_Bool bSet )
{
    MutexGuard aGuard( GetInitMutex() );
    m_pDataContainer->SetConfirmationEnabled( bSet );
}

void SvtSecurityOptions::SetBasicMode( EBasicSecurityMode eMode )
{
    MutexGuard aGuard( GetInitMutex() );
	m_pDataContainer->SetBasicMode( eMode );
}

EBasicSecurityMode SvtSecurityOptions::GetBasicMode() const
{
    MutexGuard aGuard( GetInitMutex() );
	return m_pDataContainer->GetBasicMode();
}

