Add a new class allowing to store passwords and other sensitive information using the OS-provided facilities. Add implementations for all the main platforms, documentation and a new sample (which contains an ad hoc unit test as the real unit test for this class would probably be a bad idea as it wouldn't run in non-interactive contexts and could show OS level dialog boxes if it did).
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        wx/private/secretstore.h
 | |
| // Purpose:     Classes used in wxSecretStore implementation only.
 | |
| // Author:      Vadim Zeitlin
 | |
| // Created:     2016-05-27
 | |
| // Copyright:   (c) 2016 Vadim Zeitlin <vadim@wxwidgets.org>
 | |
| // Licence:     wxWindows licence
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef _WX_PRIVATE_SECRETSTORE_H_
 | |
| #define _WX_PRIVATE_SECRETSTORE_H_
 | |
| 
 | |
| #include "wx/object.h"          // wxRefCounter
 | |
| 
 | |
| // Both of the implementation classes here are ref-counted so that the
 | |
| // corresponding public objects could be copied cheaply and, in the case of
 | |
| // wxSecretValue, also to avoid having the secret in more than one place in
 | |
| // memory at a time.
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // Class holding wxSecretValue data
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // This is a common base class for our own and libsecret-based implementations.
 | |
| class wxSecretValueImpl : public wxRefCounter
 | |
| {
 | |
| public:
 | |
|     wxSecretValueImpl()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     virtual size_t GetSize() const = 0;
 | |
|     virtual const void *GetData() const = 0;
 | |
| };
 | |
| 
 | |
| // Trivial common implementation of wxSecretValueImpl used under MSW and OS X.
 | |
| #if defined(__WINDOWS__) || defined(__DARWIN__)
 | |
| 
 | |
| class wxSecretValueGenericImpl : public wxSecretValueImpl
 | |
| {
 | |
| public:
 | |
|     wxSecretValueGenericImpl(size_t size, const void *data)
 | |
|         : m_size(size),
 | |
|           m_data(new char[size])
 | |
|     {
 | |
|         memcpy(m_data, data, size);
 | |
|     }
 | |
| 
 | |
|     virtual ~wxSecretValueGenericImpl()
 | |
|     {
 | |
|         if ( m_data )
 | |
|         {
 | |
|             wxSecretValue::Wipe(m_size, m_data);
 | |
|             delete [] m_data;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     virtual size_t GetSize() const wxOVERRIDE { return m_size; }
 | |
|     virtual const void *GetData() const wxOVERRIDE { return m_data; }
 | |
| 
 | |
| private:
 | |
|     const size_t m_size;
 | |
|     char* const m_data;
 | |
| };
 | |
| 
 | |
| #endif // MSW or OSX
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // Base class for wxSecretStore implementations
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // All its methods are similar to the methods of the public class except that
 | |
| // they work with the implementation rather than public objects and they all
 | |
| // take an extra "wxString&" output parameter which is filled with the low
 | |
| // level error message in case of an error. This message will be logged by
 | |
| // wxSecretStore itself, wxSecretStoreImpl methods shouldn't do any logging on
 | |
| // their own.
 | |
| class wxSecretStoreImpl : public wxRefCounter
 | |
| {
 | |
| public:
 | |
|     virtual bool Save(const wxString& service,
 | |
|                       const wxString& user,
 | |
|                       const wxSecretValueImpl& secret,
 | |
|                       wxString& errmsg) = 0;
 | |
|     virtual wxSecretValueImpl* Load(const wxString& service,
 | |
|                                     const wxString& user,
 | |
|                                     wxString& errmsg) const = 0;
 | |
|     virtual bool Delete(const wxString& service,
 | |
|                         const wxString& user,
 | |
|                         wxString& errmsg) = 0;
 | |
| };
 | |
| 
 | |
| #endif // _WX_PRIVATE_SECRETSTORE_H_
 |