VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Setup
AgeCommit message (Collapse)AuthorFilesLines
2015-04-05Windows Setup: Avoid potential issues by correctly initializing variables ↵Mounir IDRASSI1-13/+13
and checking memory allocation.
2015-03-17Windows Setup: When clicking uninstall link, launch Windows Add/Remove ↵Mounir IDRASSI1-6/+15
program instead of uninstall directly in order to avoid being flagged as legacy application by the Windows Program Compatibility Assistant (see number 5 in Microsoft UI Design Standard https://msdn.microsoft.com/en-us/library/ms954377.aspx)
2015-03-16Windows Setup: remove other VeraCrypt references for registry.Mounir IDRASSI1-0/+6
2015-03-15Windows Setup: implement removal of special LEGACY_VERACRYPT registry keys.Mounir IDRASSI1-60/+258
2015-03-13Windows: VeraCrypt reference from various registry locations. Uninstall old ↵Mounir IDRASSI2-2/+123
VeraCrypt COM interfaces that were left after upgrading.
2015-02-16Windows Installer: don't add link to VeraCryptExpander in the desktop.Mounir IDRASSI1-8/+0
2015-02-13Windows: Add VeraCryptExpander.exe to the Windows installer.Mounir IDRASSI2-0/+17
2015-02-11Linux: modify installer script to make it run when the "less" command ↵Mounir IDRASSI1-3/+23
doesn't support the -X argument (Busybox case)
2015-02-10Linux: Add graphical installer support when xterm is not available (Linux ↵Mounir IDRASSI1-4/+36
Mint case)
2015-02-09Static Code Analysis: check return of remove function and display message ↵Mounir IDRASSI1-22/+45
when it fails.
2015-02-09Static Code Analysis: Avoid over-flaw in arithmetic operations by adding ↵Mounir IDRASSI2-25/+27
more checks. Add extra checks. Solve various issues.
2015-02-08Windows Setup: implement removal of non-empty directories to avoid errors ↵Mounir IDRASSI1-1/+19
during uninstall.
2015-01-04Increment version to 1.0f-1 and update language files and PDF with ↵Mounir IDRASSI2-5/+5
information about TrueCrypt 6.0 support.
2015-01-03Windows: solve XP issue where the installer has missing/blacked out text boxes.Mounir IDRASSI1-12/+0
2014-12-31Increment version to 1.0f and update language XML files with new fields.Mounir IDRASSI2-5/+5
2014-12-28Windows: support loading TrueCrypt volumes. Implement converting TrueCrypt ↵Mounir IDRASSI1-1/+1
vo
/*
 Legal Notice: Some portions of the source code contained in this file were
 derived from the source code of TrueCrypt 7.1a, which is
 Copyright (c) 2003-2012 TrueCrypt Developers Association and which is
 governed by the TrueCrypt License 3.0, also from the source code of
 Encryption for the Masses 2.02a, which is Copyright (c) 1998-2000 Paul Le Roux
 and which is governed by the 'License Agreement for Encryption for the Masses'
 Modifications and additions to the original source code (contained in this file)
 and all other portions of this file are Copyright (c) 2013-2016 IDRIX
 and are 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. */

#include "Tcdefs.h"
#include "Combo.h"
#include "Dlgcode.h"
#include "Xml.h"

#include <time.h>

#define SIZEOF_MRU_LIST 20

void AddComboItem (HWND hComboBox, const wchar_t *lpszFileName, BOOL saveHistory)
{
	LPARAM nIndex;

	if (!saveHistory)
	{
		SendMessage (hComboBox, CB_RESETCONTENT, 0, 0);
		SetWindowText (hComboBox, lpszFileName);
		return;
	}

	nIndex = SendMessage (hComboBox, CB_FINDSTRINGEXACT, (WPARAM) - 1, (LPARAM) & lpszFileName[0]);

	if (nIndex == CB_ERR && *lpszFileName)
	{
		time_t lTime = time (NULL);
		nIndex = SendMessage (hComboBox, CB_ADDSTRING, 0, (LPARAM) & lpszFileName[0]);
		if (nIndex != CB_ERR)
			SendMessage (hComboBox, CB_SETITEMDATA, nIndex, (LPARAM) lTime);
	}

	if (nIndex != CB_ERR && *lpszFileName)
		nIndex = SendMessage (hComboBox, CB_SETCURSEL, nIndex, 0);

	if (*lpszFileName == 0)
	{
		SendMessage (hComboBox, CB_SETCURSEL, (WPARAM) - 1, 0);
	}
}


LPARAM MoveEditToCombo (HWND hComboBox, BOOL saveHistory)
{
	wchar_t szTmp[TC_MAX_PATH] = {0};

	if (!saveHistory)
	{
		GetWindowText (hComboBox, szTmp, ARRAYSIZE (szTmp));
		SendMessage (hComboBox, CB_RESETCONTENT, 0, 0);
		SetWindowText (hComboBox, szTmp);
		return 0;
	}

	GetWindowText (hComboBox, szTmp, ARRAYSIZE (szTmp));

	if (wcslen (szTmp) > 0)
	{
		LPARAM nIndex = SendMessage (hComboBox, CB_FINDSTRINGEXACT, (WPARAM) - 1,
					     (LPARAM) & szTmp[0]);
		if (nIndex == CB_ERR)
		{
			time_t lTime = time (NULL);
			nIndex = SendMessage (hComboBox, CB_ADDSTRING, 0, (LPARAM) & szTmp[0]);
			if (nIndex != CB_ERR)
				SendMessage (hComboBox, CB_SETITEMDATA, nIndex, (DWORD) lTime);
		}
		else
		{
			time_t lTime = time (NULL);
			SendMessage (hComboBox, CB_SETITEMDATA, nIndex, (DWORD) lTime);
		}

		return nIndex;
	}

	return SendMessage (hComboBox, CB_GETCURSEL, 0, 0);
}

int GetOrderComboIdx (HWND hComboBox, int *nIdxList, int nElems)
{
	int x = (int) SendMessage (hComboBox, CB_GETCOUNT, 0, 0);
	if (x != CB_ERR)
	{
		int i, nHighIdx = CB_ERR;
		time_t lHighTime = -1;

		for (i = 0; i < x; i++)
		{
			time_t lTime = SendMessage (hComboBox, CB_GETITEMDATA, (WPARAM) i, 0);
			if (lTime > lHighTime)
			{
				int n;
				for (n = 0; n < nElems; n++)
					if (nIdxList[n] == i)
						break;
				if (n == nElems)
				{
					lHighTime = lTime;
					nHighIdx = i;
				}
			}
		}

		return nHighIdx;
	}

	return CB_ERR;
}

LPARAM UpdateComboOrder (HWND hComboBox)
{
	LPARAM nIndex;

	nIndex = SendMessage (hComboBox, CB_GETCURSEL, 0, 0);

	if (nIndex != CB_ERR)
	{
		time_t lTime = time (NULL);
		nIndex = SendMessage (hComboBox, CB_SETITEMDATA, (WPARAM) nIndex,
				      (LPARAM) lTime);
	}

	return nIndex;
}

void LoadCombo (HWND hComboBox, BOOL bEnabled, BOOL bOnlyCheckModified, BOOL *pbModified)
{
	DWORD size;
	char *history = LoadFile (GetConfigPath (TC_APPD_FILENAME_HISTORY), &size);
	char *xml = history;
	char volume[MAX_PATH];
	int i, nComboIdx[SIZEOF_MRU_LIST] = {0};
	int count = SendMessage (hComboBox, CB_GETCOUNT, 0, 0);

	if (xml == NULL)
	{
		// No history XML file but history is enabled
		if (bEnabled && pbModified)
		*pbModified = TRUE;
		return;
	}

	if (!bEnabled && bOnlyCheckModified)
	{
		// History is disable but there is a history XML file
		if (pbModified)
			*pbModified = TRUE;
		free (history);
		return;
	}


	/* combo list part:- get mru items */
	for (i = 0; i < SIZEOF_MRU_LIST; i++)
		nComboIdx[i] = GetOrderComboIdx (hComboBox, &nComboIdx[0], i);

	i = 0;
	while (xml = XmlFindElement (xml, "volume"))
	{
		wchar_t szTmp[MAX_PATH] = { 0 };
		wchar_t wszVolume[MAX_PATH] = {0};

		if (i < count)
		{
			if (SendMessage (hComboBox, CB_GETLBTEXTLEN, nComboIdx[i], 0) < ARRAYSIZE (szTmp))
				SendMessage (hComboBox, CB_GETLBTEXT, nComboIdx[i], (LPARAM) & szTmp[0]);
		}

		XmlGetNodeText (xml, volume, sizeof (volume));
		if (0 == MultiByteToWideChar (CP_UTF8, 0, volume, -1, wszVolume, MAX_PATH))
			wszVolume [0] = 0;
		if (!bOnlyCheckModified)
			AddComboItem (hComboBox, wszVolume, TRUE);

		if (pbModified && wcscmp (wszVolume, szTmp))
			*pbModified = TRUE;

		xml++;
		i++;
	}

	if (pbModified && (i != count))
		*pbModified = TRUE;

	if (!bOnlyCheckModified)
		SendMessage (hComboBox, CB_SETCURSEL, 0, 0);

	free (history);
}

void DumpCombo (HWND hComboBox, int bClear)
{
	FILE *f;
	int i, nComboIdx[SIZEOF_MRU_LIST] = {0};

	if (bClear)
	{
		DeleteFile (GetConfigPath (TC_APPD_FILENAME_HISTORY));
		return;
	}

	f = _wfopen (GetConfigPath (TC_APPD_FILENAME_HISTORY), L"w,ccs=UTF-8");
	if (f == NULL) return;

	XmlWriteHeader (f);
	fputws (L"\n\t<history>", f);

	/* combo list part:- get mru items */
	for (i = 0; i < SIZEOF_MRU_LIST; i++)
		nComboIdx[i] = GetOrderComboIdx (hComboBox, &nComboIdx[0], i);

	/* combo list part:- write out mru items */
	for (i = 0; i < SIZEOF_MRU_LIST; i++)
	{
		wchar_t szTmp[MAX_PATH] = { 0 };

		if (SendMessage (hComboBox, CB_GETLBTEXTLEN, nComboIdx[i], 0) < ARRAYSIZE (szTmp))
			SendMessage (hComboBox, CB_GETLBTEXT, nComboIdx[i], (LPARAM) & szTmp[0]);

		if (szTmp[0] != 0)
		{
			wchar_t q[MAX_PATH * 2] = { 0 };
			XmlQuoteTextW (szTmp, q, ARRAYSIZE (q));

			fwprintf (f, L"\n\t\t<volume>%s</volume>", q);
		}
	}

	fputws (L"\n\t</history>", f);
	XmlWriteFooter (f);
	fclose (f);
}

void ClearCombo (HWND hComboBox)
{
	int i;
	for (i = 0; i < SIZEOF_MRU_LIST; i++)
	{
		SendMessage (hComboBox, CB_DELETESTRING, 0, 0);
	}
}

int IsComboEmpty (HWND hComboBox)
{
	return SendMessage (hComboBox, CB_GETCOUNT, 0, 0) < 1;
}