VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/ExpandVolume/WinMain.cpp
AgeCommit message (Expand)AuthorFilesLines
2017-05-15Replace Codeplex links by ones on veracrypt.frMounir IDRASSI1-1/+1
2016-12-30Windows: Implement Secure Desktop for password entry. Add option and command ...Mounir IDRASSI1-1/+3
2016-12-08Windows: Enhancement to favorites handling. Add PRF/TrueCryptMode fields in f...Mounir IDRASSI1-2/+2
2016-08-15Windows: Implement support for EFI system encryption in Windows GUI.Mounir IDRASSI1-1/+9
2016-05-10Remove trailing whitespaceDavid Foerster1-16/+16
2016-05-10Normalize all line terminatorsDavid Foerster1-423/+423
2016-05-05Windows: Add option and command line switch to hide waiting dialog when perfo...Mounir IDRASSI1-0/+2
2016-02-07Windows:Fix various issues and warnings reported by static code analysis tool...Mounir IDRASSI1-1/+1
2016-01-20Copyright: update dates to include 2016.Mounir IDRASSI1-1/+1
2016-01-10Windows: Avoid wrong update of configuration XML file caused by not using the...Mounir IDRASSI1-1/+1
2016-01-10Windows: Don't show disconnected network drives in the list of available driv...Mounir IDRASSI1-0/+2
2016-01-03Windows: Fix Dll hijacking vulnerability affecting installer that allows arbi...Mounir IDRASSI1-1/+0
2015-12-31Cryptography: Optimize Whirlpool implementation by using public domain assemb...Mounir IDRASSI1-0/+3
2015-11-26Windows: Full UNICODE rewrite and implement support for UNICODE passwords.Mounir IDRASSI1-38/+46
2015-09-26Windows: Set keyboard focus to PIM field when "Use PIM" is checked.Mounir IDRASSI1-0/+2
2015-08-28Windows: Treat the PIM like a password and make it visible when "Display pass...Mounir IDRASSI1-2/+2
2015-08-27Windows: Correctly display the password edit "black dot" instead of a '*' whe...Mounir IDRASSI1-8/+7
2015-08-27Windows: Protect against using a container file as its own keyfile. Normalizi...Mounir IDRASSI1-3/+5
2015-08-06Update license information to reflect the use of a dual license Apache 2.0 an...Mounir IDRASSI1-28/+15
2015-07-13Windows: Modify PIM parts in GUI to make it easier to use. Users must explici...Mounir IDRASSI1-5/+19
2015-07-11Use Pim name for internal variables instead of the old name PinMounir IDRASSI1-10/+10
2015-07-06Windows: Display source location of errors in order to help diagnose issues r...Mounir IDRASSI1-2/+2
2015-06-08Windows: rename PIN to PIM to avoid confusion. Better error messages.Mounir IDRASSI1-6/+6
2015-05-27Windows: GUI modifications around PIN fieldMounir IDRASSI1-16/+2
2015-05-26Windows: first implementation of dynamic modeMounir IDRASSI1-1/+43
2015-05-06Windows: Solve detection issue when resuming encryption. Add separate logic f...Mounir IDRASSI1-1/+3
2015-05-03Windows: enable showing/hiding password for system encryption in Windows UI a...Mounir IDRASSI1-1/+0
2015-04-27Windows: Support A: and B: as driver letters for mounting volumes.Mounir IDRASSI1-1/+1
2015-02-09Static Code Analysis: handle unused variables more properly. Catch STL except...Mounir IDRASSI1-1/+0
2015-01-20Windows: Add first version of VeraCryptExpander who is based on extcv. Minor ...Mounir IDRASSI1-0/+971
">
/*
 Copyright (c) 2013-2018 IDRIX. All rights reserved.

 Governed by the Apache License 2.0 the full text of which is
 contained in the file License.txt included in VeraCrypt binary and source
 code distribution packages.
*/

#ifndef TC_HEADER_Main_Forms_WaitDialog
#define TC_HEADER_Main_Forms_WaitDialog

#include "Forms.h"
#include "Main/Main.h"
#include "Main/Application.h"
#include <wx/msgqueue.h>

