diff options
Diffstat (limited to 'svl/source/inc/passwordcontainer.hxx')
-rw-r--r-- | svl/source/inc/passwordcontainer.hxx | 429 |
1 files changed, 429 insertions, 0 deletions
diff --git a/svl/source/inc/passwordcontainer.hxx b/svl/source/inc/passwordcontainer.hxx new file mode 100644 index 000000000000..a067672f3cf6 --- /dev/null +++ b/svl/source/inc/passwordcontainer.hxx @@ -0,0 +1,429 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: passwordcontainer.hxx,v $ + * $Revision: 1.11 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef INCLUDED_COMPHELPER_PASSWORDCONTAINER_HXX +#define INCLUDED_COMPHELPER_PASSWORDCONTAINER_HXX + +#include <list> +#include <vector> +#include <map> +#include <com/sun/star/task/XPasswordContainer.hpp> +#include <com/sun/star/task/XUrlContainer.hpp> +#include <com/sun/star/task/PasswordRequestMode.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/task/XMasterPasswordHandling2.hpp> +#include <cppuhelper/implbase5.hxx> +#include <cppuhelper/typeprovider.hxx> +#include <cppuhelper/queryinterface.hxx> +#include <cppuhelper/factory.hxx> + +#include <tools/stream.hxx> +#include <unotools/configitem.hxx> +#include <ucbhelper/interactionrequest.hxx> + +#include <rtl/ref.hxx> +#include <osl/mutex.hxx> + +#include "syscreds.hxx" + +#define MEMORY_RECORD 0 +#define PERSISTENT_RECORD 1 + +//---------------------------------------------------------------------------------- + +class NamePassRecord +{ + ::rtl::OUString m_aName; + + // there are two lists of passwords, memory passwords and persistent passwords + sal_Bool m_bHasMemPass; + ::std::vector< ::rtl::OUString > m_aMemPass; + + // persistent passwords are encrypted in one string + sal_Bool m_bHasPersPass; + ::rtl::OUString m_aPersPass; + + void InitArrays( sal_Bool bHasMemoryList, const ::std::vector< ::rtl::OUString >& aMemoryList, + sal_Bool bHasPersistentList, const ::rtl::OUString& aPersistentList ) + { + m_bHasMemPass = bHasMemoryList; + if ( bHasMemoryList ) + m_aMemPass = aMemoryList; + + m_bHasPersPass = bHasPersistentList; + if ( bHasPersistentList ) + m_aPersPass = aPersistentList; + } + +public: + + NamePassRecord( const ::rtl::OUString& aName ) + : m_aName( aName ) + , m_bHasMemPass( sal_False ) + , m_bHasPersPass( sal_False ) + { + } + + NamePassRecord( const ::rtl::OUString& aName, const ::std::vector< ::rtl::OUString >& aMemoryList ) + : m_aName( aName ) + , m_bHasMemPass( sal_True ) + , m_aMemPass( aMemoryList ) + , m_bHasPersPass( sal_False ) + { + } + + NamePassRecord( const ::rtl::OUString& aName, const ::rtl::OUString& aPersistentList ) + : m_aName( aName ) + , m_bHasMemPass( sal_False ) + , m_bHasPersPass( sal_True ) + , m_aPersPass( aPersistentList ) + { + } + + NamePassRecord( const ::rtl::OUString& aName, + sal_Bool bHasMemoryList, const ::std::vector< ::rtl::OUString >& aMemoryList, + sal_Bool bHasPersistentList, const ::rtl::OUString aPersistentList ) + : m_aName( aName ) + , m_bHasMemPass( bHasMemoryList ) + , m_bHasPersPass( bHasPersistentList ) + { + InitArrays( bHasMemoryList, aMemoryList, bHasPersistentList, aPersistentList ); + } + + NamePassRecord( const NamePassRecord& aRecord ) + : m_aName( aRecord.m_aName ) + , m_bHasMemPass( sal_False ) + , m_bHasPersPass( sal_False ) + { + InitArrays( aRecord.m_bHasMemPass, aRecord.m_aMemPass, aRecord.m_bHasPersPass, aRecord.m_aPersPass ); + } + + NamePassRecord& operator=( const NamePassRecord& aRecord ) + { + m_aName = aRecord.m_aName; + + m_aMemPass.clear(); + m_aPersPass = ::rtl::OUString(); + InitArrays( aRecord.m_bHasMemPass, aRecord.m_aMemPass, aRecord.m_bHasPersPass, aRecord.m_aPersPass ); + + return *this; + } + + ::rtl::OUString GetUserName() const + { + return m_aName; + } + + sal_Bool HasPasswords( sal_Int8 nStatus ) const + { + if ( nStatus == MEMORY_RECORD ) + return m_bHasMemPass; + if ( nStatus == PERSISTENT_RECORD ) + return m_bHasPersPass; + + return sal_False; + } + + ::std::vector< ::rtl::OUString > GetMemPasswords() const + { + if ( m_bHasMemPass ) + return m_aMemPass; + + return ::std::vector< ::rtl::OUString >(); + } + + ::rtl::OUString GetPersPasswords() const + { + if ( m_bHasPersPass ) + return m_aPersPass; + + return ::rtl::OUString(); + } + + void SetMemPasswords( const ::std::vector< ::rtl::OUString >& aMemList ) + { + m_aMemPass = aMemList; + m_bHasMemPass = sal_True; + } + + void SetPersPasswords( const ::rtl::OUString& aPersList ) + { + m_aPersPass = aPersList; + m_bHasPersPass = sal_True; + } + + void RemovePasswords( sal_Int8 nStatus ) + { + if ( nStatus == MEMORY_RECORD ) + { + m_bHasMemPass = sal_False; + m_aMemPass.clear(); + } + else if ( nStatus == PERSISTENT_RECORD ) + { + m_bHasPersPass = sal_False; + m_aPersPass = ::rtl::OUString(); + } + } + +}; + +//---------------------------------------------------------------------------------- + +typedef ::std::pair< const ::rtl::OUString, ::std::list< NamePassRecord > > PairUrlRecord; +typedef ::std::map< ::rtl::OUString, ::std::list< NamePassRecord > > PassMap; + +//---------------------------------------------------------------------------------- + +class PasswordContainer; + +class StorageItem : public ::utl::ConfigItem { + PasswordContainer* mainCont; + sal_Bool hasEncoded; + ::rtl::OUString mEncoded; +public: + StorageItem( PasswordContainer* point, const ::rtl::OUString& path ) : + ConfigItem( path, CONFIG_MODE_IMMEDIATE_UPDATE ), + mainCont( point ), + hasEncoded( sal_False ) + { + ::com::sun::star::uno::Sequence< ::rtl::OUString > aNode( 1 ); + *aNode.getArray() = path; + *aNode.getArray() += ::rtl::OUString::createFromAscii( "/Store" ); + EnableNotification( aNode ); + } + + PassMap getInfo(); + void update( const ::rtl::OUString& url, const NamePassRecord& rec ); + void remove( const ::rtl::OUString& url, const ::rtl::OUString& rec ); + void clear(); + + sal_Bool getEncodedMP( ::rtl::OUString& aResult ); + void setEncodedMP( const ::rtl::OUString& aResult, sal_Bool bAcceptEnmpty = sal_False ); + void setUseStorage( sal_Bool bUse ); + sal_Bool useStorage(); + + virtual void Notify( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames ); + virtual void Commit(); +}; + +//---------------------------------------------------------------------------------- + +enum PasswordState { + no_password, + entered, + cancelled +}; + +class PasswordContainer : public ::cppu::WeakImplHelper5< + ::com::sun::star::task::XPasswordContainer, + ::com::sun::star::task::XMasterPasswordHandling2, + ::com::sun::star::task::XUrlContainer, + ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::lang::XEventListener > +{ +private: + PassMap m_aContainer; + StorageItem* m_pStorageFile; + ::osl::Mutex mMutex; + ::rtl::OUString m_aMasterPasswd; // master password is set when the string is not empty + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > mComponent; + SysCredentialsConfig mUrlContainer; + + ::com::sun::star::uno::Sequence< ::com::sun::star::task::UserRecord > CopyToUserRecordSequence( + const ::std::list< NamePassRecord >& original, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); + + ::com::sun::star::task::UserRecord CopyToUserRecord( + const NamePassRecord& aRecord, + sal_Bool& io_bTryToDecode, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& aHandler ); + + ::com::sun::star::uno::Sequence< ::com::sun::star::task::UserRecord > FindUsr( + const ::std::list< NamePassRecord >& userlist, + const ::rtl::OUString& name, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); +bool createUrlRecord( + const PassMap::iterator & rIter, + bool bName, + const ::rtl::OUString & aName, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& aHandler, + ::com::sun::star::task::UrlRecord & rRec ) + throw( ::com::sun::star::uno::RuntimeException ); + +::com::sun::star::task::UrlRecord find( + const ::rtl::OUString& aURL, + const ::rtl::OUString& aName, + bool bName, // only needed to support empty user names + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& aHandler ) throw(::com::sun::star::uno::RuntimeException); + + ::rtl::OUString GetDefaultMasterPassword(); + + ::rtl::OUString RequestPasswordFromUser( + ::com::sun::star::task::PasswordRequestMode aRMode, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ); + + ::rtl::OUString GetMasterPassword( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); + + void UpdateVector( const ::rtl::OUString& url, ::std::list< NamePassRecord >& toUpdate, NamePassRecord& rec, sal_Bool writeFile ) + throw(::com::sun::star::uno::RuntimeException); + + void PrivateAdd( const ::rtl::OUString& aUrl, + const ::rtl::OUString& aUserName, + const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPasswords, + char aMode, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); + + ::std::vector< ::rtl::OUString > DecodePasswords( const ::rtl::OUString& aLine, const ::rtl::OUString& aMasterPassword ) + throw(::com::sun::star::uno::RuntimeException); + + ::rtl::OUString EncodePasswords( ::std::vector< ::rtl::OUString > lines, const ::rtl::OUString& aMasterPassword ) + throw(::com::sun::star::uno::RuntimeException); + +public: + PasswordContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); + ~PasswordContainer(); + + virtual void SAL_CALL add( const ::rtl::OUString& aUrl, + const ::rtl::OUString& aUserName, + const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPasswords, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL addPersistent( const ::rtl::OUString& aUrl, + const ::rtl::OUString& aUserName, + const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPasswords, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::task::UrlRecord SAL_CALL + find( const ::rtl::OUString& aUrl, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::task::UrlRecord SAL_CALL + findForName( const ::rtl::OUString& aUrl, + const ::rtl::OUString& aUserName, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) + throw(::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL remove( const ::rtl::OUString& aUrl, + const ::rtl::OUString& aUserName ) + throw(::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL removePersistent( const ::rtl::OUString& aUrl, + const ::rtl::OUString& aUserName ) + throw(::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL removeAllPersistent() throw(::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::task::UrlRecord > SAL_CALL + getAllPersistent( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) throw(::com::sun::star::uno::RuntimeException); + + + // provide factory + static ::rtl::OUString SAL_CALL impl_getStaticImplementationName( ) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL + impl_getStaticSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleServiceFactory > SAL_CALL + impl_createFactory( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ServiceManager ) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL + impl_createInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ) throw( ::com::sun::star::uno::RuntimeException ); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL + getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) + throw(::com::sun::star::uno::RuntimeException); + + // XMasterPasswordHandling + virtual ::sal_Bool SAL_CALL authorizateWithMasterPassword( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) + throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL changeMasterPassword( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeMasterPassword() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL hasMasterPassword( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL allowPersistentStoring( ::sal_Bool bAllow ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isPersistentStoringAllowed( ) throw (::com::sun::star::uno::RuntimeException); + + // XMasterPasswordHandling2 + virtual ::sal_Bool SAL_CALL useDefaultMasterPassword( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isDefaultMasterPasswordUsed( ) throw (::com::sun::star::uno::RuntimeException); + + // XUrlContainer + virtual void SAL_CALL addUrl( const ::rtl::OUString& Url, ::sal_Bool MakePersistent ) throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL findUrl( const ::rtl::OUString& Url ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeUrl( const ::rtl::OUString& Url ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getUrls( ::sal_Bool OnlyPersistent ) throw (::com::sun::star::uno::RuntimeException); + + void Notify(); +}; + +//---------------------------------------------------------------------------------- + +class MasterPasswordRequest_Impl : public ucbhelper::InteractionRequest +{ + ::rtl::Reference< ucbhelper::InteractionSupplyAuthentication > m_xAuthSupplier; + +public: + MasterPasswordRequest_Impl( ::com::sun::star::task::PasswordRequestMode Mode ); + + const ::rtl::Reference< ucbhelper::InteractionSupplyAuthentication > & + getAuthenticationSupplier() const { return m_xAuthSupplier; } + +}; + +//---------------------------------------------------------------------------------- + +class RW_SvMemoryStream : public SvMemoryStream { +public: + RW_SvMemoryStream( void* Buf, ULONG Size, StreamMode eMode ): + SvMemoryStream( Buf, Size, eMode){} + + RW_SvMemoryStream( ULONG InitSize=512, ULONG Resize=64 ): + SvMemoryStream( InitSize, Resize ){} + + ULONG getActualSize(){ return nEndOfData; } +}; + + + +#endif // #ifndef INCLUDED_COMPHELPER_PASSWORDCONTAINER_HXX + |