namespace VeraCrypt
{

	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, -1);
	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, -1);
	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_PIN, -1);
	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, -1);

	class WaitDialog;



	class WaitThread : public wxThread
	{
	public:
		WaitThread(WaitDialog *handler, WaitThreadRoutine* pRoutine) : wxThread(wxTHREAD_DETACHED), m_pRoutine(pRoutine)
		{
			m_pHandler = handler;
		}
		~WaitThread()
		{
		}

	protected:
		virtual ExitCode Entry();
		WaitDialog *m_pHandler;
		WaitThreadRoutine* m_pRoutine;
	};

	class WaitDialog : public WaitDialogBase, public WaitThreadUI
	{
	public:
		WaitDialog (wxWindow *parent, const wxString& label, WaitThreadRoutine* pRoutine)
			: WaitDialogBase(parent), WaitThreadUI(pRoutine), m_bThreadRunning (false), m_timer (this)
		{
			WaitStaticText->SetLabel (label);
			WaitProgessBar->Pulse();
			Layout();
			GetSizer()->Fit( this );
			Centre( wxBOTH );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );

			Connect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ), NULL, this );
			m_thread = new WaitThread(this, pRoutine);
		}

		~WaitDialog()
		{
			Disconnect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ));
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
		}

		virtual void OnWaitDialogInit( wxInitDialogEvent& event )
		{
			m_thread->Run();
			m_timer.Start(100);
			m_bThreadRunning = true;
		}

		int GetCharWidth (wxWindow *window) const
		{
			int width;
			int height;
			window->GetTextExtent (L"a", &width, &height);

			if (width < 1)
				return 7;

			return width;
		}

		class ShowMessageParam
		{
		public:
			wxString m_message;
			wxString m_caption;
			long m_style;
			bool m_topMost;
			ShowMessageParam(const wxString &message, const wxString &caption,long style, bool topMost)
				: m_message(message), m_caption(caption), m_style(style), m_topMost(topMost)
			{}
		};

		int RequestShowMessage (const wxString &message, const wxString &caption,long style, bool topMost)
		{
			long lResult = -1;
			if (m_queue.IsOk())
			{
				wxString sResult;
				ShowMessageParam* pParam = new ShowMessageParam(message, caption, style, topMost);
				wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_SHOW_MSG,0);
				pEvent->SetClientData (pParam);
				wxQueueEvent (this, pEvent);
				m_queue.Receive (sResult);
				sResult.ToLong(&lResult);
			}
			return (int) lResult;
		}

		void RequestAdminPassword (wxString& adminPassword)
		{
			if (m_queue.IsOk())
			{
				wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD,0));
				if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (adminPassword))
					adminPassword = wxT("");
			}
			else
				adminPassword = wxT("");
		}

		void RequestPin (wxString& pin)
		{
			if (m_queue.IsOk())
			{
				wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_PIN,0);
				pEvent->SetString (pin);
				wxQueueEvent (this, pEvent);
				if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (pin))
					pin = wxT("");
			}
			else
				pin = wxT("");
		}

		virtual void OnWaitDialogClose( wxCloseEvent& event ) 
		{ 
			if (event.CanVeto () && m_bThreadRunning)
			{
				event.Veto ();
			}
			else
				event.Skip ();
		}
 
		void OnThreadCompletion(wxCommandEvent &)
		{
			m_bThreadRunning = false;
			m_queue.Clear();
			EndModal(0);
		}

		void OnAdminPasswordRequest(wxCommandEvent &)
		{

			wxPasswordEntryDialog dialog (this, _("Enter your user password or administrator password:"), _("Administrator privileges required"));
			if (dialog.ShowModal() != wxID_OK)
				m_queue.Post(wxT(""));
			else
				m_queue.Post(dialog.GetValue());
		}



		void OnPinRequest(wxCommandEvent &e)
		{

			wxPasswordEntryDialog dialog (this, wxString::Format (LangString["ENTER_TOKEN_PASSWORD"], e.GetString()), LangString["IDD_TOKEN_PASSWORD"]);
			dialog.SetSize (wxSize (GetCharWidth (&dialog) * 50, -1));

			if (dialog.ShowModal() != wxID_OK)
				m_queue.Post(wxT(""));
			else
				m_queue.Post(dialog.GetValue());
		}

		void OnShowMsg(wxCommandEvent &e)
		{
			ShowMessageParam* pParam = (ShowMessageParam*) e.GetClientData();
			if (pParam->m_topMost)
			{
				if (!IsActive())
					RequestUserAttention (wxUSER_ATTENTION_ERROR);

				pParam->m_style |= wxSTAY_ON_TOP;
			}

			int iResult = wxMessageBox (pParam->m_message, pParam->m_caption, pParam->m_style, this);
			delete pParam;
			m_queue.Post(wxString::Format(wxT("%d"), iResult));
		}

		void OnProgressTimer(wxTimerEvent& event)
		{
			WaitProgessBar->Pulse();
		}

		virtual void Run(void) { ShowModal(); if (m_pRoutine->HasException()) ThrowException(m_pRoutine->m_pException); }

		void ThrowException(Exception* ex);

	protected:
		WaitThread* m_thread;
		bool m_bThreadRunning;
		wxTimer m_timer;
		wxMessageQueue<wxString> m_queue;
	};
}

#endif // TC_HEADER_Main_Forms_WaitDialog