VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2014-05-31 18:44:53 +0200
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2014-11-08 23:18:59 +0100
commit7ffce028d04a6b13ef762e2b89c34b688e8ca59d (patch)
treeeefedb6e94de5b26fa963675969490c641c29077
parent97011f179cfd3dcd12446ef4ccb6964c8e52c3db (diff)
downloadVeraCrypt-7ffce028d04a6b13ef762e2b89c34b688e8ca59d.tar.gz
VeraCrypt-7ffce028d04a6b13ef762e2b89c34b688e8ca59d.zip
Add TrueCrypt 7.1a MacOSX/Linux specific source files.
-rw-r--r--src/Build/Include/Makefile.inc58
-rw-r--r--src/Build/Resources/MacOSX/Info.plist.xml44
-rw-r--r--src/Core/Core.h20
-rw-r--r--src/Core/Core.make27
-rw-r--r--src/Core/CoreBase.cpp279
-rw-r--r--src/Core/CoreBase.h99
-rw-r--r--src/Core/CoreException.cpp29
-rw-r--r--src/Core/CoreException.h52
-rw-r--r--src/Core/FatFormatter.cpp384
-rw-r--r--src/Core/FatFormatter.h29
-rw-r--r--src/Core/HostDevice.cpp47
-rw-r--r--src/Core/HostDevice.h45
-rw-r--r--src/Core/MountOptions.cpp129
-rw-r--r--src/Core/MountOptions.h70
-rw-r--r--src/Core/RandomNumberGenerator.cpp213
-rw-r--r--src/Core/RandomNumberGenerator.h55
-rw-r--r--src/Core/Unix/CoreService.cpp544
-rw-r--r--src/Core/Unix/CoreService.h63
-rw-r--r--src/Core/Unix/CoreServiceProxy.h152
-rw-r--r--src/Core/Unix/CoreServiceRequest.cpp269
-rw-r--r--src/Core/Unix/CoreServiceRequest.h136
-rw-r--r--src/Core/Unix/CoreServiceResponse.cpp119
-rw-r--r--src/Core/Unix/CoreServiceResponse.h84
-rw-r--r--src/Core/Unix/CoreUnix.cpp618
-rw-r--r--src/Core/Unix/CoreUnix.h69
-rw-r--r--src/Core/Unix/FreeBSD/CoreFreeBSD.cpp202
-rw-r--r--src/Core/Unix/FreeBSD/CoreFreeBSD.h37
-rw-r--r--src/Core/Unix/FreeBSD/System.h12
-rw-r--r--src/Core/Unix/Linux/CoreLinux.cpp477
-rw-r--r--src/Core/Unix/Linux/CoreLinux.h39
-rw-r--r--src/Core/Unix/Linux/System.h12
-rw-r--r--src/Core/Unix/MacOSX/CoreMacOSX.cpp215
-rw-r--r--src/Core/Unix/MacOSX/CoreMacOSX.h36
-rw-r--r--src/Core/Unix/MacOSX/System.h12
-rw-r--r--src/Core/Unix/MountedFilesystem.h27
-rw-r--r--src/Core/Unix/Solaris/CoreSolaris.cpp174
-rw-r--r--src/Core/Unix/Solaris/CoreSolaris.h37
-rw-r--r--src/Core/Unix/Solaris/System.h12
-rw-r--r--src/Core/Unix/System.h12
-rw-r--r--src/Core/VolumeCreator.cpp345
-rw-r--r--src/Core/VolumeCreator.h119
-rw-r--r--src/Driver/Fuse/Driver.make16
-rw-r--r--src/Driver/Fuse/FuseService.cpp592
-rw-r--r--src/Driver/Fuse/FuseService.h73
-rw-r--r--src/Main/Application.cpp98
-rw-r--r--src/Main/Application.h40
-rw-r--r--src/Main/CommandLineInterface.cpp583
-rw-r--r--src/Main/CommandLineInterface.h94
-rw-r--r--src/Main/FatalErrorHandler.cpp274
-rw-r--r--src/Main/FatalErrorHandler.h33
-rw-r--r--src/Main/FavoriteVolume.cpp94
-rw-r--r--src/Main/FavoriteVolume.h53
-rw-r--r--src/Main/Forms/AboutDialog.cpp66
-rw-r--r--src/Main/Forms/AboutDialog.h25
-rw-r--r--src/Main/Forms/BenchmarkDialog.cpp157
-rw-r--r--src/Main/Forms/BenchmarkDialog.h43
-rw-r--r--src/Main/Forms/ChangePasswordDialog.cpp195
-rw-r--r--src/Main/Forms/ChangePasswordDialog.h48
-rw-r--r--src/Main/Forms/DeviceSelectionDialog.cpp120
-rw-r--r--src/Main/Forms/DeviceSelectionDialog.h46
-rw-r--r--src/Main/Forms/EncryptionOptionsWizardPage.cpp137
-rw-r--r--src/Main/Forms/EncryptionOptionsWizardPage.h41
-rw-r--r--src/Main/Forms/EncryptionTestDialog.cpp227
-rw-r--r--src/Main/Forms/EncryptionTestDialog.h40
-rw-r--r--src/Main/Forms/FavoriteVolumesDialog.cpp118
-rw-r--r--src/Main/Forms/FavoriteVolumesDialog.h45
-rw-r--r--src/Main/Forms/Forms.cpp3062
-rw-r--r--src/Main/Forms/Forms.h1023
-rw-r--r--src/Main/Forms/InfoWizardPage.cpp33
-rw-r--r--src/Main/Forms/InfoWizardPage.h32
-rw-r--r--src/Main/Forms/KeyfileGeneratorDialog.cpp118
-rw-r--r--src/Main/Forms/KeyfileGeneratorDialog.h34
-rw-r--r--src/Main/Forms/KeyfilesDialog.cpp44
-rw-r--r--src/Main/Forms/KeyfilesDialog.h33
-rw-r--r--src/Main/Forms/KeyfilesPanel.cpp160
-rw-r--r--src/Main/Forms/KeyfilesPanel.h37
-rw-r--r--src/Main/Forms/LegalNoticesDialog.cpp28
-rw-r--r--src/Main/Forms/LegalNoticesDialog.h23
-rw-r--r--src/Main/Forms/MainFrame.cpp1585
-rw-r--r--src/Main/Forms/MainFrame.h173
-rw-r--r--src/Main/Forms/MountOptionsDialog.cpp174
-rw-r--r--src/Main/Forms/MountOptionsDialog.h42
-rw-r--r--src/Main/Forms/NewSecurityTokenKeyfileDialog.cpp45
-rw-r--r--src/Main/Forms/NewSecurityTokenKeyfileDialog.h30
-rw-r--r--src/Main/Forms/PreferencesDialog.cpp488
-rw-r--r--src/Main/Forms/PreferencesDialog.h60
-rw-r--r--src/Main/Forms/ProgressWizardPage.cpp80
-rw-r--r--src/Main/Forms/ProgressWizardPage.h42
-rw-r--r--src/Main/Forms/RandomPoolEnrichmentDialog.cpp93
-rw-r--r--src/Main/Forms/RandomPoolEnrichmentDialog.h33
-rw-r--r--src/Main/Forms/SecurityTokenKeyfilesDialog.cpp197
-rw-r--r--src/Main/Forms/SecurityTokenKeyfilesDialog.h47
-rw-r--r--src/Main/Forms/SelectDirectoryWizardPage.cpp32
-rw-r--r--src/Main/Forms/SelectDirectoryWizardPage.h33
-rw-r--r--src/Main/Forms/SingleChoiceWizardPage.h116
-rw-r--r--src/Main/Forms/TrueCrypt.fbp17436
-rw-r--r--src/Main/Forms/VolumeCreationProgressWizardPage.cpp183
-rw-r--r--src/Main/Forms/VolumeCreationProgressWizardPage.h53
-rw-r--r--src/Main/Forms/VolumeCreationWizard.cpp984
-rw-r--r--src/Main/Forms/VolumeCreationWizard.h85
-rw-r--r--src/Main/Forms/VolumeFormatOptionsWizardPage.cpp81
-rw-r--r--src/Main/Forms/VolumeFormatOptionsWizardPage.h36
-rw-r--r--src/Main/Forms/VolumeLocationWizardPage.cpp98
-rw-r--r--src/Main/Forms/VolumeLocationWizardPage.h40
-rw-r--r--src/Main/Forms/VolumePasswordPanel.cpp310
-rw-r--r--src/Main/Forms/VolumePasswordPanel.h54
-rw-r--r--src/Main/Forms/VolumePasswordWizardPage.cpp39
-rw-r--r--src/Main/Forms/VolumePasswordWizardPage.h37
-rw-r--r--src/Main/Forms/VolumePropertiesDialog.cpp97
-rw-r--r--src/Main/Forms/VolumePropertiesDialog.h26
-rw-r--r--src/Main/Forms/VolumeSizeWizardPage.cpp137
-rw-r--r--src/Main/Forms/VolumeSizeWizardPage.h51
-rw-r--r--src/Main/Forms/WizardFrame.cpp189
-rw-r--r--src/Main/Forms/WizardFrame.h58
-rw-r--r--src/Main/Forms/WizardPage.h41
-rw-r--r--src/Main/GraphicUserInterface.cpp1690
-rw-r--r--src/Main/GraphicUserInterface.h160
-rw-r--r--src/Main/Hotkey.cpp241
-rw-r--r--src/Main/Hotkey.h63
-rw-r--r--src/Main/LanguageStrings.cpp86
-rw-r--r--src/Main/LanguageStrings.h40
-rw-r--r--src/Main/Main.h17
-rw-r--r--src/Main/Main.make145
-rw-r--r--src/Main/Resources.cpp184
-rw-r--r--src/Main/Resources.h33
-rw-r--r--src/Main/StringFormatter.cpp88
-rw-r--r--src/Main/StringFormatter.h64
-rw-r--r--src/Main/System.cpp10
-rw-r--r--src/Main/System.h69
-rw-r--r--src/Main/SystemPrecompiled.h29
-rw-r--r--src/Main/TextUserInterface.cpp1552
-rw-r--r--src/Main/TextUserInterface.h78
-rw-r--r--src/Main/Unix/Main.cpp127
-rw-r--r--src/Main/UserInterface.cpp1494
-rw-r--r--src/Main/UserInterface.h111
-rw-r--r--src/Main/UserInterfaceException.h36
-rw-r--r--src/Main/UserInterfaceType.h25
-rw-r--r--src/Main/UserPreferences.cpp235
-rw-r--r--src/Main/UserPreferences.h107
-rw-r--r--src/Main/VolumeHistory.cpp152
-rw-r--r--src/Main/VolumeHistory.h46
-rw-r--r--src/Main/Xml.cpp178
-rw-r--r--src/Main/Xml.h75
-rw-r--r--src/Makefile298
-rw-r--r--src/Platform/Unix/Directory.cpp62
-rw-r--r--src/Platform/Unix/File.cpp348
-rw-r--r--src/Platform/Unix/FilesystemPath.cpp96
-rw-r--r--src/Platform/Unix/Mutex.cpp62
-rw-r--r--src/Platform/Unix/Pipe.cpp65
-rw-r--r--src/Platform/Unix/Pipe.h38
-rw-r--r--src/Platform/Unix/Poller.cpp57
-rw-r--r--src/Platform/Unix/Poller.h33
-rw-r--r--src/Platform/Unix/Process.cpp202
-rw-r--r--src/Platform/Unix/Process.h40
-rw-r--r--src/Platform/Unix/SyncEvent.cpp68
-rw-r--r--src/Platform/Unix/System.h12
-rw-r--r--src/Platform/Unix/SystemException.cpp66
-rw-r--r--src/Platform/Unix/SystemInfo.cpp69
-rw-r--r--src/Platform/Unix/SystemLog.cpp27
-rw-r--r--src/Platform/Unix/Thread.cpp54
-rw-r--r--src/Platform/Unix/Time.cpp23
-rw-r--r--src/Resources/Icons/TrueCrypt-16x16.xpm253
-rw-r--r--src/Resources/Icons/TrueCrypt-48x48.xpm251
-rw-r--r--src/Volume/Cipher.cpp314
-rw-r--r--src/Volume/Cipher.h129
-rw-r--r--src/Volume/Crc32.h44
-rw-r--r--src/Volume/EncryptionAlgorithm.cpp345
-rw-r--r--src/Volume/EncryptionAlgorithm.h93
-rw-r--r--src/Volume/EncryptionMode.cpp63
-rw-r--r--src/Volume/EncryptionMode.h62
-rw-r--r--src/Volume/EncryptionModeCBC.cpp335
-rw-r--r--src/Volume/EncryptionModeCBC.h47
-rw-r--r--src/Volume/EncryptionModeLRW.cpp195
-rw-r--r--src/Volume/EncryptionModeLRW.h50
-rw-r--r--src/Volume/EncryptionModeXTS.cpp374
-rw-r--r--src/Volume/EncryptionModeXTS.h50
-rw-r--r--src/Volume/EncryptionTest.cpp890
-rw-r--r--src/Volume/EncryptionTest.h50
-rw-r--r--src/Volume/EncryptionThreadPool.cpp325
-rw-r--r--src/Volume/EncryptionThreadPool.h87
-rw-r--r--src/Volume/Hash.cpp138
-rw-r--r--src/Volume/Hash.h135
-rw-r--r--src/Volume/Keyfile.cpp181
-rw-r--r--src/Volume/Keyfile.h49
-rw-r--r--src/Volume/Pkcs5Kdf.cpp96
-rw-r--r--src/Volume/Pkcs5Kdf.h127
-rw-r--r--src/Volume/Version.h25
-rw-r--r--src/Volume/Volume.cpp388
-rw-r--r--src/Volume/Volume.h126
-rw-r--r--src/Volume/Volume.make62
-rw-r--r--src/Volume/VolumeException.cpp32
-rw-r--r--src/Volume/VolumeException.h43
-rw-r--r--src/Volume/VolumeHeader.cpp340
-rw-r--r--src/Volume/VolumeHeader.h126
-rw-r--r--src/Volume/VolumeInfo.cpp118
-rw-r--r--src/Volume/VolumeInfo.h66
-rw-r--r--src/Volume/VolumeLayout.cpp254
-rw-r--r--src/Volume/VolumeLayout.h153
-rw-r--r--src/Volume/VolumePassword.cpp167
-rw-r--r--src/Volume/VolumePassword.h92
-rw-r--r--src/Volume/VolumePasswordCache.cpp43
-rw-r--r--src/Volume/VolumePasswordCache.h36
-rw-r--r--src/Volume/VolumeSlot.h19
203 files changed, 52120 insertions, 0 deletions
diff --git a/src/Build/Include/Makefile.inc b/src/Build/Include/Makefile.inc
new file mode 100644
index 00000000..39395e95
--- /dev/null
+++ b/src/Build/Include/Makefile.inc
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+#
+# Governed by the TrueCrypt License 3.0 the full text of which is contained in
+# the file License.txt included in TrueCrypt binary and source code distribution
+# packages.
+#
+
+$(NAME): $(NAME).a
+
+clean:
+ @echo Cleaning $(NAME)
+ rm -f $(APPNAME) $(NAME).a $(OBJS) $(OBJS:.o=.d) *.gch
+
+%.o: %.c
+ @echo Compiling $(<F)
+ $(CC) $(CFLAGS) -c $< -o $@
+
+%.o: %.cpp
+ @echo Compiling $(<F)
+ $(CXX) $(CXXFLAGS) -c $< -o $@
+
+%.o: %.asm
+ @echo Assembling $(<F)
+ $(AS) $(ASFLAGS) -o $@ $<
+
+
+# Precompiled headers
+%.h.gch: %.h
+ @echo Precompiling $(<F)
+ $(CXX) $(CXXFLAGS) -g0 -c $< || (rm -f $(<F).gch && exit 1)
+
+
+# Embedded files
+OD_BIN := od -v -t u1 -A n
+TR_SED_BIN := tr '\n' ' ' | tr -s ' ' ',' | sed -e 's/^,//g' -e 's/,$$/n/' | tr 'n' '\n'
+
+%.xml.h: %.xml
+ @echo Converting $(<F)
+ $(OD_BIN) $< | $(TR_SED_BIN) >$@
+
+%.txt.h: %.txt
+ @echo Converting $(<F)
+ $(OD_BIN) $< | $(TR_SED_BIN) >$@
+
+%.bmp.h: %.bmp
+ @echo Converting $(<F)
+ $(OD_BIN) $< | $(TR_SED_BIN) >$@
+
+
+# Dependencies
+-include $(OBJS:.o=.d)
+
+
+$(NAME).a: $(OBJS)
+ @echo Updating library $@
+ $(AR) $(AFLAGS) -rcu $@ $(OBJS)
+ $(RANLIB) $@
diff --git a/src/Build/Resources/MacOSX/Info.plist.xml b/src/Build/Resources/MacOSX/Info.plist.xml
new file mode 100644
index 00000000..29e114fa
--- /dev/null
+++ b/src/Build/Resources/MacOSX/Info.plist.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+
+ <key>CFBundleIdentifier</key>
+ <string>org.TrueCryptFoundation.TrueCrypt</string>
+
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+
+ <key>CFBundleExecutable</key>
+ <string>TrueCrypt</string>
+
+ <key>CFBundleIconFile</key>
+ <string>TrueCrypt.icns</string>
+
+ <key>CFBundleName</key>
+ <string>TrueCrypt</string>
+
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+
+ <key>CFBundleSignature</key>
+ <string>TRUE</string>
+
+ <key>CFBundleVersion</key>
+ <string>0</string>
+
+ <key>CFBundleShortVersionString</key>
+ <string>_VERSION_</string>
+
+ <key>CFBundleLongVersionString</key>
+ <string>TrueCrypt _VERSION_</string>
+
+ <key>LSRequiresCarbon</key>
+ <true/>
+
+ <key>CSResourcesFileMapped</key>
+ <true/>
+</dict>
+</plist>
diff --git a/src/Core/Core.h b/src/Core/Core.h
new file mode 100644
index 00000000..37bbb986
--- /dev/null
+++ b/src/Core/Core.h
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_Core
+#define TC_HEADER_Core_Core
+
+#include "CoreBase.h"
+
+namespace TrueCrypt
+{
+ extern auto_ptr <CoreBase> Core;
+ extern auto_ptr <CoreBase> CoreDirect;
+}
+
+#endif // TC_HEADER_Core_Core
diff --git a/src/Core/Core.make b/src/Core/Core.make
new file mode 100644
index 00000000..c4a5ccf2
--- /dev/null
+++ b/src/Core/Core.make
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+#
+# Governed by the TrueCrypt License 3.0 the full text of which is contained in
+# the file License.txt included in TrueCrypt binary and source code distribution
+# packages.
+#
+
+OBJS :=
+OBJS += CoreBase.o
+OBJS += CoreException.o
+OBJS += FatFormatter.o
+OBJS += HostDevice.o
+OBJS += MountOptions.o
+OBJS += RandomNumberGenerator.o
+OBJS += VolumeCreator.o
+OBJS += Unix/CoreService.o
+OBJS += Unix/CoreServiceRequest.o
+OBJS += Unix/CoreServiceResponse.o
+OBJS += Unix/CoreUnix.o
+OBJS += Unix/$(PLATFORM)/Core$(PLATFORM).o
+OBJS += Unix/$(PLATFORM)/Core$(PLATFORM).o
+ifeq "$(PLATFORM)" "MacOSX"
+OBJS += Unix/FreeBSD/CoreFreeBSD.o
+endif
+
+include $(BUILD_INC)/Makefile.inc
diff --git a/src/Core/CoreBase.cpp b/src/Core/CoreBase.cpp
new file mode 100644
index 00000000..b615b7ff
--- /dev/null
+++ b/src/Core/CoreBase.cpp
@@ -0,0 +1,279 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include <set>
+
+#include "CoreBase.h"
+#include "RandomNumberGenerator.h"
+#include "Volume/Volume.h"
+
+namespace TrueCrypt
+{
+ CoreBase::CoreBase ()
+ : DeviceChangeInProgress (false)
+ {
+ }
+
+ CoreBase::~CoreBase ()
+ {
+ }
+
+ void CoreBase::ChangePassword (shared_ptr <Volume> openVolume, shared_ptr <VolumePassword> newPassword, shared_ptr <KeyfileList> newKeyfiles, shared_ptr <Pkcs5Kdf> newPkcs5Kdf) const
+ {
+ if ((!newPassword || newPassword->Size() < 1) && (!newKeyfiles || newKeyfiles->empty()))
+ throw PasswordEmpty (SRC_POS);
+
+ if (!newPkcs5Kdf)
+ newPkcs5Kdf = openVolume->GetPkcs5Kdf();
+
+ if ((openVolume->GetHeader()->GetFlags() & TC_HEADER_FLAG_ENCRYPTED_SYSTEM) != 0
+ && openVolume->GetType() == VolumeType::Hidden
+ && openVolume->GetPath().IsDevice())
+ {
+ throw EncryptedSystemRequired (SRC_POS);
+ }
+
+ RandomNumberGenerator::SetHash (newPkcs5Kdf->GetHash());
+
+ SecureBuffer newSalt (openVolume->GetSaltSize());
+ SecureBuffer newHeaderKey (VolumeHeader::GetLargestSerializedKeySize());
+
+ shared_ptr <VolumePassword> password (Keyfile::ApplyListToPassword (newKeyfiles, newPassword));
+
+ bool backupHeader = false;
+ while (true)
+ {
+ for (int i = 1; i <= SecureWipePassCount; i++)
+ {
+ if (i == SecureWipePassCount)
+ RandomNumberGenerator::GetData (newSalt);
+ else
+ RandomNumberGenerator::GetDataFast (newSalt);
+
+ newPkcs5Kdf->DeriveKey (newHeaderKey, *password, newSalt);
+
+ openVolume->ReEncryptHeader (backupHeader, newSalt, newHeaderKey, newPkcs5Kdf);
+ openVolume->GetFile()->Flush();
+ }
+
+ if (!openVolume->GetLayout()->HasBackupHeader() || backupHeader)
+ break;
+
+ backupHeader = true;
+ }
+ }
+
+ void CoreBase::ChangePassword (shared_ptr <VolumePath> volumePath, bool preserveTimestamps, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles, shared_ptr <VolumePassword> newPassword, shared_ptr <KeyfileList> newKeyfiles, shared_ptr <Pkcs5Kdf> newPkcs5Kdf) const
+ {
+ shared_ptr <Volume> volume = OpenVolume (volumePath, preserveTimestamps, password, keyfiles);
+ ChangePassword (volume, newPassword, newKeyfiles, newPkcs5Kdf);
+ }
+
+ void CoreBase::CoalesceSlotNumberAndMountPoint (MountOptions &options) const
+ {
+ if (options.SlotNumber < GetFirstSlotNumber())
+ {
+ if (options.MountPoint && !options.MountPoint->IsEmpty())
+ options.SlotNumber = MountPointToSlotNumber (*options.MountPoint);
+ else
+ options.SlotNumber = GetFirstFreeSlotNumber();
+ }
+
+ if (!IsSlotNumberAvailable (options.SlotNumber))
+#ifdef TC_WINDOWS
+ throw DriveLetterUnavailable (SRC_POS);
+#else
+ throw VolumeSlotUnavailable (SRC_POS);
+#endif
+ if (!options.NoFilesystem && (!options.MountPoint || options.MountPoint->IsEmpty()))
+ options.MountPoint.reset (new DirectoryPath (SlotNumberToMountPoint (options.SlotNumber)));
+ }
+
+ void CoreBase::CreateKeyfile (const FilePath &keyfilePath) const
+ {
+ SecureBuffer keyfileBuffer (VolumePassword::MaxSize);
+ RandomNumberGenerator::GetData (keyfileBuffer);
+
+ File keyfile;
+ keyfile.Open (keyfilePath, File::CreateWrite);
+ keyfile.Write (keyfileBuffer);
+ }
+
+ VolumeSlotNumber CoreBase::GetFirstFreeSlotNumber (VolumeSlotNumber startFrom) const
+ {
+ if (startFrom < GetFirstSlotNumber())
+ startFrom = GetFirstSlotNumber();
+
+ set <VolumeSlotNumber> usedSlotNumbers;
+
+ foreach_ref (const VolumeInfo &volume, GetMountedVolumes())
+ usedSlotNumbers.insert (volume.SlotNumber);
+
+ for (VolumeSlotNumber slotNumber = startFrom; slotNumber <= GetLastSlotNumber(); ++slotNumber)
+ {
+ if (usedSlotNumbers.find (slotNumber) == usedSlotNumbers.end()
+ && IsMountPointAvailable (SlotNumberToMountPoint (slotNumber)))
+ return slotNumber;
+ }
+#ifdef TC_WINDOWS
+ throw DriveLetterUnavailable (SRC_POS);
+#else
+ throw VolumeSlotUnavailable (SRC_POS);
+#endif
+ }
+
+ uint64 CoreBase::GetMaxHiddenVolumeSize (shared_ptr <Volume> outerVolume) const
+ {
+ uint32 sectorSize = outerVolume->GetSectorSize();
+
+ SecureBuffer bootSectorBuffer (sectorSize);
+ outerVolume->ReadSectors (bootSectorBuffer, 0);
+
+ int fatType;
+ byte *bootSector = bootSectorBuffer.Ptr();
+
+ if (memcmp (bootSector + 54, "FAT12", 5) == 0)
+ fatType = 12;
+ else if (memcmp (bootSector + 54, "FAT16", 5) == 0)
+ fatType = 16;
+ else if (memcmp (bootSector + 82, "FAT32", 5) == 0)
+ fatType = 32;
+ else
+ throw ParameterIncorrect (SRC_POS);
+
+ uint32 clusterSize = bootSector[13] * sectorSize;
+ uint32 reservedSectorCount = Endian::Little (*(uint16 *) (bootSector + 14));
+ uint32 fatCount = bootSector[16];
+
+ uint64 fatSectorCount;
+ if (fatType == 32)
+ fatSectorCount = Endian::Little (*(uint32 *) (bootSector + 36));
+ else
+ fatSectorCount = Endian::Little (*(uint16 *) (bootSector + 22));
+ uint64 fatSize = fatSectorCount * sectorSize;
+
+ uint64 fatStartOffset = reservedSectorCount * sectorSize;
+ uint64 dataAreaOffset = reservedSectorCount * sectorSize + fatSize * fatCount;
+
+ if (fatType < 32)
+ dataAreaOffset += Endian::Little (*(uint16 *) (bootSector + 17)) * 32;
+
+ SecureBuffer sector (sectorSize);
+
+ // Find last used cluster
+ for (uint64 readOffset = fatStartOffset + fatSize - sectorSize;
+ readOffset >= fatStartOffset;
+ readOffset -= sectorSize)
+ {
+ outerVolume->ReadSectors (sector, readOffset);
+
+ for (int offset = sectorSize - 4; offset >= 0; offset -= 4)
+ {
+ if (*(uint32 *) (sector.Ptr() + offset))
+ {
+ uint64 clusterNumber = readOffset - fatStartOffset + offset;
+
+ if (fatType == 12)
+ clusterNumber = (clusterNumber * 8) / 12;
+ else if (fatType == 16)
+ clusterNumber /= 2;
+ else if (fatType == 32)
+ clusterNumber /= 4;
+
+ uint64 maxSize = outerVolume->GetSize() - dataAreaOffset;
+
+ // Some FAT entries may span over sector boundaries
+ if (maxSize >= clusterSize)
+ maxSize -= clusterSize;
+
+ uint64 clusterOffset = clusterNumber * clusterSize;
+ if (maxSize < clusterOffset)
+ return 0;
+
+ return maxSize - clusterOffset;
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ shared_ptr <VolumeInfo> CoreBase::GetMountedVolume (const VolumePath &volumePath) const
+ {
+ VolumeInfoList volumes = GetMountedVolumes (volumePath);
+ if (volumes.empty())
+ return shared_ptr <VolumeInfo> ();
+ else
+ return volumes.front();
+ }
+
+ shared_ptr <VolumeInfo> CoreBase::GetMountedVolume (VolumeSlotNumber slot) const
+ {
+ foreach (shared_ptr <VolumeInfo> volume, GetMountedVolumes())
+ {
+ if (volume->SlotNumber == slot)
+ return volume;
+ }
+
+ return shared_ptr <VolumeInfo> ();
+ }
+
+ bool CoreBase::IsSlotNumberAvailable (VolumeSlotNumber slotNumber) const
+ {
+ if (!IsMountPointAvailable (SlotNumberToMountPoint (slotNumber)))
+ return false;
+
+ foreach_ref (const VolumeInfo &volume, GetMountedVolumes())
+ {
+ if (volume.SlotNumber == slotNumber)
+ return false;
+ }
+
+ return true;
+ }
+
+ bool CoreBase::IsVolumeMounted (const VolumePath &volumePath) const
+ {
+ return GetMountedVolume (volumePath);
+ }
+
+ shared_ptr <Volume> CoreBase::OpenVolume (shared_ptr <VolumePath> volumePath, bool preserveTimestamps, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles, VolumeProtection::Enum protection, shared_ptr <VolumePassword> protectionPassword, shared_ptr <KeyfileList> protectionKeyfiles, bool sharedAccessAllowed, VolumeType::Enum volumeType, bool useBackupHeaders, bool partitionInSystemEncryptionScope) const
+ {
+ make_shared_auto (Volume, volume);
+ volume->Open (*volumePath, preserveTimestamps, password, keyfiles, protection, protectionPassword, protectionKeyfiles, sharedAccessAllowed, volumeType, useBackupHeaders, partitionInSystemEncryptionScope);
+ return volume;
+ }
+
+ void CoreBase::RandomizeEncryptionAlgorithmKey (shared_ptr <EncryptionAlgorithm> encryptionAlgorithm) const
+ {
+ SecureBuffer eaKey (encryptionAlgorithm->GetKeySize());
+ RandomNumberGenerator::GetData (eaKey);
+ encryptionAlgorithm->SetKey (eaKey);
+
+ SecureBuffer modeKey (encryptionAlgorithm->GetMode()->GetKeySize());
+ RandomNumberGenerator::GetData (modeKey);
+ encryptionAlgorithm->GetMode()->SetKey (modeKey);
+ }
+
+ void CoreBase::ReEncryptVolumeHeaderWithNewSalt (const BufferPtr &newHeaderBuffer, shared_ptr <VolumeHeader> header, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles) const
+ {
+ shared_ptr <Pkcs5Kdf> pkcs5Kdf = header->GetPkcs5Kdf();
+
+ RandomNumberGenerator::SetHash (pkcs5Kdf->GetHash());
+
+ SecureBuffer newSalt (header->GetSaltSize());
+ SecureBuffer newHeaderKey (VolumeHeader::GetLargestSerializedKeySize());
+
+ shared_ptr <VolumePassword> passwordKey (Keyfile::ApplyListToPassword (keyfiles, password));
+
+ RandomNumberGenerator::GetData (newSalt);
+ pkcs5Kdf->DeriveKey (newHeaderKey, *passwordKey, newSalt);
+
+ header->EncryptNew (newHeaderBuffer, newSalt, newHeaderKey, pkcs5Kdf);
+ }
+}
diff --git a/src/Core/CoreBase.h b/src/Core/CoreBase.h
new file mode 100644
index 00000000..d99420ab
--- /dev/null
+++ b/src/Core/CoreBase.h
@@ -0,0 +1,99 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_CoreBase
+#define TC_HEADER_Core_CoreBase
+
+#include "Platform/Platform.h"
+#include "Platform/Functor.h"
+#include "Platform/User.h"
+#include "Common/Crypto.h"
+#include "Volume/Keyfile.h"
+#include "Volume/VolumeInfo.h"
+#include "Volume/Volume.h"
+#include "Volume/VolumePassword.h"
+#include "CoreException.h"
+#include "HostDevice.h"
+#include "MountOptions.h"
+
+namespace TrueCrypt
+{
+ class CoreBase
+ {
+ public:
+ virtual ~CoreBase ();
+
+ virtual void ChangePassword (shared_ptr <Volume> openVolume, shared_ptr <VolumePassword> newPassword, shared_ptr <KeyfileList> newKeyfiles, shared_ptr <Pkcs5Kdf> newPkcs5Kdf = shared_ptr <Pkcs5Kdf> ()) const;
+ virtual void ChangePassword (shared_ptr <VolumePath> volumePath, bool preserveTimestamps, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles, shared_ptr <VolumePassword> newPassword, shared_ptr <KeyfileList> newKeyfiles, shared_ptr <Pkcs5Kdf> newPkcs5Kdf = shared_ptr <Pkcs5Kdf> ()) const;
+ virtual void CheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair = false) const = 0;
+ virtual void CoalesceSlotNumberAndMountPoint (MountOptions &options) const;
+ virtual void CreateKeyfile (const FilePath &keyfilePath) const;
+ virtual void DismountFilesystem (const DirectoryPath &mountPoint, bool force) const = 0;
+ virtual shared_ptr <VolumeInfo> DismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles = false, bool syncVolumeInfo = false) = 0;
+ virtual bool FilesystemSupportsLargeFiles (const FilePath &filePath) const = 0;
+ virtual DirectoryPath GetDeviceMountPoint (const DevicePath &devicePath) const = 0;
+ virtual uint32 GetDeviceSectorSize (const DevicePath &devicePath) const = 0;
+ virtual uint64 GetDeviceSize (const DevicePath &devicePath) const = 0;
+ virtual VolumeSlotNumber GetFirstFreeSlotNumber (VolumeSlotNumber startFrom = 0) const;
+ virtual VolumeSlotNumber GetFirstSlotNumber () const { return 1; }
+ virtual VolumeSlotNumber GetLastSlotNumber () const { return 64; }
+ virtual HostDeviceList GetHostDevices (bool pathListOnly = false) const = 0;
+ virtual FilePath GetApplicationExecutablePath () const { return ApplicationExecutablePath; }
+ virtual uint64 GetMaxHiddenVolumeSize (shared_ptr <Volume> outerVolume) const;
+ virtual int GetOSMajorVersion () const = 0;
+ virtual int GetOSMinorVersion () const = 0;
+ virtual shared_ptr <VolumeInfo> GetMountedVolume (const VolumePath &volumePath) const;
+ virtual shared_ptr <VolumeInfo> GetMountedVolume (VolumeSlotNumber slot) const;
+ virtual VolumeInfoList GetMountedVolumes (const VolumePath &volumePath = VolumePath()) const = 0;
+ virtual bool HasAdminPrivileges () const = 0;
+ virtual void Init () { }
+ virtual bool IsDeviceChangeInProgress () const { return DeviceChangeInProgress; }
+ virtual bool IsDevicePresent (const DevicePath &device) const = 0;
+ virtual bool IsInPortableMode () const = 0;
+ virtual bool IsMountPointAvailable (const DirectoryPath &mountPoint) const = 0;
+ virtual bool IsOSVersion (int major, int minor) const = 0;
+ virtual bool IsOSVersionLower (int major, int minor) const = 0;
+ virtual bool IsPasswordCacheEmpty () const = 0;
+ virtual bool IsSlotNumberAvailable (VolumeSlotNumber slotNumber) const;
+ virtual bool IsSlotNumberValid (VolumeSlotNumber slotNumber) const { return slotNumber >= GetFirstSlotNumber() && slotNumber <= GetLastSlotNumber(); }
+ virtual bool IsVolumeMounted (const VolumePath &volumePath) const;
+ virtual VolumeSlotNumber MountPointToSlotNumber (const DirectoryPath &mountPoint) const = 0;
+ virtual shared_ptr <VolumeInfo> MountVolume (MountOptions &options) = 0;
+ virtual shared_ptr <Volume> OpenVolume (shared_ptr <VolumePath> volumePath, bool preserveTimestamps, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles, VolumeProtection::Enum protection = VolumeProtection::None, shared_ptr <VolumePassword> protectionPassword = shared_ptr <VolumePassword> (), shared_ptr <KeyfileList> protectionKeyfiles = shared_ptr <KeyfileList> (), bool sharedAccessAllowed = false, VolumeType::Enum volumeType = VolumeType::Unknown, bool useBackupHeaders = false, bool partitionInSystemEncryptionScope = false) const;
+ virtual void RandomizeEncryptionAlgorithmKey (shared_ptr <EncryptionAlgorithm> encryptionAlgorithm) const;
+ virtual void ReEncryptVolumeHeaderWithNewSalt (const BufferPtr &newHeaderBuffer, shared_ptr <VolumeHeader> header, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles) const;
+ virtual void SetAdminPasswordCallback (shared_ptr <GetStringFunctor> functor) { }
+ virtual void SetApplicationExecutablePath (const FilePath &path) { ApplicationExecutablePath = path; }
+ virtual void SetFileOwner (const FilesystemPath &path, const UserId &owner) const = 0;
+ virtual DirectoryPath SlotNumberToMountPoint (VolumeSlotNumber slotNumber) const = 0;
+ virtual void WipePasswordCache () const = 0;
+
+ Event VolumeDismountedEvent;
+ Event VolumeMountedEvent;
+ Event WarningEvent;
+
+ protected:
+ CoreBase ();
+
+ static const int SecureWipePassCount = PRAND_DISK_WIPE_PASSES;
+ bool DeviceChangeInProgress;
+ FilePath ApplicationExecutablePath;
+
+ private:
+ CoreBase (const CoreBase &);
+ CoreBase &operator= (const CoreBase &);
+ };
+
+ struct VolumeEventArgs : EventArgs
+ {
+ VolumeEventArgs (shared_ptr <VolumeInfo> volume) : mVolume (volume) { }
+ shared_ptr <VolumeInfo> mVolume;
+ };
+}
+
+#endif // TC_HEADER_Core_CoreBase
diff --git a/src/Core/CoreException.cpp b/src/Core/CoreException.cpp
new file mode 100644
index 00000000..da939a8d
--- /dev/null
+++ b/src/Core/CoreException.cpp
@@ -0,0 +1,29 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "CoreException.h"
+#include "Platform/SerializerFactory.h"
+
+namespace TrueCrypt
+{
+ void ElevationFailed::Deserialize (shared_ptr <Stream> stream)
+ {
+ ExecutedProcessFailed::Deserialize (stream);
+ }
+
+ void ElevationFailed::Serialize (shared_ptr <Stream> stream) const
+ {
+ ExecutedProcessFailed::Serialize (stream);
+ }
+
+#define TC_EXCEPTION(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE)
+#undef TC_EXCEPTION_NODECL
+#define TC_EXCEPTION_NODECL(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE)
+
+ TC_SERIALIZER_FACTORY_ADD_EXCEPTION_SET (CoreException);
+}
diff --git a/src/Core/CoreException.h b/src/Core/CoreException.h
new file mode 100644
index 00000000..40ffbcea
--- /dev/null
+++ b/src/Core/CoreException.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_CoreException
+#define TC_HEADER_Core_CoreException
+
+#include "Platform/Platform.h"
+
+namespace TrueCrypt
+{
+ struct ElevationFailed : public ExecutedProcessFailed
+ {
+ ElevationFailed () { }
+ ElevationFailed (const string &message, const string &command, int exitCode, const string &errorOutput)
+ : ExecutedProcessFailed (message, command, exitCode, errorOutput) { }
+ TC_SERIALIZABLE_EXCEPTION (ElevationFailed);
+ };
+
+ TC_EXCEPTION_DECL (RootDeviceUnavailable, SystemException);
+
+#define TC_EXCEPTION(NAME) TC_EXCEPTION_DECL(NAME,Exception)
+
+#undef TC_EXCEPTION_SET
+#define TC_EXCEPTION_SET \
+ TC_EXCEPTION_NODECL (ElevationFailed); \
+ TC_EXCEPTION_NODECL (RootDeviceUnavailable); \
+ TC_EXCEPTION (DriveLetterUnavailable); \
+ TC_EXCEPTION (DriverError); \
+ TC_EXCEPTION (EncryptedSystemRequired); \
+ TC_EXCEPTION (HigherFuseVersionRequired); \
+ TC_EXCEPTION (KernelCryptoServiceTestFailed); \
+ TC_EXCEPTION (LoopDeviceSetupFailed); \
+ TC_EXCEPTION (MountPointRequired); \
+ TC_EXCEPTION (MountPointUnavailable); \
+ TC_EXCEPTION (NoDriveLetterAvailable); \
+ TC_EXCEPTION (TemporaryDirectoryFailure); \
+ TC_EXCEPTION (UnsupportedSectorSizeHiddenVolumeProtection); \
+ TC_EXCEPTION (UnsupportedSectorSizeNoKernelCrypto); \
+ TC_EXCEPTION (VolumeAlreadyMounted); \
+ TC_EXCEPTION (VolumeSlotUnavailable);
+
+ TC_EXCEPTION_SET;
+
+#undef TC_EXCEPTION
+}
+
+#endif // TC_HEADER_Core_CoreException
diff --git a/src/Core/FatFormatter.cpp b/src/Core/FatFormatter.cpp
new file mode 100644
index 00000000..ba69df61
--- /dev/null
+++ b/src/Core/FatFormatter.cpp
@@ -0,0 +1,384 @@
+/*
+ Legal Notice: Some portions of the source code contained in this file were
+ derived 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) 2003-2010 TrueCrypt Developers Association
+ and are governed by the TrueCrypt License 3.0 the full text of which is
+ contained in the file License.txt included in TrueCrypt binary and source
+ code distribution packages. */
+
+#include "Common/Tcdefs.h"
+#include "Platform/Platform.h"
+#include "Volume/VolumeHeader.h"
+#include "FatFormatter.h"
+#include "RandomNumberGenerator.h"
+
+namespace TrueCrypt
+{
+ struct fatparams
+ {
+ char volume_name[11];
+ uint32 num_sectors; /* total number of sectors */
+ uint32 cluster_count; /* number of clusters */
+ uint32 size_root_dir; /* size of the root directory in bytes */
+ uint32 size_fat; /* size of FAT */
+ uint32 fats;
+ uint32 media;
+ uint32 cluster_size;
+ uint32 fat_length;
+ uint16 dir_entries;
+ uint16 sector_size;
+ uint32 hidden;
+ uint16 reserved;
+ uint16 sectors;
+ uint32 total_sect;
+
+ uint16 heads;
+ uint16 secs_track;
+
+ };
+
+ static void GetFatParams (fatparams * ft)
+ {
+ uint64 volumeSize = (uint64) ft->num_sectors * ft->sector_size;
+ unsigned int fatsecs;
+
+ if(ft->cluster_size == 0) // 'Default' cluster size
+ {
+ uint32 clusterSize;
+
+ // Determine optimal cluster size to minimize FAT size (mounting delay), maximize number of files, keep 4 KB alignment, etc.
+ if (volumeSize >= 2 * BYTES_PER_TB)
+ clusterSize = 256 * BYTES_PER_KB;
+ else if (volumeSize >= 512 * BYTES_PER_GB)
+ clusterSize = 128 * BYTES_PER_KB;
+ else if (volumeSize >= 128 * BYTES_PER_GB)
+ clusterSize = 64 * BYTES_PER_KB;
+ else if (volumeSize >= 64 * BYTES_PER_GB)
+ clusterSize = 32 * BYTES_PER_KB;
+ else if (volumeSize >= 32 * BYTES_PER_GB)
+ clusterSize = 16 * BYTES_PER_KB;
+ else if (volumeSize >= 16 * BYTES_PER_GB)
+ clusterSize = 8 * BYTES_PER_KB;
+ else if (volumeSize >= 512 * BYTES_PER_MB)
+ clusterSize = 4 * BYTES_PER_KB;
+ else if (volumeSize >= 256 * BYTES_PER_MB)
+ clusterSize = 2 * BYTES_PER_KB;
+ else if (volumeSize >= 1 * BYTES_PER_MB)
+ clusterSize = 1 * BYTES_PER_KB;
+ else
+ clusterSize = 512;
+
+ ft->cluster_size = clusterSize / ft->sector_size;
+
+ if (ft->cluster_size == 0)
+ ft->cluster_size = 1;
+
+ if (ft->cluster_size * ft->sector_size > TC_MAX_FAT_CLUSTER_SIZE)
+ ft->cluster_size = TC_MAX_FAT_CLUSTER_SIZE / ft->sector_size;
+
+ if (ft->cluster_size > 128)
+ ft->cluster_size = 128;
+ }
+
+ if (volumeSize <= TC_MAX_FAT_CLUSTER_SIZE * 4)
+ ft->cluster_size = 1;
+
+ // Geometry always set to SECTORS/1/1
+ ft->secs_track = 1;
+ ft->heads = 1;
+
+ ft->dir_entries = 512;
+ ft->fats = 2;
+ ft->media = 0xf8;
+ ft->hidden = 0;
+
+ ft->size_root_dir = ft->dir_entries * 32;
+
+ // FAT12
+ ft->size_fat = 12;
+ ft->reserved = 2;
+ fatsecs = ft->num_sectors - (ft->size_root_dir + ft->sector_size - 1) / ft->sector_size - ft->reserved;
+ ft->cluster_count = (int) (((int64) fatsecs * ft->sector_size) / (ft->cluster_size * ft->sector_size));
+ ft->fat_length = (((ft->cluster_count * 3 + 1) >> 1) + ft->sector_size - 1) / ft->sector_size;
+
+ if (ft->cluster_count >= 4085) // FAT16
+ {
+ ft->size_fat = 16;
+ ft->reserved = 2;
+ fatsecs = ft->num_sectors - (ft->size_root_dir + ft->sector_size - 1) / ft->sector_size - ft->reserved;
+ ft->cluster_count = (int) (((int64) fatsecs * ft->sector_size) / (ft->cluster_size * ft->sector_size));
+ ft->fat_length = (ft->cluster_count * 2 + ft->sector_size - 1) / ft->sector_size;
+ }
+
+ if(ft->cluster_count >= 65525) // FAT32
+ {
+ ft->size_fat = 32;
+ ft->reserved = 32 - 1;
+
+ do
+ {
+ ft->reserved++;
+
+ fatsecs = ft->num_sectors - ft->reserved;
+ ft->size_root_dir = ft->cluster_size * ft->sector_size;
+ ft->cluster_count = (int) (((int64) fatsecs * ft->sector_size) / (ft->cluster_size * ft->sector_size));
+ ft->fat_length = (ft->cluster_count * 4 + ft->sector_size - 1) / ft->sector_size;
+
+ // Align data area on TC_MAX_VOLUME_SECTOR_SIZE
+
+ } while (ft->sector_size == TC_SECTOR_SIZE_LEGACY
+ && (ft->reserved * ft->sector_size + ft->fat_length * ft->fats * ft->sector_size) % TC_MAX_VOLUME_SECTOR_SIZE != 0);
+ }
+
+ ft->cluster_count -= ft->fat_length * ft->fats / ft->cluster_size;
+
+ if (ft->num_sectors >= 65536 || ft->size_fat == 32)
+ {
+ ft->sectors = 0;
+ ft->total_sect = ft->num_sectors;
+ }
+ else
+ {
+ ft->sectors = (uint16) ft->num_sectors;
+ ft->total_sect = 0;
+ }
+ }
+
+ static void PutBoot (fatparams * ft, byte *boot, uint32 volumeId)
+ {
+ int cnt = 0;
+
+ boot[cnt++] = 0xeb; /* boot jump */
+ boot[cnt++] = 0x3c;
+ boot[cnt++] = 0x90;
+ memcpy (boot + cnt, "MSDOS5.0", 8); /* system id */
+ cnt += 8;
+ *(int16 *)(boot + cnt) = Endian::Little (ft->sector_size); /* bytes per sector */
+ cnt += 2;
+ boot[cnt++] = (int8) ft->cluster_size; /* sectors per cluster */
+ *(int16 *)(boot + cnt) = Endian::Little (ft->reserved); /* reserved sectors */
+ cnt += 2;
+ boot[cnt++] = (int8) ft->fats; /* 2 fats */
+
+ if(ft->size_fat == 32)
+ {
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x00;
+ }
+ else
+ {
+ *(int16 *)(boot + cnt) = Endian::Little (ft->dir_entries); /* 512 root entries */
+ cnt += 2;
+ }
+
+ *(int16 *)(boot + cnt) = Endian::Little (ft->sectors); /* # sectors */
+ cnt += 2;
+ boot[cnt++] = (int8) ft->media; /* media byte */
+
+ if(ft->size_fat == 32)
+ {
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x00;
+ }
+ else
+ {
+ *(uint16 *)(boot + cnt) = Endian::Little ((uint16) ft->fat_length); /* fat size */
+ cnt += 2;
+ }
+
+ *(int16 *)(boot + cnt) = Endian::Little (ft->secs_track); /* # sectors per track */
+ cnt += 2;
+ *(int16 *)(boot + cnt) = Endian::Little (ft->heads); /* # heads */
+ cnt += 2;
+ *(int32 *)(boot + cnt) = Endian::Little (ft->hidden); /* # hidden sectors */
+ cnt += 4;
+ *(int32 *)(boot + cnt) = Endian::Little (ft->total_sect); /* # huge sectors */
+ cnt += 4;
+
+ if(ft->size_fat == 32)
+ {
+ *(int32 *)(boot + cnt) = Endian::Little (ft->fat_length); cnt += 4; /* fat size 32 */
+ boot[cnt++] = 0x00; /* ExtFlags */
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x00; /* FSVer */
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x02; /* RootClus */
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x01; /* FSInfo */
+ boot[cnt++] = 0x00;
+ boot[cnt++] = 0x06; /* BkBootSec */
+ boot[cnt++] = 0x00;
+ memset(boot+cnt, 0, 12); cnt+=12; /* Reserved */
+ }
+
+ boot[cnt++] = 0x00; /* drive number */ // FIXED 80 > 00
+ boot[cnt++] = 0x00; /* reserved */
+ boot[cnt++] = 0x29; /* boot sig */
+
+ *(int32 *)(boot + cnt) = volumeId;
+ cnt += 4;
+
+ memcpy (boot + cnt, ft->volume_name, 11); /* vol title */
+ cnt += 11;
+
+ switch(ft->size_fat) /* filesystem type */
+ {
+ case 12: memcpy (boot + cnt, "FAT12 ", 8); break;
+ case 16: memcpy (boot + cnt, "FAT16 ", 8); break;
+ case 32: memcpy (boot + cnt, "FAT32 ", 8); break;
+ }
+ cnt += 8;
+
+ memset (boot + cnt, 0, ft->size_fat==32 ? 420:448); /* boot code */
+ cnt += ft->size_fat==32 ? 420:448;
+ boot[cnt++] = 0x55;
+ boot[cnt++] = 0xaa; /* boot sig */
+ }
+
+
+ /* FAT32 FSInfo */
+ static void PutFSInfo (byte *sector, fatparams *ft)
+ {
+ memset (sector, 0, ft->sector_size);
+ sector[3] = 0x41; /* LeadSig */
+ sector[2] = 0x61;
+ sector[1] = 0x52;
+ sector[0] = 0x52;
+ sector[484+3] = 0x61; /* StrucSig */
+ sector[484+2] = 0x41;
+ sector[484+1] = 0x72;
+ sector[484+0] = 0x72;
+
+ // Free cluster count
+ *(uint32 *)(sector + 488) = Endian::Little (ft->cluster_count - ft->size_root_dir / ft->sector_size / ft->cluster_size);
+
+ // Next free cluster
+ *(uint32 *)(sector + 492) = Endian::Little ((uint32) 2);
+
+ sector[508+3] = 0xaa; /* TrailSig */
+ sector[508+2] = 0x55;
+ sector[508+1] = 0x00;
+ sector[508+0] = 0x00;
+ }
+
+ void FatFormatter::Format (WriteSectorCallback &writeSector, uint64 deviceSize, uint32 clusterSize, uint32 sectorSize)
+ {
+ fatparams fatParams;
+
+#if TC_MAX_VOLUME_SECTOR_SIZE > 0xFFFF
+#error TC_MAX_VOLUME_SECTOR_SIZE > 0xFFFF
+#endif
+ fatParams.sector_size = (uint16) sectorSize;
+
+ if (deviceSize / fatParams.sector_size > 0xffffFFFF)
+ throw ParameterIncorrect (SRC_POS);
+
+ fatParams.num_sectors = (uint32) (deviceSize / fatParams.sector_size);
+ fatParams.cluster_size = clusterSize / fatParams.sector_size;
+ memcpy (fatParams.volume_name, "NO NAME ", 11);
+ GetFatParams (&fatParams);
+ fatparams *ft = &fatParams;
+
+ SecureBuffer sector (ft->sector_size);
+ uint32 sectorNumber = 0;
+
+ /* Write the data area */
+
+ sector.Zero();
+
+ uint32 volumeId;
+ RandomNumberGenerator::GetDataFast (BufferPtr ((byte *) &volumeId, sizeof (volumeId)));
+
+ PutBoot (ft, (byte *) sector, volumeId);
+ writeSector (sector); ++sectorNumber;
+
+ /* fat32 boot area */
+ if (ft->size_fat == 32)
+ {
+ /* fsinfo */
+ PutFSInfo((byte *) sector, ft);
+ writeSector (sector); ++sectorNumber;
+
+ /* reserved */
+ while (sectorNumber < 6)
+ {
+ sector.Zero();
+ sector[508+3] = 0xaa; /* TrailSig */
+ sector[508+2] = 0x55;
+ writeSector (sector); ++sectorNumber;
+ }
+
+ /* bootsector backup */
+ sector.Zero();
+ PutBoot (ft, (byte *) sector, volumeId);
+ writeSector (sector); ++sectorNumber;
+
+ PutFSInfo((byte *) sector, ft);
+ writeSector (sector); ++sectorNumber;
+ }
+
+ /* reserved */
+ while (sectorNumber < (uint32)ft->reserved)
+ {
+ sector.Zero();
+ writeSector (sector); ++sectorNumber;
+ }
+
+ /* write fat */
+ for (uint32 x = 1; x <= ft->fats; x++)
+ {
+ for (uint32 n = 0; n < ft->fat_length; n++)
+ {
+ sector.Zero();
+
+ if (n == 0)
+ {
+ byte fat_sig[12];
+ if (ft->size_fat == 32)
+ {
+ fat_sig[0] = (byte) ft->media;
+ fat_sig[1] = fat_sig[2] = 0xff;
+ fat_sig[3] = 0x0f;
+ fat_sig[4] = fat_sig[5] = fat_sig[6] = 0xff;
+ fat_sig[7] = 0x0f;
+ fat_sig[8] = fat_sig[9] = fat_sig[10] = 0xff;
+ fat_sig[11] = 0x0f;
+ memcpy (sector, fat_sig, 12);
+ }
+ else if (ft->size_fat == 16)
+ {
+ fat_sig[0] = (byte) ft->media;
+ fat_sig[1] = 0xff;
+ fat_sig[2] = 0xff;
+ fat_sig[3] = 0xff;
+ memcpy (sector, fat_sig, 4);
+ }
+ else if (ft->size_fat == 12)
+ {
+ fat_sig[0] = (byte) ft->media;
+ fat_sig[1] = 0xff;
+ fat_sig[2] = 0xff;
+ fat_sig[3] = 0x00;
+ memcpy (sector, fat_sig, 4);
+ }
+ }
+
+ if (!writeSector (sector))
+ return;
+ }
+ }
+
+ /* write rootdir */
+ for (uint32 x = 0; x < ft->size_root_dir / ft->sector_size; x++)
+ {
+ sector.Zero();
+ if (!writeSector (sector))
+ return;
+ }
+ }
+}
diff --git a/src/Core/FatFormatter.h b/src/Core/FatFormatter.h
new file mode 100644
index 00000000..47702190
--- /dev/null
+++ b/src/Core/FatFormatter.h
@@ -0,0 +1,29 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_FatFormatter
+#define TC_HEADER_Core_FatFormatter
+
+#include "Platform/Platform.h"
+
+namespace TrueCrypt
+{
+ class FatFormatter
+ {
+ public:
+ struct WriteSectorCallback
+ {
+ virtual ~WriteSectorCallback () { }
+ virtual bool operator() (const BufferPtr &sector) = 0;
+ };
+
+ static void Format (WriteSectorCallback &writeSector, uint64 deviceSize, uint32 clusterSize, uint32 sectorSize);
+ };
+}
+
+#endif // TC_HEADER_Core_FatFormatter
diff --git a/src/Core/HostDevice.cpp b/src/Core/HostDevice.cpp
new file mode 100644
index 00000000..0147d568
--- /dev/null
+++ b/src/Core/HostDevice.cpp
@@ -0,0 +1,47 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "HostDevice.h"
+#include "Platform/SerializerFactory.h"
+
+namespace TrueCrypt
+{
+ void HostDevice::Deserialize (shared_ptr <Stream> stream)
+ {
+ Serializer sr (stream);
+ MountPoint = sr.DeserializeWString ("MountPoint");
+ sr.Deserialize ("Name", Name);
+ Path = sr.DeserializeWString ("Path");
+ sr.Deserialize ("Removable", Removable);
+ sr.Deserialize ("Size", Size);
+ sr.Deserialize ("SystemNumber", SystemNumber);
+
+ uint32 partitionCount;
+ sr.Deserialize ("Partitions", partitionCount);
+ for (uint32 i = 0; i < partitionCount; i++)
+ Partitions.push_back (Serializable::DeserializeNew <HostDevice> (stream));
+ }
+
+ void HostDevice::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("MountPoint", wstring (MountPoint));
+ sr.Serialize ("Name", Name);
+ sr.Serialize ("Path", wstring (Path));
+ sr.Serialize ("Removable", Removable);
+ sr.Serialize ("Size", Size);
+ sr.Serialize ("SystemNumber", SystemNumber);
+
+ sr.Serialize ("Partitions", (uint32) Partitions.size());
+ foreach_ref (const HostDevice &partition, Partitions)
+ partition.Serialize (stream);
+ }
+
+ TC_SERIALIZER_FACTORY_ADD_CLASS (HostDevice);
+}
diff --git a/src/Core/HostDevice.h b/src/Core/HostDevice.h
new file mode 100644
index 00000000..227dc241
--- /dev/null
+++ b/src/Core/HostDevice.h
@@ -0,0 +1,45 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_HostDevice
+#define TC_HEADER_Core_HostDevice
+
+#include "Platform/Platform.h"
+#include "Platform/Serializable.h"
+
+namespace TrueCrypt
+{
+ struct HostDevice;
+ typedef list < shared_ptr <HostDevice> > HostDeviceList;
+
+ struct HostDevice : public Serializable
+ {
+ HostDevice ()
+ : Removable (false),
+ Size (0)
+ {
+ }
+
+ virtual ~HostDevice ()
+ {
+ }
+
+ TC_SERIALIZABLE (HostDevice);
+
+ DirectoryPath MountPoint;
+ wstring Name;
+ DevicePath Path;
+ bool Removable;
+ uint64 Size;
+ uint32 SystemNumber;
+
+ HostDeviceList Partitions;
+ };
+}
+
+#endif // TC_HEADER_Core_HostDevice
diff --git a/src/Core/MountOptions.cpp b/src/Core/MountOptions.cpp
new file mode 100644
index 00000000..04187311
--- /dev/null
+++ b/src/Core/MountOptions.cpp
@@ -0,0 +1,129 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "MountOptions.h"
+#include "Platform/MemoryStream.h"
+#include "Platform/SerializerFactory.h"
+
+namespace TrueCrypt
+{
+ void MountOptions::CopyFrom (const MountOptions &other)
+ {
+#define TC_CLONE(NAME) NAME = other.NAME
+#define TC_CLONE_SHARED(TYPE,NAME) NAME = other.NAME ? make_shared <TYPE> (*other.NAME) : shared_ptr <TYPE> ()
+
+ TC_CLONE (CachePassword);
+ TC_CLONE (FilesystemOptions);
+ TC_CLONE (FilesystemType);
+ TC_CLONE_SHARED (KeyfileList, Keyfiles);
+ TC_CLONE_SHARED (DirectoryPath, MountPoint);
+ TC_CLONE (NoFilesystem);
+ TC_CLONE (NoHardwareCrypto);
+ TC_CLONE (NoKernelCrypto);
+ TC_CLONE_SHARED (VolumePassword, Password);
+ TC_CLONE_SHARED (VolumePath, Path);
+ TC_CLONE (PartitionInSystemEncryptionScope);
+ TC_CLONE (PreserveTimestamps);
+ TC_CLONE (Protection);
+ TC_CLONE_SHARED (VolumePassword, ProtectionPassword);
+ TC_CLONE_SHARED (KeyfileList, ProtectionKeyfiles);
+ TC_CLONE (Removable);
+ TC_CLONE (SharedAccessAllowed);
+ TC_CLONE (SlotNumber);
+ TC_CLONE (UseBackupHeaders);
+ }
+
+ void MountOptions::Deserialize (shared_ptr <Stream> stream)
+ {
+ Serializer sr (stream);
+
+ sr.Deserialize ("CachePassword", CachePassword);
+ sr.Deserialize ("FilesystemOptions", FilesystemOptions);
+ sr.Deserialize ("FilesystemType", FilesystemType);
+
+ Keyfiles = Keyfile::DeserializeList (stream, "Keyfiles");
+
+ if (!sr.DeserializeBool ("MountPointNull"))
+ MountPoint.reset (new DirectoryPath (sr.DeserializeWString ("MountPoint")));
+ else
+ MountPoint.reset();
+
+ sr.Deserialize ("NoFilesystem", NoFilesystem);
+ sr.Deserialize ("NoHardwareCrypto", NoHardwareCrypto);
+ sr.Deserialize ("NoKernelCrypto", NoKernelCrypto);
+
+ if (!sr.DeserializeBool ("PasswordNull"))
+ Password = Serializable::DeserializeNew <VolumePassword> (stream);
+ else
+ Password.reset();
+
+ if (!sr.DeserializeBool ("PathNull"))
+ Path.reset (new VolumePath (sr.DeserializeWString ("Path")));
+ else
+ Path.reset();
+
+ sr.Deserialize ("PartitionInSystemEncryptionScope", PartitionInSystemEncryptionScope);
+ sr.Deserialize ("PreserveTimestamps", PreserveTimestamps);
+
+ Protection = static_cast <VolumeProtection::Enum> (sr.DeserializeInt32 ("Protection"));
+
+ if (!sr.DeserializeBool ("ProtectionPasswordNull"))
+ ProtectionPassword = Serializable::DeserializeNew <VolumePassword> (stream);
+ else
+ ProtectionPassword.reset();
+
+ ProtectionKeyfiles = Keyfile::DeserializeList (stream, "ProtectionKeyfiles");
+ sr.Deserialize ("Removable", Removable);
+ sr.Deserialize ("SharedAccessAllowed", SharedAccessAllowed);
+ sr.Deserialize ("SlotNumber", SlotNumber);
+ sr.Deserialize ("UseBackupHeaders", UseBackupHeaders);
+ }
+
+ void MountOptions::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializer sr (stream);
+
+ sr.Serialize ("CachePassword", CachePassword);
+ sr.Serialize ("FilesystemOptions", FilesystemOptions);
+ sr.Serialize ("FilesystemType", FilesystemType);
+ Keyfile::SerializeList (stream, "Keyfiles", Keyfiles);
+
+ sr.Serialize ("MountPointNull", MountPoint == nullptr);
+ if (MountPoint)
+ sr.Serialize ("MountPoint", wstring (*MountPoint));
+
+ sr.Serialize ("NoFilesystem", NoFilesystem);
+ sr.Serialize ("NoHardwareCrypto", NoHardwareCrypto);
+ sr.Serialize ("NoKernelCrypto", NoKernelCrypto);
+
+ sr.Serialize ("PasswordNull", Password == nullptr);
+ if (Password)
+ Password->Serialize (stream);
+
+ sr.Serialize ("PathNull", Path == nullptr);
+ if (Path)
+ sr.Serialize ("Path", wstring (*Path));
+
+ sr.Serialize ("PartitionInSystemEncryptionScope", PartitionInSystemEncryptionScope);
+ sr.Serialize ("PreserveTimestamps", PreserveTimestamps);
+ sr.Serialize ("Protection", static_cast <uint32> (Protection));
+
+ sr.Serialize ("ProtectionPasswordNull", ProtectionPassword == nullptr);
+ if (ProtectionPassword)
+ ProtectionPassword->Serialize (stream);
+
+ Keyfile::SerializeList (stream, "ProtectionKeyfiles", ProtectionKeyfiles);
+ sr.Serialize ("Removable", Removable);
+ sr.Serialize ("SharedAccessAllowed", SharedAccessAllowed);
+ sr.Serialize ("SlotNumber", SlotNumber);
+ sr.Serialize ("UseBackupHeaders", UseBackupHeaders);
+ }
+
+ TC_SERIALIZER_FACTORY_ADD_CLASS (MountOptions);
+}
diff --git a/src/Core/MountOptions.h b/src/Core/MountOptions.h
new file mode 100644
index 00000000..23fc7ca2
--- /dev/null
+++ b/src/Core/MountOptions.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_MountOptions
+#define TC_HEADER_Core_MountOptions
+
+#include "Platform/Serializable.h"
+#include "Volume/Keyfile.h"
+#include "Volume/Volume.h"
+#include "Volume/VolumeSlot.h"
+#include "Volume/VolumePassword.h"
+
+namespace TrueCrypt
+{
+ struct MountOptions : public Serializable
+ {
+ MountOptions ()
+ :
+ CachePassword (false),
+ NoFilesystem (false),
+ NoHardwareCrypto (false),
+ NoKernelCrypto (false),
+ PartitionInSystemEncryptionScope (false),
+ PreserveTimestamps (true),
+ Protection (VolumeProtection::None),
+ Removable (false),
+ SharedAccessAllowed (false),
+ SlotNumber (0),
+ UseBackupHeaders (false)
+ {
+ }
+
+ MountOptions (const MountOptions &other) { CopyFrom (other); }
+ virtual ~MountOptions () { }
+
+ MountOptions &operator= (const MountOptions &other) { CopyFrom (other); return *this; }
+
+ TC_SERIALIZABLE (MountOptions);
+
+ bool CachePassword;
+ wstring FilesystemOptions;
+ wstring FilesystemType;
+ shared_ptr <KeyfileList> Keyfiles;
+ shared_ptr <DirectoryPath> MountPoint;
+ bool NoFilesystem;
+ bool NoHardwareCrypto;
+ bool NoKernelCrypto;
+ shared_ptr <VolumePassword> Password;
+ bool PartitionInSystemEncryptionScope;
+ shared_ptr <VolumePath> Path;
+ bool PreserveTimestamps;
+ VolumeProtection::Enum Protection;
+ shared_ptr <VolumePassword> ProtectionPassword;
+ shared_ptr <KeyfileList> ProtectionKeyfiles;
+ bool Removable;
+ bool SharedAccessAllowed;
+ VolumeSlotNumber SlotNumber;
+ bool UseBackupHeaders;
+
+ protected:
+ void CopyFrom (const MountOptions &other);
+ };
+}
+
+#endif // TC_HEADER_Core_MountOptions
diff --git a/src/Core/RandomNumberGenerator.cpp b/src/Core/RandomNumberGenerator.cpp
new file mode 100644
index 00000000..a010e7c6
--- /dev/null
+++ b/src/Core/RandomNumberGenerator.cpp
@@ -0,0 +1,213 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_WINDOWS
+#include <sys/types.h>
+#include <errno.h>
+#include <fcntl.h>
+#endif
+
+#include "RandomNumberGenerator.h"
+#include "Volume/Crc32.h"
+
+namespace TrueCrypt
+{
+ void RandomNumberGenerator::AddSystemDataToPool (bool fast)
+ {
+ SecureBuffer buffer (PoolSize);
+
+#ifdef TC_WINDOWS
+#ifndef DEBUG
+ throw NotImplemented (SRC_POS);
+#endif
+#else
+ int urandom = open ("/dev/urandom", O_RDONLY);
+ throw_sys_sub_if (urandom == -1, L"/dev/urandom");
+ finally_do_arg (int, urandom, { close (finally_arg); });
+
+ throw_sys_sub_if (read (urandom, buffer, buffer.Size()) == -1, L"/dev/urandom");
+ AddToPool (buffer);
+
+ if (!fast)
+ {
+ // Read all bytes available in /dev/random up to buffer size
+ int random = open ("/dev/random", O_RDONLY | O_NONBLOCK);
+ throw_sys_sub_if (random == -1, L"/dev/random");
+ finally_do_arg (int, random, { close (finally_arg); });
+
+ throw_sys_sub_if (read (random, buffer, buffer.Size()) == -1 && errno != EAGAIN, L"/dev/random");
+ AddToPool (buffer);
+ }
+#endif
+ }
+
+ void RandomNumberGenerator::AddToPool (const ConstBufferPtr &data)
+ {
+ if (!Running)
+ throw NotInitialized (SRC_POS);
+
+ ScopeLock lock (AccessMutex);
+
+ for (size_t i = 0; i < data.Size(); ++i)
+ {
+ Pool[WriteOffset++] += data[i];
+
+ if (WriteOffset >= PoolSize)
+ WriteOffset = 0;
+
+ if (++BytesAddedSincePoolHashMix >= MaxBytesAddedBeforePoolHashMix)
+ HashMixPool();
+ }
+ }
+
+ void RandomNumberGenerator::GetData (const BufferPtr &buffer, bool fast)
+ {
+ if (!Running)
+ throw NotInitialized (SRC_POS);
+
+ if (buffer.Size() > PoolSize)
+ throw ParameterIncorrect (SRC_POS);
+
+ ScopeLock lock (AccessMutex);
+
+ // Poll system for data
+ AddSystemDataToPool (fast);
+ HashMixPool();
+
+ // Transfer bytes from pool to output buffer
+ for (size_t i = 0; i < buffer.Size(); ++i)
+ {
+ buffer[i] += Pool[ReadOffset++];
+
+ if (ReadOffset >= PoolSize)
+ ReadOffset = 0;
+ }
+
+ // Invert and mix the pool
+ for (size_t i = 0; i < Pool.Size(); ++i)
+ {
+ Pool[i] = ~Pool[i];
+ }
+
+ AddSystemDataToPool (true);
+ HashMixPool();
+
+ // XOR the current pool content into the output buffer to prevent pool state leaks
+ for (size_t i = 0; i < buffer.Size(); ++i)
+ {
+ buffer[i] ^= Pool[ReadOffset++];
+
+ if (ReadOffset >= PoolSize)
+ ReadOffset = 0;
+ }
+ }
+
+ shared_ptr <Hash> RandomNumberGenerator::GetHash ()
+ {
+ ScopeLock lock (AccessMutex);
+ return PoolHash;
+ }
+
+ void RandomNumberGenerator::HashMixPool ()
+ {
+ BytesAddedSincePoolHashMix = 0;
+
+ for (size_t poolPos = 0; poolPos < Pool.Size(); )
+ {
+ // Compute the message digest of the entire pool using the selected hash function
+ SecureBuffer digest (PoolHash->GetDigestSize());
+ PoolHash->ProcessData (Pool);
+ PoolHash->GetDigest (digest);
+
+ // Add the message digest to the pool
+ for (size_t digestPos = 0; digestPos < digest.Size() && poolPos < Pool.Size(); ++digestPos)
+ {
+ Pool[poolPos++] += digest[digestPos];
+ }
+ }
+ }
+
+ void RandomNumberGenerator::SetHash (shared_ptr <Hash> hash)
+ {
+ ScopeLock lock (AccessMutex);
+ PoolHash = hash;
+ }
+
+ void RandomNumberGenerator::Start ()
+ {
+ ScopeLock lock (AccessMutex);
+
+ if (IsRunning())
+ return;
+
+ BytesAddedSincePoolHashMix = 0;
+ ReadOffset = 0;
+ WriteOffset = 0;
+ Running = true;
+ EnrichedByUser = false;
+
+ Pool.Allocate (PoolSize);
+ Test();
+
+ if (!PoolHash)
+ {
+ // First hash algorithm is the default one
+ PoolHash = Hash::GetAvailableAlgorithms().front();
+ }
+
+ AddSystemDataToPool (true);
+ }
+
+ void RandomNumberGenerator::Stop ()
+ {
+ ScopeLock lock (AccessMutex);
+
+ if (Pool.IsAllocated())
+ Pool.Free ();
+
+ PoolHash.reset();
+
+ EnrichedByUser = false;
+ Running = false;
+ }
+
+ void RandomNumberGenerator::Test ()
+ {
+ shared_ptr <Hash> origPoolHash = PoolHash;
+ PoolHash.reset (new Ripemd160());
+
+ Pool.Zero();
+ Buffer buffer (1);
+ for (size_t i = 0; i < PoolSize * 10; ++i)
+ {
+ buffer[0] = (byte) i;
+ AddToPool (buffer);
+ }
+
+ if (Crc32::ProcessBuffer (Pool) != 0x2de46d17)
+ throw TestFailed (SRC_POS);
+
+ buffer.Allocate (PoolSize);
+ buffer.CopyFrom (PeekPool());
+ AddToPool (buffer);
+
+ if (Crc32::ProcessBuffer (Pool) != 0xcb88e019)
+ throw TestFailed (SRC_POS);
+
+ PoolHash = origPoolHash;
+ }
+
+ Mutex RandomNumberGenerator::AccessMutex;
+ size_t RandomNumberGenerator::BytesAddedSincePoolHashMix;
+ bool RandomNumberGenerator::EnrichedByUser;
+ SecureBuffer RandomNumberGenerator::Pool;
+ shared_ptr <Hash> RandomNumberGenerator::PoolHash;
+ size_t RandomNumberGenerator::ReadOffset;
+ bool RandomNumberGenerator::Running = false;
+ size_t RandomNumberGenerator::WriteOffset;
+}
diff --git a/src/Core/RandomNumberGenerator.h b/src/Core/RandomNumberGenerator.h
new file mode 100644
index 00000000..fb3a6917
--- /dev/null
+++ b/src/Core/RandomNumberGenerator.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_RandomNumberGenerator
+#define TC_HEADER_Core_RandomNumberGenerator
+
+#include "Platform/Platform.h"
+#include "Volume/Hash.h"
+#include "Common/Random.h"
+
+namespace TrueCrypt
+{
+ class RandomNumberGenerator
+ {
+ public:
+ static void AddToPool (const ConstBufferPtr &buffer);
+ static void GetData (const BufferPtr &buffer) { GetData (buffer, false); }
+ static void GetDataFast (const BufferPtr &buffer) { GetData (buffer, true); }
+ static shared_ptr <Hash> GetHash ();
+ static bool IsEnrichedByUser () { return EnrichedByUser; }
+ static bool IsRunning () { return Running; }
+ static ConstBufferPtr PeekPool () { return Pool; }
+ static void SetEnrichedByUserStatus (bool enriched) { EnrichedByUser = enriched; }
+ static void SetHash (shared_ptr <Hash> hash);
+ static void Start ();
+ static void Stop ();
+
+ static const size_t PoolSize = RNG_POOL_SIZE;
+
+ protected:
+ static void AddSystemDataToPool (bool fast);
+ static void GetData (const BufferPtr &buffer, bool fast);
+ static void HashMixPool ();
+ static void Test ();
+ RandomNumberGenerator ();
+
+ static const size_t MaxBytesAddedBeforePoolHashMix = RANDMIX_BYTE_INTERVAL;
+
+ static Mutex AccessMutex;
+ static size_t BytesAddedSincePoolHashMix;
+ static bool EnrichedByUser;
+ static SecureBuffer Pool;
+ static shared_ptr <Hash> PoolHash;
+ static size_t ReadOffset;
+ static bool Running;
+ static size_t WriteOffset;
+ };
+}
+
+#endif // TC_HEADER_Core_RandomNumberGenerator
diff --git a/src/Core/Unix/CoreService.cpp b/src/Core/Unix/CoreService.cpp
new file mode 100644
index 00000000..0ec636c7
--- /dev/null
+++ b/src/Core/Unix/CoreService.cpp
@@ -0,0 +1,544 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "CoreService.h"
+#include <fcntl.h>
+#include <sys/wait.h>
+#include "Platform/FileStream.h"
+#include "Platform/MemoryStream.h"
+#include "Platform/Serializable.h"
+#include "Platform/SystemLog.h"
+#include "Platform/Thread.h"
+#include "Platform/Unix/Poller.h"
+#include "Core/Core.h"
+#include "CoreUnix.h"
+#include "CoreServiceRequest.h"
+#include "CoreServiceResponse.h"
+
+namespace TrueCrypt
+{
+ template <class T>
+ auto_ptr <T> CoreService::GetResponse ()
+ {
+ auto_ptr <Serializable> deserializedObject (Serializable::DeserializeNew (ServiceOutputStream));
+
+ Exception *deserializedException = dynamic_cast <Exception*> (deserializedObject.get());
+ if (deserializedException)
+ deserializedException->Throw();
+
+ if (dynamic_cast <T *> (deserializedObject.get()) == nullptr)
+ throw ParameterIncorrect (SRC_POS);
+
+ return auto_ptr <T> (dynamic_cast <T *> (deserializedObject.release()));
+ }
+
+ void CoreService::ProcessElevatedRequests ()
+ {
+ int pid = fork();
+ throw_sys_if (pid == -1);
+ if (pid == 0)
+ {
+ try
+ {
+ int f = open ("/dev/null", 0);
+ throw_sys_sub_if (f == -1, "/dev/null");
+ throw_sys_if (dup2 (f, STDERR_FILENO) == -1);
+
+ // Wait for sync code
+ while (true)
+ {
+ byte b;
+ throw_sys_if (read (STDIN_FILENO, &b, 1) != 1);
+ if (b != 0x00)
+ continue;
+
+ throw_sys_if (read (STDIN_FILENO, &b, 1) != 1);
+ if (b != 0x11)
+ continue;
+
+ throw_sys_if (read (STDIN_FILENO, &b, 1) != 1);
+ if (b == 0x22)
+ break;
+ }
+
+ ElevatedPrivileges = true;
+ ProcessRequests (STDIN_FILENO, STDOUT_FILENO);
+ _exit (0);
+ }
+ catch (exception &e)
+ {
+#ifdef DEBUG
+ SystemLog::WriteException (e);
+#endif
+ }
+ catch (...) { }
+ _exit (1);
+ }
+ }
+
+ void CoreService::ProcessRequests (int inputFD, int outputFD)
+ {
+ try
+ {
+ Core = CoreDirect;
+
+ shared_ptr <Stream> inputStream (new FileStream (inputFD != -1 ? inputFD : InputPipe->GetReadFD()));
+ shared_ptr <Stream> outputStream (new FileStream (outputFD != -1 ? outputFD : OutputPipe->GetWriteFD()));
+
+ while (true)
+ {
+ shared_ptr <CoreServiceRequest> request = Serializable::DeserializeNew <CoreServiceRequest> (inputStream);
+
+ try
+ {
+ // ExitRequest
+ if (dynamic_cast <ExitRequest*> (request.get()) != nullptr)
+ {
+ if (ElevatedServiceAvailable)
+ request->Serialize (ServiceInputStream);
+ return;
+ }
+
+ if (!ElevatedPrivileges && request->ElevateUserPrivileges)
+ {
+ if (!ElevatedServiceAvailable)
+ {
+ finally_do_arg (string *, &request->AdminPassword, { StringConverter::Erase (*finally_arg); });
+
+ CoreService::StartElevated (*request);
+ ElevatedServiceAvailable = true;
+ }
+
+ request->Serialize (ServiceInputStream);
+ GetResponse <Serializable>()->Serialize (outputStream);
+ continue;
+ }
+
+ // CheckFilesystemRequest
+ CheckFilesystemRequest *checkRequest = dynamic_cast <CheckFilesystemRequest*> (request.get());
+ if (checkRequest)
+ {
+ Core->CheckFilesystem (checkRequest->MountedVolumeInfo, checkRequest->Repair);
+
+ CheckFilesystemResponse().Serialize (outputStream);
+ continue;
+ }
+
+ // DismountFilesystemRequest
+ DismountFilesystemRequest *dismountFsRequest = dynamic_cast <DismountFilesystemRequest*> (request.get());
+ if (dismountFsRequest)
+ {
+ Core->DismountFilesystem (dismountFsRequest->MountPoint, dismountFsRequest->Force);
+
+ DismountFilesystemResponse().Serialize (outputStream);
+ continue;
+ }
+
+ // DismountVolumeRequest
+ DismountVolumeRequest *dismountRequest = dynamic_cast <DismountVolumeRequest*> (request.get());
+ if (dismountRequest)
+ {
+ DismountVolumeResponse response;
+ response.DismountedVolumeInfo = Core->DismountVolume (dismountRequest->MountedVolumeInfo, dismountRequest->IgnoreOpenFiles, dismountRequest->SyncVolumeInfo);
+ response.Serialize (outputStream);
+ continue;
+ }
+
+ // GetDeviceSectorSizeRequest
+ GetDeviceSectorSizeRequest *getDeviceSectorSizeRequest = dynamic_cast <GetDeviceSectorSizeRequest*> (request.get());
+ if (getDeviceSectorSizeRequest)
+ {
+ GetDeviceSectorSizeResponse response;
+ response.Size = Core->GetDeviceSectorSize (getDeviceSectorSizeRequest->Path);
+ response.Serialize (outputStream);
+ continue;
+ }
+
+ // GetDeviceSizeRequest
+ GetDeviceSizeRequest *getDeviceSizeRequest = dynamic_cast <GetDeviceSizeRequest*> (request.get());
+ if (getDeviceSizeRequest)
+ {
+ GetDeviceSizeResponse response;
+ response.Size = Core->GetDeviceSize (getDeviceSizeRequest->Path);
+ response.Serialize (outputStream);
+ continue;
+ }
+
+ // GetHostDevicesRequest
+ GetHostDevicesRequest *getHostDevicesRequest = dynamic_cast <GetHostDevicesRequest*> (request.get());
+ if (getHostDevicesRequest)
+ {
+ GetHostDevicesResponse response;
+ response.HostDevices = Core->GetHostDevices (getHostDevicesRequest->PathListOnly);
+ response.Serialize (outputStream);
+ continue;
+ }
+
+ // MountVolumeRequest
+ MountVolumeRequest *mountRequest = dynamic_cast <MountVolumeRequest*> (request.get());
+ if (mountRequest)
+ {
+ MountVolumeResponse (
+ Core->MountVolume (*mountRequest->Options)
+ ).Serialize (outputStream);
+
+ continue;
+ }
+
+ // SetFileOwnerRequest
+ SetFileOwnerRequest *setFileOwnerRequest = dynamic_cast <SetFileOwnerRequest*> (request.get());
+ if (setFileOwnerRequest)
+ {
+ CoreUnix *coreUnix = dynamic_cast <CoreUnix *> (Core.get());
+ if (!coreUnix)
+ throw ParameterIncorrect (SRC_POS);
+
+ coreUnix->SetFileOwner (setFileOwnerRequest->Path, setFileOwnerRequest->Owner);
+ SetFileOwnerResponse().Serialize (outputStream);
+ continue;
+ }
+
+ throw ParameterIncorrect (SRC_POS);
+ }
+ catch (Exception &e)
+ {
+ e.Serialize (outputStream);
+ }
+ catch (exception &e)
+ {
+ ExternalException (SRC_POS, StringConverter::ToExceptionString (e)).Serialize (outputStream);
+ }
+ }
+ }
+ catch (exception &e)
+ {
+#ifdef DEBUG
+ SystemLog::WriteException (e);
+#endif
+ throw;
+ }
+ }
+
+ void CoreService::RequestCheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair)
+ {
+ CheckFilesystemRequest request (mountedVolume, repair);
+ SendRequest <CheckFilesystemResponse> (request);
+ }
+
+ void CoreService::RequestDismountFilesystem (const DirectoryPath &mountPoint, bool force)
+ {
+ DismountFilesystemRequest request (mountPoint, force);
+ SendRequest <DismountFilesystemResponse> (request);
+ }
+
+ shared_ptr <VolumeInfo> CoreService::RequestDismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles, bool syncVolumeInfo)
+ {
+ DismountVolumeRequest request (mountedVolume, ignoreOpenFiles, syncVolumeInfo);
+ return SendRequest <DismountVolumeResponse> (request)->DismountedVolumeInfo;
+ }
+
+ uint32 CoreService::RequestGetDeviceSectorSize (const DevicePath &devicePath)
+ {
+ GetDeviceSectorSizeRequest request (devicePath);
+ return SendRequest <GetDeviceSectorSizeResponse> (request)->Size;
+ }
+
+ uint64 CoreService::RequestGetDeviceSize (const DevicePath &devicePath)
+ {
+ GetDeviceSizeRequest request (devicePath);
+ return SendRequest <GetDeviceSizeResponse> (request)->Size;
+ }
+
+ HostDeviceList CoreService::RequestGetHostDevices (bool pathListOnly)
+ {
+ GetHostDevicesRequest request (pathListOnly);
+ return SendRequest <GetHostDevicesResponse> (request)->HostDevices;
+ }
+
+ shared_ptr <VolumeInfo> CoreService::RequestMountVolume (MountOptions &options)
+ {
+ MountVolumeRequest request (&options);
+ return SendRequest <MountVolumeResponse> (request)->MountedVolumeInfo;
+ }
+
+ void CoreService::RequestSetFileOwner (const FilesystemPath &path, const UserId &owner)
+ {
+ SetFileOwnerRequest request (path, owner);
+ SendRequest <SetFileOwnerResponse> (request);
+ }
+
+ template <class T>
+ auto_ptr <T> CoreService::SendRequest (CoreServiceRequest &request)
+ {
+ static Mutex mutex;
+ ScopeLock lock (mutex);
+
+ if (request.RequiresElevation())
+ {
+ request.ElevateUserPrivileges = true;
+ request.FastElevation = !ElevatedServiceAvailable;
+ request.ApplicationExecutablePath = Core->GetApplicationExecutablePath();
+
+ while (!ElevatedServiceAvailable)
+ {
+ try
+ {
+ request.Serialize (ServiceInputStream);
+ auto_ptr <T> response (GetResponse <T>());
+ ElevatedServiceAvailable = true;
+ return response;
+ }
+ catch (ElevationFailed &e)
+ {
+ if (!request.FastElevation)
+ {
+ ExceptionEventArgs args (e);
+ Core->WarningEvent.Raise (args);
+ }
+
+ request.FastElevation = false;
+ (*AdminPasswordCallback) (request.AdminPassword);
+ }
+ }
+ }
+
+ finally_do_arg (string *, &request.AdminPassword, { StringConverter::Erase (*finally_arg); });
+
+ request.Serialize (ServiceInputStream);
+ return GetResponse <T>();
+ }
+
+ void CoreService::Start ()
+ {
+ InputPipe.reset (new Pipe());
+ OutputPipe.reset (new Pipe());
+
+ int pid = fork();
+ throw_sys_if (pid == -1);
+
+ if (pid == 0)
+ {
+ try
+ {
+ ProcessRequests();
+ _exit (0);
+ }
+ catch (...) { }
+ _exit (1);
+ }
+
+ ServiceInputStream = shared_ptr <Stream> (new FileStream (InputPipe->GetWriteFD()));
+ ServiceOutputStream = shared_ptr <Stream> (new FileStream (OutputPipe->GetReadFD()));
+ }
+
+ void CoreService::StartElevated (const CoreServiceRequest &request)
+ {
+ auto_ptr <Pipe> inPipe (new Pipe());
+ auto_ptr <Pipe> outPipe (new Pipe());
+ Pipe errPipe;
+
+ int forkedPid = fork();
+ throw_sys_if (forkedPid == -1);
+
+ if (forkedPid == 0)
+ {
+ try
+ {
+ try
+ {
+ throw_sys_if (dup2 (inPipe->GetReadFD(), STDIN_FILENO) == -1);
+ throw_sys_if (dup2 (outPipe->GetWriteFD(), STDOUT_FILENO) == -1);
+ throw_sys_if (dup2 (errPipe.GetWriteFD(), STDERR_FILENO) == -1);
+
+ string appPath = request.ApplicationExecutablePath;
+ if (appPath.empty())
+ appPath = "truecrypt";
+
+ const char *args[] = { "sudo", "-S", "-p", "", appPath.c_str(), TC_CORE_SERVICE_CMDLINE_OPTION, nullptr };
+ execvp (args[0], ((char* const*) args));
+ throw SystemException (SRC_POS, args[0]);
+ }
+ catch (Exception &)
+ {
+ throw;
+ }
+ catch (exception &e)
+ {
+ throw ExternalException (SRC_POS, StringConverter::ToExceptionString (e));
+ }
+ catch (...)
+ {
+ throw UnknownException (SRC_POS);
+ }
+ }
+ catch (Exception &e)
+ {
+ try
+ {
+ shared_ptr <Stream> outputStream (new FileStream (errPipe.GetWriteFD()));
+ e.Serialize (outputStream);
+ }
+ catch (...) { }
+ }
+
+ _exit (1);
+ }
+
+ vector <char> adminPassword (request.AdminPassword.size() + 1);
+ int timeout = 6000;
+
+ if (request.FastElevation)
+ {
+ string dummyPassword = "dummy\n";
+ adminPassword = vector <char> (dummyPassword.size());
+ Memory::Copy (&adminPassword.front(), dummyPassword.c_str(), dummyPassword.size());
+ timeout = 1000;
+ }
+ else
+ {
+ Memory::Copy (&adminPassword.front(), request.AdminPassword.c_str(), request.AdminPassword.size());
+ adminPassword[request.AdminPassword.size()] = '\n';
+ }
+
+ if (write (inPipe->GetWriteFD(), &adminPassword.front(), adminPassword.size())) { } // Errors ignored
+
+ Memory::Erase (&adminPassword.front(), adminPassword.size());
+
+ throw_sys_if (fcntl (outPipe->GetReadFD(), F_SETFL, O_NONBLOCK) == -1);
+ throw_sys_if (fcntl (errPipe.GetReadFD(), F_SETFL, O_NONBLOCK) == -1);
+
+ vector <char> buffer (4096), errOutput (4096);
+ buffer.clear ();
+ errOutput.clear ();
+
+ Poller poller (outPipe->GetReadFD(), errPipe.GetReadFD());
+ int status, waitRes;
+ int exitCode = 1;
+
+ try
+ {
+ do
+ {
+ ssize_t bytesRead = 0;
+ foreach (int fd, poller.WaitForData (timeout))
+ {
+ bytesRead = read (fd, &buffer[0], buffer.capacity());
+ if (bytesRead > 0 && fd == errPipe.GetReadFD())
+ {
+ errOutput.insert (errOutput.end(), buffer.begin(), buffer.begin() + bytesRead);
+
+ if (bytesRead > 5 && bytesRead < 80) // Short message captured
+ timeout = 200;
+ }
+ }
+
+ if (bytesRead == 0)
+ {
+ waitRes = waitpid (forkedPid, &status, 0);
+ break;
+ }
+
+ } while ((waitRes = waitpid (forkedPid, &status, WNOHANG)) == 0);
+ }
+ catch (TimeOut&)
+ {
+ if ((waitRes = waitpid (forkedPid, &status, WNOHANG)) == 0)
+ {
+ inPipe->Close();
+ outPipe->Close();
+ errPipe.Close();
+
+ if (request.FastElevation)
+ {
+ // Prevent defunct process
+ struct WaitFunctor : public Functor
+ {
+ WaitFunctor (int pid) : Pid (pid) { }
+ virtual void operator() ()
+ {
+ int status;
+ for (int t = 0; t < 10 && waitpid (Pid, &status, WNOHANG) == 0; t++)
+ Thread::Sleep (1000);
+ }
+ int Pid;
+ };
+ Thread thread;
+ thread.Start (new WaitFunctor (forkedPid));
+
+ throw ElevationFailed (SRC_POS, "sudo", 1, "");
+ }
+
+ waitRes = waitpid (forkedPid, &status, 0);
+ }
+ }
+
+ if (!errOutput.empty())
+ {
+ auto_ptr <Serializable> deserializedObject;
+ Exception *deserializedException = nullptr;
+
+ try
+ {
+ shared_ptr <Stream> stream (new MemoryStream (ConstBufferPtr ((byte *) &errOutput[0], errOutput.size())));
+ deserializedObject.reset (Serializable::DeserializeNew (stream));
+ deserializedException = dynamic_cast <Exception*> (deserializedObject.get());
+ }
+ catch (...) { }
+
+ if (deserializedException)
+ deserializedException->Throw();
+ }
+
+ throw_sys_if (waitRes == -1);
+ exitCode = (WIFEXITED (status) ? WEXITSTATUS (status) : 1);
+ if (exitCode != 0)
+ {
+ string strErrOutput;
+
+ if (!errOutput.empty())
+ strErrOutput.insert (strErrOutput.begin(), errOutput.begin(), errOutput.end());
+
+ // sudo may require a tty even if -S is used
+ if (strErrOutput.find (" tty") != string::npos)
+ strErrOutput += "\nTo enable use of 'sudo' by applications without a terminal window, please disable 'requiretty' option in '/etc/sudoers'. Newer versions of sudo automatically determine whether a terminal is required ('requiretty' option is obsolete).";
+
+ throw ElevationFailed (SRC_POS, "sudo", exitCode, strErrOutput);
+ }
+
+ throw_sys_if (fcntl (outPipe->GetReadFD(), F_SETFL, 0) == -1);
+
+ ServiceInputStream = shared_ptr <Stream> (new FileStream (inPipe->GetWriteFD()));
+ ServiceOutputStream = shared_ptr <Stream> (new FileStream (outPipe->GetReadFD()));
+
+ // Send sync code
+ byte sync[] = { 0, 0x11, 0x22 };
+ ServiceInputStream->Write (ConstBufferPtr (sync, array_capacity (sync)));
+
+ AdminInputPipe = inPipe;
+ AdminOutputPipe = outPipe;
+ }
+
+ void CoreService::Stop ()
+ {
+ ExitRequest exitRequest;
+ exitRequest.Serialize (ServiceInputStream);
+ }
+
+ shared_ptr <GetStringFunctor> CoreService::AdminPasswordCallback;
+
+ auto_ptr <Pipe> CoreService::AdminInputPipe;
+ auto_ptr <Pipe> CoreService::AdminOutputPipe;
+
+ auto_ptr <Pipe> CoreService::InputPipe;
+ auto_ptr <Pipe> CoreService::OutputPipe;
+ shared_ptr <Stream> CoreService::ServiceInputStream;
+ shared_ptr <Stream> CoreService::ServiceOutputStream;
+
+ bool CoreService::ElevatedPrivileges = false;
+ bool CoreService::ElevatedServiceAvailable = false;
+}
diff --git a/src/Core/Unix/CoreService.h b/src/Core/Unix/CoreService.h
new file mode 100644
index 00000000..9702dc7e
--- /dev/null
+++ b/src/Core/Unix/CoreService.h
@@ -0,0 +1,63 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_Unix_CoreService
+#define TC_HEADER_Core_Unix_CoreService
+
+#include "CoreServiceRequest.h"
+#include "Platform/Stream.h"
+#include "Platform/Unix/Pipe.h"
+#include "Core/Core.h"
+
+namespace TrueCrypt
+{
+ // This service facilitates process forking and elevation of user privileges
+ class CoreService
+ {
+ public:
+ static void ProcessElevatedRequests ();
+ static void ProcessRequests (int inputFD = -1, int outputFD = -1);
+ static void RequestCheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair);
+ static void RequestDismountFilesystem (const DirectoryPath &mountPoint, bool force);
+ static shared_ptr <VolumeInfo> RequestDismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles = false, bool syncVolumeInfo = false);
+ static uint32 RequestGetDeviceSectorSize (const DevicePath &devicePath);
+ static uint64 RequestGetDeviceSize (const DevicePath &devicePath);
+ static HostDeviceList RequestGetHostDevices (bool pathListOnly);
+ static shared_ptr <VolumeInfo> RequestMountVolume (MountOptions &options);
+ static void RequestSetFileOwner (const FilesystemPath &path, const UserId &owner);
+ static void SetAdminPasswordCallback (shared_ptr <GetStringFunctor> functor) { AdminPasswordCallback = functor; }
+ static void Start ();
+ static void Stop ();
+
+ protected:
+ template <class T> static auto_ptr <T> GetResponse ();
+ template <class T> static auto_ptr <T> SendRequest (CoreServiceRequest &request);
+ static void StartElevated (const CoreServiceRequest &request);
+
+ static shared_ptr <GetStringFunctor> AdminPasswordCallback;
+
+ static auto_ptr <Pipe> AdminInputPipe;
+ static auto_ptr <Pipe> AdminOutputPipe;
+
+ static auto_ptr <Pipe> InputPipe;
+ static auto_ptr <Pipe> OutputPipe;
+ static shared_ptr <Stream> ServiceInputStream;
+ static shared_ptr <Stream> ServiceOutputStream;
+
+ static bool ElevatedPrivileges;
+ static bool ElevatedServiceAvailable;
+ static bool Running;
+
+ private:
+ CoreService ();
+ };
+
+#define TC_CORE_SERVICE_CMDLINE_OPTION "--core-service"
+}
+
+#endif // TC_HEADER_Core_Unix_CoreService
diff --git a/src/Core/Unix/CoreServiceProxy.h b/src/Core/Unix/CoreServiceProxy.h
new file mode 100644
index 00000000..2a264617
--- /dev/null
+++ b/src/Core/Unix/CoreServiceProxy.h
@@ -0,0 +1,152 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_Windows_CoreServiceProxy
+#define TC_HEADER_Core_Windows_CoreServiceProxy
+
+#include "CoreService.h"
+#include "Volume/VolumePasswordCache.h"
+
+namespace TrueCrypt
+{
+ template <class T>
+ class CoreServiceProxy : public T
+ {
+ public:
+ CoreServiceProxy () { }
+ virtual ~CoreServiceProxy () { }
+
+ virtual void CheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair) const
+ {
+ CoreService::RequestCheckFilesystem (mountedVolume, repair);
+ }
+
+ virtual void DismountFilesystem (const DirectoryPath &mountPoint, bool force) const
+ {
+ CoreService::RequestDismountFilesystem (mountPoint, force);
+ }
+
+ virtual shared_ptr <VolumeInfo> DismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles = false, bool syncVolumeInfo = false)
+ {
+ shared_ptr <VolumeInfo> dismountedVolumeInfo = CoreService::RequestDismountVolume (mountedVolume, ignoreOpenFiles, syncVolumeInfo);
+
+ VolumeEventArgs eventArgs (dismountedVolumeInfo);
+ T::VolumeDismountedEvent.Raise (eventArgs);
+
+ return dismountedVolumeInfo;
+ }
+
+ virtual uint32 GetDeviceSectorSize (const DevicePath &devicePath) const
+ {
+ return CoreService::RequestGetDeviceSectorSize (devicePath);
+ }
+
+ virtual uint64 GetDeviceSize (const DevicePath &devicePath) const
+ {
+ return CoreService::RequestGetDeviceSize (devicePath);
+ }
+
+#ifndef TC_LINUX
+ virtual HostDeviceList GetHostDevices (bool pathListOnly = false) const
+ {
+ if (pathListOnly)
+ return T::GetHostDevices (pathListOnly);
+ else
+ return CoreService::RequestGetHostDevices (pathListOnly);
+ }
+#endif
+ virtual bool IsPasswordCacheEmpty () const { return VolumePasswordCache::IsEmpty(); }
+
+ virtual shared_ptr <VolumeInfo> MountVolume (MountOptions &options)
+ {
+ shared_ptr <VolumeInfo> mountedVolume;
+
+ if (!VolumePasswordCache::IsEmpty()
+ && (!options.Password || options.Password->IsEmpty())
+ && (!options.Keyfiles || options.Keyfiles->empty()))
+ {
+ finally_do_arg (MountOptions*, &options, { if (finally_arg->Password) finally_arg->Password.reset(); });
+
+ PasswordIncorrect passwordException;
+ foreach (shared_ptr <VolumePassword> password, VolumePasswordCache::GetPasswords())
+ {
+ try
+ {
+ options.Password = password;
+ mountedVolume = CoreService::RequestMountVolume (options);
+ break;
+ }
+ catch (PasswordIncorrect &e)
+ {
+ passwordException = e;
+ }
+ }
+
+ if (!mountedVolume)
+ passwordException.Throw();
+ }
+ else
+ {
+ MountOptions newOptions = options;
+
+ newOptions.Password = Keyfile::ApplyListToPassword (options.Keyfiles, options.Password);
+ if (newOptions.Keyfiles)
+ newOptions.Keyfiles->clear();
+
+ newOptions.ProtectionPassword = Keyfile::ApplyListToPassword (options.ProtectionKeyfiles, options.ProtectionPassword);
+ if (newOptions.ProtectionKeyfiles)
+ newOptions.ProtectionKeyfiles->clear();
+
+ try
+ {
+ mountedVolume = CoreService::RequestMountVolume (newOptions);
+ }
+ catch (ProtectionPasswordIncorrect &e)
+ {
+ if (options.ProtectionKeyfiles && !options.ProtectionKeyfiles->empty())
+ throw ProtectionPasswordKeyfilesIncorrect (e.what());
+ throw;
+ }
+ catch (PasswordIncorrect &e)
+ {
+ if (options.Keyfiles && !options.Keyfiles->empty())
+ throw PasswordKeyfilesIncorrect (e.what());
+ throw;
+ }
+
+ if (options.CachePassword
+ && ((options.Password && !options.Password->IsEmpty()) || (options.Keyfiles && !options.Keyfiles->empty())))
+ {
+ VolumePasswordCache::Store (*Keyfile::ApplyListToPassword (options.Keyfiles, options.Password));
+ }
+ }
+
+ VolumeEventArgs eventArgs (mountedVolume);
+ T::VolumeMountedEvent.Raise (eventArgs);
+
+ return mountedVolume;
+ }
+
+ virtual void SetAdminPasswordCallback (shared_ptr <GetStringFunctor> functor)
+ {
+ CoreService::SetAdminPasswordCallback (functor);
+ }
+
+ virtual void SetFileOwner (const FilesystemPath &path, const UserId &owner) const
+ {
+ CoreService::RequestSetFileOwner (path, owner);
+ }
+
+ virtual void WipePasswordCache () const
+ {
+ VolumePasswordCache::Clear();
+ }
+ };
+}
+
+#endif // TC_HEADER_Core_Windows_CoreServiceProxy
diff --git a/src/Core/Unix/CoreServiceRequest.cpp b/src/Core/Unix/CoreServiceRequest.cpp
new file mode 100644
index 00000000..49ee8418
--- /dev/null
+++ b/src/Core/Unix/CoreServiceRequest.cpp
@@ -0,0 +1,269 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include <errno.h>
+#include "CoreServiceRequest.h"
+#include "Platform/SerializerFactory.h"
+
+namespace TrueCrypt
+{
+ void CoreServiceRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ Serializer sr (stream);
+ sr.Deserialize ("AdminPassword", AdminPassword);
+ ApplicationExecutablePath = sr.DeserializeWString ("ApplicationExecutablePath");
+ sr.Deserialize ("ElevateUserPrivileges", ElevateUserPrivileges);
+ sr.Deserialize ("FastElevation", FastElevation);
+ }
+
+ void CoreServiceRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("AdminPassword", AdminPassword);
+ sr.Serialize ("ApplicationExecutablePath", wstring (ApplicationExecutablePath));
+ sr.Serialize ("ElevateUserPrivileges", ElevateUserPrivileges);
+ sr.Serialize ("FastElevation", FastElevation);
+ }
+
+ // CheckFilesystemRequest
+ void CheckFilesystemRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+ MountedVolumeInfo = Serializable::DeserializeNew <VolumeInfo> (stream);
+ sr.Deserialize ("Repair", Repair);
+ }
+
+ bool CheckFilesystemRequest::RequiresElevation () const
+ {
+#ifdef TC_MACOSX
+ return false;
+#endif
+ return !Core->HasAdminPrivileges();
+ }
+
+ void CheckFilesystemRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+ MountedVolumeInfo->Serialize (stream);
+ sr.Serialize ("Repair", Repair);
+ }
+
+ // DismountFilesystemRequest
+ void DismountFilesystemRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+ sr.Deserialize ("Force", Force);
+ MountPoint = sr.DeserializeWString ("MountPoint");
+ }
+
+ bool DismountFilesystemRequest::RequiresElevation () const
+ {
+ return !Core->HasAdminPrivileges();
+ }
+
+ void DismountFilesystemRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("Force", Force);
+ sr.Serialize ("MountPoint", wstring (MountPoint));
+ }
+
+ // DismountVolumeRequest
+ void DismountVolumeRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+ sr.Deserialize ("IgnoreOpenFiles", IgnoreOpenFiles);
+ sr.Deserialize ("SyncVolumeInfo", SyncVolumeInfo);
+ MountedVolumeInfo = Serializable::DeserializeNew <VolumeInfo> (stream);
+ }
+
+ bool DismountVolumeRequest::RequiresElevation () const
+ {
+#ifdef TC_MACOSX
+ if (MountedVolumeInfo->Path.IsDevice())
+ {
+ try
+ {
+ File file;
+ file.Open (MountedVolumeInfo->Path, File::OpenReadWrite);
+ }
+ catch (...)
+ {
+ return true;
+ }
+ }
+
+ return false;
+#endif
+ return !Core->HasAdminPrivileges();
+ }
+
+ void DismountVolumeRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("IgnoreOpenFiles", IgnoreOpenFiles);
+ sr.Serialize ("SyncVolumeInfo", SyncVolumeInfo);
+ MountedVolumeInfo->Serialize (stream);
+ }
+
+ // GetDeviceSectorSizeRequest
+ void GetDeviceSectorSizeRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+ Path = sr.DeserializeWString ("Path");
+ }
+
+ bool GetDeviceSectorSizeRequest::RequiresElevation () const
+ {
+ return !Core->HasAdminPrivileges();
+ }
+
+ void GetDeviceSectorSizeRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("Path", wstring (Path));
+ }
+
+ // GetDeviceSizeRequest
+ void GetDeviceSizeRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+ Path = sr.DeserializeWString ("Path");
+ }
+
+ bool GetDeviceSizeRequest::RequiresElevation () const
+ {
+ return !Core->HasAdminPrivileges();
+ }
+
+ void GetDeviceSizeRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("Path", wstring (Path));
+ }
+
+ // GetHostDevicesRequest
+ void GetHostDevicesRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+ sr.Deserialize ("PathListOnly", PathListOnly);
+ }
+
+ bool GetHostDevicesRequest::RequiresElevation () const
+ {
+ return !Core->HasAdminPrivileges();
+ }
+
+ void GetHostDevicesRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("PathListOnly", PathListOnly);
+ }
+
+ // ExitRequest
+ void ExitRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ }
+
+ void ExitRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ }
+
+ // MountVolumeRequest
+ void MountVolumeRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+ DeserializedOptions = Serializable::DeserializeNew <MountOptions> (stream);
+ Options = DeserializedOptions.get();
+ }
+
+ bool MountVolumeRequest::RequiresElevation () const
+ {
+#ifdef TC_MACOSX
+ if (Options->Path->IsDevice())
+ {
+ try
+ {
+ File file;
+ file.Open (*Options->Path, File::OpenReadWrite);
+ }
+ catch (...)
+ {
+ return true;
+ }
+ }
+
+ return false;
+#endif
+ return !Core->HasAdminPrivileges();
+ }
+
+ void MountVolumeRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+ Options->Serialize (stream);
+ }
+
+ // SetFileOwnerRequest
+ void SetFileOwnerRequest::Deserialize (shared_ptr <Stream> stream)
+ {
+ CoreServiceRequest::Deserialize (stream);
+ Serializer sr (stream);
+
+ uint64 owner;
+ sr.Deserialize ("Owner", owner);
+ Owner.SystemId = static_cast <uid_t> (owner);
+
+ Path = sr.DeserializeWString ("Path");
+ }
+
+ bool SetFileOwnerRequest::RequiresElevation () const
+ {
+ return !Core->HasAdminPrivileges();
+ }
+
+ void SetFileOwnerRequest::Serialize (shared_ptr <Stream> stream) const
+ {
+ CoreServiceRequest::Serialize (stream);
+ Serializer sr (stream);
+
+ uint64 owner = Owner.SystemId;
+ sr.Serialize ("Owner", owner);
+
+ sr.Serialize ("Path", wstring (Path));
+ }
+
+
+ TC_SERIALIZER_FACTORY_ADD_CLASS (CoreServiceRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (CheckFilesystemRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (DismountFilesystemRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (DismountVolumeRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (ExitRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (GetDeviceSectorSizeRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (GetDeviceSizeRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (GetHostDevicesRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (MountVolumeRequest);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (SetFileOwnerRequest);
+}
diff --git a/src/Core/Unix/CoreServiceRequest.h b/src/Core/Unix/CoreServiceRequest.h
new file mode 100644
index 00000000..030ac81b
--- /dev/null
+++ b/src/Core/Unix/CoreServiceRequest.h
@@ -0,0 +1,136 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_Unix_CoreServiceRequest
+#define TC_HEADER_Core_Unix_CoreServiceRequest
+
+#include "Platform/Serializable.h"
+#include "Core/Core.h"
+
+namespace TrueCrypt
+{
+ struct CoreServiceRequest : public Serializable
+ {
+ CoreServiceRequest () : ElevateUserPrivileges (false), FastElevation (false) { }
+ TC_SERIALIZABLE (CoreServiceRequest);
+
+ virtual bool RequiresElevation () const { return false; }
+
+ string AdminPassword;
+ FilePath ApplicationExecutablePath;
+ bool ElevateUserPrivileges;
+ bool FastElevation;
+ };
+
+ struct CheckFilesystemRequest : CoreServiceRequest
+ {
+ CheckFilesystemRequest () { }
+ CheckFilesystemRequest (shared_ptr <VolumeInfo> volumeInfo, bool repair)
+ : MountedVolumeInfo (volumeInfo), Repair (repair) { }
+ TC_SERIALIZABLE (CheckFilesystemRequest);
+
+ virtual bool RequiresElevation () const;
+
+ shared_ptr <VolumeInfo> MountedVolumeInfo;
+ bool Repair;
+ };
+
+ struct DismountFilesystemRequest : CoreServiceRequest
+ {
+ DismountFilesystemRequest () { }
+ DismountFilesystemRequest (const DirectoryPath &mountPoint, bool force)
+ : Force (force), MountPoint (mountPoint) { }
+ TC_SERIALIZABLE (DismountFilesystemRequest);
+
+ virtual bool RequiresElevation () const;
+
+ bool Force;
+ DirectoryPath MountPoint;
+ };
+
+ struct DismountVolumeRequest : CoreServiceRequest
+ {
+ DismountVolumeRequest () { }
+ DismountVolumeRequest (shared_ptr <VolumeInfo> volumeInfo, bool ignoreOpenFiles, bool syncVolumeInfo)
+ : IgnoreOpenFiles (ignoreOpenFiles), MountedVolumeInfo (volumeInfo), SyncVolumeInfo (syncVolumeInfo) { }
+ TC_SERIALIZABLE (DismountVolumeRequest);
+
+ virtual bool RequiresElevation () const;
+
+ bool IgnoreOpenFiles;
+ shared_ptr <VolumeInfo> MountedVolumeInfo;
+ bool SyncVolumeInfo;
+ };
+
+ struct GetDeviceSectorSizeRequest : CoreServiceRequest
+ {
+ GetDeviceSectorSizeRequest () { }
+ GetDeviceSectorSizeRequest (const DevicePath &path) : Path (path) { }
+ TC_SERIALIZABLE (GetDeviceSectorSizeRequest);
+
+ virtual bool RequiresElevation () const;
+
+ DevicePath Path;
+ };
+
+ struct GetDeviceSizeRequest : CoreServiceRequest
+ {
+ GetDeviceSizeRequest () { }
+ GetDeviceSizeRequest (const DevicePath &path) : Path (path) { }
+ TC_SERIALIZABLE (GetDeviceSizeRequest);
+
+ virtual bool RequiresElevation () const;
+
+ DevicePath Path;
+ };
+
+ struct GetHostDevicesRequest : CoreServiceRequest
+ {
+ GetHostDevicesRequest () { }
+ GetHostDevicesRequest (bool pathListOnly) : PathListOnly (pathListOnly) { }
+ TC_SERIALIZABLE (GetHostDevicesRequest);
+
+ virtual bool RequiresElevation () const;
+
+ bool PathListOnly;
+ };
+
+ struct ExitRequest : CoreServiceRequest
+ {
+ TC_SERIALIZABLE (ExitRequest);
+ };
+
+ struct MountVolumeRequest : CoreServiceRequest
+ {
+ MountVolumeRequest () { }
+ MountVolumeRequest (MountOptions *options) : Options (options) { }
+ TC_SERIALIZABLE (MountVolumeRequest);
+
+ virtual bool RequiresElevation () const;
+
+ MountOptions *Options;
+
+ protected:
+ shared_ptr <MountOptions> DeserializedOptions;
+ };
+
+
+ struct SetFileOwnerRequest : CoreServiceRequest
+ {
+ SetFileOwnerRequest () { }
+ SetFileOwnerRequest (const FilesystemPath &path, const UserId &owner) : Owner (owner), Path (path) { }
+ TC_SERIALIZABLE (SetFileOwnerRequest);
+
+ virtual bool RequiresElevation () const;
+
+ UserId Owner;
+ FilesystemPath Path;
+ };
+}
+
+#endif // TC_HEADER_Core_Unix_CoreServiceRequest
diff --git a/src/Core/Unix/CoreServiceResponse.cpp b/src/Core/Unix/CoreServiceResponse.cpp
new file mode 100644
index 00000000..7809b448
--- /dev/null
+++ b/src/Core/Unix/CoreServiceResponse.cpp
@@ -0,0 +1,119 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "CoreServiceResponse.h"
+#include "Platform/SerializerFactory.h"
+
+namespace TrueCrypt
+{
+ // CheckFilesystemResponse
+ void CheckFilesystemResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ }
+
+ void CheckFilesystemResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ }
+
+ // DismountFilesystemResponse
+ void DismountFilesystemResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ }
+
+ void DismountFilesystemResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ }
+
+ // DismountVolumeResponse
+ void DismountVolumeResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ DismountedVolumeInfo = Serializable::DeserializeNew <VolumeInfo> (stream);
+ }
+
+ void DismountVolumeResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializer sr (stream);
+ DismountedVolumeInfo->Serialize (stream);
+ }
+
+ // GetDeviceSectorSizeResponse
+ void GetDeviceSectorSizeResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ Serializer sr (stream);
+ sr.Deserialize ("Size", Size);
+ }
+
+ void GetDeviceSectorSizeResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("Size", Size);
+ }
+
+ // GetDeviceSizeResponse
+ void GetDeviceSizeResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ Serializer sr (stream);
+ sr.Deserialize ("Size", Size);
+ }
+
+ void GetDeviceSizeResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializer sr (stream);
+ sr.Serialize ("Size", Size);
+ }
+
+ // GetHostDevicesResponse
+ void GetHostDevicesResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ Serializable::DeserializeList (stream, HostDevices);
+ }
+
+ void GetHostDevicesResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializable::SerializeList (stream, HostDevices);
+ }
+
+ // MountVolumeResponse
+ void MountVolumeResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ Serializer sr (stream);
+ MountedVolumeInfo = Serializable::DeserializeNew <VolumeInfo> (stream);
+ }
+
+ void MountVolumeResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ Serializer sr (stream);
+ MountedVolumeInfo->Serialize (stream);
+ }
+
+ // SetFileOwnerResponse
+ void SetFileOwnerResponse::Deserialize (shared_ptr <Stream> stream)
+ {
+ }
+
+ void SetFileOwnerResponse::Serialize (shared_ptr <Stream> stream) const
+ {
+ Serializable::Serialize (stream);
+ }
+
+ TC_SERIALIZER_FACTORY_ADD_CLASS (CheckFilesystemResponse);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (DismountFilesystemResponse);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (DismountVolumeResponse);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (GetDeviceSectorSizeResponse);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (GetDeviceSizeResponse);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (GetHostDevicesResponse);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (MountVolumeResponse);
+ TC_SERIALIZER_FACTORY_ADD_CLASS (SetFileOwnerResponse);
+}
diff --git a/src/Core/Unix/CoreServiceResponse.h b/src/Core/Unix/CoreServiceResponse.h
new file mode 100644
index 00000000..24c09b35
--- /dev/null
+++ b/src/Core/Unix/CoreServiceResponse.h
@@ -0,0 +1,84 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_Unix_CoreServiceResponse
+#define TC_HEADER_Core_Unix_CoreServiceResponse
+
+#include "Platform/Serializable.h"
+#include "Core/Core.h"
+
+namespace TrueCrypt
+{
+ struct CoreServiceResponse : public Serializable
+ {
+ };
+
+ struct CheckFilesystemResponse : CoreServiceResponse
+ {
+ CheckFilesystemResponse () { }
+ TC_SERIALIZABLE (CheckFilesystemResponse);
+ };
+
+ struct DismountFilesystemResponse : CoreServiceResponse
+ {
+ DismountFilesystemResponse () { }
+ TC_SERIALIZABLE (DismountFilesystemResponse);
+ };
+
+ struct DismountVolumeResponse : CoreServiceResponse
+ {
+ DismountVolumeResponse () { }
+ TC_SERIALIZABLE (DismountVolumeResponse);
+
+ shared_ptr <VolumeInfo> DismountedVolumeInfo;
+ };
+
+ struct GetDeviceSectorSizeResponse : CoreServiceResponse
+ {
+ GetDeviceSectorSizeResponse () { }
+ GetDeviceSectorSizeResponse (uint32 size) : Size (size) { }
+ TC_SERIALIZABLE (GetDeviceSectorSizeResponse);
+
+ uint32 Size;
+ };
+
+ struct GetDeviceSizeResponse : CoreServiceResponse
+ {
+ GetDeviceSizeResponse () { }
+ GetDeviceSizeResponse (uint64 size) : Size (size) { }
+ TC_SERIALIZABLE (GetDeviceSizeResponse);
+
+ uint64 Size;
+ };
+
+ struct GetHostDevicesResponse : CoreServiceResponse
+ {
+ GetHostDevicesResponse () { }
+ GetHostDevicesResponse (const HostDeviceList &hostDevices) : HostDevices (hostDevices) { }
+ TC_SERIALIZABLE (GetHostDevicesResponse);
+
+ HostDeviceList HostDevices;
+ };
+
+ struct MountVolumeResponse : CoreServiceResponse
+ {
+ MountVolumeResponse () { }
+ MountVolumeResponse (shared_ptr <VolumeInfo> volumeInfo) : MountedVolumeInfo (volumeInfo) { }
+ TC_SERIALIZABLE (MountVolumeResponse);
+
+ shared_ptr <VolumeInfo> MountedVolumeInfo;
+ };
+
+ struct SetFileOwnerResponse : CoreServiceResponse
+ {
+ SetFileOwnerResponse () { }
+ TC_SERIALIZABLE (SetFileOwnerResponse);
+ };
+}
+
+#endif // TC_HEADER_Core_Unix_CoreServiceResponse
diff --git a/src/Core/Unix/CoreUnix.cpp b/src/Core/Unix/CoreUnix.cpp
new file mode 100644
index 00000000..89f34e20
--- /dev/null
+++ b/src/Core/Unix/CoreUnix.cpp
@@ -0,0 +1,618 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "CoreUnix.h"
+#include <errno.h>
+#include <iostream>
+#include <signal.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "Platform/FileStream.h"
+#include "Driver/Fuse/FuseService.h"
+#include "Volume/VolumePasswordCache.h"
+
+namespace TrueCrypt
+{
+ CoreUnix::CoreUnix ()
+ {
+ signal (SIGPIPE, SIG_IGN);
+
+ char *loc = setlocale (LC_ALL, "");
+ if (!loc || string (loc) == "C")
+ setlocale (LC_ALL, "en_US.UTF-8");
+ }
+
+ CoreUnix::~CoreUnix ()
+ {
+ }
+
+ void CoreUnix::CheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair) const
+ {
+ if (!mountedVolume->MountPoint.IsEmpty())
+ DismountFilesystem (mountedVolume->MountPoint, false);
+
+ list <string> args;
+
+ args.push_back ("-T");
+ args.push_back ("fsck");
+
+ args.push_back ("-e");
+
+ string xargs = "fsck ";
+
+#ifdef TC_LINUX
+ if (!repair)
+ xargs += "-n ";
+ else
+ xargs += "-r ";
+#endif
+
+ xargs += string (mountedVolume->VirtualDevice) + "; echo '[Done]'; read W";
+ args.push_back (xargs);
+
+ try
+ {
+ Process::Execute ("xterm", args, 1000);
+ } catch (TimeOut&) { }
+ }
+
+ void CoreUnix::DismountFilesystem (const DirectoryPath &mountPoint, bool force) const
+ {
+ list <string> args;
+
+#ifdef TC_MACOSX
+ if (force)
+ args.push_back ("-f");
+#endif
+ args.push_back ("--");
+ args.push_back (mountPoint);
+
+ Process::Execute ("umount", args);
+ }
+
+ shared_ptr <VolumeInfo> CoreUnix::DismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles, bool syncVolumeInfo)
+ {
+ if (!mountedVolume->MountPoint.IsEmpty())
+ {
+ DismountFilesystem (mountedVolume->MountPoint, ignoreOpenFiles);
+
+ // Delete mount directory if a default path has been used
+ if (string (mountedVolume->MountPoint).find (GetDefaultMountPointPrefix()) == 0)
+ mountedVolume->MountPoint.Delete();
+ }
+
+ try
+ {
+ DismountNativeVolume (mountedVolume);
+ }
+ catch (NotApplicable &) { }
+
+ if (!mountedVolume->LoopDevice.IsEmpty())
+ {
+ try
+ {
+ DetachLoopDevice (mountedVolume->LoopDevice);
+ }
+ catch (ExecutedProcessFailed&) { }
+ }
+
+ if (syncVolumeInfo || mountedVolume->Protection == VolumeProtection::HiddenVolumeReadOnly)
+ {
+ sync();
+ VolumeInfoList ml = GetMountedVolumes (mountedVolume->Path);
+
+ if (ml.size() > 0)
+ mountedVolume = ml.front();
+ }
+
+ list <string> args;
+ args.push_back ("--");
+ args.push_back (mountedVolume->AuxMountPoint);
+
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ Process::Execute ("umount", args);
+ break;
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (t > 10)
+ throw;
+ Thread::Sleep (200);
+ }
+ }
+
+ try
+ {
+ mountedVolume->AuxMountPoint.Delete();
+ }
+ catch (...) { }
+
+ VolumeEventArgs eventArgs (mountedVolume);
+ VolumeDismountedEvent.Raise (eventArgs);
+
+ return mountedVolume;
+ }
+
+ bool CoreUnix::FilesystemSupportsLargeFiles (const FilePath &filePath) const
+ {
+ string path = filePath;
+ size_t pos;
+
+ while ((pos = path.find_last_of ('/')) != string::npos)
+ {
+ path = path.substr (0, pos);
+
+ if (path.empty())
+ break;
+
+ try
+ {
+ MountedFilesystemList filesystems = GetMountedFilesystems (DevicePath(), path);
+ if (!filesystems.empty())
+ {
+ const MountedFilesystem &fs = *filesystems.front();
+
+ if (fs.Type == "fat"
+ || fs.Type == "fat32"
+ || fs.Type == "vfat"
+ || fs.Type == "fatfs"
+ || fs.Type == "msdos"
+ || fs.Type == "msdosfs"
+ || fs.Type == "umsdos"
+ || fs.Type == "dos"
+ || fs.Type == "dosfs"
+ || fs.Type == "pcfs"
+ )
+ {
+ return false;
+ }
+
+ return true;
+ }
+ }
+ catch (...) { }
+ }
+
+ return true; // Prevent errors if the filesystem cannot be identified
+ }
+
+ bool CoreUnix::FilesystemSupportsUnixPermissions (const DevicePath &devicePath) const
+ {
+ File device;
+ device.Open (devicePath);
+
+ Buffer bootSector (device.GetDeviceSectorSize());
+ device.SeekAt (0);
+ device.ReadCompleteBuffer (bootSector);
+
+ byte *b = bootSector.Ptr();
+
+ return memcmp (b + 3, "NTFS", 4) != 0
+ && memcmp (b + 54, "FAT", 3) != 0
+ && memcmp (b + 82, "FAT32", 5) != 0
+ && memcmp (b + 3, "EXFAT", 5) != 0;
+ }
+
+ string CoreUnix::GetDefaultMountPointPrefix () const
+ {
+ const char *envPrefix = getenv ("TRUECRYPT_MOUNT_PREFIX");
+ if (envPrefix && !string (envPrefix).empty())
+ return envPrefix;
+
+ if (FilesystemPath ("/media").IsDirectory())
+ return "/media/truecrypt";
+
+ if (FilesystemPath ("/mnt").IsDirectory())
+ return "/mnt/truecrypt";
+
+ return GetTempDirectory() + "/truecrypt_mnt";
+ }
+
+ uint32 CoreUnix::GetDeviceSectorSize (const DevicePath &devicePath) const
+ {
+ File dev;
+ dev.Open (devicePath);
+ return dev.GetDeviceSectorSize();
+ }
+
+ uint64 CoreUnix::GetDeviceSize (const DevicePath &devicePath) const
+ {
+ File dev;
+ dev.Open (devicePath);
+ return dev.Length();
+ }
+
+ DirectoryPath CoreUnix::GetDeviceMountPoint (const DevicePath &devicePath) const
+ {
+ DevicePath devPath = devicePath;
+#ifdef TC_MACOSX
+ if (string (devPath).find ("/dev/rdisk") != string::npos)
+ devPath = string ("/dev/") + string (devicePath).substr (6);
+#endif
+ MountedFilesystemList mountedFilesystems = GetMountedFilesystems (devPath);
+
+ if (mountedFilesystems.size() < 1)
+ return DirectoryPath();
+
+ return mountedFilesystems.front()->MountPoint;
+ }
+
+ VolumeInfoList CoreUnix::GetMountedVolumes (const VolumePath &volumePath) const
+ {
+ VolumeInfoList volumes;
+
+ foreach_ref (const MountedFilesystem &mf, GetMountedFilesystems ())
+ {
+ if (string (mf.MountPoint).find (GetFuseMountDirPrefix()) == string::npos)
+ continue;
+
+ shared_ptr <VolumeInfo> mountedVol;
+ try
+ {
+ shared_ptr <File> controlFile (new File);
+ controlFile->Open (string (mf.MountPoint) + FuseService::GetControlPath());
+
+ shared_ptr <Stream> controlFileStream (new FileStream (controlFile));
+ mountedVol = Serializable::DeserializeNew <VolumeInfo> (controlFileStream);
+ }
+ catch (...)
+ {
+ continue;
+ }
+
+ if (!volumePath.IsEmpty() && wstring (mountedVol->Path).compare (volumePath) != 0)
+ continue;
+
+ mountedVol->AuxMountPoint = mf.MountPoint;
+
+ if (!mountedVol->VirtualDevice.IsEmpty())
+ {
+ MountedFilesystemList mpl = GetMountedFilesystems (mountedVol->VirtualDevice);
+
+ if (mpl.size() > 0)
+ mountedVol->MountPoint = mpl.front()->MountPoint;
+ }
+
+ volumes.push_back (mountedVol);
+
+ if (!volumePath.IsEmpty())
+ break;
+ }
+
+ return volumes;
+ }
+
+ gid_t CoreUnix::GetRealGroupId () const
+ {
+ const char *env = getenv ("SUDO_GID");
+ if (env)
+ {
+ try
+ {
+ string s (env);
+ return static_cast <gid_t> (StringConverter::ToUInt64 (s));
+ }
+ catch (...) { }
+ }
+
+ return getgid();
+ }
+
+ uid_t CoreUnix::GetRealUserId () const
+ {
+ const char *env = getenv ("SUDO_UID");
+ if (env)
+ {
+ try
+ {
+ string s (env);
+ return static_cast <uid_t> (StringConverter::ToUInt64 (s));
+ }
+ catch (...) { }
+ }
+
+ return getuid();
+ }
+
+ string CoreUnix::GetTempDirectory () const
+ {
+ char *envDir = getenv ("TMPDIR");
+ return envDir ? envDir : "/tmp";
+ }
+
+ bool CoreUnix::IsMountPointAvailable (const DirectoryPath &mountPoint) const
+ {
+ return GetMountedFilesystems (DevicePath(), mountPoint).size() == 0;
+ }
+
+ void CoreUnix::MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const
+ {
+ if (GetMountedFilesystems (DevicePath(), mountPoint).size() > 0)
+ throw MountPointUnavailable (SRC_POS);
+
+ list <string> args;
+ string options;
+
+ if (!filesystemType.empty())
+ {
+#ifdef TC_SOLARIS
+ args.push_back ("-F");
+#else
+ args.push_back ("-t");
+#endif
+ args.push_back (filesystemType);
+ }
+
+ if (readOnly)
+ options = "-oro";
+
+ if (!systemMountOptions.empty())
+ {
+ if (options.empty())
+ options = "-o";
+ else
+ options += ",";
+
+ options += systemMountOptions;
+ }
+
+ if (!options.empty())
+ args.push_back (options);
+
+ args.push_back ("--");
+ args.push_back (devicePath);
+ args.push_back (mountPoint);
+
+ Process::Execute ("mount", args);
+ }
+
+ VolumeSlotNumber CoreUnix::MountPointToSlotNumber (const DirectoryPath &mountPoint) const
+ {
+ string mountPointStr (mountPoint);
+ if (mountPointStr.find (GetDefaultMountPointPrefix()) == 0)
+ {
+ try
+ {
+ return StringConverter::ToUInt32 (StringConverter::GetTrailingNumber (mountPointStr));
+ }
+ catch (...) { }
+ }
+ return GetFirstFreeSlotNumber();
+ }
+
+ shared_ptr <VolumeInfo> CoreUnix::MountVolume (MountOptions &options)
+ {
+ CoalesceSlotNumberAndMountPoint (options);
+
+ if (IsVolumeMounted (*options.Path))
+ throw VolumeAlreadyMounted (SRC_POS);
+
+ Cipher::EnableHwSupport (!options.NoHardwareCrypto);
+
+ shared_ptr <Volume> volume;
+
+ while (true)
+ {
+ try
+ {
+ volume = OpenVolume (
+ options.Path,
+ options.PreserveTimestamps,
+ options.Password,
+ options.Keyfiles,
+ options.Protection,
+ options.ProtectionPassword,
+ options.ProtectionKeyfiles,
+ options.SharedAccessAllowed,
+ VolumeType::Unknown,
+ options.UseBackupHeaders,
+ options.PartitionInSystemEncryptionScope
+ );
+
+ options.Password.reset();
+ }
+ catch (SystemException &e)
+ {
+ if (options.Protection != VolumeProtection::ReadOnly
+ && (e.GetErrorCode() == EROFS || e.GetErrorCode() == EACCES || e.GetErrorCode() == EPERM))
+ {
+ // Read-only filesystem
+ options.Protection = VolumeProtection::ReadOnly;
+ continue;
+ }
+
+ throw;
+ }
+
+ break;
+ }
+
+ if (options.Path->IsDevice())
+ {
+ if (volume->GetFile()->GetDeviceSectorSize() != volume->GetSectorSize())
+ throw ParameterIncorrect (SRC_POS);
+
+#if defined (TC_LINUX)
+ if (volume->GetSectorSize() != TC_SECTOR_SIZE_LEGACY)
+ {
+ if (options.Protection == VolumeProtection::HiddenVolumeReadOnly)
+ throw UnsupportedSectorSizeHiddenVolumeProtection();
+
+ if (options.NoKernelCrypto)
+ throw UnsupportedSectorSizeNoKernelCrypto();
+ }
+#endif
+ }
+
+ // Find a free mount point for FUSE service
+ MountedFilesystemList mountedFilesystems = GetMountedFilesystems ();
+ string fuseMountPoint;
+ for (int i = 1; true; i++)
+ {
+ stringstream path;
+ path << GetTempDirectory() << "/" << GetFuseMountDirPrefix() << i;
+ FilesystemPath fsPath (path.str());
+
+ bool inUse = false;
+
+ foreach_ref (const MountedFilesystem &mf, mountedFilesystems)
+ {
+ if (mf.MountPoint == path.str())
+ {
+ inUse = true;
+ break;
+ }
+ }
+
+ if (!inUse)
+ {
+ try
+ {
+ if (fsPath.IsDirectory())
+ fsPath.Delete();
+
+ throw_sys_sub_if (mkdir (path.str().c_str(), S_IRUSR | S_IXUSR) == -1, path.str());
+
+ fuseMountPoint = fsPath;
+ break;
+ }
+ catch (...)
+ {
+ if (i > 255)
+ throw TemporaryDirectoryFailure (SRC_POS, StringConverter::ToWide (path.str()));
+ }
+ }
+ }
+
+ try
+ {
+ FuseService::Mount (volume, options.SlotNumber, fuseMountPoint);
+ }
+ catch (...)
+ {
+ try
+ {
+ DirectoryPath (fuseMountPoint).Delete();
+ }
+ catch (...) { }
+ throw;
+ }
+
+ try
+ {
+ // Create a mount directory if a default path has been specified
+ bool mountDirCreated = false;
+ string mountPoint;
+ if (!options.NoFilesystem && options.MountPoint)
+ {
+ mountPoint = *options.MountPoint;
+
+#ifndef TC_MACOSX
+ if (mountPoint.find (GetDefaultMountPointPrefix()) == 0 && !options.MountPoint->IsDirectory())
+ {
+ Directory::Create (*options.MountPoint);
+ try
+ {
+ throw_sys_sub_if (chown (mountPoint.c_str(), GetRealUserId(), GetRealGroupId()) == -1, mountPoint);
+ } catch (ParameterIncorrect&) { }
+
+ mountDirCreated = true;
+ }
+#endif
+ }
+
+ try
+ {
+ try
+ {
+ MountVolumeNative (volume, options, fuseMountPoint);
+ }
+ catch (NotApplicable&)
+ {
+ MountAuxVolumeImage (fuseMountPoint, options);
+ }
+ }
+ catch (...)
+ {
+ if (mountDirCreated)
+ remove (mountPoint.c_str());
+ throw;
+ }
+ }
+ catch (...)
+ {
+ try
+ {
+ VolumeInfoList mountedVolumes = GetMountedVolumes (*options.Path);
+ if (mountedVolumes.size() > 0)
+ {
+ shared_ptr <VolumeInfo> mountedVolume (mountedVolumes.front());
+ DismountVolume (mountedVolume);
+ }
+ }
+ catch (...) { }
+ throw;
+ }
+
+ VolumeInfoList mountedVolumes = GetMountedVolumes (*options.Path);
+ if (mountedVolumes.size() != 1)
+ throw ParameterIncorrect (SRC_POS);
+
+ VolumeEventArgs eventArgs (mountedVolumes.front());
+ VolumeMountedEvent.Raise (eventArgs);
+
+ return mountedVolumes.front();
+ }
+
+ void CoreUnix::MountAuxVolumeImage (const DirectoryPath &auxMountPoint, const MountOptions &options) const
+ {
+ DevicePath loopDev = AttachFileToLoopDevice (string (auxMountPoint) + FuseService::GetVolumeImagePath(), options.Protection == VolumeProtection::ReadOnly);
+
+ try
+ {
+ FuseService::SendAuxDeviceInfo (auxMountPoint, loopDev, loopDev);
+ }
+ catch (...)
+ {
+ try
+ {
+ DetachLoopDevice (loopDev);
+ }
+ catch (...) { }
+ throw;
+ }
+
+ if (!options.NoFilesystem && options.MountPoint && !options.MountPoint->IsEmpty())
+ {
+ MountFilesystem (loopDev, *options.MountPoint,
+ StringConverter::ToSingle (options.FilesystemType),
+ options.Protection == VolumeProtection::ReadOnly,
+ StringConverter::ToSingle (options.FilesystemOptions));
+ }
+ }
+
+ void CoreUnix::SetFileOwner (const FilesystemPath &path, const UserId &owner) const
+ {
+ throw_sys_if (chown (string (path).c_str(), owner.SystemId, (gid_t) -1) == -1);
+ }
+
+ DirectoryPath CoreUnix::SlotNumberToMountPoint (VolumeSlotNumber slotNumber) const
+ {
+ if (slotNumber < GetFirstSlotNumber() || slotNumber > GetLastSlotNumber())
+ throw ParameterIncorrect (SRC_POS);
+
+ stringstream s;
+ s << GetDefaultMountPointPrefix() << slotNumber;
+ return s.str();
+ }
+}
diff --git a/src/Core/Unix/CoreUnix.h b/src/Core/Unix/CoreUnix.h
new file mode 100644
index 00000000..1d7152fb
--- /dev/null
+++ b/src/Core/Unix/CoreUnix.h
@@ -0,0 +1,69 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_CoreUnix
+#define TC_HEADER_Core_CoreUnix
+
+#include "System.h"
+#include "Platform/Unix/Process.h"
+#include "Core/CoreBase.h"
+#include "Core/Unix/MountedFilesystem.h"
+
+namespace TrueCrypt
+{
+ class CoreUnix : public CoreBase
+ {
+ public:
+ CoreUnix ();
+ virtual ~CoreUnix ();
+
+ virtual void CheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair = false) const;
+ virtual void DismountFilesystem (const DirectoryPath &mountPoint, bool force) const;
+ virtual shared_ptr <VolumeInfo> DismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles = false, bool syncVolumeInfo = false);
+ virtual bool FilesystemSupportsLargeFiles (const FilePath &filePath) const;
+ virtual DirectoryPath GetDeviceMountPoint (const DevicePath &devicePath) const;
+ virtual uint32 GetDeviceSectorSize (const DevicePath &devicePath) const;
+ virtual uint64 GetDeviceSize (const DevicePath &devicePath) const;
+ virtual int GetOSMajorVersion () const { throw NotApplicable (SRC_POS); }
+ virtual int GetOSMinorVersion () const { throw NotApplicable (SRC_POS); }
+ virtual VolumeInfoList GetMountedVolumes (const VolumePath &volumePath = VolumePath()) const;
+ virtual bool IsDevicePresent (const DevicePath &device) const { throw NotApplicable (SRC_POS); }
+ virtual bool IsInPortableMode () const { return false; }
+ virtual bool IsMountPointAvailable (const DirectoryPath &mountPoint) const;
+ virtual bool IsOSVersion (int major, int minor) const { throw NotApplicable (SRC_POS); }
+ virtual bool IsOSVersionLower (int major, int minor) const { throw NotApplicable (SRC_POS); }
+ virtual bool IsPasswordCacheEmpty () const { throw NotApplicable (SRC_POS); }
+ virtual bool HasAdminPrivileges () const { return getuid() == 0 || geteuid() == 0; }
+ virtual VolumeSlotNumber MountPointToSlotNumber (const DirectoryPath &mountPoint) const;
+ virtual shared_ptr <VolumeInfo> MountVolume (MountOptions &options);
+ virtual void SetFileOwner (const FilesystemPath &path, const UserId &owner) const;
+ virtual DirectoryPath SlotNumberToMountPoint (VolumeSlotNumber slotNumber) const;
+ virtual void WipePasswordCache () const { throw NotApplicable (SRC_POS); }
+
+ protected:
+ virtual DevicePath AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const { throw NotApplicable (SRC_POS); }
+ virtual void DetachLoopDevice (const DevicePath &devicePath) const { throw NotApplicable (SRC_POS); }
+ virtual void DismountNativeVolume (shared_ptr <VolumeInfo> mountedVolume) const { throw NotApplicable (SRC_POS); }
+ virtual bool FilesystemSupportsUnixPermissions (const DevicePath &devicePath) const;
+ virtual string GetDefaultMountPointPrefix () const;
+ virtual string GetFuseMountDirPrefix () const { return ".truecrypt_aux_mnt"; }
+ virtual MountedFilesystemList GetMountedFilesystems (const DevicePath &devicePath = DevicePath(), const DirectoryPath &mountPoint = DirectoryPath()) const = 0;
+ virtual uid_t GetRealUserId () const;
+ virtual gid_t GetRealGroupId () const;
+ virtual string GetTempDirectory () const;
+ virtual void MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const;
+ virtual void MountAuxVolumeImage (const DirectoryPath &auxMountPoint, const MountOptions &options) const;
+ virtual void MountVolumeNative (shared_ptr <Volume> volume, MountOptions &options, const DirectoryPath &auxMountPoint) const { throw NotApplicable (SRC_POS); }
+
+ private:
+ CoreUnix (const CoreUnix &);
+ CoreUnix &operator= (const CoreUnix &);
+ };
+}
+
+#endif // TC_HEADER_Core_CoreUnix
diff --git a/src/Core/Unix/FreeBSD/CoreFreeBSD.cpp b/src/Core/Unix/FreeBSD/CoreFreeBSD.cpp
new file mode 100644
index 00000000..e0a4dd5f
--- /dev/null
+++ b/src/Core/Unix/FreeBSD/CoreFreeBSD.cpp
@@ -0,0 +1,202 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include <fstream>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+#include "CoreFreeBSD.h"
+#include "Core/Unix/CoreServiceProxy.h"
+
+namespace TrueCrypt
+{
+ CoreFreeBSD::CoreFreeBSD ()
+ {
+ }
+
+ CoreFreeBSD::~CoreFreeBSD ()
+ {
+ }
+
+ DevicePath CoreFreeBSD::AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const
+ {
+ list <string> args;
+ args.push_back ("-a");
+ args.push_back ("-t");
+ args.push_back ("vnode");
+
+ if (readOnly)
+ {
+ args.push_back ("-o");
+ args.push_back ("readonly");
+ }
+
+ args.push_back ("-f");
+ args.push_back (filePath);
+
+ string dev = StringConverter::Trim (Process::Execute ("mdconfig", args));
+
+ if (dev.find ("/") == string::npos)
+ dev = string ("/dev/") + dev;
+
+ return dev;
+ }
+
+ void CoreFreeBSD::DetachLoopDevice (const DevicePath &devicePath) const
+ {
+ list <string> args;
+ args.push_back ("-d");
+ args.push_back ("-u");
+ args.push_back (StringConverter::GetTrailingNumber (devicePath));
+
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ Process::Execute ("mdconfig", args);
+ break;
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (t > 5)
+ throw;
+ Thread::Sleep (200);
+ }
+ }
+ }
+
+ HostDeviceList CoreFreeBSD::GetHostDevices (bool pathListOnly) const
+ {
+ HostDeviceList devices;
+#ifdef TC_MACOSX
+ const string busType = "rdisk";
+#else
+ foreach (const string &busType, StringConverter::Split ("ad da"))
+#endif
+ {
+ for (int devNumber = 0; devNumber < 64; devNumber++)
+ {
+ stringstream devPath;
+ devPath << "/dev/" << busType << devNumber;
+
+ if (FilesystemPath (devPath.str()).IsBlockDevice() || FilesystemPath (devPath.str()).IsCharacterDevice())
+ {
+ make_shared_auto (HostDevice, device);
+ device->Path = devPath.str();
+ if (!pathListOnly)
+ {
+ try
+ {
+ device->Size = GetDeviceSize (device->Path);
+ }
+ catch (...)
+ {
+ device->Size = 0;
+ }
+ device->MountPoint = GetDeviceMountPoint (device->Path);
+ device->SystemNumber = 0;
+ }
+ devices.push_back (device);
+
+ for (int partNumber = 1; partNumber < 32; partNumber++)
+ {
+#ifdef TC_MACOSX
+ const string partLetter = "";
+#else
+ foreach (const string &partLetter, StringConverter::Split (",a,b,c,d,e,f,g,h", ",", true))
+#endif
+ {
+ stringstream partPath;
+ partPath << devPath.str() << "s" << partNumber << partLetter;
+
+ if (FilesystemPath (partPath.str()).IsBlockDevice() || FilesystemPath (partPath.str()).IsCharacterDevice())
+ {
+ make_shared_auto (HostDevice, partition);
+ partition->Path = partPath.str();
+ if (!pathListOnly)
+ {
+ try
+ {
+ partition->Size = GetDeviceSize (partition->Path);
+ }
+ catch (...)
+ {
+ partition->Size = 0;
+ }
+ partition->MountPoint = GetDeviceMountPoint (partition->Path);
+ partition->SystemNumber = 0;
+ }
+
+ device->Partitions.push_back (partition);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return devices;
+ }
+
+ MountedFilesystemList CoreFreeBSD::GetMountedFilesystems (const DevicePath &devicePath, const DirectoryPath &mountPoint) const
+ {
+
+ static Mutex mutex;
+ ScopeLock sl (mutex);
+
+ struct statfs *sysMountList;
+ int count = getmntinfo (&sysMountList, MNT_NOWAIT);
+ throw_sys_if (count == 0);
+
+ MountedFilesystemList mountedFilesystems;
+
+ for (int i = 0; i < count; i++)
+ {
+ make_shared_auto (MountedFilesystem, mf);
+
+ if (sysMountList[i].f_mntfromname[0])
+ mf->Device = DevicePath (sysMountList[i].f_mntfromname);
+ else
+ continue;
+
+ if (sysMountList[i].f_mntonname[0])
+ mf->MountPoint = DirectoryPath (sysMountList[i].f_mntonname);
+
+ mf->Type = sysMountList[i].f_fstypename;
+
+ if ((devicePath.IsEmpty() || devicePath == mf->Device) && (mountPoint.IsEmpty() || mountPoint == mf->MountPoint))
+ mountedFilesystems.push_back (mf);
+ }
+
+ return mountedFilesystems;
+ }
+
+ void CoreFreeBSD::MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const
+ {
+ try
+ {
+ // Try to mount FAT by default as mount is unable to probe filesystem type on BSD
+ CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType.empty() ? "msdos" : filesystemType, readOnly, systemMountOptions);
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (!filesystemType.empty())
+ throw;
+
+ CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType, readOnly, systemMountOptions);
+ }
+ }
+
+#ifdef TC_FREEBSD
+ auto_ptr <CoreBase> Core (new CoreServiceProxy <CoreFreeBSD>);
+ auto_ptr <CoreBase> CoreDirect (new CoreFreeBSD);
+#endif
+}
diff --git a/src/Core/Unix/FreeBSD/CoreFreeBSD.h b/src/Core/Unix/FreeBSD/CoreFreeBSD.h
new file mode 100644
index 00000000..a8230334
--- /dev/null
+++ b/src/Core/Unix/FreeBSD/CoreFreeBSD.h
@@ -0,0 +1,37 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_CoreFreeBSD
+#define TC_HEADER_Core_CoreFreeBSD
+
+#include "System.h"
+#include "Core/Unix/CoreUnix.h"
+
+namespace TrueCrypt
+{
+ class CoreFreeBSD : public CoreUnix
+ {
+ public:
+ CoreFreeBSD ();
+ virtual ~CoreFreeBSD ();
+
+ virtual HostDeviceList GetHostDevices (bool pathListOnly = false) const;
+
+ protected:
+ virtual DevicePath AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const;
+ virtual void DetachLoopDevice (const DevicePath &devicePath) const;
+ virtual MountedFilesystemList GetMountedFilesystems (const DevicePath &devicePath = DevicePath(), const DirectoryPath &mountPoint = DirectoryPath()) const;
+ virtual void MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const;
+
+ private:
+ CoreFreeBSD (const CoreFreeBSD &);
+ CoreFreeBSD &operator= (const CoreFreeBSD &);
+ };
+}
+
+#endif // TC_HEADER_Core_CoreFreeBSD
diff --git a/src/Core/Unix/FreeBSD/System.h b/src/Core/Unix/FreeBSD/System.h
new file mode 100644
index 00000000..e0cac0ba
--- /dev/null
+++ b/src/Core/Unix/FreeBSD/System.h
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Platform_FreeBSD_System
+#define TC_HEADER_Platform_FreeBSD_System
+
+#endif // TC_HEADER_Platform_FreeBSD_System
diff --git a/src/Core/Unix/Linux/CoreLinux.cpp b/src/Core/Unix/Linux/CoreLinux.cpp
new file mode 100644
index 00000000..634a3a23
--- /dev/null
+++ b/src/Core/Unix/Linux/CoreLinux.cpp
@@ -0,0 +1,477 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include <fstream>
+#include <iomanip>
+#include <mntent.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+#include "CoreLinux.h"
+#include "Platform/SystemInfo.h"
+#include "Platform/TextReader.h"
+#include "Volume/EncryptionModeLRW.h"
+#include "Volume/EncryptionModeXTS.h"
+#include "Driver/Fuse/FuseService.h"
+#include "Core/Unix/CoreServiceProxy.h"
+
+namespace TrueCrypt
+{
+ CoreLinux::CoreLinux ()
+ {
+ }
+
+ CoreLinux::~CoreLinux ()
+ {
+ }
+
+ DevicePath CoreLinux::AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const
+ {
+ list <string> loopPaths;
+ loopPaths.push_back ("/dev/loop");
+ loopPaths.push_back ("/dev/loop/");
+ loopPaths.push_back ("/dev/.static/dev/loop");
+
+ for (int devIndex = 0; devIndex < 256; devIndex++)
+ {
+ string loopDev;
+ foreach (const string &loopPath, loopPaths)
+ {
+ loopDev = loopPath + StringConverter::ToSingle (devIndex);
+ if (FilesystemPath (loopDev).IsBlockDevice())
+ break;
+ }
+
+ if (loopDev.empty())
+ continue;
+
+ list <string> args;
+
+ list <string>::iterator readOnlyArg;
+ if (readOnly)
+ {
+ args.push_back ("-r");
+ readOnlyArg = --args.end();
+ }
+
+ args.push_back ("--");
+ args.push_back (loopDev);
+ args.push_back (filePath);
+
+ try
+ {
+ Process::Execute ("losetup", args);
+ return loopDev;
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (readOnly)
+ {
+ try
+ {
+ args.erase (readOnlyArg);
+ Process::Execute ("losetup", args);
+ return loopDev;
+ }
+ catch (ExecutedProcessFailed&) { }
+ }
+ }
+ }
+
+ throw LoopDeviceSetupFailed (SRC_POS, wstring (filePath));
+ }
+
+ void CoreLinux::DetachLoopDevice (const DevicePath &devicePath) const
+ {
+ list <string> args;
+ args.push_back ("-d");
+ args.push_back (devicePath);
+
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ Process::Execute ("losetup", args);
+ break;
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (t > 5)
+ throw;
+ Thread::Sleep (200);
+ }
+ }
+ }
+
+ void CoreLinux::DismountNativeVolume (shared_ptr <VolumeInfo> mountedVolume) const
+ {
+ string devPath = mountedVolume->VirtualDevice;
+
+ if (devPath.find ("/dev/mapper/truecrypt") != 0)
+ throw NotApplicable (SRC_POS);
+
+ size_t devCount = 0;
+ while (FilesystemPath (devPath).IsBlockDevice())
+ {
+ list <string> dmsetupArgs;
+ dmsetupArgs.push_back ("remove");
+ dmsetupArgs.push_back (StringConverter::Split (devPath, "/").back());
+
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ Process::Execute ("dmsetup", dmsetupArgs);
+ break;
+ }
+ catch (...)
+ {
+ if (t > 20)
+ throw;
+
+ Thread::Sleep (100);
+ }
+ }
+
+ for (int t = 0; FilesystemPath (devPath).IsBlockDevice() && t < 20; t++)
+ {
+ Thread::Sleep (100);
+ }
+
+ devPath = string (mountedVolume->VirtualDevice) + "_" + StringConverter::ToSingle (devCount++);
+ }
+ }
+
+ HostDeviceList CoreLinux::GetHostDevices (bool pathListOnly) const
+ {
+ HostDeviceList devices;
+ TextReader tr ("/proc/partitions");
+
+ string line;
+ while (tr.ReadLine (line))
+ {
+ vector <string> fields = StringConverter::Split (line);
+
+ if (fields.size() != 4
+ || fields[3].find ("loop") == 0 // skip loop devices
+ || fields[3].find ("cloop") == 0
+ || fields[3].find ("ram") == 0 // skip RAM devices
+ || fields[3].find ("dm-") == 0 // skip device mapper devices
+ || fields[2] == "1" // skip extended partitions
+ )
+ continue;
+
+ try
+ {
+ StringConverter::ToUInt32 (fields[0]);
+ }
+ catch (...)
+ {
+ continue;
+ }
+
+ try
+ {
+ make_shared_auto (HostDevice, hostDevice);
+
+ hostDevice->Path = string (fields[3].find ("/dev/") == string::npos ? "/dev/" : "") + fields[3];
+
+ if (!pathListOnly)
+ {
+ hostDevice->Size = StringConverter::ToUInt64 (fields[2]) * 1024;
+ hostDevice->MountPoint = GetDeviceMountPoint (hostDevice->Path);
+ hostDevice->SystemNumber = 0;
+ }
+
+ try
+ {
+ StringConverter::GetTrailingNumber (fields[3]);
+ if (devices.size() > 0)
+ {
+ HostDevice &prevDev = **--devices.end();
+ if (string (hostDevice->Path).find (prevDev.Path) == 0)
+ {
+ prevDev.Partitions.push_back (hostDevice);
+ continue;
+ }
+ }
+ }
+ catch (...) { }
+
+ devices.push_back (hostDevice);
+ continue;
+ }
+ catch (...)
+ {
+ continue;
+ }
+ }
+
+ return devices;
+ }
+
+ MountedFilesystemList CoreLinux::GetMountedFilesystems (const DevicePath &devicePath, const DirectoryPath &mountPoint) const
+ {
+ MountedFilesystemList mountedFilesystems;
+ DevicePath realDevicePath = devicePath;
+
+ if (!devicePath.IsEmpty())
+ {
+ char *resolvedPath = realpath (string (devicePath).c_str(), NULL);
+ if (resolvedPath)
+ {
+ realDevicePath = resolvedPath;
+ free (resolvedPath);
+ }
+ }
+
+ FILE *mtab = fopen ("/etc/mtab", "r");
+
+ if (!mtab)
+ mtab = fopen ("/proc/mounts", "r");
+
+ throw_sys_sub_if (!mtab, "/proc/mounts");
+ finally_do_arg (FILE *, mtab, { fclose (finally_arg); });
+
+ static Mutex mutex;
+ ScopeLock sl (mutex);
+
+ struct mntent *entry;
+ while ((entry = getmntent (mtab)) != nullptr)
+ {
+ make_shared_auto (MountedFilesystem, mf);
+
+ if (entry->mnt_fsname)
+ mf->Device = DevicePath (entry->mnt_fsname);
+ else
+ continue;
+
+ if (entry->mnt_dir)
+ mf->MountPoint = DirectoryPath (entry->mnt_dir);
+
+ if (entry->mnt_type)
+ mf->Type = entry->mnt_type;
+
+ if ((devicePath.IsEmpty() || devicePath == mf->Device || realDevicePath == mf->Device) && (mountPoint.IsEmpty() || mountPoint == mf->MountPoint))
+ mountedFilesystems.push_back (mf);
+ }
+
+ return mountedFilesystems;
+ }
+
+ void CoreLinux::MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const
+ {
+ bool fsMounted = false;
+
+ try
+ {
+ if (!FilesystemSupportsUnixPermissions (devicePath))
+ {
+ stringstream userMountOptions;
+ userMountOptions << "uid=" << GetRealUserId() << ",gid=" << GetRealGroupId() << ",umask=077" << (!systemMountOptions.empty() ? "," : "");
+
+ CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType, readOnly, userMountOptions.str() + systemMountOptions);
+ fsMounted = true;
+ }
+ }
+ catch (...) { }
+
+ if (!fsMounted)
+ CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType, readOnly, systemMountOptions);
+ }
+
+ void CoreLinux::MountVolumeNative (shared_ptr <Volume> volume, MountOptions &options, const DirectoryPath &auxMountPoint) const
+ {
+ bool xts = (typeid (*volume->GetEncryptionMode()) == typeid (EncryptionModeXTS));
+ bool lrw = (typeid (*volume->GetEncryptionMode()) == typeid (EncryptionModeLRW));
+
+ if (options.NoKernelCrypto
+ || (!xts && (!lrw || volume->GetEncryptionAlgorithm()->GetCiphers().size() > 1 || volume->GetEncryptionAlgorithm()->GetMinBlockSize() != 16))
+ || volume->GetProtectionType() == VolumeProtection::HiddenVolumeReadOnly)
+ {
+ throw NotApplicable (SRC_POS);
+ }
+
+ if (!SystemInfo::IsVersionAtLeast (2, 6, xts ? 24 : 20))
+ throw NotApplicable (SRC_POS);
+
+ // Load device mapper kernel module
+ list <string> execArgs;
+ foreach (const string &dmModule, StringConverter::Split ("dm_mod dm-mod dm"))
+ {
+ execArgs.clear();
+ execArgs.push_back (dmModule);
+
+ try
+ {
+ Process::Execute ("modprobe", execArgs);
+ break;
+ }
+ catch (...) { }
+ }
+
+ bool loopDevAttached = false;
+ bool nativeDevCreated = false;
+ bool filesystemMounted = false;
+
+ // Attach volume to loopback device if required
+ VolumePath volumePath = volume->GetPath();
+ if (!volumePath.IsDevice())
+ {
+ volumePath = AttachFileToLoopDevice (volumePath, options.Protection == VolumeProtection::ReadOnly);
+ loopDevAttached = true;
+ }
+
+ string nativeDevPath;
+
+ try
+ {
+ // Create virtual device using device mapper
+ size_t nativeDevCount = 0;
+ size_t secondaryKeyOffset = volume->GetEncryptionMode()->GetKey().Size();
+ size_t cipherCount = volume->GetEncryptionAlgorithm()->GetCiphers().size();
+
+ foreach_reverse_ref (const Cipher &cipher, volume->GetEncryptionAlgorithm()->GetCiphers())
+ {
+ stringstream dmCreateArgs;
+ dmCreateArgs << "0 " << volume->GetSize() / ENCRYPTION_DATA_UNIT_SIZE << " crypt ";
+
+ // Mode
+ dmCreateArgs << StringConverter::ToLower (StringConverter::ToSingle (cipher.GetName())) << (xts ? (SystemInfo::IsVersionAtLeast (2, 6, 33) ? "-xts-plain64 " : "-xts-plain ") : "-lrw-benbi ");
+
+ size_t keyArgOffset = dmCreateArgs.str().size();
+ dmCreateArgs << setw (cipher.GetKeySize() * (xts ? 4 : 2) + (xts ? 0 : 16 * 2)) << 0 << setw (0);
+
+ // Sector and data unit offset
+ uint64 startSector = volume->GetLayout()->GetDataOffset (volume->GetHostSize()) / ENCRYPTION_DATA_UNIT_SIZE;
+
+ dmCreateArgs << ' ' << (xts ? startSector + volume->GetEncryptionMode()->GetSectorOffset() : 0) << ' ';
+ if (nativeDevCount == 0)
+ dmCreateArgs << string (volumePath) << ' ' << startSector;
+ else
+ dmCreateArgs << nativeDevPath << " 0";
+
+ SecureBuffer dmCreateArgsBuf (dmCreateArgs.str().size());
+ dmCreateArgsBuf.CopyFrom (ConstBufferPtr ((byte *) dmCreateArgs.str().c_str(), dmCreateArgs.str().size()));
+
+ // Keys
+ const SecureBuffer &cipherKey = cipher.GetKey();
+ secondaryKeyOffset -= cipherKey.Size();
+ ConstBufferPtr secondaryKey = volume->GetEncryptionMode()->GetKey().GetRange (xts ? secondaryKeyOffset : 0, xts ? cipherKey.Size() : 16);
+
+ SecureBuffer hexStr (3);
+ for (size_t i = 0; i < cipherKey.Size(); ++i)
+ {
+ sprintf ((char *) hexStr.Ptr(), "%02x", (int) cipherKey[i]);
+ dmCreateArgsBuf.GetRange (keyArgOffset + i * 2, 2).CopyFrom (hexStr.GetRange (0, 2));
+
+ if (lrw && i >= 16)
+ continue;
+
+ sprintf ((char *) hexStr.Ptr(), "%02x", (int) secondaryKey[i]);
+ dmCreateArgsBuf.GetRange (keyArgOffset + cipherKey.Size() * 2 + i * 2, 2).CopyFrom (hexStr.GetRange (0, 2));
+ }
+
+ stringstream nativeDevName;
+ nativeDevName << "truecrypt" << options.SlotNumber;
+
+ if (nativeDevCount != cipherCount - 1)
+ nativeDevName << "_" << cipherCount - nativeDevCount - 2;
+
+ nativeDevPath = "/dev/mapper/" + nativeDevName.str();
+
+ execArgs.clear();
+ execArgs.push_back ("create");
+ execArgs.push_back (nativeDevName.str());
+
+ Process::Execute ("dmsetup", execArgs, -1, nullptr, &dmCreateArgsBuf);
+
+ // Wait for the device to be created
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ FilesystemPath (nativeDevPath).GetType();
+ break;
+ }
+ catch (...)
+ {
+ if (t > 20)
+ throw;
+
+ Thread::Sleep (100);
+ }
+ }
+
+ nativeDevCreated = true;
+ ++nativeDevCount;
+ }
+
+ // Test whether the device mapper is able to read and decrypt the last sector
+ SecureBuffer lastSectorBuf (volume->GetSectorSize());
+ uint64 lastSectorOffset = volume->GetSize() - volume->GetSectorSize();
+
+ File nativeDev;
+ nativeDev.Open (nativeDevPath);
+ nativeDev.ReadAt (lastSectorBuf, lastSectorOffset);
+
+ SecureBuffer lastSectorBuf2 (volume->GetSectorSize());
+ volume->ReadSectors (lastSectorBuf2, lastSectorOffset);
+
+ if (memcmp (lastSectorBuf.Ptr(), lastSectorBuf2.Ptr(), volume->GetSectorSize()) != 0)
+ throw KernelCryptoServiceTestFailed (SRC_POS);
+
+ // Mount filesystem
+ if (!options.NoFilesystem && options.MountPoint && !options.MountPoint->IsEmpty())
+ {
+ MountFilesystem (nativeDevPath, *options.MountPoint,
+ StringConverter::ToSingle (options.FilesystemType),
+ options.Protection == VolumeProtection::ReadOnly,
+ StringConverter::ToSingle (options.FilesystemOptions));
+
+ filesystemMounted = true;
+ }
+
+ FuseService::SendAuxDeviceInfo (auxMountPoint, nativeDevPath, volumePath);
+ }
+ catch (...)
+ {
+ try
+ {
+ if (filesystemMounted)
+ DismountFilesystem (*options.MountPoint, true);
+ }
+ catch (...) { }
+
+ try
+ {
+ if (nativeDevCreated)
+ {
+ make_shared_auto (VolumeInfo, vol);
+ vol->VirtualDevice = nativeDevPath;
+ DismountNativeVolume (vol);
+ }
+ }
+ catch (...) { }
+
+ try
+ {
+ if (loopDevAttached)
+ DetachLoopDevice (volumePath);
+ }
+ catch (...) { }
+
+ throw;
+ }
+ }
+
+ auto_ptr <CoreBase> Core (new CoreServiceProxy <CoreLinux>);
+ auto_ptr <CoreBase> CoreDirect (new CoreLinux);
+}
diff --git a/src/Core/Unix/Linux/CoreLinux.h b/src/Core/Unix/Linux/CoreLinux.h
new file mode 100644
index 00000000..5758d651
--- /dev/null
+++ b/src/Core/Unix/Linux/CoreLinux.h
@@ -0,0 +1,39 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_CoreLinux
+#define TC_HEADER_Core_CoreLinux
+
+#include "System.h"
+#include "Core/Unix/CoreUnix.h"
+
+namespace TrueCrypt
+{
+ class CoreLinux : public CoreUnix
+ {
+ public:
+ CoreLinux ();
+ virtual ~CoreLinux ();
+
+ virtual HostDeviceList GetHostDevices (bool pathListOnly = false) const;
+
+ protected:
+ virtual DevicePath AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const;
+ virtual void DetachLoopDevice (const DevicePath &devicePath) const;
+ virtual void DismountNativeVolume (shared_ptr <VolumeInfo> mountedVolume) const;
+ virtual MountedFilesystemList GetMountedFilesystems (const DevicePath &devicePath = DevicePath(), const DirectoryPath &mountPoint = DirectoryPath()) const;
+ virtual void MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const;
+ virtual void MountVolumeNative (shared_ptr <Volume> volume, MountOptions &options, const DirectoryPath &auxMountPoint) const;
+
+ private:
+ CoreLinux (const CoreLinux &);
+ CoreLinux &operator= (const CoreLinux &);
+ };
+}
+
+#endif // TC_HEADER_Core_CoreLinux
diff --git a/src/Core/Unix/Linux/System.h b/src/Core/Unix/Linux/System.h
new file mode 100644
index 00000000..20a4f82d
--- /dev/null
+++ b/src/Core/Unix/Linux/System.h
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Platform_Linux_System
+#define TC_HEADER_Platform_Linux_System
+
+#endif // TC_HEADER_Platform_Linux_System
diff --git a/src/Core/Unix/MacOSX/CoreMacOSX.cpp b/src/Core/Unix/MacOSX/CoreMacOSX.cpp
new file mode 100644
index 00000000..b7aa08c7
--- /dev/null
+++ b/src/Core/Unix/MacOSX/CoreMacOSX.cpp
@@ -0,0 +1,215 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include <fstream>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include "CoreMacOSX.h"
+#include "Driver/Fuse/FuseService.h"
+#include "Core/Unix/CoreServiceProxy.h"
+
+namespace TrueCrypt
+{
+ CoreMacOSX::CoreMacOSX ()
+ {
+ }
+
+ CoreMacOSX::~CoreMacOSX ()
+ {
+ }
+
+ shared_ptr <VolumeInfo> CoreMacOSX::DismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles, bool syncVolumeInfo)
+ {
+ if (!mountedVolume->VirtualDevice.IsEmpty() && mountedVolume->VirtualDevice.IsBlockDevice())
+ {
+ list <string> args;
+ args.push_back ("detach");
+ args.push_back (mountedVolume->VirtualDevice);
+
+ if (ignoreOpenFiles)
+ args.push_back ("-force");
+
+ try
+ {
+ Process::Execute ("hdiutil", args);
+ }
+ catch (ExecutedProcessFailed &e)
+ {
+ if (!ignoreOpenFiles)
+ {
+ string err = e.GetErrorOutput();
+
+ if (err.find ("couldn't unmount") != string::npos
+ || err.find ("busy") != string::npos
+ || err.find ("49153") != string::npos)
+ {
+ throw MountedVolumeInUse (SRC_POS);
+ }
+ }
+
+ throw;
+ }
+ }
+
+ if (syncVolumeInfo || mountedVolume->Protection == VolumeProtection::HiddenVolumeReadOnly)
+ {
+ sync();
+ VolumeInfoList ml = GetMountedVolumes (mountedVolume->Path);
+
+ if (ml.size() > 0)
+ mountedVolume = ml.front();
+ }
+
+ list <string> args;
+ args.push_back ("--");
+ args.push_back (mountedVolume->AuxMountPoint);
+
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ Process::Execute ("umount", args);
+ break;
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (t > 10)
+ throw;
+ Thread::Sleep (200);
+ }
+ }
+
+ try
+ {
+ mountedVolume->AuxMountPoint.Delete();
+ }
+ catch (...) { }
+
+ return mountedVolume;
+ }
+
+ void CoreMacOSX::CheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair) const
+ {
+ list <string> args;
+ args.push_back ("/Applications/Utilities/Disk Utility.app");
+ Process::Execute ("open", args);
+ }
+
+ void CoreMacOSX::MountAuxVolumeImage (const DirectoryPath &auxMountPoint, const MountOptions &options) const
+ {
+ // Check FUSE version
+ char fuseVersionString[MAXHOSTNAMELEN + 1] = { 0 };
+ size_t fuseVersionStringLength = MAXHOSTNAMELEN;
+
+ if (sysctlbyname ("macfuse.version.number", fuseVersionString, &fuseVersionStringLength, NULL, 0) != 0)
+ throw HigherFuseVersionRequired (SRC_POS);
+
+ vector <string> fuseVersion = StringConverter::Split (string (fuseVersionString), ".");
+ if (fuseVersion.size() < 2)
+ throw HigherFuseVersionRequired (SRC_POS);
+
+ uint32 fuseVersionMajor = StringConverter::ToUInt32 (fuseVersion[0]);
+ uint32 fuseVersionMinor = StringConverter::ToUInt32 (fuseVersion[1]);
+
+ if (fuseVersionMajor < 1 || (fuseVersionMajor == 1 && fuseVersionMinor < 3))
+ throw HigherFuseVersionRequired (SRC_POS);
+
+ // Mount volume image
+ string volImage = string (auxMountPoint) + FuseService::GetVolumeImagePath();
+
+ list <string> args;
+ args.push_back ("attach");
+ args.push_back (volImage);
+ args.push_back ("-plist");
+ args.push_back ("-noautofsck");
+ args.push_back ("-imagekey");
+ args.push_back ("diskimage-class=CRawDiskImage");
+
+ if (!options.NoFilesystem && options.MountPoint && !options.MountPoint->IsEmpty())
+ {
+ args.push_back ("-mount");
+ args.push_back ("required");
+
+ // Let the system specify mount point except when the user specified a non-default one
+ if (string (*options.MountPoint).find (GetDefaultMountPointPrefix()) != 0)
+ {
+ args.push_back ("-mountpoint");
+ args.push_back (*options.MountPoint);
+ }
+ }
+ else
+ args.push_back ("-nomount");
+
+ if (options.Protection == VolumeProtection::ReadOnly)
+ args.push_back ("-readonly");
+
+ string xml;
+
+ while (true)
+ {
+ try
+ {
+ xml = Process::Execute ("hdiutil", args);
+ break;
+ }
+ catch (ExecutedProcessFailed &e)
+ {
+ if (e.GetErrorOutput().find ("noautofsck") != string::npos)
+ {
+ args.remove ("-noautofsck");
+ continue;
+ }
+
+ throw;
+ }
+ }
+
+ size_t p = xml.find ("<key>dev-entry</key>");
+ if (p == string::npos)
+ throw ParameterIncorrect (SRC_POS);
+
+ p = xml.find ("<string>", p);
+ if (p == string::npos)
+ throw ParameterIncorrect (SRC_POS);
+ p += 8;
+
+ size_t e = xml.find ("</string>", p);
+ if (e == string::npos)
+ throw ParameterIncorrect (SRC_POS);
+
+ DevicePath virtualDev = StringConverter::Trim (xml.substr (p, e - p));
+
+ try
+ {
+ FuseService::SendAuxDeviceInfo (auxMountPoint, virtualDev);
+ }
+ catch (...)
+ {
+ try
+ {
+ list <string> args;
+ args.push_back ("detach");
+ args.push_back (volImage);
+ args.push_back ("-force");
+
+ Process::Execute ("hdiutil", args);
+ }
+ catch (ExecutedProcessFailed&) { }
+ throw;
+ }
+ }
+
+ auto_ptr <CoreBase> Core (new CoreServiceProxy <CoreMacOSX>);
+ auto_ptr <CoreBase> CoreDirect (new CoreMacOSX);
+}
diff --git a/src/Core/Unix/MacOSX/CoreMacOSX.h b/src/Core/Unix/MacOSX/CoreMacOSX.h
new file mode 100644
index 00000000..eee11d6f
--- /dev/null
+++ b/src/Core/Unix/MacOSX/CoreMacOSX.h
@@ -0,0 +1,36 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_CoreMacOSX
+#define TC_HEADER_Core_CoreMacOSX
+
+#include "System.h"
+#include "Core/Unix/FreeBSD/CoreFreeBSD.h"
+
+namespace TrueCrypt
+{
+ class CoreMacOSX : public CoreFreeBSD
+ {
+ public:
+ CoreMacOSX ();
+ virtual ~CoreMacOSX ();
+
+ virtual void CheckFilesystem (shared_ptr <VolumeInfo> mountedVolume, bool repair = false) const;
+ virtual shared_ptr <VolumeInfo> DismountVolume (shared_ptr <VolumeInfo> mountedVolume, bool ignoreOpenFiles = false, bool syncVolumeInfo = false);
+ virtual string GetDefaultMountPointPrefix () const { return "/Volumes/truecrypt"; }
+
+ protected:
+ virtual void MountAuxVolumeImage (const DirectoryPath &auxMountPoint, const MountOptions &options) const;
+
+ private:
+ CoreMacOSX (const CoreMacOSX &);
+ CoreMacOSX &operator= (const CoreMacOSX &);
+ };
+}
+
+#endif // TC_HEADER_Core_CoreMacOSX
diff --git a/src/Core/Unix/MacOSX/System.h b/src/Core/Unix/MacOSX/System.h
new file mode 100644
index 00000000..073e17a3
--- /dev/null
+++ b/src/Core/Unix/MacOSX/System.h
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Platform_MacOSX_System
+#define TC_HEADER_Platform_MacOSX_System
+
+#endif // TC_HEADER_Platform_MacOSX_System
diff --git a/src/Core/Unix/MountedFilesystem.h b/src/Core/Unix/MountedFilesystem.h
new file mode 100644
index 00000000..6e704d3c
--- /dev/null
+++ b/src/Core/Unix/MountedFilesystem.h
@@ -0,0 +1,27 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_Unix_MountedFilesystem
+#define TC_HEADER_Core_Unix_MountedFilesystem
+
+#include "Platform/Platform.h"
+
+namespace TrueCrypt
+{
+ struct MountedFilesystem
+ {
+ public:
+ DevicePath Device;
+ DirectoryPath MountPoint;
+ string Type;
+ };
+
+ typedef list < shared_ptr <MountedFilesystem> > MountedFilesystemList;
+}
+
+#endif // TC_HEADER_Core_Unix_MountedFilesystem
diff --git a/src/Core/Unix/Solaris/CoreSolaris.cpp b/src/Core/Unix/Solaris/CoreSolaris.cpp
new file mode 100644
index 00000000..63736db3
--- /dev/null
+++ b/src/Core/Unix/Solaris/CoreSolaris.cpp
@@ -0,0 +1,174 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <sys/mntent.h>
+#include <sys/mnttab.h>
+#include "CoreSolaris.h"
+#include "Core/Unix/CoreServiceProxy.h"
+
+namespace TrueCrypt
+{
+ CoreSolaris::CoreSolaris ()
+ {
+ }
+
+ CoreSolaris::~CoreSolaris ()
+ {
+ }
+
+ DevicePath CoreSolaris::AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const
+ {
+ list <string> args;
+ args.push_back ("-a");
+ args.push_back (filePath);
+
+ return StringConverter::Trim (Process::Execute ("lofiadm", args));
+ }
+
+ void CoreSolaris::DetachLoopDevice (const DevicePath &devicePath) const
+ {
+ list <string> args;
+ args.push_back ("-d");
+ args.push_back (devicePath);
+
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ Process::Execute ("lofiadm", args);
+ break;
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (t > 5)
+ throw;
+ Thread::Sleep (200);
+ }
+ }
+ }
+
+ HostDeviceList CoreSolaris::GetHostDevices (bool pathListOnly) const
+ {
+ HostDeviceList devices;
+
+ foreach_ref (const FilePath &devPath, Directory::GetFilePaths ("/dev/rdsk", false))
+ {
+ string drivePath = devPath;
+ if (drivePath.rfind ("p0") == drivePath.size() - 2)
+ {
+ make_shared_auto (HostDevice, device);
+ device->Path = drivePath;
+
+ try
+ {
+ device->Size = GetDeviceSize (device->Path);
+ }
+ catch (...)
+ {
+ device->Size = 0;
+ }
+
+ if (device->Size == 0)
+ continue;
+
+ device->MountPoint = GetDeviceMountPoint (device->Path);
+ device->SystemNumber = 0;
+
+ devices.push_back (device);
+
+ for (int partNumber = 1; partNumber <= 32; partNumber++)
+ {
+ stringstream partPath;
+ partPath << drivePath.substr (0, drivePath.size() - 1) << partNumber;
+
+ if (FilesystemPath (partPath.str()).IsBlockDevice() || FilesystemPath (partPath.str()).IsCharacterDevice())
+ {
+ make_shared_auto (HostDevice, partition);
+ partition->Path = partPath.str();
+
+ try
+ {
+ partition->Size = GetDeviceSize (partition->Path);
+ }
+ catch (...)
+ {
+ partition->Size = 0;
+ }
+
+ if (partition->Size == 0)
+ continue;
+
+ partition->MountPoint = GetDeviceMountPoint (partition->Path);
+ partition->SystemNumber = 0;
+
+ device->Partitions.push_back (partition);
+ }
+ }
+ }
+ }
+
+ return devices;
+ }
+
+ MountedFilesystemList CoreSolaris::GetMountedFilesystems (const DevicePath &devicePath, const DirectoryPath &mountPoint) const
+ {
+ MountedFilesystemList mountedFilesystems;
+
+ FILE *mtab = fopen ("/etc/mnttab", "r");
+ throw_sys_sub_if (!mtab, "/etc/mnttab");
+ finally_do_arg (FILE *, mtab, { fclose (finally_arg); });
+
+ int getmntentResult;
+ struct mnttab entry;
+ while ((getmntentResult = getmntent (mtab, &entry)) == 0)
+ {
+ make_shared_auto (MountedFilesystem, mf);
+
+ if (entry.mnt_special)
+ mf->Device = DevicePath (entry.mnt_special);
+ else
+ continue;
+
+ if (entry.mnt_mountp)
+ mf->MountPoint = DirectoryPath (entry.mnt_mountp);
+
+ if (entry.mnt_fstype)
+ mf->Type = entry.mnt_fstype;
+
+ if ((devicePath.IsEmpty() || devicePath == mf->Device) && (mountPoint.IsEmpty() || mountPoint == mf->MountPoint))
+ mountedFilesystems.push_back (mf);
+ }
+
+ throw_sys_if (getmntentResult > 0);
+
+ return mountedFilesystems;
+ }
+
+ void CoreSolaris::MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const
+ {
+ try
+ {
+ // Try to mount FAT by default as mount is unable to probe filesystem type on Solaris
+ CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType.empty() ? "pcfs" : filesystemType, readOnly, systemMountOptions);
+ }
+ catch (ExecutedProcessFailed&)
+ {
+ if (!filesystemType.empty())
+ throw;
+
+ CoreUnix::MountFilesystem (devicePath, mountPoint, filesystemType, readOnly, systemMountOptions);
+ }
+ }
+
+ auto_ptr <CoreBase> Core (new CoreServiceProxy <CoreSolaris>);
+ auto_ptr <CoreBase> CoreDirect (new CoreSolaris);
+}
diff --git a/src/Core/Unix/Solaris/CoreSolaris.h b/src/Core/Unix/Solaris/CoreSolaris.h
new file mode 100644
index 00000000..76dd1945
--- /dev/null
+++ b/src/Core/Unix/Solaris/CoreSolaris.h
@@ -0,0 +1,37 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Core_CoreSolaris
+#define TC_HEADER_Core_CoreSolaris
+
+#include "System.h"
+#include "Core/Unix/CoreUnix.h"
+
+namespace TrueCrypt
+{
+ class CoreSolaris : public CoreUnix
+ {
+ public:
+ CoreSolaris ();
+ virtual ~CoreSolaris ();
+
+ virtual HostDeviceList GetHostDevices (bool pathListOnly = false) const;
+
+ protected:
+ virtual DevicePath AttachFileToLoopDevice (const FilePath &filePath, bool readOnly) const;
+ virtual void DetachLoopDevice (const DevicePath &devicePath) const;
+ virtual MountedFilesystemList GetMountedFilesystems (const DevicePath &devicePath = DevicePath(), const DirectoryPath &mountPoint = DirectoryPath()) const;
+ virtual void MountFilesystem (const DevicePath &devicePath, const DirectoryPath &mountPoint, const string &filesystemType, bool readOnly, const string &systemMountOptions) const;
+
+ private:
+ CoreSolaris (const CoreSolaris &);
+ CoreSolaris &operator= (const CoreSolaris &);
+ };
+}
+
+#endif // TC_HEADER_Core_CoreSolaris
diff --git a/src/Core/Unix/Solaris/System.h b/src/Core/Unix/Solaris/System.h
new file mode 100644
index 00000000..039dd406
--- /dev/null
+++ b/src/Core/Unix/Solaris/System.h
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Platform_Solaris_System
+#define TC_HEADER_Platform_Solaris_System
+
+#endif // TC_HEADER_Platform_Solaris_System
diff --git a/src/Core/Unix/System.h b/src/Core/Unix/System.h
new file mode 100644
index 00000000..63d565b5
--- /dev/null
+++ b/src/Core/Unix/System.h
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Platform_Unix_System
+#define TC_HEADER_Platform_Unix_System
+
+#endif // TC_HEADER_Platform_Unix_System
diff --git a/src/Core/VolumeCreator.cpp b/src/Core/VolumeCreator.cpp
new file mode 100644
index 00000000..6011efd0
--- /dev/null
+++ b/src/Core/VolumeCreator.cpp
@@ -0,0 +1,345 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "Volume/EncryptionTest.h"
+#include "Volume/EncryptionModeXTS.h"
+#include "Core.h"
+
+#ifdef TC_UNIX
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#endif
+
+#include "VolumeCreator.h"
+#include "FatFormatter.h"
+
+namespace TrueCrypt
+{
+ VolumeCreator::VolumeCreator ()
+ : SizeDone (0)
+ {
+ }
+
+ VolumeCreator::~VolumeCreator ()
+ {
+ }
+
+ void VolumeCreator::Abort ()
+ {
+ AbortRequested = true;
+ }
+
+ void VolumeCreator::CheckResult ()
+ {
+ if (ThreadException)
+ ThreadException->Throw();
+ }
+
+ void VolumeCreator::CreationThread ()
+ {
+ try
+ {
+ uint64 endOffset;
+ uint64 filesystemSize = Layout->GetDataSize (HostSize);
+
+ if (filesystemSize < 1)
+ throw ParameterIncorrect (SRC_POS);
+
+ DataStart = Layout->GetDataOffset (HostSize);
+ WriteOffset = DataStart;
+ endOffset = DataStart + Layout->GetDataSize (HostSize);
+
+ VolumeFile->SeekAt (DataStart);
+
+ // Create filesystem
+ if (Options->Filesystem == VolumeCreationOptions::FilesystemType::FAT)
+ {
+ if (filesystemSize < TC_MIN_FAT_FS_SIZE || filesystemSize > TC_MAX_FAT_SECTOR_COUNT * Options->SectorSize)
+ throw ParameterIncorrect (SRC_POS);
+
+ struct WriteSectorCallback : public FatFormatter::WriteSectorCallback
+ {
+ WriteSectorCallback (VolumeCreator *creator) : Creator (creator), OutputBuffer (File::GetOptimalWriteSize()), OutputBufferWritePos (0) { }
+
+ virtual bool operator() (const BufferPtr &sector)
+ {
+ OutputBuffer.GetRange (OutputBufferWritePos, sector.Size()).CopyFrom (sector);
+ OutputBufferWritePos += sector.Size();
+
+ if (OutputBufferWritePos >= OutputBuffer.Size())
+ FlushOutputBuffer();
+
+ return !Creator->AbortRequested;
+ }
+
+ void FlushOutputBuffer ()
+ {
+ if (OutputBufferWritePos > 0)
+ {
+ Creator->Options->EA->EncryptSectors (OutputBuffer.GetRange (0, OutputBufferWritePos),
+ Creator->WriteOffset / ENCRYPTION_DATA_UNIT_SIZE, OutputBufferWritePos / ENCRYPTION_DATA_UNIT_SIZE, ENCRYPTION_DATA_UNIT_SIZE);
+
+ Creator->VolumeFile->Write (OutputBuffer.GetRange (0, OutputBufferWritePos));
+
+ Creator->WriteOffset += OutputBufferWritePos;
+ Creator->SizeDone.Set (Creator->WriteOffset - Creator->DataStart);
+
+ OutputBufferWritePos = 0;
+ }
+ }
+
+ VolumeCreator *Creator;
+ SecureBuffer OutputBuffer;
+ size_t OutputBufferWritePos;
+ };
+
+ WriteSectorCallback sectorWriter (this);
+ FatFormatter::Format (sectorWriter, filesystemSize, Options->FilesystemClusterSize, Options->SectorSize);
+ sectorWriter.FlushOutputBuffer();
+ }
+
+ if (!Options->Quick)
+ {
+ // Empty sectors are encrypted with different key to randomize plaintext
+ Core->RandomizeEncryptionAlgorithmKey (Options->EA);
+
+ SecureBuffer outputBuffer (File::GetOptimalWriteSize());
+ uint64 dataFragmentLength = outputBuffer.Size();
+
+ while (!AbortRequested && WriteOffset < endOffset)
+ {
+ if (WriteOffset + dataFragmentLength > endOffset)
+ dataFragmentLength = endOffset - WriteOffset;
+
+ outputBuffer.Zero();
+ Options->EA->EncryptSectors (outputBuffer, WriteOffset / ENCRYPTION_DATA_UNIT_SIZE, dataFragmentLength / ENCRYPTION_DATA_UNIT_SIZE, ENCRYPTION_DATA_UNIT_SIZE);
+ VolumeFile->Write (outputBuffer, (size_t) dataFragmentLength);
+
+ WriteOffset += dataFragmentLength;
+ SizeDone.Set (WriteOffset - DataStart);
+ }
+ }
+
+ if (!AbortRequested)
+ {
+ SizeDone.Set (Options->Size);
+
+ // Backup header
+ SecureBuffer backupHeader (Layout->GetHeaderSize());
+
+ SecureBuffer backupHeaderSalt (VolumeHeader::GetSaltSize());
+ RandomNumberGenerator::GetData (backupHeaderSalt);
+
+ Options->VolumeHeaderKdf->DeriveKey (HeaderKey, *PasswordKey, backupHeaderSalt);
+
+ Layout->GetHeader()->EncryptNew (backupHeader, backupHeaderSalt, HeaderKey, Options->VolumeHeaderKdf);
+
+ if (Options->Quick || Options->Type == VolumeType::Hidden)
+ VolumeFile->SeekEnd (Layout->GetBackupHeaderOffset());
+
+ VolumeFile->Write (backupHeader);
+
+ if (Options->Type == VolumeType::Normal)
+ {
+ // Write random data to space reserved for hidden volume backup header
+ Core->RandomizeEncryptionAlgorithmKey (Options->EA);
+ Options->EA->Encrypt (backupHeader);
+
+ VolumeFile->Write (backupHeader);
+ }
+
+ VolumeFile->Flush();
+ }
+ }
+ catch (Exception &e)
+ {
+ ThreadException.reset (e.CloneNew());
+ }
+ catch (exception &e)
+ {
+ ThreadException.reset (new ExternalException (SRC_POS, StringConverter::ToExceptionString (e)));
+ }
+ catch (...)
+ {
+ ThreadException.reset (new UnknownException (SRC_POS));
+ }
+
+ VolumeFile.reset();
+ mProgressInfo.CreationInProgress = false;
+ }
+
+ void VolumeCreator::CreateVolume (shared_ptr <VolumeCreationOptions> options)
+ {
+ EncryptionTest::TestAll();
+
+ {
+#ifdef TC_UNIX
+ // Temporarily take ownership of a device if the user is not an administrator
+ UserId origDeviceOwner ((uid_t) -1);
+
+ if (!Core->HasAdminPrivileges() && options->Path.IsDevice())
+ {
+ origDeviceOwner = FilesystemPath (wstring (options->Path)).GetOwner();
+ Core->SetFileOwner (options->Path, UserId (getuid()));
+ }
+
+ finally_do_arg2 (FilesystemPath, options->Path, UserId, origDeviceOwner,
+ {
+ if (finally_arg2.SystemId != (uid_t) -1)
+ Core->SetFileOwner (finally_arg, finally_arg2);
+ });
+#endif
+
+ VolumeFile.reset (new File);
+ VolumeFile->Open (options->Path,
+ (options->Path.IsDevice() || options->Type == VolumeType::Hidden) ? File::OpenReadWrite : File::CreateReadWrite,
+ File::ShareNone);
+
+ HostSize = VolumeFile->Length();
+ }
+
+ try
+ {
+ // Sector size
+ if (options->Path.IsDevice())
+ {
+ options->SectorSize = VolumeFile->GetDeviceSectorSize();
+
+ if (options->SectorSize < TC_MIN_VOLUME_SECTOR_SIZE
+ || options->SectorSize > TC_MAX_VOLUME_SECTOR_SIZE
+#if !defined (TC_LINUX)
+ || options->SectorSize != TC_SECTOR_SIZE_LEGACY
+#endif
+ || options->SectorSize % ENCRYPTION_DATA_UNIT_SIZE != 0)
+ {
+ throw UnsupportedSectorSize (SRC_POS);
+ }
+ }
+ else
+ options->SectorSize = TC_SECTOR_SIZE_FILE_HOSTED_VOLUME;
+
+ // Volume layout
+ switch (options->Type)
+ {
+ case VolumeType::Normal:
+ Layout.reset (new VolumeLayoutV2Normal());
+ break;
+
+ case VolumeType::Hidden:
+ Layout.reset (new VolumeLayoutV2Hidden());
+
+ if (HostSize < TC_MIN_HIDDEN_VOLUME_HOST_SIZE)
+ throw ParameterIncorrect (SRC_POS);
+ break;
+
+ default:
+ throw ParameterIncorrect (SRC_POS);
+ }
+
+ // Volume header
+ shared_ptr <VolumeHeader> header (Layout->GetHeader());
+ SecureBuffer headerBuffer (Layout->GetHeaderSize());
+
+ VolumeHeaderCreationOptions headerOptions;
+ headerOptions.EA = options->EA;
+ headerOptions.Kdf = options->VolumeHeaderKdf;
+ headerOptions.Type = options->Type;
+
+ headerOptions.SectorSize = options->SectorSize;
+
+ if (options->Type == VolumeType::Hidden)
+ headerOptions.VolumeDataStart = HostSize - Layout->GetHeaderSize() * 2 - options->Size;
+ else
+ headerOptions.VolumeDataStart = Layout->GetHeaderSize() * 2;
+
+ headerOptions.VolumeDataSize = Layout->GetMaxDataSize (options->Size);
+
+ if (headerOptions.VolumeDataSize < 1)
+ throw ParameterIncorrect (SRC_POS);
+
+ // Master data key
+ MasterKey.Allocate (options->EA->GetKeySize() * 2);
+ RandomNumberGenerator::GetData (MasterKey);
+ headerOptions.DataKey = MasterKey;
+
+ // PKCS5 salt
+ SecureBuffer salt (VolumeHeader::GetSaltSize());
+ RandomNumberGenerator::GetData (salt);
+ headerOptions.Salt = salt;
+
+ // Header key
+ HeaderKey.Allocate (VolumeHeader::GetLargestSerializedKeySize());
+ PasswordKey = Keyfile::ApplyListToPassword (options->Keyfiles, options->Password);
+ options->VolumeHeaderKdf->DeriveKey (HeaderKey, *PasswordKey, salt);
+ headerOptions.HeaderKey = HeaderKey;
+
+ header->Create (headerBuffer, headerOptions);
+
+ // Write new header
+ if (Layout->GetHeaderOffset() >= 0)
+ VolumeFile->SeekAt (Layout->GetHeaderOffset());
+ else
+ VolumeFile->SeekEnd (Layout->GetHeaderOffset());
+
+ VolumeFile->Write (headerBuffer);
+
+ if (options->Type == VolumeType::Normal)
+ {
+ // Write random data to space reserved for hidden volume header
+ Core->RandomizeEncryptionAlgorithmKey (options->EA);
+ options->EA->Encrypt (headerBuffer);
+
+ VolumeFile->Write (headerBuffer);
+ }
+
+ // Data area keys
+ options->EA->SetKey (MasterKey.GetRange (0, options->EA->GetKeySize()));
+ shared_ptr <EncryptionMode> mode (new EncryptionModeXTS ());
+ mode->SetKey (MasterKey.GetRange (options->EA->GetKeySize(), options->EA->GetKeySize()));
+ options->EA->SetMode (mode);
+
+ Options = options;
+ AbortRequested = false;
+
+ mProgressInfo.CreationInProgress = true;
+
+ struct ThreadFunctor : public Functor
+ {
+ ThreadFunctor (VolumeCreator *creator) : Creator (creator) { }
+ virtual void operator() ()
+ {
+ Creator->CreationThread ();
+ }
+ VolumeCreator *Creator;
+ };
+
+ Thread thread;
+ thread.Start (new ThreadFunctor (this));
+ }
+ catch (...)
+ {
+ VolumeFile.reset();
+ throw;
+ }
+ }
+
+ VolumeCreator::KeyInfo VolumeCreator::GetKeyInfo () const
+ {
+ KeyInfo info;
+ info.HeaderKey = HeaderKey;
+ info.MasterKey = MasterKey;
+ return info;
+ }
+
+ VolumeCreator::ProgressInfo VolumeCreator::GetProgressInfo ()
+ {
+ mProgressInfo.SizeDone = SizeDone.Get();
+ return mProgressInfo;
+ }
+}
diff --git a/src/Core/VolumeCreator.h b/src/Core/VolumeCreator.h
new file mode 100644
index 00000000..4e8cf61e
--- /dev/null
+++ b/src/Core/VolumeCreator.h
@@ -0,0 +1,119 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Volume_VolumeCreator
+#define TC_HEADER_Volume_VolumeCreator
+
+#include "Platform/Platform.h"
+#include "Volume/Volume.h"
+#include "RandomNumberGenerator.h"
+
+namespace TrueCrypt
+{
+
+ struct VolumeCreationOptions
+ {
+ VolumePath Path;
+ VolumeType::Enum Type;
+ uint64 Size;
+ shared_ptr <VolumePassword> Password;
+ shared_ptr <KeyfileList> Keyfiles;
+ shared_ptr <Pkcs5Kdf> VolumeHeaderKdf;
+ shared_ptr <EncryptionAlgorithm> EA;
+ bool Quick;
+
+ struct FilesystemType
+ {
+ enum Enum
+ {
+ Unknown = 0,
+ None,
+ FAT,
+ NTFS,
+ Ext2,
+ Ext3,
+ Ext4,
+ MacOsExt,
+ UFS
+ };
+
+ static Enum GetPlatformNative ()
+ {
+#ifdef TC_WINDOWS
+ return VolumeCreationOptions::FilesystemType::NTFS;
+#elif defined (TC_LINUX)
+ return VolumeCreationOptions::FilesystemType::Ext3;
+#elif defined (TC_MACOSX)
+ return VolumeCreationOptions::FilesystemType::MacOsExt;
+#elif defined (TC_FREEBSD) || defined (TC_SOLARIS)
+ return VolumeCreationOptions::FilesystemType::UFS;
+#else
+ return VolumeCreationOptions::FilesystemType::FAT;
+#endif
+ }
+ };
+
+ FilesystemType::Enum Filesystem;
+ uint32 FilesystemClusterSize;
+ uint32 SectorSize;
+ };
+
+ class VolumeCreator
+ {
+ public:
+
+ struct ProgressInfo
+ {
+ bool CreationInProgress;
+ uint64 TotalSize;
+ uint64 SizeDone;
+ };
+
+ struct KeyInfo
+ {
+ ConstBufferPtr HeaderKey;
+ ConstBufferPtr MasterKey;
+ };
+
+ VolumeCreator ();
+ virtual ~VolumeCreator ();
+
+ void Abort ();
+ void CheckResult ();
+ void CreateVolume (shared_ptr <VolumeCreationOptions> options);
+ KeyInfo GetKeyInfo () const;
+ ProgressInfo GetProgressInfo ();
+
+ protected:
+ void CreationThread ();
+
+ volatile bool AbortRequested;
+ volatile bool CreationInProgress;
+ uint64 DataStart;
+ uint64 HostSize;
+ shared_ptr <VolumeCreationOptions> Options;
+ shared_ptr <Exception> ThreadException;
+ uint64 VolumeSize;
+
+ shared_ptr <VolumeLayout> Layout;
+ shared_ptr <File> VolumeFile;
+ SharedVal <uint64> SizeDone;
+ uint64 WriteOffset;
+ ProgressInfo mProgressInfo;
+
+ SecureBuffer HeaderKey;
+ shared_ptr <VolumePassword> PasswordKey;
+ SecureBuffer MasterKey;
+
+ private:
+ VolumeCreator (const VolumeCreator &);
+ VolumeCreator &operator= (const VolumeCreator &);
+ };
+}
+
+#endif // TC_HEADER_Volume_VolumeCreator
diff --git a/src/Driver/Fuse/Driver.make b/src/Driver/Fuse/Driver.make
new file mode 100644
index 00000000..7e08e361
--- /dev/null
+++ b/src/Driver/Fuse/Driver.make
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+#
+# Governed by the TrueCrypt License 3.0 the full text of which is contained in
+# the file License.txt included in TrueCrypt binary and source code distribution
+# packages.
+#
+
+NAME := Driver
+
+OBJS :=
+OBJS += FuseService.o
+
+CXXFLAGS += $(shell pkg-config fuse --cflags)
+
+include $(BUILD_INC)/Makefile.inc
diff --git a/src/Driver/Fuse/FuseService.cpp b/src/Driver/Fuse/FuseService.cpp
new file mode 100644
index 00000000..fda56e0f
--- /dev/null
+++ b/src/Driver/Fuse/FuseService.cpp
@@ -0,0 +1,592 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#define FUSE_USE_VERSION 25
+#include <errno.h>
+#include <fcntl.h>
+#include <fuse.h>
+#include <iostream>
+#include <signal.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+
+#include "FuseService.h"
+#include "Platform/FileStream.h"
+#include "Platform/MemoryStream.h"
+#include "Platform/Serializable.h"
+#include "Platform/SystemLog.h"
+#include "Platform/Unix/Pipe.h"
+#include "Platform/Unix/Poller.h"
+#include "Volume/EncryptionThreadPool.h"
+#include "Core/Core.h"
+
+namespace TrueCrypt
+{
+ static int fuse_service_access (const char *path, int mask)
+ {
+ try
+ {
+ if (!FuseService::CheckAccessRights())
+ return -EACCES;
+ }
+ catch (...)
+ {
+ return FuseService::ExceptionToErrorCode();
+ }
+
+ return 0;
+ }
+
+ static void *fuse_service_init ()
+ {
+ try
+ {
+ // Termination signals are handled by a separate process to allow clean dismount on shutdown
+ struct sigaction action;
+ Memory::Zero (&action, sizeof (action));
+ action.sa_handler = SIG_IGN;
+
+ sigaction (SIGINT, &action, nullptr);
+ sigaction (SIGQUIT, &action, nullptr);
+ sigaction (SIGTERM, &action, nullptr);
+
+ if (!EncryptionThreadPool::IsRunning())
+ EncryptionThreadPool::Start();
+ }
+ catch (exception &e)
+ {
+ SystemLog::WriteException (e);
+ }
+ catch (...)
+ {
+ SystemLog::WriteException (UnknownException (SRC_POS));
+ }
+
+ return nullptr;
+ }
+
+ static void fuse_service_destroy (void *userdata)
+ {
+ try
+ {
+ FuseService::Dismount();
+ }
+ catch (exception &e)
+ {
+ SystemLog::WriteException (e);
+ }
+ catch (...)
+ {
+ SystemLog::WriteException (UnknownException (SRC_POS));
+ }
+ }
+
+ static int fuse_service_getattr (const char *path, struct stat *statData)
+ {
+ try
+ {
+ Memory::Zero (statData, sizeof(*statData));
+
+ statData->st_uid = FuseService::GetUserId();
+ statData->st_gid = FuseService::GetGroupId();
+ statData->st_atime = time (NULL);
+ statData->st_ctime = time (NULL);
+ statData->st_mtime = time (NULL);
+
+ if (strcmp (path, "/") == 0)
+ {
+ statData->st_mode = S_IFDIR | 0500;
+ statData->st_nlink = 2;
+ }
+ else
+ {
+ if (!FuseService::CheckAccessRights())
+ return -EACCES;
+
+ if (strcmp (path, FuseService::GetVolumeImagePath()) == 0)
+ {
+ statData->st_mode = S_IFREG | 0600;
+ statData->st_nlink = 1;
+ statData->st_size = FuseService::GetVolumeSize();
+ }
+ else if (strcmp (path, FuseService::GetControlPath()) == 0)
+ {
+ statData->st_mode = S_IFREG | 0600;
+ statData->st_nlink = 1;
+ statData->st_size = FuseService::GetVolumeInfo()->Size();
+ }
+ else
+ {
+ return -ENOENT;
+ }
+ }
+ }
+ catch (...)
+ {
+ return FuseService::ExceptionToErrorCode();
+ }
+
+ return 0;
+ }
+
+ static int fuse_service_opendir (const char *path, struct fuse_file_info *fi)
+ {
+ try
+ {
+ if (!FuseService::CheckAccessRights())
+ return -EACCES;
+
+ if (strcmp (path, "/") != 0)
+ return -ENOENT;
+ }
+ catch (...)
+ {
+ return FuseService::ExceptionToErrorCode();
+ }
+
+ return 0;
+ }
+
+ static int fuse_service_open (const char *path, struct fuse_file_info *fi)
+ {
+ try
+ {
+ if (!FuseService::CheckAccessRights())
+ return -EACCES;
+
+ if (strcmp (path, FuseService::GetVolumeImagePath()) == 0)
+ return 0;
+
+ if (strcmp (path, FuseService::GetControlPath()) == 0)
+ {
+ fi->direct_io = 1;
+ return 0;
+ }
+ }
+ catch (...)
+ {
+ return FuseService::ExceptionToErrorCode();
+ }
+ return -ENOENT;
+ }
+
+ static int fuse_service_read (const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi)
+ {
+ try
+ {
+ if (!FuseService::CheckAccessRights())
+ return -EACCES;
+
+ if (strcmp (path, FuseService::GetVolumeImagePath()) == 0)
+ {
+ try
+ {
+ // Test for read beyond the end of the volume
+ if ((uint64) offset + size > FuseService::GetVolumeSize())
+ size = FuseService::GetVolumeSize() - offset;
+
+ size_t sectorSize = FuseService::GetVolumeSectorSize();
+ if (size % sectorSize != 0 || offset % sectorSize != 0)
+ {
+ // Support for non-sector-aligned read operations is required by some loop device tools
+ // which may analyze the volume image before attaching it as a device
+
+ uint64 alignedOffset = offset - (offset % sectorSize);
+ uint64 alignedSize = size + (offset % sectorSize);
+
+ if (alignedSize % sectorSize != 0)
+ alignedSize += sectorSize - (alignedSize % sectorSize);
+
+ SecureBuffer alignedBuffer (alignedSize);
+
+ FuseService::ReadVolumeSectors (alignedBuffer, alignedOffset);
+ BufferPtr ((byte *) buf, size).CopyFrom (alignedBuffer.GetRange (offset % sectorSize, size));
+ }
+ else
+ {
+ FuseService::ReadVolumeSectors (BufferPtr ((byte *) buf, size), offset);
+ }
+ }
+ catch (MissingVolumeData)
+ {
+ return 0;
+ }
+
+ return size;
+ }
+
+ if (strcmp (path, FuseService::GetControlPath()) == 0)
+ {
+ shared_ptr <Buffer> infoBuf = FuseService::GetVolumeInfo();
+ BufferPtr outBuf ((byte *)buf, size);
+
+ if (offset >= (off_t) infoBuf->Size())
+ return 0;
+
+ if (offset + size > infoBuf->Size())
+ size = infoBuf->Size () - offset;
+
+ outBuf.CopyFrom (infoBuf->GetRange (offset, size));
+ return size;
+ }
+ }
+ catch (...)
+ {
+ return FuseService::ExceptionToErrorCode();
+ }
+
+ return -ENOENT;
+ }
+
+ static int fuse_service_readdir (const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi)
+ {
+ try
+ {
+ if (!FuseService::CheckAccessRights())
+ return -EACCES;
+
+ if (strcmp (path, "/") != 0)
+ return -ENOENT;
+
+ filler (buf, ".", NULL, 0);
+ filler (buf, "..", NULL, 0);
+ filler (buf, FuseService::GetVolumeImagePath() + 1, NULL, 0);
+ filler (buf, FuseService::GetControlPath() + 1, NULL, 0);
+ }
+ catch (...)
+ {
+ return FuseService::ExceptionToErrorCode();
+ }
+
+ return 0;
+ }
+
+ static int fuse_service_write (const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi)
+ {
+ try
+ {
+ if (!FuseService::CheckAccessRights())
+ return -EACCES;
+
+ if (strcmp (path, FuseService::GetVolumeImagePath()) == 0)
+ {
+ FuseService::WriteVolumeSectors (BufferPtr ((byte *) buf, size), offset);
+ return size;
+ }
+
+ if (strcmp (path, FuseService::GetControlPath()) == 0)
+ {
+ if (FuseService::AuxDeviceInfoReceived())
+ return -EACCES;
+
+ FuseService::ReceiveAuxDeviceInfo (ConstBufferPtr ((const byte *)buf, size));
+ return size;
+ }
+ }
+#ifdef TC_FREEBSD
+ // FreeBSD apparently retries failed write operations forever, which may lead to a system crash.
+ catch (VolumeReadOnly&)
+ {
+ return size;
+ }
+ catch (VolumeProtected&)
+ {
+ return size;
+ }
+#endif
+ catch (...)
+ {
+ return FuseService::ExceptionToErrorCode();
+ }
+
+ return -ENOENT;
+ }
+
+ bool FuseService::CheckAccessRights ()
+ {
+ return fuse_get_context()->uid == 0 || fuse_get_context()->uid == UserId;
+ }
+
+ void FuseService::CloseMountedVolume ()
+ {
+ if (MountedVolume)
+ {
+ // This process will exit before the use count of MountedVolume reaches zero
+ if (MountedVolume->GetFile().use_count() > 1)
+ MountedVolume->GetFile()->Close();
+
+ if (MountedVolume.use_count() > 1)
+ delete MountedVolume.get();
+
+ MountedVolume.reset();
+ }
+ }
+
+ void FuseService::Dismount ()
+ {
+ CloseMountedVolume();
+
+ if (EncryptionThreadPool::IsRunning())
+ EncryptionThreadPool::Stop();
+ }
+
+ int FuseService::ExceptionToErrorCode ()
+ {
+ try
+ {
+ throw;
+ }
+ catch (std::bad_alloc)
+ {
+ return -ENOMEM;
+ }
+ catch (ParameterIncorrect &e)
+ {
+ SystemLog::WriteException (e);
+ return -EINVAL;
+ }
+ catch (VolumeProtected&)
+ {
+ return -EPERM;
+ }
+ catch (VolumeReadOnly&)
+ {
+ return -EPERM;
+ }
+ catch (SystemException &e)
+ {
+ SystemLog::WriteException (e);
+ return -static_cast <int> (e.GetErrorCode());
+ }
+ catch (std::exception &e)
+ {
+ SystemLog::WriteException (e);
+ return -EINTR;
+ }
+ catch (...)
+ {
+ SystemLog::WriteException (UnknownException (SRC_POS));
+ return -EINTR;
+ }
+ }
+
+ shared_ptr <Buffer> FuseService::GetVolumeInfo ()
+ {
+ shared_ptr <Stream> stream (new MemoryStream);
+
+ {
+ ScopeLock lock (OpenVolumeInfoMutex);
+
+ OpenVolumeInfo.Set (*MountedVolume);
+ OpenVolumeInfo.SlotNumber = SlotNumber;
+
+ OpenVolumeInfo.Serialize (stream);
+ }
+
+ ConstBufferPtr infoBuf = dynamic_cast <MemoryStream&> (*stream);
+ shared_ptr <Buffer> outBuf (new Buffer (infoBuf.Size()));
+ outBuf->CopyFrom (infoBuf);
+
+ return outBuf;
+ }
+
+ const char *FuseService::GetVolumeImagePath ()
+ {
+#ifdef TC_MACOSX
+ return "/volume.dmg";
+#else
+ return "/volume";
+#endif
+ }
+
+ uint64 FuseService::GetVolumeSize ()
+ {
+ if (!MountedVolume)
+ throw NotInitialized (SRC_POS);
+
+ return MountedVolume->GetSize();
+ }
+
+ void FuseService::Mount (shared_ptr <Volume> openVolume, VolumeSlotNumber slotNumber, const string &fuseMountPoint)
+ {
+ list <string> args;
+ args.push_back (FuseService::GetDeviceType());
+ args.push_back (fuseMountPoint);
+
+#ifdef TC_MACOSX
+ args.push_back ("-o");
+ args.push_back ("noping_diskarb");
+ args.push_back ("-o");
+ args.push_back ("nobrowse");
+
+ if (getuid() == 0 || geteuid() == 0)
+#endif
+ {
+ args.push_back ("-o");
+ args.push_back ("allow_other");
+ }
+
+ ExecFunctor execFunctor (openVolume, slotNumber);
+ Process::Execute ("fuse", args, -1, &execFunctor);
+
+ for (int t = 0; true; t++)
+ {
+ try
+ {
+ if (FilesystemPath (fuseMountPoint + FuseService::GetControlPath()).GetType() == FilesystemPathType::File)
+ break;
+ }
+ catch (...)
+ {
+ if (t > 50)
+ throw;
+
+ Thread::Sleep (100);
+ }
+ }
+ }
+
+ void FuseService::ReadVolumeSectors (const BufferPtr &buffer, uint64 byteOffset)
+ {
+ if (!MountedVolume)
+ throw NotInitialized (SRC_POS);
+
+ MountedVolume->ReadSectors (buffer, byteOffset);
+ }
+
+ void FuseService::ReceiveAuxDeviceInfo (const ConstBufferPtr &buffer)
+ {
+ shared_ptr <Stream> stream (new MemoryStream (buffer));
+ Serializer sr (stream);
+
+ ScopeLock lock (OpenVolumeInfoMutex);
+ OpenVolumeInfo.VirtualDevice = sr.DeserializeString ("VirtualDevice");
+ OpenVolumeInfo.LoopDevice = sr.DeserializeString ("LoopDevice");
+ }
+
+ void FuseService::SendAuxDeviceInfo (const DirectoryPath &fuseMountPoint, const DevicePath &virtualDevice, const DevicePath &loopDevice)
+ {
+ File fuseServiceControl;
+ fuseServiceControl.Open (string (fuseMountPoint) + GetControlPath(), File::OpenWrite);
+
+ shared_ptr <Stream> stream (new MemoryStream);
+ Serializer sr (stream);
+
+ sr.Serialize ("VirtualDevice", string (virtualDevice));
+ sr.Serialize ("LoopDevice", string (loopDevice));
+ fuseServiceControl.Write (dynamic_cast <MemoryStream&> (*stream));
+ }
+
+ void FuseService::WriteVolumeSectors (const ConstBufferPtr &buffer, uint64 byteOffset)
+ {
+ if (!MountedVolume)
+ throw NotInitialized (SRC_POS);
+
+ MountedVolume->WriteSectors (buffer, byteOffset);
+ }
+
+ void FuseService::OnSignal (int signal)
+ {
+ try
+ {
+ shared_ptr <VolumeInfo> volume = Core->GetMountedVolume (SlotNumber);
+
+ if (volume)
+ Core->DismountVolume (volume, true);
+ }
+ catch (...) { }
+
+ _exit (0);
+ }
+
+ void FuseService::ExecFunctor::operator() (int argc, char *argv[])
+ {
+ struct timeval tv;
+ gettimeofday (&tv, NULL);
+ FuseService::OpenVolumeInfo.SerialInstanceNumber = (uint64)tv.tv_sec * 1000000ULL + tv.tv_usec;
+
+ FuseService::MountedVolume = MountedVolume;
+ FuseService::SlotNumber = SlotNumber;
+
+ FuseService::UserId = getuid();
+ FuseService::GroupId = getgid();
+
+ if (getenv ("SUDO_UID"))
+ {
+ try
+ {
+ string s (getenv ("SUDO_UID"));
+ FuseService::UserId = static_cast <uid_t> (StringConverter::ToUInt64 (s));
+
+ if (getenv ("SUDO_GID"))
+ {
+ s = getenv ("SUDO_GID");
+ FuseService::GroupId = static_cast <gid_t> (StringConverter::ToUInt64 (s));
+ }
+ }
+ catch (...) { }
+ }
+
+ static fuse_operations fuse_service_oper;
+
+ fuse_service_oper.access = fuse_service_access;
+ fuse_service_oper.destroy = fuse_service_destroy;
+ fuse_service_oper.getattr = fuse_service_getattr;
+ fuse_service_oper.init = fuse_service_init;
+ fuse_service_oper.open = fuse_service_open;
+ fuse_service_oper.opendir = fuse_service_opendir;
+ fuse_service_oper.read = fuse_service_read;
+ fuse_service_oper.readdir = fuse_service_readdir;
+ fuse_service_oper.write = fuse_service_write;
+
+ // Create a new session
+ setsid ();
+
+ // Fork handler of termination signals
+ SignalHandlerPipe.reset (new Pipe);
+
+ int forkedPid = fork();
+ throw_sys_if (forkedPid == -1);
+
+ if (forkedPid == 0)
+ {
+ CloseMountedVolume();
+
+ struct sigaction action;
+ Memory::Zero (&action, sizeof (action));
+ action.sa_handler = OnSignal;
+
+ sigaction (SIGINT, &action, nullptr);
+ sigaction (SIGQUIT, &action, nullptr);
+ sigaction (SIGTERM, &action, nullptr);
+
+ // Wait for the exit of the main service
+ byte buf[1];
+ if (read (SignalHandlerPipe->GetReadFD(), buf, sizeof (buf))) { } // Errors ignored
+
+ _exit (0);
+ }
+
+ SignalHandlerPipe->GetWriteFD();
+
+ _exit (fuse_main (argc, argv, &fuse_service_oper));
+ }
+
+ VolumeInfo FuseService::OpenVolumeInfo;
+ Mutex FuseService::OpenVolumeInfoMutex;
+ shared_ptr <Volume> FuseService::MountedVolume;
+ VolumeSlotNumber FuseService::SlotNumber;
+ uid_t FuseService::UserId;
+ gid_t FuseService::GroupId;
+ auto_ptr <Pipe> FuseService::SignalHandlerPipe;
+}
diff --git a/src/Driver/Fuse/FuseService.h b/src/Driver/Fuse/FuseService.h
new file mode 100644
index 00000000..5ff2dd72
--- /dev/null
+++ b/src/Driver/Fuse/FuseService.h
@@ -0,0 +1,73 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Driver_Fuse_FuseService
+#define TC_HEADER_Driver_Fuse_FuseService
+
+#include "Platform/Platform.h"
+#include "Platform/Unix/Pipe.h"
+#include "Platform/Unix/Process.h"
+#include "Volume/VolumeInfo.h"
+#include "Volume/Volume.h"
+
+namespace TrueCrypt
+{
+
+ class FuseService
+ {
+ protected:
+ struct ExecFunctor : public ProcessExecFunctor
+ {
+ ExecFunctor (shared_ptr <Volume> openVolume, VolumeSlotNumber slotNumber)
+ : MountedVolume (openVolume), SlotNumber (slotNumber)
+ {
+ }
+ virtual void operator() (int argc, char *argv[]);
+
+ protected:
+ shared_ptr <Volume> MountedVolume;
+ VolumeSlotNumber SlotNumber;
+ };
+
+ friend class ExecFunctor;
+
+ public:
+ static bool AuxDeviceInfoReceived () { return !OpenVolumeInfo.VirtualDevice.IsEmpty(); }
+ static bool CheckAccessRights ();
+ static void Dismount ();
+ static int ExceptionToErrorCode ();
+ static const char *GetControlPath () { return "/control"; }
+ static const char *GetVolumeImagePath ();
+ static string GetDeviceType () { return "truecrypt"; }
+ static uid_t GetGroupId () { return GroupId; }
+ static uid_t GetUserId () { return UserId; }
+ static shared_ptr <Buffer> GetVolumeInfo ();
+ static uint64 GetVolumeSize ();
+ static uint64 GetVolumeSectorSize () { return MountedVolume->GetSectorSize(); }
+ static void Mount (shared_ptr <Volume> openVolume, VolumeSlotNumber slotNumber, const string &fuseMountPoint);
+ static void ReadVolumeSectors (const BufferPtr &buffer, uint64 byteOffset);
+ static void ReceiveAuxDeviceInfo (const ConstBufferPtr &buffer);
+ static void SendAuxDeviceInfo (const DirectoryPath &fuseMountPoint, const DevicePath &virtualDevice, const DevicePath &loopDevice = DevicePath());
+ static void WriteVolumeSectors (const ConstBufferPtr &buffer, uint64 byteOffset);
+
+ protected:
+ FuseService ();
+ static void CloseMountedVolume ();
+ static void OnSignal (int signal);
+
+ static VolumeInfo OpenVolumeInfo;
+ static Mutex OpenVolumeInfoMutex;
+ static shared_ptr <Volume> MountedVolume;
+ static VolumeSlotNumber SlotNumber;
+ static uid_t UserId;
+ static gid_t GroupId;
+ static auto_ptr <Pipe> SignalHandlerPipe;
+ };
+}
+
+#endif // TC_HEADER_Driver_Fuse_FuseService
diff --git a/src/Main/Application.cpp b/src/Main/Application.cpp
new file mode 100644
index 00000000..f6d692cb
--- /dev/null
+++ b/src/Main/Application.cpp
@@ -0,0 +1,98 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include <wx/stdpaths.h>
+#include "Main.h"
+#include "Application.h"
+#include "CommandLineInterface.h"
+#ifndef TC_NO_GUI
+#include "GraphicUserInterface.h"
+#endif
+#include "TextUserInterface.h"
+
+namespace TrueCrypt
+{
+ wxApp* Application::CreateConsoleApp ()
+ {
+ mUserInterface = new TextUserInterface;
+ mUserInterfaceType = UserInterfaceType::Text;
+ return mUserInterface;
+ }
+
+#ifndef TC_NO_GUI
+ wxApp* Application::CreateGuiApp ()
+ {
+ mUserInterface = new GraphicUserInterface;
+ mUserInterfaceType = UserInterfaceType::Graphic;
+ return mUserInterface;
+ }
+#endif
+
+ FilePath Application::GetConfigFilePath (const wxString &configFileName, bool createConfigDir)
+ {
+ wxStandardPaths stdPaths;
+ DirectoryPath configDir;
+
+ if (!Core->IsInPortableMode())
+ {
+#ifdef TC_MACOSX
+ wxFileName configPath (L"~/Library/Application Support/TrueCrypt");
+ configPath.Normalize();
+ configDir = wstring (configPath.GetFullPath());
+#else
+ configDir = wstring (stdPaths.GetUserDataDir());
+#endif
+ }
+ else
+ configDir = GetExecutableDirectory();
+
+ if (createConfigDir && !configDir.IsDirectory())
+ Directory::Create (configDir);
+
+ FilePath filePath = wstring (wxFileName (wstring (configDir), configFileName).GetFullPath());
+ return filePath;
+ }
+
+ DirectoryPath Application::GetExecutableDirectory ()
+ {
+ return wstring (wxFileName (wxStandardPaths().GetExecutablePath()).GetPath());
+ }
+
+ FilePath Application::GetExecutablePath ()
+ {
+ return wstring (wxStandardPaths().GetExecutablePath());
+ }
+
+ void Application::Initialize (UserInterfaceType::Enum type)
+ {
+ switch (type)
+ {
+ case UserInterfaceType::Text:
+ {
+ wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) CreateConsoleApp);
+ break;
+ }
+
+#ifndef TC_NO_GUI
+ case UserInterfaceType::Graphic:
+ {
+ wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) CreateGuiApp);
+ break;
+ }
+#endif
+
+ default:
+ throw ParameterIncorrect (SRC_POS);
+ }
+ }
+
+ int Application::ExitCode = 0;
+ UserInterface *Application::mUserInterface = nullptr;
+ UserInterfaceType::Enum Application::mUserInterfaceType;
+}
diff --git a/src/Main/Application.h b/src/Main/Application.h
new file mode 100644
index 00000000..07ed3d03
--- /dev/null
+++ b/src/Main/Application.h
@@ -0,0 +1,40 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_AppMain
+#define TC_HEADER_Main_AppMain
+
+#include "Main.h"
+#include "UserInterface.h"
+#include "UserInterfaceType.h"
+
+namespace TrueCrypt
+{
+ class Application
+ {
+ public:
+ static wxApp* CreateConsoleApp ();
+ static wxApp* CreateGuiApp ();
+ static FilePath GetConfigFilePath (const wxString &configFileName, bool createConfigDir = false);
+ static DirectoryPath GetExecutableDirectory ();
+ static FilePath GetExecutablePath ();
+ static int GetExitCode () { return ExitCode; }
+ static wstring GetName () { return L"TrueCrypt"; }
+ static UserInterface *GetUserInterface () { return mUserInterface; }
+ static UserInterfaceType::Enum GetUserInterfaceType () { return mUserInterfaceType; }
+ static void Initialize (UserInterfaceType::Enum type);
+ static void SetExitCode (int code) { ExitCode = code; }
+
+ protected:
+ static int ExitCode;
+ static UserInterface *mUserInterface;
+ static UserInterfaceType::Enum mUserInterfaceType;
+ };
+}
+
+#endif // TC_HEADER_Main_AppMain
diff --git a/src/Main/CommandLineInterface.cpp b/src/Main/CommandLineInterface.cpp
new file mode 100644
index 00000000..ab5f90b2
--- /dev/null
+++ b/src/Main/CommandLineInterface.cpp
@@ -0,0 +1,583 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include <wx/cmdline.h>
+#include <wx/tokenzr.h>
+#include "Core/Core.h"
+#include "Application.h"
+#include "CommandLineInterface.h"
+#include "LanguageStrings.h"
+#include "UserInterfaceException.h"
+
+namespace TrueCrypt
+{
+ CommandLineInterface::CommandLineInterface (wxCmdLineParser &parser, UserInterfaceType::Enum interfaceType) :
+ ArgCommand (CommandId::None),
+ ArgFilesystem (VolumeCreationOptions::FilesystemType::Unknown),
+ ArgNoHiddenVolumeProtection (false),
+ ArgSize (0),
+ ArgVolumeType (VolumeType::Unknown),
+ StartBackgroundTask (false)
+ {
+ parser.SetSwitchChars (L"-");
+
+ parser.AddOption (L"", L"auto-mount", _("Auto mount device-hosted/favorite volumes"));
+ parser.AddSwitch (L"", L"backup-headers", _("Backup volume headers"));
+ parser.AddSwitch (L"", L"background-task", _("Start Background Task"));
+#ifdef TC_WINDOWS
+ parser.AddSwitch (L"", L"cache", _("Cache passwords and keyfiles"));
+#endif
+ parser.AddSwitch (L"C", L"change", _("Change password or keyfiles"));
+ parser.AddSwitch (L"c", L"create", _("Create new volume"));
+ parser.AddSwitch (L"", L"create-keyfile", _("Create new keyfile"));
+ parser.AddSwitch (L"", L"delete-token-keyfiles", _("Delete security token keyfiles"));
+ parser.AddSwitch (L"d", L"dismount", _("Dismount volume"));
+ parser.AddSwitch (L"", L"display-password", _("Display password while typing"));
+ parser.AddOption (L"", L"encryption", _("Encryption algorithm"));
+ parser.AddSwitch (L"", L"explore", _("Open explorer window for mounted volume"));
+ parser.AddSwitch (L"", L"export-token-keyfile",_("Export keyfile from security token"));
+ parser.AddOption (L"", L"filesystem", _("Filesystem type"));
+ parser.AddSwitch (L"f", L"force", _("Force mount/dismount/overwrite"));
+#if !defined(TC_WINDOWS) && !defined(TC_MACOSX)
+ parser.AddOption (L"", L"fs-options", _("Filesystem mount options"));
+#endif
+ parser.AddOption (L"", L"hash", _("Hash algorithm"));
+ parser.AddSwitch (L"h", L"help", _("Display detailed command line help"), wxCMD_LINE_OPTION_HELP);
+ parser.AddSwitch (L"", L"import-token-keyfiles", _("Import keyfiles to security token"));
+ parser.AddOption (L"k", L"keyfiles", _("Keyfiles"));
+ parser.AddSwitch (L"l", L"list", _("List mounted volumes"));
+ parser.AddSwitch (L"", L"list-token-keyfiles", _("List security token keyfiles"));
+ parser.AddSwitch (L"", L"load-preferences", _("Load user preferences"));
+ parser.AddSwitch (L"", L"mount", _("Mount volume interactively"));
+ parser.AddOption (L"m", L"mount-options", _("TrueCrypt volume mount options"));
+ parser.AddOption (L"", L"new-keyfiles", _("New keyfiles"));
+ parser.AddOption (L"", L"new-password", _("New password"));
+ parser.AddSwitch (L"", L"non-interactive", _("Do not interact with user"));
+ parser.AddOption (L"p", L"password", _("Password"));
+ parser.AddOption (L"", L"protect-hidden", _("Protect hidden volume"));
+ parser.AddOption (L"", L"protection-keyfiles", _("Keyfiles for protected hidden volume"));
+ parser.AddOption (L"", L"protection-password", _("Password for protected hidden volume"));
+ parser.AddOption (L"", L"random-source", _("Use file as source of random data"));
+ parser.AddSwitch (L"", L"restore-headers", _("Restore volume headers"));
+ parser.AddSwitch (L"", L"save-preferences", _("Save user preferences"));
+ parser.AddSwitch (L"", L"quick", _("Enable quick format"));
+ parser.AddOption (L"", L"size", _("Size in bytes"));
+ parser.AddOption (L"", L"slot", _("Volume slot number"));
+ parser.AddSwitch (L"", L"test", _("Test internal algorithms"));
+ parser.AddSwitch (L"t", L"text", _("Use text user interface"));
+ parser.AddOption (L"", L"token-lib", _("Security token library"));
+ parser.AddSwitch (L"v", L"verbose", _("Enable verbose output"));
+ parser.AddSwitch (L"", L"version", _("Display version information"));
+ parser.AddSwitch (L"", L"volume-properties", _("Display volume properties"));
+ parser.AddOption (L"", L"volume-type", _("Volume type"));
+ parser.AddParam ( _("Volume path"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
+ parser.AddParam ( _("Mount point"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
+
+ wxString str;
+ bool param1IsVolume = false;
+ bool param1IsMountedVolumeSpec = false;
+ bool param1IsMountPoint = false;
+ bool param1IsFile = false;
+
+ if (parser.Parse () > 0)
+ throw_err (_("Incorrect command line specified."));
+
+ if (parser.Found (L"help"))
+ {
+ ArgCommand = CommandId::Help;
+ return;
+ }
+
+ if (parser.Found (L"text") && interfaceType != UserInterfaceType::Text)
+ {
+ wstring msg = wstring (_("Option -t or --text must be specified as the first argument."));
+ wcerr << msg << endl;
+ throw_err (msg);
+ }
+
+ if (parser.Found (L"version"))
+ {
+ ArgCommand = CommandId::DisplayVersion;
+ return;
+ }
+
+ // Preferences
+ if (parser.Found (L"load-preferences"))
+ {
+ // Load preferences first to allow command line options to override them
+ Preferences.Load();
+ ArgMountOptions = Preferences.DefaultMountOptions;
+ }
+
+ // Commands
+ if (parser.Found (L"auto-mount", &str))
+ {
+ CheckCommandSingle();
+
+ wxStringTokenizer tokenizer (str, L",");
+ while (tokenizer.HasMoreTokens())
+ {
+ wxString token = tokenizer.GetNextToken();
+
+ if (token == L"devices")
+ {
+ if (ArgCommand == CommandId::AutoMountFavorites)
+ ArgCommand = CommandId::AutoMountDevicesFavorites;
+ else
+ ArgCommand = CommandId::AutoMountDevices;
+
+ param1IsMountPoint = true;
+ }
+ else if (token == L"favorites")
+ {
+ if (ArgCommand == CommandId::AutoMountDevices)
+ ArgCommand = CommandId::AutoMountDevicesFavorites;
+ else
+ ArgCommand = CommandId::AutoMountFavorites;
+ }
+ else
+ {
+ throw_err (LangString["UNKNOWN_OPTION"] + L": " + token);
+ }
+ }
+ }
+
+ if (parser.Found (L"backup-headers"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::BackupHeaders;
+ param1IsVolume = true;
+ }
+
+ if (parser.Found (L"change"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::ChangePassword;
+ param1IsVolume = true;
+ }
+
+ if (parser.Found (L"create"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::CreateVolume;
+ param1IsVolume = true;
+ }
+
+ if (parser.Found (L"create-keyfile"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::CreateKeyfile;
+ param1IsFile = true;
+ }
+
+ if (parser.Found (L"delete-token-keyfiles"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::DeleteSecurityTokenKeyfiles;
+ }
+
+ if (parser.Found (L"dismount"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::DismountVolumes;
+ param1IsMountedVolumeSpec = true;
+ }
+
+ if (parser.Found (L"export-token-keyfile"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::ExportSecurityTokenKeyfile;
+ }
+
+ if (parser.Found (L"import-token-keyfiles"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::ImportSecurityTokenKeyfiles;
+ }
+
+ if (parser.Found (L"list"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::ListVolumes;
+ param1IsMountedVolumeSpec = true;
+ }
+
+ if (parser.Found (L"list-token-keyfiles"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::ListSecurityTokenKeyfiles;
+ }
+
+ if (parser.Found (L"mount"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::MountVolume;
+ param1IsVolume = true;
+ }
+
+ if (parser.Found (L"save-preferences"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::SavePreferences;
+ }
+
+ if (parser.Found (L"test"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::Test;
+ }
+
+ if (parser.Found (L"volume-properties"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::DisplayVolumeProperties;
+ param1IsMountedVolumeSpec = true;
+ }
+
+ // Options
+ if (parser.Found (L"background-task"))
+ StartBackgroundTask = true;
+
+#ifdef TC_WINDOWS
+ if (parser.Found (L"cache"))
+ ArgMountOptions.CachePassword = true;
+#endif
+ ArgDisplayPassword = parser.Found (L"display-password");
+
+ if (parser.Found (L"encryption", &str))
+ {
+ ArgEncryptionAlgorithm.reset();
+
+ foreach (shared_ptr <EncryptionAlgorithm> ea, EncryptionAlgorithm::GetAvailableAlgorithms())
+ {
+ if (!ea->IsDeprecated() && wxString (ea->GetName()).IsSameAs (str, false))
+ ArgEncryptionAlgorithm = ea;
+ }
+
+ if (!ArgEncryptionAlgorithm)
+ throw_err (LangString["UNKNOWN_OPTION"] + L": " + str);
+ }
+
+ if (parser.Found (L"explore"))
+ Preferences.OpenExplorerWindowAfterMount = true;
+
+ if (parser.Found (L"filesystem", &str))
+ {
+ if (str.IsSameAs (L"none", false))
+ {
+ ArgMountOptions.NoFilesystem = true;
+ ArgFilesystem = VolumeCreationOptions::FilesystemType::None;
+ }
+ else
+ {
+ ArgMountOptions.FilesystemType = wstring (str);
+
+ if (str.IsSameAs (L"FAT", false))
+ ArgFilesystem = VolumeCreationOptions::FilesystemType::FAT;
+ else
+ ArgFilesystem = VolumeCreationOptions::FilesystemType::None;
+ }
+ }
+
+ ArgForce = parser.Found (L"force");
+
+#if !defined(TC_WINDOWS) && !defined(TC_MACOSX)
+ if (parser.Found (L"fs-options", &str))
+ ArgMountOptions.FilesystemOptions = str;
+#endif
+
+ if (parser.Found (L"hash", &str))
+ {
+ ArgHash.reset();
+
+ foreach (shared_ptr <Hash> hash, Hash::GetAvailableAlgorithms())
+ {
+ if (wxString (hash->GetName()).IsSameAs (str, false))
+ ArgHash = hash;
+ }
+
+ if (!ArgHash)
+ throw_err (LangString["UNKNOWN_OPTION"] + L": " + str);
+ }
+
+ if (parser.Found (L"keyfiles", &str))
+ ArgKeyfiles = ToKeyfileList (str);
+
+ if (parser.Found (L"mount-options", &str))
+ {
+ wxStringTokenizer tokenizer (str, L",");
+ while (tokenizer.HasMoreTokens())
+ {
+ wxString token = tokenizer.GetNextToken();
+
+ if (token == L"headerbak")
+ ArgMountOptions.UseBackupHeaders = true;
+ else if (token == L"nokernelcrypto")
+ ArgMountOptions.NoKernelCrypto = true;
+ else if (token == L"readonly" || token == L"ro")
+ ArgMountOptions.Protection = VolumeProtection::ReadOnly;
+ else if (token == L"system")
+ ArgMountOptions.PartitionInSystemEncryptionScope = true;
+ else if (token == L"timestamp" || token == L"ts")
+ ArgMountOptions.PreserveTimestamps = false;
+#ifdef TC_WINDOWS
+ else if (token == L"removable" || token == L"rm")
+ ArgMountOptions.Removable = true;
+#endif
+ else
+ throw_err (LangString["UNKNOWN_OPTION"] + L": " + token);
+ }
+ }
+
+ if (parser.Found (L"new-keyfiles", &str))
+ ArgNewKeyfiles = ToKeyfileList (str);
+
+ if (parser.Found (L"new-password", &str))
+ ArgNewPassword.reset (new VolumePassword (wstring (str)));
+
+ if (parser.Found (L"non-interactive"))
+ {
+ if (interfaceType != UserInterfaceType::Text)
+ throw_err (L"--non-interactive is supported only in text mode");
+
+ Preferences.NonInteractive = true;
+ }
+
+ if (parser.Found (L"password", &str))
+ ArgPassword.reset (new VolumePassword (wstring (str)));
+
+ if (parser.Found (L"protect-hidden", &str))
+ {
+ if (str == L"yes")
+ {
+ if (ArgMountOptions.Protection != VolumeProtection::ReadOnly)
+ ArgMountOptions.Protection = VolumeProtection::HiddenVolumeReadOnly;
+ }
+ else if (str == L"no")
+ ArgNoHiddenVolumeProtection = true;
+ else
+ throw_err (LangString["UNKNOWN_OPTION"] + L": " + str);
+ }
+
+ if (parser.Found (L"protection-keyfiles", &str))
+ {
+ ArgMountOptions.ProtectionKeyfiles = ToKeyfileList (str);
+ ArgMountOptions.Protection = VolumeProtection::HiddenVolumeReadOnly;
+ }
+
+ if (parser.Found (L"protection-password", &str))
+ {
+ ArgMountOptions.ProtectionPassword.reset (new VolumePassword (wstring (str)));
+ ArgMountOptions.Protection = VolumeProtection::HiddenVolumeReadOnly;
+ }
+
+ ArgQuick = parser.Found (L"quick");
+
+ if (parser.Found (L"random-source", &str))
+ ArgRandomSourcePath = FilesystemPath (str);
+
+ if (parser.Found (L"restore-headers"))
+ {
+ CheckCommandSingle();
+ ArgCommand = CommandId::RestoreHeaders;
+ param1IsVolume = true;
+ }
+
+ if (parser.Found (L"slot", &str))
+ {
+ unsigned long number;
+ if (!str.ToULong (&number) || number < Core->GetFirstSlotNumber() || number > Core->GetLastSlotNumber())
+ throw_err (LangString["PARAMETER_INCORRECT"] + L": " + str);
+
+ ArgMountOptions.SlotNumber = number;
+
+ if (param1IsMountedVolumeSpec)
+ {
+ shared_ptr <VolumeInfo> volume = Core->GetMountedVolume (number);
+ if (!volume)
+ throw_err (_("No such volume is mounted."));
+
+ ArgVolumes.push_back (volume);
+ param1IsMountedVolumeSpec = false;
+ }
+ }
+
+ if (parser.Found (L"size", &str))
+ {
+ try
+ {
+ ArgSize = StringConverter::ToUInt64 (wstring (str));
+ }
+ catch (...)
+ {
+ throw_err (LangString["PARAMETER_INCORRECT"] + L": " + str);
+ }
+ }
+
+ if (parser.Found (L"token-lib", &str))
+ Preferences.SecurityTokenModule = wstring (str);
+
+ if (parser.Found (L"verbose"))
+ Preferences.Verbose = true;
+
+ if (parser.Found (L"volume-type", &str))
+ {
+ if (str.IsSameAs (L"normal", false))
+ ArgVolumeType = VolumeType::Normal;
+ else if (str.IsSameAs (L"hidden", false))
+ ArgVolumeType = VolumeType::Hidden;
+ else
+ throw_err (LangString["UNKNOWN_OPTION"] + L": " + str);
+ }
+
+ // Parameters
+ if (parser.GetParamCount() > 0)
+ {
+ if (ArgCommand == CommandId::None)
+ {
+ ArgCommand = CommandId::MountVolume;
+ param1IsVolume = true;
+ }
+
+ if (param1IsVolume)
+ {
+ wxFileName volPath (parser.GetParam (0));
+
+#ifdef TC_WINDOWS
+ if (!parser.GetParam (0).StartsWith (L"\\Device\\"))
+#endif
+ volPath.Normalize (wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS);
+
+ ArgVolumePath.reset (new VolumePath (wstring (volPath.GetFullPath())));
+ }
+
+ if (param1IsMountPoint || parser.GetParamCount() >= 2)
+ {
+ wstring s (parser.GetParam (param1IsMountPoint ? 0 : 1));
+
+ if (s.empty())
+ ArgMountOptions.NoFilesystem = true;
+
+ wxFileName mountPoint (wstring (Directory::AppendSeparator (s)));
+ mountPoint.Normalize (wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS);
+ ArgMountPoint.reset (new DirectoryPath (wstring (mountPoint.GetPath())));
+ }
+
+ if (param1IsFile)
+ {
+ ArgFilePath.reset (new FilePath (parser.GetParam (0)));
+ }
+ }
+
+ if (param1IsMountedVolumeSpec)
+ ArgVolumes = GetMountedVolumes (parser.GetParamCount() > 0 ? parser.GetParam (0) : wxString());
+
+ if (ArgCommand == CommandId::None && Application::GetUserInterfaceType() == UserInterfaceType::Text)
+ parser.Usage();
+ }
+
+ CommandLineInterface::~CommandLineInterface ()
+ {
+ }
+
+ void CommandLineInterface::CheckCommandSingle () const
+ {
+ if (ArgCommand != CommandId::None)
+ throw_err (_("Only a single command can be specified at a time."));
+ }
+
+ shared_ptr <KeyfileList> CommandLineInterface::ToKeyfileList (const wxString &arg) const
+ {
+ wxStringTokenizer tokenizer (arg, L",", wxTOKEN_RET_EMPTY_ALL);
+
+ // Handle escaped separator
+ wxArrayString arr;
+ bool prevEmpty = false;
+ while (tokenizer.HasMoreTokens())
+ {
+ wxString token = tokenizer.GetNextToken();
+
+ if (prevEmpty && token.empty() && tokenizer.HasMoreTokens())
+ {
+ token = tokenizer.GetNextToken();
+ if (!token.empty())
+ {
+ arr.Add (token);
+ prevEmpty = true;
+ continue;
+ }
+ }
+
+ if (token.empty() && !tokenizer.HasMoreTokens())
+ break;
+
+ if (prevEmpty || token.empty())
+ {
+ if (arr.Count() < 1)
+ {
+ arr.Add (L"");
+ continue;
+ }
+ arr.Last() += token.empty() ? L',' : token;
+ }
+ else
+ arr.Add (token);
+
+ prevEmpty = token.empty();
+ }
+
+ make_shared_auto (KeyfileList, keyfileList);
+ for (size_t i = 0; i < arr.GetCount(); i++)
+ {
+ if (!arr[i].empty())
+ keyfileList->push_back (make_shared <Keyfile> (wstring (arr[i])));
+ }
+
+ return keyfileList;
+ }
+
+ VolumeInfoList CommandLineInterface::GetMountedVolumes (const wxString &mountedVolumeSpec) const
+ {
+ VolumeInfoList volumes = Core->GetMountedVolumes ();
+ VolumeInfoList filteredVolumes;
+
+ wxFileName pathFilter;
+ if (!mountedVolumeSpec.empty())
+ {
+ pathFilter = mountedVolumeSpec;
+ pathFilter.Normalize (wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS);
+ }
+ else
+ return volumes;
+
+ foreach (shared_ptr <VolumeInfo> volume, volumes)
+ {
+ if (mountedVolumeSpec.empty())
+ {
+ filteredVolumes.push_back (volume);
+ }
+ else if (wxString (volume->Path) == pathFilter.GetFullPath())
+ {
+ filteredVolumes.push_back (volume);
+ }
+ else if (wxString (volume->MountPoint) == pathFilter.GetFullPath()
+ || (wxString (volume->MountPoint) + wxFileName::GetPathSeparator()) == pathFilter.GetFullPath())
+ {
+ filteredVolumes.push_back (volume);
+ }
+ }
+
+ if (!mountedVolumeSpec.IsEmpty() && filteredVolumes.size() < 1)
+ throw_err (_("No such volume is mounted."));
+
+ return filteredVolumes;
+ }
+
+ auto_ptr <CommandLineInterface> CmdLine;
+}
diff --git a/src/Main/CommandLineInterface.h b/src/Main/CommandLineInterface.h
new file mode 100644
index 00000000..50f98f6c
--- /dev/null
+++ b/src/Main/CommandLineInterface.h
@@ -0,0 +1,94 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_CommandInterface
+#define TC_HEADER_Main_CommandInterface
+
+#include "System.h"
+#include "Main.h"
+#include "Volume/VolumeInfo.h"
+#include "Core/MountOptions.h"
+#include "Core/VolumeCreator.h"
+#include "UserPreferences.h"
+#include "UserInterfaceType.h"
+
+namespace TrueCrypt
+{
+ struct CommandId
+ {
+ enum Enum
+ {
+ None,
+ AutoMountDevices,
+ AutoMountDevicesFavorites,
+ AutoMountFavorites,
+ BackupHeaders,
+ ChangePassword,
+ CreateKeyfile,
+ CreateVolume,
+ DeleteSecurityTokenKeyfiles,
+ DismountVolumes,
+ DisplayVersion,
+ DisplayVolumeProperties,
+ ExportSecurityTokenKeyfile,
+ Help,
+ ImportSecurityTokenKeyfiles,
+ ListSecurityTokenKeyfiles,
+ ListVolumes,
+ MountVolume,
+ RestoreHeaders,
+ SavePreferences,
+ Test
+ };
+ };
+
+ struct CommandLineInterface
+ {
+ public:
+ CommandLineInterface (wxCmdLineParser &parser, UserInterfaceType::Enum interfaceType);
+ virtual ~CommandLineInterface ();
+
+
+ CommandId::Enum ArgCommand;
+ bool ArgDisplayPassword;
+ shared_ptr <EncryptionAlgorithm> ArgEncryptionAlgorithm;
+ shared_ptr <FilePath> ArgFilePath;
+ VolumeCreationOptions::FilesystemType::Enum ArgFilesystem;
+ bool ArgForce;
+ shared_ptr <Hash> ArgHash;
+ shared_ptr <KeyfileList> ArgKeyfiles;
+ MountOptions ArgMountOptions;
+ shared_ptr <DirectoryPath> ArgMountPoint;
+ shared_ptr <KeyfileList> ArgNewKeyfiles;
+ shared_ptr <VolumePassword> ArgNewPassword;
+ bool ArgNoHiddenVolumeProtection;
+ shared_ptr <VolumePassword> ArgPassword;
+ bool ArgQuick;
+ FilesystemPath ArgRandomSourcePath;
+ uint64 ArgSize;
+ shared_ptr <VolumePath> ArgVolumePath;
+ VolumeInfoList ArgVolumes;
+ VolumeType::Enum ArgVolumeType;
+
+ bool StartBackgroundTask;
+ UserPreferences Preferences;
+
+ protected:
+ void CheckCommandSingle () const;
+ shared_ptr <KeyfileList> ToKeyfileList (const wxString &arg) const;
+ VolumeInfoList GetMountedVolumes (const wxString &filter) const;
+
+ private:
+ CommandLineInterface (const CommandLineInterface &);
+ CommandLineInterface &operator= (const CommandLineInterface &);
+ };
+
+ extern auto_ptr <CommandLineInterface> CmdLine;
+}
+
+#endif // TC_HEADER_Main_CommandInterface
diff --git a/src/Main/FatalErrorHandler.cpp b/src/Main/FatalErrorHandler.cpp
new file mode 100644
index 00000000..d84a717d
--- /dev/null
+++ b/src/Main/FatalErrorHandler.cpp
@@ -0,0 +1,274 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include <wx/stackwalk.h>
+
+#include "Main.h"
+#include "Application.h"
+#include "UserInterface.h"
+#include "GraphicUserInterface.h"
+#include "Volume/Crc32.h"
+
+#ifdef TC_UNIX
+#include <signal.h>
+#endif
+
+#ifdef TC_MACOSX
+# ifdef __ppc__
+# include <ppc/ucontext.h>
+# else
+# include <i386/ucontext.h>
+# endif
+#elif defined (TC_BSD)
+# include <ucontext.h>
+#endif
+
+#include "FatalErrorHandler.h"
+
+namespace TrueCrypt
+{
+ static terminate_handler DefaultTerminateHandler;
+
+ struct FatalErrorReport
+ {
+ bool UnhandledException;
+ };
+
+#ifdef TC_UNIX
+ static void OnFatalProgramErrorSignal (int, siginfo_t *signalInfo, void *contextArg)
+ {
+ TC_UNUSED_VAR ucontext_t *context = (ucontext_t *) contextArg;
+ uint64 faultingInstructionAddress = 0;
+
+#ifdef TC_LINUX
+# ifdef REG_EIP
+ faultingInstructionAddress = context->uc_mcontext.gregs[REG_EIP];
+# elif defined (REG_RIP)
+ faultingInstructionAddress = context->uc_mcontext.gregs[REG_RIP];
+# endif
+
+#elif defined (TC_MACOSX)
+# ifdef __ppc__
+ faultingInstructionAddress = context->uc_mcontext->ss.srr0;
+# elif defined (__x86_64__)
+ faultingInstructionAddress = context->uc_mcontext->ss.rip;
+# else
+ faultingInstructionAddress = context->uc_mcontext->ss.eip;
+# endif
+
+#endif
+ wstringstream vars;
+
+ vars << L"cpus=" << wxThread::GetCPUCount();
+ vars << L"&cksum=" << hex << FatalErrorHandler::GetAppChecksum() << dec;
+ vars << L"&err=" << signalInfo->si_signo;
+ vars << L"&addr=" << hex << faultingInstructionAddress << dec;
+ vars << FatalErrorHandler::GetCallStack (16);
+
+ wxString url = Gui->GetHomepageLinkURL (L"err-report", true, vars.str());
+ url.Replace (L"=0x", L"=");
+ url.Replace (L"=0X0x", L"=0x");
+ url.Replace (L"=0X", L"=0x");
+
+ wxString msg = L"A critical error has occurred and TrueCrypt must be terminated. If this is caused by a bug in TrueCrypt, we would like to fix it. To help us, you can send us an automatically generated error report containing the following items:\n\n- Program version\n- Operating system version\n- Hardware architecture\n- Checksum of TrueCrypt executable\n- Error category\n- Error address\n";
+#if wxUSE_STACKWALKER == 1
+ msg += L"- TrueCrypt call stack\n";
+#endif
+ msg += L"\nIf you select 'Yes', the following URL (which contains the entire error report) will be opened in your default Internet browser.\n\n";
+
+#ifdef __WXGTK__
+ wxString fUrl = url;
+ fUrl.Replace (L"&st", L" &st");
+ msg += fUrl;
+#else
+ msg += url;
+#endif
+
+ msg += L"\n\nDo you want to send us the error report?";
+
+ if (Gui->AskYesNo (msg, true))
+ wxLaunchDefaultBrowser (url, wxBROWSER_NEW_WINDOW);
+
+ _exit (1);
+ }
+#endif // TC_UNIX
+
+ void FatalErrorHandler::Deregister()
+ {
+#ifdef TC_UNIX
+ signal (SIGILL, SIG_DFL);
+ signal (SIGFPE, SIG_DFL);
+ signal (SIGSEGV, SIG_DFL);
+ signal (SIGBUS, SIG_DFL);
+ signal (SIGSYS, SIG_DFL);
+#endif
+
+#ifndef TC_WINDOWS
+ std::set_terminate (DefaultTerminateHandler);
+#endif
+ }
+
+ uint32 FatalErrorHandler::GetAppChecksum ()
+ {
+ uint32 checkSum = 0;
+ try
+ {
+ File executable;
+ executable.Open (Application::GetExecutablePath());
+
+ Buffer executableData (executable.Length());
+ executable.ReadCompleteBuffer (executableData);
+ checkSum = Crc32::ProcessBuffer (executableData);
+ }
+ catch (...) { }
+
+ return checkSum;
+ }
+
+ wstring FatalErrorHandler::GetCallStack (int depth)
+ {
+#if wxUSE_STACKWALKER == 1
+
+ class StackWalker : public wxStackWalker
+ {
+ public:
+ StackWalker () : FrameCount (0) { }
+
+ void OnStackFrame (const wxStackFrame &frame)
+ {
+ if (FrameCount >= 32)
+ return;
+
+ StackVars << L"&st" << FrameCount++ << L"=";
+
+ wxString functionName = frame.GetName();
+ if (!functionName.empty() && !frame.GetModule().empty())
+ {
+ int p = functionName.Find (L"(");
+ if (p != wxNOT_FOUND)
+ functionName = functionName.Mid (0, p);
+
+ for (size_t i = 0; i < functionName.size(); ++i)
+ {
+ if (!isalnum (functionName[i]))
+ functionName[i] = L'_';
+ }
+
+ while (functionName.Replace (L"__", L"_"));
+
+ StackVars << wstring (functionName);
+ }
+ else
+ StackVars << "0X" << hex << frame.GetAddress() << dec;
+ }
+
+ int FrameCount;
+ wstringstream StackVars;
+ };
+
+ StackWalker stackWalker;
+ stackWalker.Walk (2);
+
+ return stackWalker.StackVars.str();
+
+#else // wxUSE_STACKWALKER
+
+ return wstring();
+
+#endif // wxUSE_STACKWALKER
+ }
+
+ void FatalErrorHandler::OnTerminate ()
+ {
+ try
+ {
+ throw;
+ }
+ catch (UserAbort&)
+ {
+ }
+ catch (Exception &e)
+ {
+ wxString vars;
+
+ wxString exName = StringConverter::ToWide (StringConverter::GetTypeName (typeid (e)));
+ if (exName.find (L"TrueCrypt::") != string::npos)
+ exName = exName.Mid (11);
+
+ wxString exPos = StringConverter::ToWide (e.what());
+ if (exPos.find (L"TrueCrypt::") != string::npos)
+ exPos = exPos.Mid (11);
+
+ vars << L"cpus=" << wxThread::GetCPUCount();
+ vars << wxString::Format (L"&cksum=%x", GetAppChecksum());
+ vars << L"&exception=" << exName;
+ vars << L"&exlocation=" << exPos;
+ vars << FatalErrorHandler::GetCallStack (16);
+
+ vars.Replace (L"::", L".");
+ vars.Replace (L":", L".");
+
+ wxString url = Gui->GetHomepageLinkURL (L"err-report", true, vars);
+ url.Replace (L"=0x", L"=");
+ url.Replace (L"=0X0x", L"=0x");
+ url.Replace (L"=0X", L"=0x");
+
+ wxString msg = L"An unhandled exception has occurred and TrueCrypt must be terminated. If this is caused by a bug in TrueCrypt, we would like to fix it. To help us, you can send us an automatically generated error report containing the following items:\n\n- Program version\n- Operating system version\n- Hardware architecture\n- Checksum of TrueCrypt executable\n- Error description\n- Error location\n";
+#if wxUSE_STACKWALKER == 1
+ msg += L"- TrueCrypt call stack\n";
+#endif
+ msg += L"\nIf you select 'Yes', the following URL (which contains the entire error report) will be opened in your default Internet browser.\n\n";
+
+#ifdef __WXGTK__
+ wxString fUrl = url;
+ fUrl.Replace (L"&st", L" &st");
+ msg += fUrl;
+#else
+ msg += url;
+#endif
+
+ msg += L"\n\nDo you want to send us the error report?";
+
+ if (Gui->AskYesNo (msg, true))
+ wxLaunchDefaultBrowser (url, wxBROWSER_NEW_WINDOW);
+
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ catch (...)
+ {
+ Gui->ShowError (_("Unknown exception occurred."));
+ }
+
+ _exit (1);
+ }
+
+ void FatalErrorHandler::Register ()
+ {
+#ifndef TC_WINDOWS
+ // OnUnhandledException() seems to be called only on Windows
+ DefaultTerminateHandler = std::set_terminate (OnTerminate);
+#endif
+
+#ifdef TC_UNIX
+ struct sigaction action;
+ Memory::Zero (&action, sizeof (action));
+ action.sa_flags = SA_SIGINFO;
+ action.sa_sigaction = OnFatalProgramErrorSignal;
+
+ throw_sys_if (sigaction (SIGILL, &action, nullptr) == -1);
+ throw_sys_if (sigaction (SIGFPE, &action, nullptr) == -1);
+ throw_sys_if (sigaction (SIGSEGV, &action, nullptr) == -1);
+ throw_sys_if (sigaction (SIGBUS, &action, nullptr) == -1);
+ throw_sys_if (sigaction (SIGSYS, &action, nullptr) == -1);
+#endif
+ }
+}
diff --git a/src/Main/FatalErrorHandler.h b/src/Main/FatalErrorHandler.h
new file mode 100644
index 00000000..478b0ae8
--- /dev/null
+++ b/src/Main/FatalErrorHandler.h
@@ -0,0 +1,33 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_FatalErrorHandler
+#define TC_HEADER_Main_FatalErrorHandler
+
+#include "System.h"
+
+namespace TrueCrypt
+{
+ class FatalErrorHandler
+ {
+ public:
+ static void Deregister();
+ static uint32 GetAppChecksum ();
+ static wstring GetCallStack (int depth);
+ static void Register();
+
+ protected:
+ static void OnSignal (int signal);
+ static void OnTerminate ();
+
+ private:
+ FatalErrorHandler ();
+ };
+}
+
+#endif // TC_HEADER_Main_FatalErrorHandler
diff --git a/src/Main/FavoriteVolume.cpp b/src/Main/FavoriteVolume.cpp
new file mode 100644
index 00000000..06831791
--- /dev/null
+++ b/src/Main/FavoriteVolume.cpp
@@ -0,0 +1,94 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Application.h"
+#include "FavoriteVolume.h"
+#include "Xml.h"
+
+namespace TrueCrypt
+{
+ FavoriteVolumeList FavoriteVolume::LoadList ()
+ {
+ FavoriteVolumeList favorites;
+
+ FilePath path = Application::GetConfigFilePath (GetFileName());
+
+ if (path.IsFile())
+ {
+ foreach (XmlNode node, XmlParser (path).GetNodes (L"volume"))
+ {
+ VolumeSlotNumber slotNumber = 0;
+ wstring attr = wstring (node.Attributes[L"slotnumber"]);
+ if (!attr.empty())
+ slotNumber = StringConverter::ToUInt64 (attr);
+
+ bool readOnly = false;
+ attr = wstring (node.Attributes[L"readonly"]);
+ if (!attr.empty())
+ readOnly = (StringConverter::ToUInt32 (attr) != 0 ? true : false);
+
+ bool system = false;
+ attr = wstring (node.Attributes[L"system"]);
+ if (!attr.empty())
+ system = (StringConverter::ToUInt32 (attr) != 0 ? true : false);
+
+ favorites.push_back (shared_ptr <FavoriteVolume> (
+ new FavoriteVolume ((wstring) node.InnerText, wstring (node.Attributes[L"mountpoint"]), slotNumber, readOnly, system)));
+ }
+ }
+
+ return favorites;
+ }
+
+ void FavoriteVolume::SaveList (const FavoriteVolumeList &favorites)
+ {
+ FilePath favoritesCfgPath = Application::GetConfigFilePath (GetFileName(), true);
+
+ if (favorites.empty())
+ {
+ if (favoritesCfgPath.IsFile())
+ favoritesCfgPath.Delete();
+ }
+ else
+ {
+ XmlNode favoritesXml (L"favorites");
+
+ foreach_ref (const FavoriteVolume &favorite, favorites)
+ {
+ XmlNode node (L"volume", wstring (favorite.Path));
+ node.Attributes[L"mountpoint"] = wstring (favorite.MountPoint);
+ node.Attributes[L"slotnumber"] = StringConverter::FromNumber (favorite.SlotNumber);
+ node.Attributes[L"readonly"] = StringConverter::FromNumber (favorite.ReadOnly ? 1 : 0);
+ node.Attributes[L"system"] = StringConverter::FromNumber (favorite.System ? 1 : 0);
+
+ favoritesXml.InnerNodes.push_back (node);
+ }
+
+ XmlWriter favoritesWriter (favoritesCfgPath);
+ favoritesWriter.WriteNode (favoritesXml);
+ favoritesWriter.Close();
+ }
+ }
+
+ void FavoriteVolume::ToMountOptions (MountOptions &options) const
+ {
+ if (MountPoint.IsEmpty())
+ {
+ options.MountPoint.reset();
+ options.NoFilesystem = true;
+ }
+ else
+ options.MountPoint.reset (new DirectoryPath (MountPoint));
+
+ options.Path.reset (new VolumePath (Path));
+ options.PartitionInSystemEncryptionScope = System;
+ options.Protection = (ReadOnly ? VolumeProtection::ReadOnly : VolumeProtection::None);
+ options.SlotNumber = SlotNumber;
+ }
+}
diff --git a/src/Main/FavoriteVolume.h b/src/Main/FavoriteVolume.h
new file mode 100644
index 00000000..f16ca5b9
--- /dev/null
+++ b/src/Main/FavoriteVolume.h
@@ -0,0 +1,53 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_FavoriteVolume
+#define TC_HEADER_Main_FavoriteVolume
+
+#include "System.h"
+#include "Main.h"
+
+namespace TrueCrypt
+{
+ struct FavoriteVolume;
+ typedef list < shared_ptr <FavoriteVolume> > FavoriteVolumeList;
+
+ struct FavoriteVolume
+ {
+ public:
+ FavoriteVolume ()
+ : ReadOnly (false),
+ System (false)
+ {
+ }
+
+ FavoriteVolume (const VolumePath &path, const DirectoryPath &mountPoint, VolumeSlotNumber slotNumber, bool readOnly, bool system)
+ : MountPoint (mountPoint),
+ Path (path),
+ ReadOnly (readOnly),
+ SlotNumber (slotNumber),
+ System (system)
+ {
+ }
+
+ static FavoriteVolumeList LoadList ();
+ static void SaveList (const FavoriteVolumeList &favorites);
+ void ToMountOptions (MountOptions &options) const;
+
+ DirectoryPath MountPoint;
+ VolumePath Path;
+ bool ReadOnly;
+ VolumeSlotNumber SlotNumber;
+ bool System;
+
+ protected:
+ static wxString GetFileName () { return L"Favorite Volumes.xml"; }
+ };
+}
+
+#endif // TC_HEADER_Main_FavoriteVolume
diff --git a/src/Main/Forms/AboutDialog.cpp b/src/Main/Forms/AboutDialog.cpp
new file mode 100644
index 00000000..736a669a
--- /dev/null
+++ b/src/Main/Forms/AboutDialog.cpp
@@ -0,0 +1,66 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Volume/Version.h"
+#include "Main/Application.h"
+#include "Main/GraphicUserInterface.h"
+#include "Main/Resources.h"
+#include "AboutDialog.h"
+
+namespace TrueCrypt
+{
+ AboutDialog::AboutDialog (wxWindow* parent) : AboutDialogBase (parent)
+ {
+ LogoBitmap->SetBitmap (Resources::GetTextualLogoBitmap());
+
+ wxFont versionStaticTextFont = VersionStaticText->GetFont();
+ versionStaticTextFont.SetWeight (wxFONTWEIGHT_BOLD);
+ VersionStaticText->SetFont (versionStaticTextFont);
+
+ VersionStaticText->SetLabel (Application::GetName() + L" " + StringConverter::ToWide (Version::String()));
+ CopyrightStaticText->SetLabel (StringConverter::ToWide (TC_STR_RELEASED_BY));
+ WebsiteHyperlink->SetLabel (L"www.truecrypt.org");
+
+ CreditsTextCtrl->SetMinSize (wxSize (
+ Gui->GetCharWidth (CreditsTextCtrl) * 70,
+ Gui->GetCharHeight (CreditsTextCtrl) * 6
+#ifdef TC_WINDOWS
+ - 5
+#else
+ - 11
+#endif
+ ));
+
+ Layout();
+ Fit();
+ Center();
+
+ CreditsTextCtrl->ChangeValue (
+ L"Portions of this software are based in part on the works of the following people: "
+ L"Paul Le Roux, "
+ L"Bruce Schneier, John Kelsey, Doug Whiting, David Wagner, Chris Hall, Niels Ferguson, "
+ L"Lars Knudsen, Ross Anderson, Eli Biham, "
+ L"Joan Daemen, Vincent Rijmen, "
+ L"Phillip Rogaway, "
+ L"Hans Dobbertin, Antoon Bosselaers, Bart Preneel, "
+ L"Paulo Barreto, Brian Gladman, Wei Dai, Peter Gutmann, and many others.\n\n"
+
+ L"Portions of this software:\n"
+ L"Copyright \xA9 2003-2012 TrueCrypt Developers Association. All Rights Reserved.\n"
+ L"Copyright \xA9 1998-2000 Paul Le Roux. All Rights Reserved.\n"
+ L"Copyright \xA9 1998-2008 Brian Gladman. All Rights Reserved.\n"
+
+ L"\nThis software as a whole:\n"
+ L"Copyright \xA9 2012 TrueCrypt Developers Association. All rights reserved.\n\n"
+
+ L"This software uses wxWidgets library, which is copyright \xA9 1998-2011 Julian Smart, Robert Roebling et al.\n\n"
+
+ L"A TrueCrypt Foundation Release");
+ }
+}
diff --git a/src/Main/Forms/AboutDialog.h b/src/Main/Forms/AboutDialog.h
new file mode 100644
index 00000000..94cca8bb
--- /dev/null
+++ b/src/Main/Forms/AboutDialog.h
@@ -0,0 +1,25 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_AboutDialog
+#define TC_HEADER_Main_Forms_AboutDialog
+
+#include "Forms.h"
+
+namespace TrueCrypt
+{
+ class AboutDialog : public AboutDialogBase
+ {
+ public:
+ AboutDialog (wxWindow* parent);
+
+ void OnWebsiteHyperlinkClick (wxHyperlinkEvent& event) { Gui->OpenHomepageLink (this, L"main"); }
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_AboutDialog
diff --git a/src/Main/Forms/BenchmarkDialog.cpp b/src/Main/Forms/BenchmarkDialog.cpp
new file mode 100644
index 00000000..a2c1418d
--- /dev/null
+++ b/src/Main/Forms/BenchmarkDialog.cpp
@@ -0,0 +1,157 @@
+/*
+ Copyright (c) 2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Volume/EncryptionModeXTS.h"
+#include "Main/GraphicUserInterface.h"
+#include "BenchmarkDialog.h"
+
+namespace TrueCrypt
+{
+ BenchmarkDialog::BenchmarkDialog (wxWindow *parent)
+ : BenchmarkDialogBase (parent)
+ {
+ BenchmarkNoteStaticText->SetLabel (LangString["IDT_BOX_BENCHMARK_INFO"]);
+ BenchmarkNoteStaticText->Wrap (RightSizer->GetSize().GetWidth());
+
+ list <size_t> bufferSizes;
+ bufferSizes.push_back (1 * BYTES_PER_MB);
+ bufferSizes.push_back (5 * BYTES_PER_MB);
+ bufferSizes.push_back (10 * BYTES_PER_MB);
+ bufferSizes.push_back (50 * BYTES_PER_MB);
+ bufferSizes.push_back (100 * BYTES_PER_MB);
+ bufferSizes.push_back (200 * BYTES_PER_MB);
+ bufferSizes.push_back (500 * BYTES_PER_MB);
+ bufferSizes.push_back (1 * BYTES_PER_GB);
+
+ foreach (size_t size, bufferSizes)
+ {
+ BufferSizeChoice->Append (Gui->SizeToString (size), (void *) size);
+ }
+
+ BufferSizeChoice->Select (1);
+
+ list <int> colPermilles;
+ BenchmarkListCtrl->InsertColumn (ColumnAlgorithm, LangString["ALGORITHM"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (322);
+
+ BenchmarkListCtrl->InsertColumn (ColumnEncryption, LangString["ENCRYPTION"], wxLIST_FORMAT_RIGHT, 1);
+ colPermilles.push_back (226);
+
+ BenchmarkListCtrl->InsertColumn (ColumnDecryption, LangString["DECRYPTION"], wxLIST_FORMAT_RIGHT, 1);
+ colPermilles.push_back (226);
+
+ BenchmarkListCtrl->InsertColumn (ColumnMean, LangString["MEAN"], wxLIST_FORMAT_RIGHT, 1);
+ colPermilles.push_back (226);
+
+ Gui->SetListCtrlWidth (BenchmarkListCtrl, 62, false);
+ Gui->SetListCtrlHeight (BenchmarkListCtrl, 14);
+ Gui->SetListCtrlColumnWidths (BenchmarkListCtrl, colPermilles);
+
+ Layout();
+ Fit();
+ Center();
+ }
+
+ void BenchmarkDialog::OnBenchmarkButtonClick (wxCommandEvent& event)
+ {
+ try
+ {
+ list <BenchmarkResult> results;
+
+ wxBusyCursor busy;
+ Buffer buffer ((size_t) Gui->GetSelectedData <size_t> (BufferSizeChoice));
+
+ EncryptionAlgorithmList encryptionAlgorithms = EncryptionAlgorithm::GetAvailableAlgorithms();
+ foreach (shared_ptr <EncryptionAlgorithm> ea, encryptionAlgorithms)
+ {
+ if (!ea->IsDeprecated())
+ {
+ BenchmarkResult result;
+ result.AlgorithmName = ea->GetName();
+
+ Buffer key (ea->GetKeySize());
+ ea->SetKey (key);
+
+ shared_ptr <EncryptionMode> xts (new EncryptionModeXTS);
+ xts->SetKey (key);
+ ea->SetMode (xts);
+
+ wxLongLong startTime = wxGetLocalTimeMillis();
+
+ // CPU "warm up" (an attempt to prevent skewed results on systems where CPU frequency gradually changes depending on CPU load).
+ do
+ {
+ ea->EncryptSectors (buffer, 0, buffer.Size() / ENCRYPTION_DATA_UNIT_SIZE, ENCRYPTION_DATA_UNIT_SIZE);
+ }
+ while (wxGetLocalTimeMillis().GetValue() - startTime.GetValue() < 20);
+
+ uint64 size = 0;
+ uint64 time;
+ startTime = wxGetLocalTimeMillis();
+
+ do
+ {
+ ea->EncryptSectors (buffer, 0, buffer.Size() / ENCRYPTION_DATA_UNIT_SIZE, ENCRYPTION_DATA_UNIT_SIZE);
+ size += buffer.Size();
+ time = (uint64) (wxGetLocalTimeMillis().GetValue() - startTime.GetValue());
+ }
+ while (time < 100);
+
+ result.EncryptionSpeed = size * 1000 / time;
+
+ startTime = wxGetLocalTimeMillis();
+ size = 0;
+
+ do
+ {
+ ea->DecryptSectors (buffer, 0, buffer.Size() / ENCRYPTION_DATA_UNIT_SIZE, ENCRYPTION_DATA_UNIT_SIZE);
+ size += buffer.Size();
+ time = (uint64) (wxGetLocalTimeMillis().GetValue() - startTime.GetValue());
+ }
+ while (time < 100);
+
+ result.DecryptionSpeed = size * 1000 / time;
+ result.MeanSpeed = (result.EncryptionSpeed + result.DecryptionSpeed) / 2;
+
+ bool inserted = false;
+ for (list <BenchmarkResult>::iterator i = results.begin(); i != results.end(); ++i)
+ {
+ if (i->MeanSpeed < result.MeanSpeed)
+ {
+ results.insert (i, result);
+ inserted = true;
+ break;
+ }
+ }
+
+ if (!inserted)
+ results.push_back (result);
+ }
+ }
+
+ BenchmarkListCtrl->DeleteAllItems();
+
+ foreach (const BenchmarkResult &result, results)
+ {
+ vector <wstring> fields (BenchmarkListCtrl->GetColumnCount());
+
+ fields[ColumnAlgorithm] = result.AlgorithmName;
+ fields[ColumnEncryption] = Gui->SpeedToString (result.EncryptionSpeed);
+ fields[ColumnDecryption] = Gui->SpeedToString (result.DecryptionSpeed);
+ fields[ColumnMean] = Gui->SpeedToString (result.MeanSpeed);
+
+ Gui->AppendToListCtrl (BenchmarkListCtrl, fields);
+ }
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+}
diff --git a/src/Main/Forms/BenchmarkDialog.h b/src/Main/Forms/BenchmarkDialog.h
new file mode 100644
index 00000000..3cd61511
--- /dev/null
+++ b/src/Main/Forms/BenchmarkDialog.h
@@ -0,0 +1,43 @@
+/*
+ Copyright (c) 2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_BenchmarkDialog
+#define TC_HEADER_Main_Forms_BenchmarkDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+
+namespace TrueCrypt
+{
+ class BenchmarkDialog : public BenchmarkDialogBase
+ {
+ public:
+ BenchmarkDialog (wxWindow *parent);
+
+ protected:
+ enum
+ {
+ ColumnAlgorithm = 0,
+ ColumnEncryption,
+ ColumnDecryption,
+ ColumnMean
+ };
+
+ struct BenchmarkResult
+ {
+ wstring AlgorithmName;
+ uint64 EncryptionSpeed;
+ uint64 DecryptionSpeed;
+ uint64 MeanSpeed;
+ };
+
+ void OnBenchmarkButtonClick (wxCommandEvent& event);
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_BenchmarkDialog
diff --git a/src/Main/Forms/ChangePasswordDialog.cpp b/src/Main/Forms/ChangePasswordDialog.cpp
new file mode 100644
index 00000000..05d0143c
--- /dev/null
+++ b/src/Main/Forms/ChangePasswordDialog.cpp
@@ -0,0 +1,195 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/Main.h"
+#include "Main/GraphicUserInterface.h"
+#include "ChangePasswordDialog.h"
+
+namespace TrueCrypt
+{
+ ChangePasswordDialog::ChangePasswordDialog (wxWindow* parent, shared_ptr <VolumePath> volumePath, Mode::Enum mode, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles, shared_ptr <VolumePassword> newPassword, shared_ptr <KeyfileList> newKeyfiles)
+ : ChangePasswordDialogBase (parent), DialogMode (mode), Path (volumePath)
+ {
+ bool enableNewPassword = false;
+ bool enableNewKeyfiles = false;
+ bool enablePkcs5Prf = false;
+
+ switch (mode)
+ {
+ case Mode::ChangePasswordAndKeyfiles:
+ enableNewPassword = true;
+ enableNewKeyfiles = true;
+ enablePkcs5Prf = true;
+ SetTitle (_("Change Volume Password and Keyfiles"));
+ break;
+
+ case Mode::ChangeKeyfiles:
+ enableNewKeyfiles = true;
+ SetTitle (_("Add/Remove Keyfiles to/from Volume"));
+ break;
+
+ case Mode::RemoveAllKeyfiles:
+ SetTitle (_("Remove All Keyfiles from Volume"));
+ break;
+
+ case Mode::ChangePkcs5Prf:
+ enablePkcs5Prf = true;
+ SetTitle (_("Change Header Key Derivation Algorithm"));
+ break;
+
+ default:
+ throw ParameterIncorrect (SRC_POS);
+ }
+
+ CurrentPasswordPanel = new VolumePasswordPanel (this, password, keyfiles);
+ CurrentPasswordPanel->UpdateEvent.Connect (EventConnector <ChangePasswordDialog> (this, &ChangePasswordDialog::OnPasswordPanelUpdate));
+ CurrentPasswordPanelSizer->Add (CurrentPasswordPanel, 1, wxALL | wxEXPAND);
+
+ NewPasswordPanel = new VolumePasswordPanel (this, newPassword, newKeyfiles, false, enableNewPassword, enableNewKeyfiles, enableNewPassword, enablePkcs5Prf);
+ NewPasswordPanel->UpdateEvent.Connect (EventConnector <ChangePasswordDialog> (this, &ChangePasswordDialog::OnPasswordPanelUpdate));
+ NewPasswordPanelSizer->Add (NewPasswordPanel, 1, wxALL | wxEXPAND);
+
+ if (mode == Mode::RemoveAllKeyfiles)
+ NewSizer->Show (false);
+
+ Layout();
+ Fit();
+ Center();
+
+ OnPasswordPanelUpdate();
+ CurrentPasswordPanel->SetFocusToPasswordTextCtrl();
+ }
+
+ ChangePasswordDialog::~ChangePasswordDialog ()
+ {
+ CurrentPasswordPanel->UpdateEvent.Disconnect (this);
+ NewPasswordPanel->UpdateEvent.Disconnect (this);
+ }
+
+ void ChangePasswordDialog::OnOKButtonClick (wxCommandEvent& event)
+ {
+ // Avoid a GTK bug
+ if (!OKButton->IsEnabled())
+ return;
+
+ try
+ {
+ shared_ptr <VolumePassword> newPassword;
+ if (DialogMode == Mode::ChangePasswordAndKeyfiles)
+ {
+ newPassword = NewPasswordPanel->GetPassword();
+ newPassword->CheckPortability();
+
+ if (newPassword->Size() > 0 && newPassword->Size() < VolumePassword::WarningSizeThreshold
+ && !Gui->AskYesNo (LangString ["PASSWORD_LENGTH_WARNING"], false, true))
+ {
+ NewPasswordPanel->SetFocusToPasswordTextCtrl();
+ return;
+ }
+ }
+ else
+ newPassword = CurrentPasswordPanel->GetPassword();
+
+ shared_ptr <KeyfileList> newKeyfiles;
+ if (DialogMode == Mode::ChangePasswordAndKeyfiles || DialogMode == Mode::ChangeKeyfiles)
+ newKeyfiles = NewPasswordPanel->GetKeyfiles();
+ else if (DialogMode != Mode::RemoveAllKeyfiles)
+ newKeyfiles = CurrentPasswordPanel->GetKeyfiles();
+
+ Gui->UserEnrichRandomPool (this, NewPasswordPanel->GetPkcs5Kdf() ? NewPasswordPanel->GetPkcs5Kdf()->GetHash() : shared_ptr <Hash>());
+
+ {
+#ifdef TC_UNIX
+ // Temporarily take ownership of a device if the user is not an administrator
+ UserId origDeviceOwner ((uid_t) -1);
+
+ if (!Core->HasAdminPrivileges() && Path->IsDevice())
+ {
+ origDeviceOwner = FilesystemPath (wstring (*Path)).GetOwner();
+ Core->SetFileOwner (*Path, UserId (getuid()));
+ }
+
+ finally_do_arg2 (FilesystemPath, *Path, UserId, origDeviceOwner,
+ {
+ if (finally_arg2.SystemId != (uid_t) -1)
+ Core->SetFileOwner (finally_arg, finally_arg2);
+ });
+#endif
+ wxBusyCursor busy;
+ Core->ChangePassword (Path, Gui->GetPreferences().DefaultMountOptions.PreserveTimestamps,
+ CurrentPasswordPanel->GetPassword(), CurrentPasswordPanel->GetKeyfiles(),
+ newPassword, newKeyfiles, NewPasswordPanel->GetPkcs5Kdf());
+ }
+
+ switch (DialogMode)
+ {
+ case Mode::ChangePasswordAndKeyfiles:
+ Gui->ShowInfo ("PASSWORD_CHANGED");
+ break;
+
+ case Mode::ChangeKeyfiles:
+ case Mode::RemoveAllKeyfiles:
+ Gui->ShowInfo ("KEYFILE_CHANGED");
+ break;
+
+ case Mode::ChangePkcs5Prf:
+ Gui->ShowInfo ("PKCS5_PRF_CHANGED");
+ break;
+
+ default:
+ throw ParameterIncorrect (SRC_POS);
+ }
+
+ EndModal (wxID_OK);
+ }
+ catch (UnportablePassword &e)
+ {
+ Gui->ShowError (e);
+ NewPasswordPanel->SetFocusToPasswordTextCtrl();
+ }
+ catch (PasswordException &e)
+ {
+ Gui->ShowWarning (e);
+ CurrentPasswordPanel->SetFocusToPasswordTextCtrl();
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void ChangePasswordDialog::OnPasswordPanelUpdate ()
+ {
+ bool ok = true;
+
+ bool passwordEmpty = CurrentPasswordPanel->GetPassword()->IsEmpty();
+ bool keyfilesEmpty = !CurrentPasswordPanel->GetKeyfiles() || CurrentPasswordPanel->GetKeyfiles()->empty();
+
+ if (passwordEmpty && keyfilesEmpty)
+ ok = false;
+
+ if (DialogMode == Mode::RemoveAllKeyfiles && (passwordEmpty || keyfilesEmpty))
+ ok = false;
+
+ if (DialogMode == Mode::ChangePasswordAndKeyfiles || DialogMode == Mode::ChangeKeyfiles)
+ {
+ bool newKeyfilesEmpty = !NewPasswordPanel->GetKeyfiles() || NewPasswordPanel->GetKeyfiles()->empty();
+
+ if (DialogMode == Mode::ChangeKeyfiles
+ && ((passwordEmpty && newKeyfilesEmpty) || (keyfilesEmpty && newKeyfilesEmpty)))
+ ok = false;
+
+ if (DialogMode == Mode::ChangePasswordAndKeyfiles
+ && ((NewPasswordPanel->GetPassword()->IsEmpty() && newKeyfilesEmpty) || !NewPasswordPanel->PasswordsMatch()))
+ ok = false;
+ }
+
+ OKButton->Enable (ok);
+ }
+}
diff --git a/src/Main/Forms/ChangePasswordDialog.h b/src/Main/Forms/ChangePasswordDialog.h
new file mode 100644
index 00000000..cc147602
--- /dev/null
+++ b/src/Main/Forms/ChangePasswordDialog.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_ChangePasswordDialog
+#define TC_HEADER_Main_Forms_ChangePasswordDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+#include "VolumePasswordPanel.h"
+
+namespace TrueCrypt
+{
+ class ChangePasswordDialog : public ChangePasswordDialogBase
+ {
+ public:
+ struct Mode
+ {
+ enum Enum
+ {
+ ChangePasswordAndKeyfiles,
+ ChangeKeyfiles,
+ RemoveAllKeyfiles,
+ ChangePkcs5Prf
+ };
+ };
+
+ ChangePasswordDialog (wxWindow* parent, shared_ptr <VolumePath> volumePath, Mode::Enum mode = Mode::ChangePasswordAndKeyfiles, shared_ptr <VolumePassword> password = shared_ptr <VolumePassword> (), shared_ptr <KeyfileList> keyfiles = shared_ptr <KeyfileList> (), shared_ptr <VolumePassword> newPassword = shared_ptr <VolumePassword> (), shared_ptr <KeyfileList> newKeyfiles = shared_ptr <KeyfileList> ());
+ virtual ~ChangePasswordDialog ();
+
+ protected:
+ void OnOKButtonClick (wxCommandEvent& event);
+ void OnPasswordPanelUpdate ();
+ void OnPasswordPanelUpdate (EventArgs &args) { OnPasswordPanelUpdate(); }
+
+ Mode::Enum DialogMode;
+
+ VolumePasswordPanel *CurrentPasswordPanel;
+ VolumePasswordPanel *NewPasswordPanel;
+ shared_ptr <VolumePath> Path;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_ChangePasswordDialog
diff --git a/src/Main/Forms/DeviceSelectionDialog.cpp b/src/Main/Forms/DeviceSelectionDialog.cpp
new file mode 100644
index 00000000..86db68a1
--- /dev/null
+++ b/src/Main/Forms/DeviceSelectionDialog.cpp
@@ -0,0 +1,120 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/GraphicUserInterface.h"
+#include "Main/Resources.h"
+#include "DeviceSelectionDialog.h"
+
+namespace TrueCrypt
+{
+ DeviceSelectionDialog::DeviceSelectionDialog (wxWindow* parent)
+ : DeviceSelectionDialogBase (parent)
+ {
+ wxBusyCursor busy;
+
+ list <int> colPermilles;
+
+ DeviceListCtrl->InsertColumn (ColumnDevice, LangString["DEVICE"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (447);
+#ifdef TC_WINDOWS
+ DeviceListCtrl->InsertColumn (ColumnDrive, LangString["DRIVE"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (91);
+#endif
+ DeviceListCtrl->InsertColumn (ColumnSize, LangString["SIZE"], wxLIST_FORMAT_RIGHT, 1);
+ colPermilles.push_back (153);
+#ifdef TC_WINDOWS
+ DeviceListCtrl->InsertColumn (ColumnName, LangString["LABEL"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (307);
+#else
+ DeviceListCtrl->InsertColumn (ColumnMountPoint, LangString["MOUNT_POINT"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (396);
+#endif
+
+ wxImageList *imageList = new wxImageList (16, 12, true);
+ imageList->Add (Resources::GetDriveIconBitmap(), Resources::GetDriveIconMaskBitmap());
+ DeviceListCtrl->AssignImageList (imageList, wxIMAGE_LIST_SMALL);
+
+ DeviceList = Core->GetHostDevices();
+
+ foreach_ref (HostDevice &device, DeviceList)
+ {
+ if (device.Size == 0)
+ continue;
+
+ vector <wstring> fields (DeviceListCtrl->GetColumnCount());
+
+ if (DeviceListCtrl->GetItemCount() > 0)
+ Gui->AppendToListCtrl (DeviceListCtrl, fields);
+
+#ifdef TC_WINDOWS
+ fields[ColumnDevice] = StringFormatter (L"{0} {1}:", _("Harddisk"), device.SystemNumber);
+ fields[ColumnDrive] = device.MountPoint;
+ fields[ColumnName] = device.Name;
+#else
+ fields[ColumnDevice] = wstring (device.Path) + L":";
+ fields[ColumnMountPoint] = device.MountPoint;
+#endif
+ fields[ColumnSize] = Gui->SizeToString (device.Size);
+ Gui->AppendToListCtrl (DeviceListCtrl, fields, 0, &device);
+
+ foreach_ref (HostDevice &partition, device.Partitions)
+ {
+ fields[ColumnDevice] =
+#ifndef TC_WINDOWS
+ wstring (L" ") +
+#endif
+ wstring (partition.Path);
+
+#ifdef TC_WINDOWS
+ fields[ColumnDrive] = partition.MountPoint;
+ fields[ColumnName] = partition.Name;
+#else
+ fields[ColumnMountPoint] = partition.MountPoint;
+#endif
+ fields[ColumnSize] = Gui->SizeToString (partition.Size);
+ Gui->AppendToListCtrl (DeviceListCtrl, fields, -1, &partition);
+ }
+ }
+
+ Gui->SetListCtrlWidth (DeviceListCtrl, 73);
+ Gui->SetListCtrlHeight (DeviceListCtrl, 16);
+ Gui->SetListCtrlColumnWidths (DeviceListCtrl, colPermilles);
+
+ Fit();
+ Layout();
+ Center();
+
+ StdButtonsOK->Disable();
+ StdButtonsOK->SetDefault();
+ }
+
+ void DeviceSelectionDialog::OnListItemActivated (wxListEvent& event)
+ {
+ if (StdButtonsOK->IsEnabled())
+ EndModal (wxID_OK);
+ }
+
+ void DeviceSelectionDialog::OnListItemDeselected (wxListEvent& event)
+ {
+ if (DeviceListCtrl->GetSelectedItemCount() == 0)
+ StdButtonsOK->Disable();
+ }
+
+ void DeviceSelectionDialog::OnListItemSelected (wxListEvent& event)
+ {
+ HostDevice *device = (HostDevice *) (event.GetItem().GetData());
+ if (device)
+ {
+ SelectedDevice = *device;
+ StdButtonsOK->Enable();
+ }
+ else
+ StdButtonsOK->Disable();
+ }
+}
diff --git a/src/Main/Forms/DeviceSelectionDialog.h b/src/Main/Forms/DeviceSelectionDialog.h
new file mode 100644
index 00000000..df0b6184
--- /dev/null
+++ b/src/Main/Forms/DeviceSelectionDialog.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_DeviceSelectionDialog
+#define TC_HEADER_Main_Forms_DeviceSelectionDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+
+namespace TrueCrypt
+{
+ class DeviceSelectionDialog : public DeviceSelectionDialogBase
+ {
+ public:
+ DeviceSelectionDialog (wxWindow* parent);
+
+ HostDeviceList DeviceList;
+ HostDevice SelectedDevice;
+
+ protected:
+ enum
+ {
+ ColumnDevice = 0,
+#ifdef TC_WINDOWS
+ ColumnDrive,
+#endif
+ ColumnSize,
+#ifdef TC_WINDOWS
+ ColumnName
+#else
+ ColumnMountPoint
+#endif
+ };
+
+ void OnListItemActivated (wxListEvent& event);
+ void OnListItemDeselected (wxListEvent& event);
+ void OnListItemSelected (wxListEvent& event);
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_DeviceSelectionDialog
diff --git a/src/Main/Forms/EncryptionOptionsWizardPage.cpp b/src/Main/Forms/EncryptionOptionsWizardPage.cpp
new file mode 100644
index 00000000..d321add2
--- /dev/null
+++ b/src/Main/Forms/EncryptionOptionsWizardPage.cpp
@@ -0,0 +1,137 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Volume/EncryptionTest.h"
+#include "Volume/Hash.h"
+#include "Main/GraphicUserInterface.h"
+#include "BenchmarkDialog.h"
+#include "EncryptionOptionsWizardPage.h"
+#include "EncryptionTestDialog.h"
+
+namespace TrueCrypt
+{
+ EncryptionOptionsWizardPage::EncryptionOptionsWizardPage (wxPanel* parent)
+ : EncryptionOptionsWizardPageBase (parent)
+ {
+
+ EncryptionAlgorithms = EncryptionAlgorithm::GetAvailableAlgorithms();
+ foreach (shared_ptr <EncryptionAlgorithm> ea, EncryptionAlgorithms)
+ {
+ if (!ea->IsDeprecated())
+ EncryptionAlgorithmChoice->Append (ea->GetName(), ea.get());
+ }
+
+ EncryptionAlgorithmChoice->Select (0);
+
+ Hashes = Hash::GetAvailableAlgorithms();
+ foreach (shared_ptr <Hash> hash, Hashes)
+ {
+ if (!hash->IsDeprecated())
+ HashChoice->Append (hash->GetName(), hash.get());
+ }
+
+ HashChoice->Select (0);
+ OnEncryptionAlgorithmSelected();
+
+ }
+
+ shared_ptr <EncryptionAlgorithm> EncryptionOptionsWizardPage::GetEncryptionAlgorithm () const
+ {
+ return Gui->GetSelectedData <EncryptionAlgorithm> (EncryptionAlgorithmChoice)->GetNew();
+ }
+
+ shared_ptr <Hash> EncryptionOptionsWizardPage::GetHash () const
+ {
+ return Gui->GetSelectedData <Hash> (HashChoice)->GetNew();
+ }
+
+ void EncryptionOptionsWizardPage::OnBenchmarkButtonClick (wxCommandEvent& event)
+ {
+ BenchmarkDialog dialog (this);
+ dialog.ShowModal();
+ }
+
+ void EncryptionOptionsWizardPage::OnEncryptionAlgorithmSelected ()
+ {
+ FreezeScope freeze (this);
+
+ shared_ptr <EncryptionAlgorithm> ea = GetEncryptionAlgorithm();
+ CipherList ciphers = ea->GetCiphers();
+
+ if (ciphers.size() == 1)
+ {
+ EncryptionAlgorithmHyperlink->SetLabel (StringFormatter (LangString["MORE_INFO_ABOUT"], ea->GetName()));
+
+ if (typeid (*ea) == typeid (AES))
+ EncryptionAlgorithmStaticText->SetLabel (LangString["AES_HELP"]);
+ else if (typeid (*ea) == typeid (Serpent))
+ EncryptionAlgorithmStaticText->SetLabel (LangString["SERPENT_HELP"]);
+ else if (typeid (*ea) == typeid (Twofish))
+ EncryptionAlgorithmStaticText->SetLabel (LangString["TWOFISH_HELP"]);
+ else
+ EncryptionAlgorithmStaticText->SetLabel (L"");
+ }
+ else
+ {
+ if (ciphers.size() == 2)
+ {
+ EncryptionAlgorithmStaticText->SetLabel (StringFormatter (LangString["TWO_LAYER_CASCADE_HELP"],
+ ciphers[0]->GetName(), (int) ciphers[0]->GetKeySize() * 8,
+ ciphers[1]->GetName(), (int) ciphers[1]->GetKeySize() * 8));
+ }
+ else if (ciphers.size() == 3)
+ {
+ EncryptionAlgorithmStaticText->SetLabel (StringFormatter (LangString["THREE_LAYER_CASCADE_HELP"],
+ ciphers[0]->GetName(), (int) ciphers[0]->GetKeySize() * 8,
+ ciphers[1]->GetName(), (int) ciphers[1]->GetKeySize() * 8,
+ ciphers[2]->GetName(), (int) ciphers[2]->GetKeySize() * 8));
+ }
+ else
+ EncryptionAlgorithmStaticText->SetLabel (L"");
+
+ EncryptionAlgorithmHyperlink->SetLabel (_("More information"));
+ }
+
+ Layout();
+ }
+
+ void EncryptionOptionsWizardPage::OnEncryptionAlgorithmHyperlinkClick (wxHyperlinkEvent& event)
+ {
+ if (GetEncryptionAlgorithm()->GetCiphers().size() == 1)
+ Gui->OpenHomepageLink (this, wxString (GetEncryptionAlgorithm()->GetName()).Lower());
+ else
+ Gui->OpenHomepageLink (this, L"cascades");
+ }
+
+ void EncryptionOptionsWizardPage::OnHashHyperlinkClick (wxHyperlinkEvent& event)
+ {
+ Gui->OpenHomepageLink (this, L"hashalgorithms");
+ }
+
+ void EncryptionOptionsWizardPage::OnTestButtonClick (wxCommandEvent& event)
+ {
+ EncryptionTestDialog dialog (this);
+ dialog.ShowModal();
+ }
+
+ void EncryptionOptionsWizardPage::SetEncryptionAlgorithm (shared_ptr <EncryptionAlgorithm> algorithm)
+ {
+ if (algorithm)
+ {
+ EncryptionAlgorithmChoice->SetStringSelection (algorithm->GetName());
+ OnEncryptionAlgorithmSelected ();
+ }
+ }
+
+ void EncryptionOptionsWizardPage::SetHash (shared_ptr <Hash> hash)
+ {
+ if (hash)
+ HashChoice->SetStringSelection (hash->GetName());
+ }
+}
diff --git a/src/Main/Forms/EncryptionOptionsWizardPage.h b/src/Main/Forms/EncryptionOptionsWizardPage.h
new file mode 100644
index 00000000..1c8b0d95
--- /dev/null
+++ b/src/Main/Forms/EncryptionOptionsWizardPage.h
@@ -0,0 +1,41 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_EncryptionOptionsWizardPage
+#define TC_HEADER_Main_Forms_EncryptionOptionsWizardPage
+
+#include "Forms.h"
+
+namespace TrueCrypt
+{
+ class EncryptionOptionsWizardPage : public EncryptionOptionsWizardPageBase
+ {
+ public:
+ EncryptionOptionsWizardPage (wxPanel* parent);
+
+ shared_ptr <EncryptionAlgorithm> GetEncryptionAlgorithm () const;
+ shared_ptr <Hash> GetHash () const;
+ bool IsValid () { return true; }
+ void SetPageText (const wxString &text) { }
+ void SetEncryptionAlgorithm (shared_ptr <EncryptionAlgorithm> algorithm);
+ void SetHash (shared_ptr <Hash> hash);
+
+ protected:
+ void OnBenchmarkButtonClick (wxCommandEvent& event);
+ void OnEncryptionAlgorithmHyperlinkClick (wxHyperlinkEvent& event);
+ void OnEncryptionAlgorithmSelected ();
+ void OnEncryptionAlgorithmSelected (wxCommandEvent& event) { OnEncryptionAlgorithmSelected(); }
+ void OnHashHyperlinkClick (wxHyperlinkEvent& event);
+ void OnTestButtonClick (wxCommandEvent& event);
+
+ EncryptionAlgorithmList EncryptionAlgorithms;
+ HashList Hashes;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_EncryptionOptionsWizardPage
diff --git a/src/Main/Forms/EncryptionTestDialog.cpp b/src/Main/Forms/EncryptionTestDialog.cpp
new file mode 100644
index 00000000..3e6fa6cc
--- /dev/null
+++ b/src/Main/Forms/EncryptionTestDialog.cpp
@@ -0,0 +1,227 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Volume/EncryptionModeXTS.h"
+#include "Volume/EncryptionTest.h"
+#include "Main/GraphicUserInterface.h"
+#include "EncryptionTestDialog.h"
+
+namespace TrueCrypt
+{
+ EncryptionTestDialog::EncryptionTestDialog (wxWindow* parent)
+ : EncryptionTestDialogBase (parent)
+ {
+ EncryptionAlgorithms = EncryptionAlgorithm::GetAvailableAlgorithms();
+ foreach (shared_ptr <EncryptionAlgorithm> ea, EncryptionAlgorithms)
+ {
+ if (!ea->IsDeprecated())
+ EncryptionAlgorithmChoice->Append (ea->GetName(), ea.get());
+ }
+
+ EncryptionAlgorithmChoice->Select (0);
+ Reset();
+
+ Fit();
+ Layout();
+ Center();
+ }
+
+ void EncryptionTestDialog::EncryptOrDecrypt (bool encrypt)
+ {
+ try
+ {
+ bool xts = XtsModeCheckBox->IsChecked();
+
+ shared_ptr <EncryptionAlgorithm> ea = GetSelectedEncryptionAlgorithm();
+
+ Buffer key;
+ GetTextCtrlData (KeyTextCtrl, key);
+
+ if (key.Size() != ea->GetKeySize())
+ throw_err (LangString["TEST_KEY_SIZE"]);
+
+ ea->SetKey (key);
+
+ Buffer data;
+ GetTextCtrlData (encrypt ? PlainTextTextCtrl : CipherTextTextCtrl, data);
+
+ if (data.Size() != ea->GetMaxBlockSize())
+ throw_err (LangString[encrypt ? "TEST_PLAINTEXT_SIZE" : "TEST_CIPHERTEXT_SIZE"]);
+
+ if (xts)
+ {
+ Buffer secondaryKey;
+ GetTextCtrlData (SecondaryKeyTextCtrl, secondaryKey);
+
+ if (secondaryKey.Size() != ea->GetKeySize())
+ throw_err (LangString["TEST_INCORRECT_SECONDARY_KEY_SIZE"]);
+
+ uint64 dataUnitNumber;
+ size_t blockNumber;
+
+ try
+ {
+ dataUnitNumber = StringConverter::ToUInt64 (wstring (DataUnitNumberTextCtrl->GetValue()));
+ }
+ catch (...)
+ {
+ DataUnitNumberTextCtrl->SetFocus();
+ throw StringConversionFailed (SRC_POS);
+ }
+
+ try
+ {
+ blockNumber = StringConverter::ToUInt32 (wstring (BlockNumberTextCtrl->GetValue()));
+ if (blockNumber > 31)
+ {
+ blockNumber = 31;
+ BlockNumberTextCtrl->SetValue (L"31");
+ }
+ }
+ catch (...)
+ {
+ BlockNumberTextCtrl->SetFocus();
+ throw StringConversionFailed (SRC_POS);
+ }
+
+ shared_ptr <EncryptionMode> xts (new EncryptionModeXTS);
+ xts->SetKey (secondaryKey);
+ ea->SetMode (xts);
+
+ Buffer sector (ENCRYPTION_DATA_UNIT_SIZE);
+ BufferPtr block = sector.GetRange (blockNumber * ea->GetMaxBlockSize(), ea->GetMaxBlockSize());
+
+ block.CopyFrom (data);
+
+ if (encrypt)
+ ea->EncryptSectors (sector, dataUnitNumber, 1, sector.Size());
+ else
+ ea->DecryptSectors (sector, dataUnitNumber, 1, sector.Size());
+
+ data.CopyFrom (block);
+ }
+ else
+ {
+ if (encrypt)
+ ea->GetCiphers().front()->EncryptBlock (data);
+ else
+ ea->GetCiphers().front()->DecryptBlock (data);
+ }
+
+ SetTextCtrlData (encrypt ? CipherTextTextCtrl : PlainTextTextCtrl, data);
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ shared_ptr <EncryptionAlgorithm> EncryptionTestDialog::GetSelectedEncryptionAlgorithm () const
+ {
+ return Gui->GetSelectedData <EncryptionAlgorithm> (EncryptionAlgorithmChoice)->GetNew();
+ }
+
+ void EncryptionTestDialog::GetTextCtrlData (wxTextCtrl *textCtrl, Buffer &buffer) const
+ {
+ vector <byte> data;
+ string dataStr = StringConverter::ToSingle (wstring (textCtrl->GetValue()));
+
+ for (size_t i = 0; i < dataStr.size() / 2; ++i)
+ {
+ unsigned int dataByte;
+ if (sscanf (dataStr.substr (i * 2, 2).c_str(), "%x", &dataByte) != 1)
+ {
+ textCtrl->SetFocus();
+ throw StringConversionFailed (SRC_POS);
+ }
+
+ data.push_back ((byte) dataByte);
+ }
+
+ if (data.empty())
+ return;
+
+ buffer.CopyFrom (ConstBufferPtr (&data.front(), data.size()));
+ }
+
+ void EncryptionTestDialog::OnAutoTestAllButtonClick (wxCommandEvent& event)
+ {
+ try
+ {
+ {
+ wxBusyCursor busy;
+ EncryptionTest::TestAll();
+ }
+
+ Gui->ShowInfo ("TESTS_PASSED");
+ }
+ catch (Exception &e)
+ {
+ Gui->ShowError (e);
+ Gui->ShowError ("TESTS_FAILED");
+ }
+ }
+
+ void EncryptionTestDialog::OnEncryptionAlgorithmSelected ()
+ {
+ shared_ptr <EncryptionAlgorithm> ea = GetSelectedEncryptionAlgorithm();
+
+ KeySizeStaticText->SetLabel (StringFormatter (L"{0} {1}", (uint32) ea->GetKeySize() * 8, LangString["BITS"]));
+
+ Buffer key (ea->GetKeySize());
+ key.Zero();
+ SetTextCtrlData (KeyTextCtrl, key);
+ SetTextCtrlData (SecondaryKeyTextCtrl, key);
+
+ Buffer block (ea->GetMaxBlockSize());
+ block.Zero();
+ SetTextCtrlData (PlainTextTextCtrl, block);
+ SetTextCtrlData (CipherTextTextCtrl, block);
+
+ if (ea->GetCiphers().size() > 1)
+ {
+ XtsModeCheckBox->Disable();
+ XtsModeCheckBox->SetValue (true);
+ SecondaryKeyTextCtrl->Enable (true);
+ DataUnitNumberTextCtrl->Enable (true);
+ BlockNumberTextCtrl->Enable (true);
+ }
+ else
+ XtsModeCheckBox->Enable();
+ }
+
+ void EncryptionTestDialog::OnXtsModeCheckBoxClick (wxCommandEvent& event)
+ {
+ bool enabled = event.IsChecked();
+ SecondaryKeyTextCtrl->Enable (enabled);
+ DataUnitNumberTextCtrl->Enable (enabled);
+ BlockNumberTextCtrl->Enable (enabled);
+ }
+
+ void EncryptionTestDialog::SetTextCtrlData (wxTextCtrl *textCtrl, const BufferPtr &data)
+ {
+ wstring str;
+ for (size_t i = 0; i < data.Size(); i++)
+ {
+ char strBuf[3];
+ sprintf (strBuf, "%02x", (int) data[i]);
+ str += StringConverter::ToWide (strBuf);
+ }
+
+ textCtrl->SetValue (str);
+ }
+
+ void EncryptionTestDialog::Reset ()
+ {
+ OnEncryptionAlgorithmSelected();
+
+ DataUnitNumberTextCtrl->SetValue (L"0");
+ BlockNumberTextCtrl->SetValue (L"0");
+ }
+}
diff --git a/src/Main/Forms/EncryptionTestDialog.h b/src/Main/Forms/EncryptionTestDialog.h
new file mode 100644
index 00000000..3466ac98
--- /dev/null
+++ b/src/Main/Forms/EncryptionTestDialog.h
@@ -0,0 +1,40 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_EncryptionTestDialog
+#define TC_HEADER_Main_Forms_EncryptionTestDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+
+namespace TrueCrypt
+{
+ class EncryptionTestDialog : public EncryptionTestDialogBase
+ {
+ public:
+ EncryptionTestDialog (wxWindow* parent);
+
+ protected:
+ void EncryptOrDecrypt (bool encrypt);
+ shared_ptr <EncryptionAlgorithm> GetSelectedEncryptionAlgorithm () const;
+ void GetTextCtrlData (wxTextCtrl *textCtrl, Buffer &buffer) const;
+ void OnAutoTestAllButtonClick (wxCommandEvent& event);
+ void OnDecryptButtonClick (wxCommandEvent& event) { EncryptOrDecrypt (false); }
+ void OnEncryptButtonClick (wxCommandEvent& event) { EncryptOrDecrypt (true); }
+ void OnEncryptionAlgorithmSelected ();
+ void OnEncryptionAlgorithmSelected (wxCommandEvent& event) { OnEncryptionAlgorithmSelected(); }
+ void OnResetButtonClick (wxCommandEvent& event) { Reset(); }
+ void OnXtsModeCheckBoxClick (wxCommandEvent& event);
+ void SetTextCtrlData (wxTextCtrl *textCtrl, const BufferPtr &data);
+ void Reset ();
+
+ EncryptionAlgorithmList EncryptionAlgorithms;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_EncryptionTestDialog
diff --git a/src/Main/Forms/FavoriteVolumesDialog.cpp b/src/Main/Forms/FavoriteVolumesDialog.cpp
new file mode 100644
index 00000000..7592b3c9
--- /dev/null
+++ b/src/Main/Forms/FavoriteVolumesDialog.cpp
@@ -0,0 +1,118 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/GraphicUserInterface.h"
+#include "FavoriteVolumesDialog.h"
+
+namespace TrueCrypt
+{
+ FavoriteVolumesDialog::FavoriteVolumesDialog (wxWindow* parent, const FavoriteVolumeList &favorites, size_t newItemCount)
+ : FavoriteVolumesDialogBase (parent), Favorites (favorites)
+ {
+ list <int> colPermilles;
+ FavoritesListCtrl->InsertColumn (ColumnVolumePath, LangString["VOLUME"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (500);
+ FavoritesListCtrl->InsertColumn (ColumnMountPoint, LangString["MOUNT_POINT"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (500);
+
+ FavoritesListCtrl->SetMinSize (wxSize (400, -1));
+ Gui->SetListCtrlHeight (FavoritesListCtrl, 15);
+ Gui->SetListCtrlColumnWidths (FavoritesListCtrl, colPermilles);
+
+ Layout();
+ Fit();
+ Center();
+
+#ifdef TC_MACOSX
+ // wxMac cannot insert items to wxListCtrl due to a bug
+ MoveUpButton->Show (false);
+ MoveDownButton->Show (false);
+#endif
+
+ vector <wstring> fields (FavoritesListCtrl->GetColumnCount());
+ size_t itemCount = 0;
+ foreach (shared_ptr <FavoriteVolume> favorite, Favorites)
+ {
+ fields[ColumnVolumePath] = favorite->Path;
+ fields[ColumnMountPoint] = favorite->MountPoint;
+ Gui->AppendToListCtrl (FavoritesListCtrl, fields, -1, favorite.get());
+
+ if (++itemCount > Favorites.size() - newItemCount)
+ {
+ FavoritesListCtrl->SetItemState (itemCount - 1, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
+ FavoritesListCtrl->EnsureVisible (itemCount - 1);
+ }
+ }
+
+ UpdateButtons();
+ FavoritesListCtrl->SetFocus();
+ }
+
+ void FavoriteVolumesDialog::OnMoveDownButtonClick (wxCommandEvent& event)
+ {
+ FreezeScope freeze (this);
+ foreach_reverse (long itemIndex, Gui->GetListCtrlSelectedItems (FavoritesListCtrl))
+ {
+ if (itemIndex >= FavoritesListCtrl->GetItemCount() - 1)
+ break;
+ Gui->MoveListCtrlItem (FavoritesListCtrl, itemIndex, itemIndex + 1);
+ }
+ UpdateButtons();
+ }
+
+ void FavoriteVolumesDialog::OnMoveUpButtonClick (wxCommandEvent& event)
+ {
+ FreezeScope freeze (this);
+ foreach (long itemIndex, Gui->GetListCtrlSelectedItems (FavoritesListCtrl))
+ {
+ if (itemIndex == 0)
+ break;
+
+ Gui->MoveListCtrlItem (FavoritesListCtrl, itemIndex, itemIndex - 1);
+ }
+ UpdateButtons();
+ }
+
+ void FavoriteVolumesDialog::OnOKButtonClick (wxCommandEvent& event)
+ {
+ FavoriteVolumeList newFavorites;
+
+ for (long i = 0; i < FavoritesListCtrl->GetItemCount(); i++)
+ {
+ newFavorites.push_back (make_shared <FavoriteVolume> (
+ *reinterpret_cast <FavoriteVolume *> (FavoritesListCtrl->GetItemData (i))));
+ }
+
+ Favorites = newFavorites;
+ EndModal (wxID_OK);
+ }
+
+ void FavoriteVolumesDialog::OnRemoveAllButtonClick (wxCommandEvent& event)
+ {
+ FavoritesListCtrl->DeleteAllItems();
+ UpdateButtons();
+ }
+
+ void FavoriteVolumesDialog::OnRemoveButtonClick (wxCommandEvent& event)
+ {
+ long offset = 0;
+ foreach (long item, Gui->GetListCtrlSelectedItems (FavoritesListCtrl))
+ FavoritesListCtrl->DeleteItem (item - offset++);
+ }
+
+ void FavoriteVolumesDialog::UpdateButtons ()
+ {
+ bool selected = FavoritesListCtrl->GetSelectedItemCount() > 0;
+
+ MoveDownButton->Enable (selected);
+ MoveUpButton->Enable (selected);
+ RemoveAllButton->Enable (FavoritesListCtrl->GetItemCount() > 0);
+ RemoveButton->Enable (selected);
+ }
+}
diff --git a/src/Main/Forms/FavoriteVolumesDialog.h b/src/Main/Forms/FavoriteVolumesDialog.h
new file mode 100644
index 00000000..7ab940a6
--- /dev/null
+++ b/src/Main/Forms/FavoriteVolumesDialog.h
@@ -0,0 +1,45 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_FavoriteVolumesDialog
+#define TC_HEADER_Main_Forms_FavoriteVolumesDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+#include "Main/FavoriteVolume.h"
+
+namespace TrueCrypt
+{
+ class FavoriteVolumesDialog : public FavoriteVolumesDialogBase
+ {
+ public:
+ FavoriteVolumesDialog (wxWindow* parent, const FavoriteVolumeList &favorites, size_t newItemCount = 0);
+
+ FavoriteVolumeList GetFavorites () const { return Favorites; }
+
+ protected:
+ void OnListItemDeselected (wxListEvent& event) { UpdateButtons (); }
+ void OnListItemSelected (wxListEvent& event) { UpdateButtons (); }
+ void OnMoveUpButtonClick (wxCommandEvent& event);
+ void OnMoveDownButtonClick (wxCommandEvent& event);
+ void OnOKButtonClick (wxCommandEvent& event);
+ void OnRemoveAllButtonClick (wxCommandEvent& event);
+ void OnRemoveButtonClick (wxCommandEvent& event);
+ void UpdateButtons ();
+
+ enum
+ {
+ ColumnVolumePath = 0,
+ ColumnMountPoint
+ };
+
+ FavoriteVolumeList Favorites;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_FavoriteVolumesDialog
diff --git a/src/Main/Forms/Forms.cpp b/src/Main/Forms/Forms.cpp
new file mode 100644
index 00000000..5825381c
--- /dev/null
+++ b/src/Main/Forms/Forms.cpp
@@ -0,0 +1,3062 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "System.h"
+
+#include "Forms.h"
+
+///////////////////////////////////////////////////////////////////////////
+using namespace TrueCrypt;
+
+MainFrameBase::MainFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( -1,496 ), wxDefaultSize );
+
+ MainMenuBar = new wxMenuBar( 0 );
+ VolumesMenu = new wxMenu();
+ wxMenuItem* CreateNewVolumeMenuItem;
+ CreateNewVolumeMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Create New Volume...") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( CreateNewVolumeMenuItem );
+
+ VolumesMenu->AppendSeparator();
+
+ MountVolumeMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Mount Volume") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( MountVolumeMenuItem );
+
+ wxMenuItem* AutoMountDevicesMenuItem;
+ AutoMountDevicesMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Auto-Mount All Device-Hosted Volumes") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( AutoMountDevicesMenuItem );
+
+ VolumesMenu->AppendSeparator();
+
+ DismountVolumeMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Dismount Volume") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( DismountVolumeMenuItem );
+
+ DismountAllMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Dismount All Mounted Volumes") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( DismountAllMenuItem );
+
+ VolumesMenu->AppendSeparator();
+
+ wxMenuItem* ChangePasswordMenuItem;
+ ChangePasswordMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Change Volume Password...") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( ChangePasswordMenuItem );
+
+ wxMenuItem* ChangePkcs5PrfMenuItem;
+ ChangePkcs5PrfMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Change Header Key Derivation Algorithm...") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( ChangePkcs5PrfMenuItem );
+
+ wxMenuItem* ChangeKeyfilesMenuItem;
+ ChangeKeyfilesMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Add/Remove Keyfiles to/from Volume...") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( ChangeKeyfilesMenuItem );
+
+ wxMenuItem* RemoveKeyfilesMenuItem;
+ RemoveKeyfilesMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Remove All Keyfiles from Volume...") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( RemoveKeyfilesMenuItem );
+
+ VolumesMenu->AppendSeparator();
+
+ VolumePropertiesMenuItem = new wxMenuItem( VolumesMenu, wxID_ANY, wxString( _("Volume Properties...") ) , wxEmptyString, wxITEM_NORMAL );
+ VolumesMenu->Append( VolumePropertiesMenuItem );
+
+ MainMenuBar->Append( VolumesMenu, _("&Volumes") );
+
+ FavoritesMenu = new wxMenu();
+ AddToFavoritesMenuItem = new wxMenuItem( FavoritesMenu, wxID_ANY, wxString( _("Add Selected Volume to Favorites...") ) , wxEmptyString, wxITEM_NORMAL );
+ FavoritesMenu->Append( AddToFavoritesMenuItem );
+
+ AddAllMountedToFavoritesMenuItem = new wxMenuItem( FavoritesMenu, wxID_ANY, wxString( _("Add All Mounted Volumes to Favorites...") ) , wxEmptyString, wxITEM_NORMAL );
+ FavoritesMenu->Append( AddAllMountedToFavoritesMenuItem );
+
+ wxMenuItem* OrganizeFavoritesMenuItem;
+ OrganizeFavoritesMenuItem = new wxMenuItem( FavoritesMenu, wxID_ANY, wxString( _("Organize Favorite Volumes...") ) , wxEmptyString, wxITEM_NORMAL );
+ FavoritesMenu->Append( OrganizeFavoritesMenuItem );
+
+ FavoritesMenu->AppendSeparator();
+
+ wxMenuItem* MountAllFavoritesMenuItem;
+ MountAllFavoritesMenuItem = new wxMenuItem( FavoritesMenu, wxID_ANY, wxString( _("Mount Favorite Volumes") ) , wxEmptyString, wxITEM_NORMAL );
+ FavoritesMenu->Append( MountAllFavoritesMenuItem );
+
+ FavoritesMenu->AppendSeparator();
+
+ MainMenuBar->Append( FavoritesMenu, _("&Favorites") );
+
+ ToolsMenu = new wxMenu();
+ wxMenuItem* BenchmarkMenuItem;
+ BenchmarkMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Benchmark...") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( BenchmarkMenuItem );
+
+ wxMenuItem* EncryptionTestMenuItem;
+ EncryptionTestMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Test Vectors...") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( EncryptionTestMenuItem );
+
+ ToolsMenu->AppendSeparator();
+
+ wxMenuItem* VolumeCreationWizardMenuItem;
+ VolumeCreationWizardMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Volume Creation Wizard") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( VolumeCreationWizardMenuItem );
+
+ ToolsMenu->AppendSeparator();
+
+ BackupVolumeHeadersMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Backup Volume Header...") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( BackupVolumeHeadersMenuItem );
+
+ RestoreVolumeHeaderMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Restore Volume Header...") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( RestoreVolumeHeaderMenuItem );
+
+ ToolsMenu->AppendSeparator();
+
+ wxMenuItem* CreateKeyfileMenuItem;
+ CreateKeyfileMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Keyfile Generator") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( CreateKeyfileMenuItem );
+
+ wxMenuItem* ManageSecurityTokenKeyfilesMenuItem;
+ ManageSecurityTokenKeyfilesMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Manage Security Token Keyfiles...") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( ManageSecurityTokenKeyfilesMenuItem );
+
+ wxMenuItem* CloseAllSecurityTokenSessionsMenuItem;
+ CloseAllSecurityTokenSessionsMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Close All Security Token Sessions") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( CloseAllSecurityTokenSessionsMenuItem );
+
+ ToolsMenu->AppendSeparator();
+
+ WipeCachedPasswordsMenuItem = new wxMenuItem( ToolsMenu, wxID_ANY, wxString( _("Wipe Cached Passwords") ) , wxEmptyString, wxITEM_NORMAL );
+ ToolsMenu->Append( WipeCachedPasswordsMenuItem );
+
+ MainMenuBar->Append( ToolsMenu, _("T&ools") );
+
+ SettingsMenu = new wxMenu();
+ HotkeysMenuItem = new wxMenuItem( SettingsMenu, wxID_ANY, wxString( _("Hotkeys...") ) , wxEmptyString, wxITEM_NORMAL );
+ SettingsMenu->Append( HotkeysMenuItem );
+
+ wxMenuItem* DefaultKeyfilesMenuItem;
+ DefaultKeyfilesMenuItem = new wxMenuItem( SettingsMenu, wxID_ANY, wxString( _("Default Keyfiles...") ) , wxEmptyString, wxITEM_NORMAL );
+ SettingsMenu->Append( DefaultKeyfilesMenuItem );
+
+ wxMenuItem* SecurityTokenPreferencesMenuItem;
+ SecurityTokenPreferencesMenuItem = new wxMenuItem( SettingsMenu, wxID_ANY, wxString( _("Security Tokens...") ) , wxEmptyString, wxITEM_NORMAL );
+ SettingsMenu->Append( SecurityTokenPreferencesMenuItem );
+
+ SettingsMenu->AppendSeparator();
+
+ PreferencesMenuItem = new wxMenuItem( SettingsMenu, wxID_PREFERENCES, wxString( _("&Preferences...") ) , wxEmptyString, wxITEM_NORMAL );
+ SettingsMenu->Append( PreferencesMenuItem );
+
+ MainMenuBar->Append( SettingsMenu, _("Settin&gs") );
+
+ HelpMenu = new wxMenu();
+ wxMenuItem* UserGuideMenuItem;
+ UserGuideMenuItem = new wxMenuItem( HelpMenu, wxID_HELP, wxString( _("User's Guide") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( UserGuideMenuItem );
+
+ wxMenuItem* OnlineHelpMenuItem;
+ OnlineHelpMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("Online Help") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( OnlineHelpMenuItem );
+
+ wxMenuItem* BeginnersTutorialMenuItem;
+ BeginnersTutorialMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("Beginner's Tutorial") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( BeginnersTutorialMenuItem );
+
+ wxMenuItem* FaqMenuItem;
+ FaqMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("Frequently Asked Questions") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( FaqMenuItem );
+
+ HelpMenu->AppendSeparator();
+
+ wxMenuItem* WebsiteMenuItem;
+ WebsiteMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("TrueCrypt Website") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( WebsiteMenuItem );
+
+ wxMenuItem* DownloadsMenuItem;
+ DownloadsMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("Downloads") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( DownloadsMenuItem );
+
+ wxMenuItem* NewsMenuItem;
+ NewsMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("News") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( NewsMenuItem );
+
+ wxMenuItem* VersionHistoryMenuItem;
+ VersionHistoryMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("Version History") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( VersionHistoryMenuItem );
+
+ HelpMenu->AppendSeparator();
+
+ wxMenuItem* ContactMenuItem;
+ ContactMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("Contact") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( ContactMenuItem );
+
+ wxMenuItem* LegalNoticesMenuItem;
+ LegalNoticesMenuItem = new wxMenuItem( HelpMenu, wxID_ANY, wxString( _("Legal Notices") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( LegalNoticesMenuItem );
+
+ wxMenuItem* AboutMenuItem;
+ AboutMenuItem = new wxMenuItem( HelpMenu, wxID_ABOUT, wxString( _("About") ) , wxEmptyString, wxITEM_NORMAL );
+ HelpMenu->Append( AboutMenuItem );
+
+ MainMenuBar->Append( HelpMenu, _("&Help") );
+
+ this->SetMenuBar( MainMenuBar );
+
+ wxBoxSizer* bSizer1;
+ bSizer1 = new wxBoxSizer( wxVERTICAL );
+
+ MainPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer2;
+ bSizer2 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer48;
+ bSizer48 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer1;
+ sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ SlotListCtrl = new wxListCtrl( MainPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_VRULES|wxSUNKEN_BORDER );
+ sbSizer1->Add( SlotListCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ bSizer48->Add( sbSizer1, 1, wxEXPAND, 5 );
+
+ LowStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ HigherButtonSizer = new wxBoxSizer( wxVERTICAL );
+
+ LowStaticBoxSizer->Add( HigherButtonSizer, 0, wxEXPAND|wxTOP, 2 );
+
+ wxGridSizer* gSizer1;
+ gSizer1 = new wxGridSizer( 1, 3, 0, 0 );
+
+ wxBoxSizer* bSizer17;
+ bSizer17 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer17->SetMinSize( wxSize( 138,34 ) );
+ CreateVolumeButton = new wxButton( MainPanel, wxID_ANY, _("&Create Volume"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer17->Add( CreateVolumeButton, 1, wxALL|wxEXPAND, 5 );
+
+ gSizer1->Add( bSizer17, 0, 0, 5 );
+
+ wxBoxSizer* bSizer18;
+ bSizer18 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer18->SetMinSize( wxSize( 138,34 ) );
+ VolumePropertiesButton = new wxButton( MainPanel, wxID_ANY, _("&Volume Properties..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer18->Add( VolumePropertiesButton, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ gSizer1->Add( bSizer18, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ wxBoxSizer* bSizer19;
+ bSizer19 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer19->SetMinSize( wxSize( 138,34 ) );
+ WipeCacheButton = new wxButton( MainPanel, wxID_ANY, _("&Wipe Cache"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer19->Add( WipeCacheButton, 1, wxALL|wxALIGN_RIGHT|wxEXPAND, 5 );
+
+ gSizer1->Add( bSizer19, 0, wxALIGN_RIGHT, 5 );
+
+ LowStaticBoxSizer->Add( gSizer1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+
+ LowStaticBoxSizer->Add( 0, 0, 0, 0, 5 );
+
+ VolumeStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, _("Volume") ), wxVERTICAL );
+
+ VolumeGridBagSizer = new wxGridBagSizer( 0, 0 );
+ VolumeGridBagSizer->AddGrowableCol( 1 );
+ VolumeGridBagSizer->AddGrowableRow( 0 );
+ VolumeGridBagSizer->SetFlexibleDirection( wxBOTH );
+ VolumeGridBagSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ LogoBitmap = new wxStaticBitmap( MainPanel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER );
+ LogoBitmap->SetMinSize( wxSize( 42,52 ) );
+
+ VolumeGridBagSizer->Add( LogoBitmap, wxGBPosition( 0, 0 ), wxGBSpan( 2, 1 ), wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ VolumePathComboBox = new wxComboBox( MainPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN );
+ VolumeGridBagSizer->Add( VolumePathComboBox, wxGBPosition( 0, 1 ), wxGBSpan( 1, 2 ), wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer191;
+ bSizer191 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer191->SetMinSize( wxSize( 138,34 ) );
+ SelectFileButton = new wxButton( MainPanel, wxID_ANY, _("Select &File..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer191->Add( SelectFileButton, 1, wxALL|wxEXPAND, 5 );
+
+ VolumeGridBagSizer->Add( bSizer191, wxGBPosition( 0, 3 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 );
+
+ NoHistoryCheckBox = new wxCheckBox( MainPanel, wxID_ANY, _("&Never save history"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ VolumeGridBagSizer->Add( NoHistoryCheckBox, wxGBPosition( 1, 1 ), wxGBSpan( 1, 1 ), wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer20;
+ bSizer20 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer20->SetMinSize( wxSize( 138,34 ) );
+ VolumeToolsButton = new wxButton( MainPanel, wxID_ANY, _("Volume &Tools..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer20->Add( VolumeToolsButton, 1, wxALL|wxEXPAND, 5 );
+
+ VolumeGridBagSizer->Add( bSizer20, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALIGN_RIGHT, 5 );
+
+ wxBoxSizer* bSizer21;
+ bSizer21 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer21->SetMinSize( wxSize( 138,34 ) );
+ SelectDeviceButton = new wxButton( MainPanel, wxID_ANY, _("Select D&evice..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer21->Add( SelectDeviceButton, 1, wxEXPAND|wxALL, 5 );
+
+ VolumeGridBagSizer->Add( bSizer21, wxGBPosition( 1, 3 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 );
+
+ VolumeStaticBoxSizer->Add( VolumeGridBagSizer, 1, wxEXPAND|wxALL, 4 );
+
+ LowStaticBoxSizer->Add( VolumeStaticBoxSizer, 1, wxEXPAND, 5 );
+
+
+ LowStaticBoxSizer->Add( 0, 0, 0, 0, 5 );
+
+ wxGridSizer* gSizer2;
+ gSizer2 = new wxGridSizer( 1, 4, 0, 0 );
+
+ wxStaticBoxSizer* sbSizer4;
+ sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ sbSizer4->SetMinSize( wxSize( 139,-1 ) );
+ VolumeButton = new wxButton( MainPanel, wxID_ANY, _("&Mount"), wxDefaultPosition, wxDefaultSize, 0 );
+ VolumeButton->SetDefault();
+ VolumeButton->SetMinSize( wxSize( -1,32 ) );
+
+ sbSizer4->Add( VolumeButton, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 2 );
+
+ gSizer2->Add( sbSizer4, 1, wxEXPAND, 0 );
+
+ wxStaticBoxSizer* sbSizer41;
+ sbSizer41 = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ MountAllDevicesButton = new wxButton( MainPanel, wxID_ANY, _("&Auto-Mount Devices"), wxDefaultPosition, wxDefaultSize, 0 );
+ MountAllDevicesButton->SetMinSize( wxSize( -1,32 ) );
+
+ sbSizer41->Add( MountAllDevicesButton, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 2 );
+
+ gSizer2->Add( sbSizer41, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer42;
+ sbSizer42 = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ DismountAllButton = new wxButton( MainPanel, wxID_ANY, _("Di&smount All"), wxDefaultPosition, wxDefaultSize, 0 );
+ DismountAllButton->SetMinSize( wxSize( -1,32 ) );
+
+ sbSizer42->Add( DismountAllButton, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 2 );
+
+ gSizer2->Add( sbSizer42, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer43;
+ sbSizer43 = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ ExitButton = new wxButton( MainPanel, wxID_ANY, _("E&xit"), wxDefaultPosition, wxDefaultSize, 0 );
+ ExitButton->SetMinSize( wxSize( -1,32 ) );
+
+ sbSizer43->Add( ExitButton, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 2 );
+
+ gSizer2->Add( sbSizer43, 1, wxALIGN_RIGHT|wxEXPAND, 5 );
+
+ LowStaticBoxSizer->Add( gSizer2, 0, wxEXPAND, 5 );
+
+ bSizer48->Add( LowStaticBoxSizer, 0, wxEXPAND, 5 );
+
+ bSizer2->Add( bSizer48, 1, wxEXPAND, 5 );
+
+ MainPanel->SetSizer( bSizer2 );
+ MainPanel->Layout();
+ bSizer2->Fit( MainPanel );
+ bSizer1->Add( MainPanel, 1, wxEXPAND, 0 );
+
+ this->SetSizer( bSizer1 );
+ this->Layout();
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_ACTIVATE, wxActivateEventHandler( MainFrameBase::OnActivate ) );
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnClose ) );
+ this->Connect( CreateNewVolumeMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCreateVolumeButtonClick ) );
+ this->Connect( MountVolumeMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnMountVolumeMenuItemSelected ) );
+ this->Connect( AutoMountDevicesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnMountAllDevicesButtonClick ) );
+ this->Connect( DismountVolumeMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDismountVolumeMenuItemSelected ) );
+ this->Connect( DismountAllMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDismountAllButtonClick ) );
+ this->Connect( ChangePasswordMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnChangePasswordMenuItemSelected ) );
+ this->Connect( ChangePkcs5PrfMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnChangePkcs5PrfMenuItemSelected ) );
+ this->Connect( ChangeKeyfilesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnChangeKeyfilesMenuItemSelected ) );
+ this->Connect( RemoveKeyfilesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnRemoveKeyfilesMenuItemSelected ) );
+ this->Connect( VolumePropertiesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnVolumePropertiesButtonClick ) );
+ this->Connect( AddToFavoritesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnAddToFavoritesMenuItemSelected ) );
+ this->Connect( AddAllMountedToFavoritesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnAddAllMountedToFavoritesMenuItemSelected ) );
+ this->Connect( OrganizeFavoritesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnOrganizeFavoritesMenuItemSelected ) );
+ this->Connect( MountAllFavoritesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnMountAllFavoritesMenuItemSelected ) );
+ this->Connect( BenchmarkMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnBenchmarkMenuItemSelected ) );
+ this->Connect( EncryptionTestMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnEncryptionTestMenuItemSelected ) );
+ this->Connect( VolumeCreationWizardMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCreateVolumeButtonClick ) );
+ this->Connect( BackupVolumeHeadersMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnBackupVolumeHeadersMenuItemSelected ) );
+ this->Connect( RestoreVolumeHeaderMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnRestoreVolumeHeaderMenuItemSelected ) );
+ this->Connect( CreateKeyfileMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCreateKeyfileMenuItemSelected ) );
+ this->Connect( ManageSecurityTokenKeyfilesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnManageSecurityTokenKeyfilesMenuItemSelected ) );
+ this->Connect( CloseAllSecurityTokenSessionsMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCloseAllSecurityTokenSessionsMenuItemSelected ) );
+ this->Connect( WipeCachedPasswordsMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnWipeCacheButtonClick ) );
+ this->Connect( HotkeysMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnHotkeysMenuItemSelected ) );
+ this->Connect( DefaultKeyfilesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDefaultKeyfilesMenuItemSelected ) );
+ this->Connect( SecurityTokenPreferencesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnSecurityTokenPreferencesMenuItemSelected ) );
+ this->Connect( PreferencesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnPreferencesMenuItemSelected ) );
+ this->Connect( UserGuideMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnUserGuideMenuItemSelected ) );
+ this->Connect( OnlineHelpMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnOnlineHelpMenuItemSelected ) );
+ this->Connect( BeginnersTutorialMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnBeginnersTutorialMenuItemSelected ) );
+ this->Connect( FaqMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnFaqMenuItemSelected ) );
+ this->Connect( WebsiteMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnWebsiteMenuItemSelected ) );
+ this->Connect( DownloadsMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDownloadsMenuItemSelected ) );
+ this->Connect( NewsMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnNewsMenuItemSelected ) );
+ this->Connect( VersionHistoryMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnVersionHistoryMenuItemSelected ) );
+ this->Connect( ContactMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnContactMenuItemSelected ) );
+ this->Connect( LegalNoticesMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnLegalNoticesMenuItemSelected ) );
+ this->Connect( AboutMenuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnAboutMenuItemSelected ) );
+ SlotListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( MainFrameBase::OnListItemActivated ), NULL, this );
+ SlotListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( MainFrameBase::OnListItemDeselected ), NULL, this );
+ SlotListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, wxListEventHandler( MainFrameBase::OnListItemRightClick ), NULL, this );
+ SlotListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( MainFrameBase::OnListItemSelected ), NULL, this );
+ CreateVolumeButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnCreateVolumeButtonClick ), NULL, this );
+ VolumePropertiesButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnVolumePropertiesButtonClick ), NULL, this );
+ WipeCacheButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnWipeCacheButtonClick ), NULL, this );
+ LogoBitmap->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( MainFrameBase::OnLogoBitmapClick ), NULL, this );
+ SelectFileButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnSelectFileButtonClick ), NULL, this );
+ NoHistoryCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainFrameBase::OnNoHistoryCheckBoxClick ), NULL, this );
+ VolumeToolsButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnVolumeToolsButtonClick ), NULL, this );
+ SelectDeviceButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnSelectDeviceButtonClick ), NULL, this );
+ VolumeButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnVolumeButtonClick ), NULL, this );
+ MountAllDevicesButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnMountAllDevicesButtonClick ), NULL, this );
+ DismountAllButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnDismountAllButtonClick ), NULL, this );
+ ExitButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnExitButtonClick ), NULL, this );
+}
+
+MainFrameBase::~MainFrameBase()
+{
+ // Disconnect Events
+ this->Disconnect( wxEVT_ACTIVATE, wxActivateEventHandler( MainFrameBase::OnActivate ) );
+ this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnClose ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCreateVolumeButtonClick ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnMountVolumeMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnMountAllDevicesButtonClick ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDismountVolumeMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDismountAllButtonClick ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnChangePasswordMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnChangePkcs5PrfMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnChangeKeyfilesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnRemoveKeyfilesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnVolumePropertiesButtonClick ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnAddToFavoritesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnAddAllMountedToFavoritesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnOrganizeFavoritesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnMountAllFavoritesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnBenchmarkMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnEncryptionTestMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCreateVolumeButtonClick ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnBackupVolumeHeadersMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnRestoreVolumeHeaderMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCreateKeyfileMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnManageSecurityTokenKeyfilesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnCloseAllSecurityTokenSessionsMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnWipeCacheButtonClick ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnHotkeysMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDefaultKeyfilesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnSecurityTokenPreferencesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnPreferencesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnUserGuideMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnOnlineHelpMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnBeginnersTutorialMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnFaqMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnWebsiteMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnDownloadsMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnNewsMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnVersionHistoryMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnContactMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnLegalNoticesMenuItemSelected ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnAboutMenuItemSelected ) );
+ SlotListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( MainFrameBase::OnListItemActivated ), NULL, this );
+ SlotListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( MainFrameBase::OnListItemDeselected ), NULL, this );
+ SlotListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, wxListEventHandler( MainFrameBase::OnListItemRightClick ), NULL, this );
+ SlotListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( MainFrameBase::OnListItemSelected ), NULL, this );
+ CreateVolumeButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnCreateVolumeButtonClick ), NULL, this );
+ VolumePropertiesButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnVolumePropertiesButtonClick ), NULL, this );
+ WipeCacheButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnWipeCacheButtonClick ), NULL, this );
+ LogoBitmap->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( MainFrameBase::OnLogoBitmapClick ), NULL, this );
+ SelectFileButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnSelectFileButtonClick ), NULL, this );
+ NoHistoryCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainFrameBase::OnNoHistoryCheckBoxClick ), NULL, this );
+ VolumeToolsButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnVolumeToolsButtonClick ), NULL, this );
+ SelectDeviceButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnSelectDeviceButtonClick ), NULL, this );
+ VolumeButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnVolumeButtonClick ), NULL, this );
+ MountAllDevicesButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnMountAllDevicesButtonClick ), NULL, this );
+ DismountAllButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnDismountAllButtonClick ), NULL, this );
+ ExitButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrameBase::OnExitButtonClick ), NULL, this );
+}
+
+WizardFrameBase::WizardFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer92;
+ bSizer92 = new wxBoxSizer( wxVERTICAL );
+
+ MainPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer63;
+ bSizer63 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer64;
+ bSizer64 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer27;
+ sbSizer27 = new wxStaticBoxSizer( new wxStaticBox( MainPanel, wxID_ANY, wxEmptyString ), wxHORIZONTAL );
+
+ WizardBitmap = new wxStaticBitmap( MainPanel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ sbSizer27->Add( WizardBitmap, 0, wxALL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer66;
+ bSizer66 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer126;
+ bSizer126 = new wxBoxSizer( wxHORIZONTAL );
+
+ PageTitleStaticText = new wxStaticText( MainPanel, wxID_ANY, _("Page Title"), wxDefaultPosition, wxDefaultSize, 0 );
+ PageTitleStaticText->Wrap( -1 );
+ PageTitleStaticText->SetFont( wxFont( 16, 70, 90, 90, false, wxT("Times New Roman") ) );
+
+ bSizer126->Add( PageTitleStaticText, 0, wxALL, 5 );
+
+ bSizer66->Add( bSizer126, 0, wxLEFT, 5 );
+
+ PageSizer = new wxBoxSizer( wxVERTICAL );
+
+ bSizer66->Add( PageSizer, 1, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ sbSizer27->Add( bSizer66, 1, wxEXPAND|wxLEFT, 5 );
+
+ bSizer64->Add( sbSizer27, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer70;
+ bSizer70 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer70->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ HelpButton = new wxButton( MainPanel, wxID_HELP, _("&Help"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer70->Add( HelpButton, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer70->Add( 0, 0, 0, wxLEFT|wxALIGN_RIGHT, 5 );
+
+ PreviousButton = new wxButton( MainPanel, wxID_ANY, _("< &Prev"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer70->Add( PreviousButton, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ NextButton = new wxButton( MainPanel, wxID_ANY, _("&Next >"), wxDefaultPosition, wxDefaultSize, 0|wxWANTS_CHARS );
+ NextButton->SetDefault();
+ bSizer70->Add( NextButton, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer70->Add( 0, 0, 0, wxLEFT|wxALIGN_RIGHT, 5 );
+
+ CancelButton = new wxButton( MainPanel, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer70->Add( CancelButton, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer64->Add( bSizer70, 0, wxEXPAND|wxALIGN_RIGHT|wxALL, 5 );
+
+ bSizer63->Add( bSizer64, 1, wxEXPAND, 5 );
+
+ MainPanel->SetSizer( bSizer63 );
+ MainPanel->Layout();
+ bSizer63->Fit( MainPanel );
+ bSizer92->Add( MainPanel, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer92 );
+ this->Layout();
+ bSizer92->Fit( this );
+
+ // Connect Events
+ this->Connect( wxEVT_ACTIVATE, wxActivateEventHandler( WizardFrameBase::OnActivate ) );
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WizardFrameBase::OnClose ) );
+ MainPanel->Connect( wxEVT_MOTION, wxMouseEventHandler( WizardFrameBase::OnMouseMotion ), NULL, this );
+ HelpButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnHelpButtonClick ), NULL, this );
+ PreviousButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnPreviousButtonClick ), NULL, this );
+ NextButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnNextButtonClick ), NULL, this );
+ CancelButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnCancelButtonClick ), NULL, this );
+}
+
+WizardFrameBase::~WizardFrameBase()
+{
+ // Disconnect Events
+ this->Disconnect( wxEVT_ACTIVATE, wxActivateEventHandler( WizardFrameBase::OnActivate ) );
+ this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WizardFrameBase::OnClose ) );
+ MainPanel->Disconnect( wxEVT_MOTION, wxMouseEventHandler( WizardFrameBase::OnMouseMotion ), NULL, this );
+ HelpButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnHelpButtonClick ), NULL, this );
+ PreviousButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnPreviousButtonClick ), NULL, this );
+ NextButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnNextButtonClick ), NULL, this );
+ CancelButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WizardFrameBase::OnCancelButtonClick ), NULL, this );
+}
+
+AboutDialogBase::AboutDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer116;
+ bSizer116 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer117;
+ bSizer117 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer120;
+ bSizer120 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer120->SetMinSize( wxSize( -1,78 ) );
+ m_panel14 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel14->SetBackgroundColour( wxColour( 10, 108, 206 ) );
+
+ wxBoxSizer* bSizer121;
+ bSizer121 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer121->Add( 0, 0, 1, wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer122;
+ bSizer122 = new wxBoxSizer( wxVERTICAL );
+
+ LogoBitmap = new wxStaticBitmap( m_panel14, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer122->Add( LogoBitmap, 0, wxALL, 10 );
+
+ bSizer121->Add( bSizer122, 0, wxEXPAND|wxLEFT, 8 );
+
+ m_panel14->SetSizer( bSizer121 );
+ m_panel14->Layout();
+ bSizer121->Fit( m_panel14 );
+ bSizer120->Add( m_panel14, 1, wxEXPAND, 5 );
+
+ bSizer117->Add( bSizer120, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer118;
+ bSizer118 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer123;
+ bSizer123 = new wxBoxSizer( wxVERTICAL );
+
+ VersionStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ VersionStaticText->Wrap( -1 );
+ bSizer123->Add( VersionStaticText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer123->Add( 0, 0, 0, wxTOP, 3 );
+
+ CopyrightStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ CopyrightStaticText->Wrap( -1 );
+ bSizer123->Add( CopyrightStaticText, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer123->Add( 0, 0, 0, wxTOP, 3 );
+
+ WebsiteHyperlink = new wxHyperlinkCtrl( this, wxID_ANY, wxEmptyString, wxT("."), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+
+ WebsiteHyperlink->SetHoverColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ WebsiteHyperlink->SetNormalColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ WebsiteHyperlink->SetVisitedColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ bSizer123->Add( WebsiteHyperlink, 0, wxALL, 5 );
+
+ bSizer118->Add( bSizer123, 1, wxEXPAND|wxLEFT, 5 );
+
+ bSizer117->Add( bSizer118, 1, wxALL|wxEXPAND, 15 );
+
+ m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer117->Add( m_staticline3, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ CreditsTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxSUNKEN_BORDER );
+ bSizer117->Add( CreditsTextCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 );
+
+
+ bSizer117->Add( 0, 0, 0, wxTOP, 5 );
+
+ m_staticline4 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer117->Add( m_staticline4, 0, wxEXPAND|wxTOP|wxBOTTOM, 3 );
+
+ m_staticline5 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer117->Add( m_staticline5, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer119;
+ bSizer119 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer119->Add( 0, 0, 1, wxEXPAND|wxALL, 5 );
+
+ wxButton* OKButton;
+ OKButton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ OKButton->SetDefault();
+ bSizer119->Add( OKButton, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer119->Add( 0, 0, 0, wxLEFT, 5 );
+
+ bSizer117->Add( bSizer119, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 6 );
+
+ bSizer116->Add( bSizer117, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer116 );
+ this->Layout();
+ bSizer116->Fit( this );
+
+ // Connect Events
+ WebsiteHyperlink->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( AboutDialogBase::OnWebsiteHyperlinkClick ), NULL, this );
+}
+
+AboutDialogBase::~AboutDialogBase()
+{
+ // Disconnect Events
+ WebsiteHyperlink->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( AboutDialogBase::OnWebsiteHyperlinkClick ), NULL, this );
+}
+
+BenchmarkDialogBase::BenchmarkDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer153;
+ bSizer153 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer154;
+ bSizer154 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer155;
+ bSizer155 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticText* m_staticText54;
+ m_staticText54 = new wxStaticText( this, wxID_ANY, _("Buffer Size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText54->Wrap( -1 );
+ bSizer155->Add( m_staticText54, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ wxArrayString BufferSizeChoiceChoices;
+ BufferSizeChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, BufferSizeChoiceChoices, 0 );
+ BufferSizeChoice->SetSelection( 0 );
+ bSizer155->Add( BufferSizeChoice, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer154->Add( bSizer155, 0, wxEXPAND, 5 );
+
+ wxStaticLine* m_staticline6;
+ m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer154->Add( m_staticline6, 0, wxEXPAND | wxALL, 5 );
+
+ wxBoxSizer* bSizer156;
+ bSizer156 = new wxBoxSizer( wxHORIZONTAL );
+
+ BenchmarkListCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxSUNKEN_BORDER );
+ bSizer156->Add( BenchmarkListCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ RightSizer = new wxBoxSizer( wxVERTICAL );
+
+ BenchmarkButton = new wxButton( this, wxID_OK, _("Benchmark"), wxDefaultPosition, wxDefaultSize, 0 );
+ BenchmarkButton->SetDefault();
+ RightSizer->Add( BenchmarkButton, 0, wxALL|wxEXPAND, 5 );
+
+ wxButton* CancelButton;
+ CancelButton = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
+ RightSizer->Add( CancelButton, 0, wxALL|wxEXPAND, 5 );
+
+
+ RightSizer->Add( 0, 0, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ BenchmarkNoteStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ BenchmarkNoteStaticText->Wrap( -1 );
+ RightSizer->Add( BenchmarkNoteStaticText, 1, wxALL|wxEXPAND, 5 );
+
+ bSizer156->Add( RightSizer, 0, wxEXPAND, 5 );
+
+ bSizer154->Add( bSizer156, 1, wxEXPAND, 5 );
+
+ bSizer153->Add( bSizer154, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer153 );
+ this->Layout();
+ bSizer153->Fit( this );
+
+ // Connect Events
+ BenchmarkButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BenchmarkDialogBase::OnBenchmarkButtonClick ), NULL, this );
+}
+
+BenchmarkDialogBase::~BenchmarkDialogBase()
+{
+ // Disconnect Events
+ BenchmarkButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BenchmarkDialogBase::OnBenchmarkButtonClick ), NULL, this );
+}
+
+ChangePasswordDialogBase::ChangePasswordDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
+
+ wxBoxSizer* bSizer30;
+ bSizer30 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer31;
+ bSizer31 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer32;
+ bSizer32 = new wxBoxSizer( wxVERTICAL );
+
+ CurrentSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Current") ), wxVERTICAL );
+
+ CurrentPasswordPanelSizer = new wxBoxSizer( wxVERTICAL );
+
+ CurrentSizer->Add( CurrentPasswordPanelSizer, 0, wxALIGN_RIGHT, 5 );
+
+ bSizer32->Add( CurrentSizer, 0, wxEXPAND, 5 );
+
+ NewSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("New") ), wxVERTICAL );
+
+ NewPasswordPanelSizer = new wxBoxSizer( wxVERTICAL );
+
+ NewSizer->Add( NewPasswordPanelSizer, 0, wxALIGN_RIGHT, 5 );
+
+ bSizer32->Add( NewSizer, 0, wxTOP|wxEXPAND, 5 );
+
+ bSizer31->Add( bSizer32, 1, wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer33;
+ bSizer33 = new wxBoxSizer( wxVERTICAL );
+
+ OKButton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ OKButton->SetDefault();
+ bSizer33->Add( OKButton, 0, wxALL|wxEXPAND, 5 );
+
+ CancelButton = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer33->Add( CancelButton, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer31->Add( bSizer33, 0, 0, 5 );
+
+ bSizer30->Add( bSizer31, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer30 );
+ this->Layout();
+ bSizer30->Fit( this );
+
+ // Connect Events
+ OKButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ChangePasswordDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+ChangePasswordDialogBase::~ChangePasswordDialogBase()
+{
+ // Disconnect Events
+ OKButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ChangePasswordDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+DeviceSelectionDialogBase::DeviceSelectionDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
+
+ wxBoxSizer* bSizer3;
+ bSizer3 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer4;
+ bSizer4 = new wxBoxSizer( wxVERTICAL );
+
+ DeviceListCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_VRULES|wxSUNKEN_BORDER );
+ bSizer4->Add( DeviceListCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ StdButtons = new wxStdDialogButtonSizer();
+ StdButtonsOK = new wxButton( this, wxID_OK );
+ StdButtons->AddButton( StdButtonsOK );
+ StdButtonsCancel = new wxButton( this, wxID_CANCEL );
+ StdButtons->AddButton( StdButtonsCancel );
+ StdButtons->Realize();
+ bSizer4->Add( StdButtons, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer3->Add( bSizer4, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer3 );
+ this->Layout();
+ bSizer3->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ DeviceListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( DeviceSelectionDialogBase::OnListItemActivated ), NULL, this );
+ DeviceListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( DeviceSelectionDialogBase::OnListItemDeselected ), NULL, this );
+ DeviceListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DeviceSelectionDialogBase::OnListItemSelected ), NULL, this );
+}
+
+DeviceSelectionDialogBase::~DeviceSelectionDialogBase()
+{
+ // Disconnect Events
+ DeviceListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( DeviceSelectionDialogBase::OnListItemActivated ), NULL, this );
+ DeviceListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( DeviceSelectionDialogBase::OnListItemDeselected ), NULL, this );
+ DeviceListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DeviceSelectionDialogBase::OnListItemSelected ), NULL, this );
+}
+
+EncryptionTestDialogBase::EncryptionTestDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer132;
+ bSizer132 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer133;
+ bSizer133 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticText* m_staticText41;
+ m_staticText41 = new wxStaticText( this, wxID_ANY, _("Encryption algorithm:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText41->Wrap( -1 );
+ bSizer134->Add( m_staticText41, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ wxArrayString EncryptionAlgorithmChoiceChoices;
+ EncryptionAlgorithmChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, EncryptionAlgorithmChoiceChoices, 0 );
+ EncryptionAlgorithmChoice->SetSelection( 0 );
+ bSizer134->Add( EncryptionAlgorithmChoice, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ XtsModeCheckBox = new wxCheckBox( this, wxID_ANY, _("XTS mode"), wxDefaultPosition, wxDefaultSize, 0 );
+ XtsModeCheckBox->SetValue(true);
+
+ bSizer134->Add( XtsModeCheckBox, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer133->Add( bSizer134, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ wxStaticBoxSizer* sbSizer38;
+ sbSizer38 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Key (hexadecimal)") ), wxVERTICAL );
+
+ KeyTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ KeyTextCtrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier") ) );
+
+ sbSizer38->Add( KeyTextCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer135;
+ bSizer135 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticText* m_staticText43;
+ m_staticText43 = new wxStaticText( this, wxID_ANY, _("Key size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText43->Wrap( -1 );
+ bSizer135->Add( m_staticText43, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ KeySizeStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ KeySizeStaticText->Wrap( -1 );
+ bSizer135->Add( KeySizeStaticText, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
+
+ sbSizer38->Add( bSizer135, 0, wxEXPAND, 5 );
+
+ bSizer133->Add( sbSizer38, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer39;
+ sbSizer39 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("XTS mode") ), wxVERTICAL );
+
+ wxStaticText* m_staticText45;
+ m_staticText45 = new wxStaticText( this, wxID_ANY, _("Secondary key (hexadecimal)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText45->Wrap( -1 );
+ sbSizer39->Add( m_staticText45, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ SecondaryKeyTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ SecondaryKeyTextCtrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier") ) );
+
+ sbSizer39->Add( SecondaryKeyTextCtrl, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticText* m_staticText46;
+ m_staticText46 = new wxStaticText( this, wxID_ANY, _("Data unit number (64-bit, data unit size is 512 bytes)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText46->Wrap( -1 );
+ sbSizer39->Add( m_staticText46, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ DataUnitNumberTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ sbSizer39->Add( DataUnitNumberTextCtrl, 0, wxALL, 5 );
+
+ wxStaticText* m_staticText47;
+ m_staticText47 = new wxStaticText( this, wxID_ANY, _("Block number:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText47->Wrap( -1 );
+ sbSizer39->Add( m_staticText47, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ BlockNumberTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ sbSizer39->Add( BlockNumberTextCtrl, 0, wxALL, 5 );
+
+ bSizer133->Add( sbSizer39, 1, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer40;
+ sbSizer40 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Plaintext (hexadecimal)") ), wxVERTICAL );
+
+ PlainTextTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ PlainTextTextCtrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier") ) );
+
+ sbSizer40->Add( PlainTextTextCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer133->Add( sbSizer40, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer41;
+ sbSizer41 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Ciphertext (hexadecimal)") ), wxVERTICAL );
+
+ CipherTextTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ CipherTextTextCtrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier") ) );
+
+ sbSizer41->Add( CipherTextTextCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer133->Add( sbSizer41, 0, wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer136;
+ bSizer136 = new wxBoxSizer( wxHORIZONTAL );
+
+ EncryptButton = new wxButton( this, wxID_ANY, _("&Encrypt"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer136->Add( EncryptButton, 0, wxALL, 5 );
+
+ DecryptButton = new wxButton( this, wxID_ANY, _("&Decrypt"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer136->Add( DecryptButton, 0, wxALL, 5 );
+
+ AutoTestAllButton = new wxButton( this, wxID_ANY, _("&Auto-Test All"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer136->Add( AutoTestAllButton, 0, wxALL, 5 );
+
+ ResetButton = new wxButton( this, wxID_ANY, _("&Reset"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer136->Add( ResetButton, 0, wxALL, 5 );
+
+ CloseButton = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer136->Add( CloseButton, 0, wxALL, 5 );
+
+ bSizer133->Add( bSizer136, 0, wxEXPAND, 5 );
+
+ bSizer132->Add( bSizer133, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer132 );
+ this->Layout();
+ bSizer132->Fit( this );
+
+ // Connect Events
+ EncryptionAlgorithmChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( EncryptionTestDialogBase::OnEncryptionAlgorithmSelected ), NULL, this );
+ XtsModeCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnXtsModeCheckBoxClick ), NULL, this );
+ EncryptButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnEncryptButtonClick ), NULL, this );
+ DecryptButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnDecryptButtonClick ), NULL, this );
+ AutoTestAllButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnAutoTestAllButtonClick ), NULL, this );
+ ResetButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnResetButtonClick ), NULL, this );
+}
+
+EncryptionTestDialogBase::~EncryptionTestDialogBase()
+{
+ // Disconnect Events
+ EncryptionAlgorithmChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( EncryptionTestDialogBase::OnEncryptionAlgorithmSelected ), NULL, this );
+ XtsModeCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnXtsModeCheckBoxClick ), NULL, this );
+ EncryptButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnEncryptButtonClick ), NULL, this );
+ DecryptButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnDecryptButtonClick ), NULL, this );
+ AutoTestAllButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnAutoTestAllButtonClick ), NULL, this );
+ ResetButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionTestDialogBase::OnResetButtonClick ), NULL, this );
+}
+
+FavoriteVolumesDialogBase::FavoriteVolumesDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer57;
+ bSizer57 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer60;
+ bSizer60 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer58;
+ bSizer58 = new wxBoxSizer( wxVERTICAL );
+
+ FavoritesListCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_VRULES|wxSUNKEN_BORDER );
+ bSizer58->Add( FavoritesListCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ wxGridSizer* gSizer5;
+ gSizer5 = new wxGridSizer( 1, 4, 0, 0 );
+
+ MoveUpButton = new wxButton( this, wxID_ANY, _("Move &Up"), wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer5->Add( MoveUpButton, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ MoveDownButton = new wxButton( this, wxID_ANY, _("Move &Down"), wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer5->Add( MoveDownButton, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ RemoveButton = new wxButton( this, wxID_ANY, _("&Remove"), wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer5->Add( RemoveButton, 0, wxALIGN_RIGHT|wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ RemoveAllButton = new wxButton( this, wxID_ANY, _("Remove &All"), wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer5->Add( RemoveAllButton, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ bSizer58->Add( gSizer5, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+ wxFlexGridSizer* fgSizer4;
+ fgSizer4 = new wxFlexGridSizer( 1, 5, 0, 0 );
+ fgSizer4->AddGrowableCol( 2 );
+ fgSizer4->SetFlexibleDirection( wxBOTH );
+ fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+
+ fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizer58->Add( fgSizer4, 0, wxEXPAND, 5 );
+
+ bSizer60->Add( bSizer58, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer59;
+ bSizer59 = new wxBoxSizer( wxVERTICAL );
+
+ OKButton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ OKButton->SetDefault();
+ bSizer59->Add( OKButton, 0, wxALL, 5 );
+
+ CancelButton = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer59->Add( CancelButton, 0, wxALL, 5 );
+
+ bSizer60->Add( bSizer59, 0, wxEXPAND, 5 );
+
+ bSizer57->Add( bSizer60, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer57 );
+ this->Layout();
+ bSizer57->Fit( this );
+
+ // Connect Events
+ FavoritesListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( FavoriteVolumesDialogBase::OnListItemDeselected ), NULL, this );
+ FavoritesListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( FavoriteVolumesDialogBase::OnListItemSelected ), NULL, this );
+ MoveUpButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnMoveUpButtonClick ), NULL, this );
+ MoveDownButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnMoveDownButtonClick ), NULL, this );
+ RemoveButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnRemoveButtonClick ), NULL, this );
+ RemoveAllButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnRemoveAllButtonClick ), NULL, this );
+ OKButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+FavoriteVolumesDialogBase::~FavoriteVolumesDialogBase()
+{
+ // Disconnect Events
+ FavoritesListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( FavoriteVolumesDialogBase::OnListItemDeselected ), NULL, this );
+ FavoritesListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( FavoriteVolumesDialogBase::OnListItemSelected ), NULL, this );
+ MoveUpButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnMoveUpButtonClick ), NULL, this );
+ MoveDownButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnMoveDownButtonClick ), NULL, this );
+ RemoveButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnRemoveButtonClick ), NULL, this );
+ RemoveAllButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnRemoveAllButtonClick ), NULL, this );
+ OKButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FavoriteVolumesDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+KeyfilesDialogBase::KeyfilesDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
+
+ wxBoxSizer* bSizer26;
+ bSizer26 = new wxBoxSizer( wxVERTICAL );
+
+ UpperSizer = new wxBoxSizer( wxHORIZONTAL );
+
+ PanelSizer = new wxBoxSizer( wxVERTICAL );
+
+ UpperSizer->Add( PanelSizer, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer22;
+ bSizer22 = new wxBoxSizer( wxVERTICAL );
+
+ OKButton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ OKButton->SetDefault();
+ bSizer22->Add( OKButton, 0, wxALL|wxEXPAND, 5 );
+
+ CancelButton = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer22->Add( CancelButton, 0, wxALL|wxEXPAND, 5 );
+
+ WarningStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ WarningStaticText->Wrap( -1 );
+ bSizer22->Add( WarningStaticText, 1, wxALL|wxEXPAND, 5 );
+
+ UpperSizer->Add( bSizer22, 0, wxEXPAND, 5 );
+
+ bSizer26->Add( UpperSizer, 1, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer23;
+ bSizer23 = new wxBoxSizer( wxVERTICAL );
+
+ KeyfilesNoteSizer = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticLine* m_staticline1;
+ m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ KeyfilesNoteSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
+
+ KeyfilesNoteStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ KeyfilesNoteStaticText->Wrap( -1 );
+ KeyfilesNoteSizer->Add( KeyfilesNoteStaticText, 0, wxALL|wxEXPAND, 5 );
+
+ wxStaticLine* m_staticline2;
+ m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ KeyfilesNoteSizer->Add( m_staticline2, 0, wxEXPAND | wxALL, 5 );
+
+ bSizer23->Add( KeyfilesNoteSizer, 1, wxEXPAND, 5 );
+
+ wxFlexGridSizer* fgSizer2;
+ fgSizer2 = new wxFlexGridSizer( 1, 2, 0, 0 );
+ fgSizer2->AddGrowableCol( 0 );
+ fgSizer2->SetFlexibleDirection( wxBOTH );
+ fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ KeyfilesHyperlink = new wxHyperlinkCtrl( this, wxID_ANY, _("More information on keyfiles"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+
+ KeyfilesHyperlink->SetHoverColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ KeyfilesHyperlink->SetNormalColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ KeyfilesHyperlink->SetVisitedColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ fgSizer2->Add( KeyfilesHyperlink, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ CreateKeyfileButtton = new wxButton( this, wxID_ANY, _("&Generate Random Keyfile..."), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer2->Add( CreateKeyfileButtton, 0, wxALL, 5 );
+
+ bSizer23->Add( fgSizer2, 0, wxEXPAND, 5 );
+
+ bSizer26->Add( bSizer23, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ this->SetSizer( bSizer26 );
+ this->Layout();
+ bSizer26->Fit( this );
+
+ // Connect Events
+ KeyfilesHyperlink->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( KeyfilesDialogBase::OnKeyfilesHyperlinkClick ), NULL, this );
+ CreateKeyfileButtton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesDialogBase::OnCreateKeyfileButttonClick ), NULL, this );
+}
+
+KeyfilesDialogBase::~KeyfilesDialogBase()
+{
+ // Disconnect Events
+ KeyfilesHyperlink->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( KeyfilesDialogBase::OnKeyfilesHyperlinkClick ), NULL, this );
+ CreateKeyfileButtton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesDialogBase::OnCreateKeyfileButttonClick ), NULL, this );
+}
+
+KeyfileGeneratorDialogBase::KeyfileGeneratorDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ MainSizer = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer144;
+ bSizer144 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer145;
+ bSizer145 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer145->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ wxStaticText* m_staticText49;
+ m_staticText49 = new wxStaticText( this, wxID_ANY, _("Mixing PRF:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText49->Wrap( -1 );
+ bSizer145->Add( m_staticText49, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxArrayString HashChoiceChoices;
+ HashChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, HashChoiceChoices, 0 );
+ HashChoice->SetSelection( 0 );
+ bSizer145->Add( HashChoice, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer145->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizer144->Add( bSizer145, 0, wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer43;
+ sbSizer43 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ wxBoxSizer* bSizer147;
+ bSizer147 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticText* m_staticText52;
+ m_staticText52 = new wxStaticText( this, wxID_ANY, _("Random Pool:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText52->Wrap( -1 );
+ bSizer147->Add( m_staticText52, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ RandomPoolStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ RandomPoolStaticText->Wrap( -1 );
+ RandomPoolStaticText->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier New") ) );
+
+ bSizer147->Add( RandomPoolStaticText, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ ShowRandomPoolCheckBox = new wxCheckBox( this, wxID_ANY, _("Show"), wxDefaultPosition, wxDefaultSize, 0 );
+ ShowRandomPoolCheckBox->SetValue(true);
+
+ bSizer147->Add( ShowRandomPoolCheckBox, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ sbSizer43->Add( bSizer147, 0, wxEXPAND|wxTOP, 5 );
+
+
+ sbSizer43->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ MouseStaticText = new wxStaticText( this, wxID_ANY, _("IMPORTANT: Move your mouse as randomly as possible within this window. The longer you move it, the better. This significantly increases the cryptographic strength of the keyfile."), wxDefaultPosition, wxDefaultSize, 0 );
+ MouseStaticText->Wrap( -1 );
+ sbSizer43->Add( MouseStaticText, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ sbSizer43->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizer144->Add( sbSizer43, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer146;
+ bSizer146 = new wxBoxSizer( wxHORIZONTAL );
+
+ GenerateButton = new wxButton( this, wxID_ANY, _("Generate and Save Keyfile..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer146->Add( GenerateButton, 0, wxALL, 5 );
+
+
+ bSizer146->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ wxButton* m_button61;
+ m_button61 = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer146->Add( m_button61, 0, wxALL, 5 );
+
+ bSizer144->Add( bSizer146, 0, wxEXPAND, 5 );
+
+ MainSizer->Add( bSizer144, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( MainSizer );
+ this->Layout();
+ MainSizer->Fit( this );
+
+ // Connect Events
+ this->Connect( wxEVT_MOTION, wxMouseEventHandler( KeyfileGeneratorDialogBase::OnMouseMotion ) );
+ HashChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( KeyfileGeneratorDialogBase::OnHashSelected ), NULL, this );
+ ShowRandomPoolCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( KeyfileGeneratorDialogBase::OnShowRandomPoolCheckBoxClicked ), NULL, this );
+ GenerateButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfileGeneratorDialogBase::OnGenerateButtonClick ), NULL, this );
+}
+
+KeyfileGeneratorDialogBase::~KeyfileGeneratorDialogBase()
+{
+ // Disconnect Events
+ this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( KeyfileGeneratorDialogBase::OnMouseMotion ) );
+ HashChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( KeyfileGeneratorDialogBase::OnHashSelected ), NULL, this );
+ ShowRandomPoolCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( KeyfileGeneratorDialogBase::OnShowRandomPoolCheckBoxClicked ), NULL, this );
+ GenerateButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfileGeneratorDialogBase::OnGenerateButtonClick ), NULL, this );
+}
+
+LegalNoticesDialogBase::LegalNoticesDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer114;
+ bSizer114 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer115;
+ bSizer115 = new wxBoxSizer( wxVERTICAL );
+
+ LegalNoticesTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
+ bSizer115->Add( LegalNoticesTextCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ wxButton* OKButton;
+ OKButton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ OKButton->SetDefault();
+ bSizer115->Add( OKButton, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizer114->Add( bSizer115, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer114 );
+ this->Layout();
+ bSizer114->Fit( this );
+}
+
+LegalNoticesDialogBase::~LegalNoticesDialogBase()
+{
+}
+
+MountOptionsDialogBase::MountOptionsDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
+
+ wxBoxSizer* bSizer5;
+ bSizer5 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer19;
+ bSizer19 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer14;
+ bSizer14 = new wxBoxSizer( wxHORIZONTAL );
+
+ PasswordSizer = new wxBoxSizer( wxVERTICAL );
+
+ bSizer14->Add( PasswordSizer, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer9;
+ bSizer9 = new wxBoxSizer( wxVERTICAL );
+
+ OKButton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ OKButton->SetDefault();
+ bSizer9->Add( OKButton, 0, wxALL|wxEXPAND, 5 );
+
+ CancelButton = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer9->Add( CancelButton, 0, wxALL|wxEXPAND, 5 );
+
+
+ bSizer9->Add( 0, 0, 1, wxTOP|wxEXPAND, 5 );
+
+ OptionsButton = new wxButton( this, wxID_ANY, _("Op&tions"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer9->Add( OptionsButton, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer14->Add( bSizer9, 0, wxEXPAND, 5 );
+
+ bSizer19->Add( bSizer14, 0, wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer6;
+ bSizer6 = new wxBoxSizer( wxVERTICAL );
+
+ OptionsPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ OptionsSizer = new wxStaticBoxSizer( new wxStaticBox( OptionsPanel, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+
+ OptionsSizer->Add( 0, 0, 0, wxTOP, 5 );
+
+ ReadOnlyCheckBox = new wxCheckBox( OptionsPanel, wxID_ANY, _("Mount volume as &read-only"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ OptionsSizer->Add( ReadOnlyCheckBox, 0, wxALL, 5 );
+
+ RemovableCheckBox = new wxCheckBox( OptionsPanel, wxID_ANY, _("Mount volume as removable &medium"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ OptionsSizer->Add( RemovableCheckBox, 0, wxALL, 5 );
+
+ PartitionInSystemEncryptionScopeCheckBox = new wxCheckBox( OptionsPanel, wxID_ANY, _("Mount partition &using system encryption (preboot authentication)"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ OptionsSizer->Add( PartitionInSystemEncryptionScopeCheckBox, 0, wxALL, 5 );
+
+ ProtectionSizer = new wxStaticBoxSizer( new wxStaticBox( OptionsPanel, wxID_ANY, _("Hidden Volume Protection") ), wxVERTICAL );
+
+ ProtectionCheckBox = new wxCheckBox( OptionsPanel, wxID_ANY, _("&Protect hidden volume when mounting outer volume"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ ProtectionSizer->Add( ProtectionCheckBox, 0, wxALL, 5 );
+
+ ProtectionPasswordSizer = new wxBoxSizer( wxVERTICAL );
+
+ ProtectionSizer->Add( ProtectionPasswordSizer, 1, wxEXPAND|wxLEFT, 5 );
+
+ ProtectionHyperlinkCtrl = new wxHyperlinkCtrl( OptionsPanel, wxID_ANY, _("What is hidden volume protection?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+
+ ProtectionHyperlinkCtrl->SetHoverColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ ProtectionHyperlinkCtrl->SetNormalColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ ProtectionHyperlinkCtrl->SetVisitedColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ ProtectionSizer->Add( ProtectionHyperlinkCtrl, 0, wxALL, 5 );
+
+ OptionsSizer->Add( ProtectionSizer, 1, wxEXPAND|wxALL, 5 );
+
+ FilesystemSizer = new wxBoxSizer( wxVERTICAL );
+
+ m_panel8 = new wxPanel( OptionsPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxStaticBoxSizer* sbSizer28;
+ sbSizer28 = new wxStaticBoxSizer( new wxStaticBox( m_panel8, wxID_ANY, _("Filesystem") ), wxVERTICAL );
+
+ wxBoxSizer* bSizer54;
+ bSizer54 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer55;
+ bSizer55 = new wxBoxSizer( wxVERTICAL );
+
+ NoFilesystemCheckBox = new wxCheckBox( m_panel8, wxID_ANY, _("Do &not mount"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ bSizer55->Add( NoFilesystemCheckBox, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ bSizer54->Add( bSizer55, 1, wxEXPAND, 5 );
+
+ FilesystemOptionsSizer = new wxGridBagSizer( 0, 0 );
+ FilesystemOptionsSizer->AddGrowableCol( 1 );
+ FilesystemOptionsSizer->SetFlexibleDirection( wxBOTH );
+ FilesystemOptionsSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ FilesystemOptionsSizer->SetEmptyCellSize( wxSize( 0,0 ) );
+
+ FilesystemSpacer = new wxBoxSizer( wxVERTICAL );
+
+ FilesystemOptionsSizer->Add( FilesystemSpacer, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxEXPAND|wxTOP, 5 );
+
+ MountPointTextCtrlStaticText = new wxStaticText( m_panel8, wxID_ANY, _("Mount at directory:"), wxDefaultPosition, wxDefaultSize, 0 );
+ MountPointTextCtrlStaticText->Wrap( -1 );
+ FilesystemOptionsSizer->Add( MountPointTextCtrlStaticText, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ MountPointTextCtrl = new wxTextCtrl( m_panel8, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ FilesystemOptionsSizer->Add( MountPointTextCtrl, wxGBPosition( 1, 1 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ MountPointButton = new wxButton( m_panel8, wxID_ANY, _("Se&lect..."), wxDefaultPosition, wxDefaultSize, 0 );
+ FilesystemOptionsSizer->Add( MountPointButton, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ FilesystemOptionsStaticText = new wxStaticText( m_panel8, wxID_ANY, _("Mount options:"), wxDefaultPosition, wxDefaultSize, 0 );
+ FilesystemOptionsStaticText->Wrap( -1 );
+ FilesystemOptionsSizer->Add( FilesystemOptionsStaticText, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxLEFT, 5 );
+
+ FilesystemOptionsTextCtrl = new wxTextCtrl( m_panel8, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ FilesystemOptionsSizer->Add( FilesystemOptionsTextCtrl, wxGBPosition( 2, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ bSizer54->Add( FilesystemOptionsSizer, 0, wxEXPAND, 5 );
+
+ sbSizer28->Add( bSizer54, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ m_panel8->SetSizer( sbSizer28 );
+ m_panel8->Layout();
+ sbSizer28->Fit( m_panel8 );
+ FilesystemSizer->Add( m_panel8, 0, wxEXPAND | wxALL, 5 );
+
+ OptionsSizer->Add( FilesystemSizer, 0, wxEXPAND, 5 );
+
+ OptionsPanel->SetSizer( OptionsSizer );
+ OptionsPanel->Layout();
+ OptionsSizer->Fit( OptionsPanel );
+ bSizer6->Add( OptionsPanel, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ bSizer19->Add( bSizer6, 0, wxEXPAND, 5 );
+
+ bSizer5->Add( bSizer19, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer5 );
+ this->Layout();
+ bSizer5->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( MountOptionsDialogBase::OnInitDialog ) );
+ OKButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnOKButtonClick ), NULL, this );
+ OptionsButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnOptionsButtonClick ), NULL, this );
+ ReadOnlyCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnReadOnlyCheckBoxClick ), NULL, this );
+ ProtectionCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnProtectionCheckBoxClick ), NULL, this );
+ ProtectionHyperlinkCtrl->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MountOptionsDialogBase::OnProtectionHyperlinkClick ), NULL, this );
+ NoFilesystemCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnNoFilesystemCheckBoxClick ), NULL, this );
+ MountPointButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnMountPointButtonClick ), NULL, this );
+}
+
+MountOptionsDialogBase::~MountOptionsDialogBase()
+{
+ // Disconnect Events
+ this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( MountOptionsDialogBase::OnInitDialog ) );
+ OKButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnOKButtonClick ), NULL, this );
+ OptionsButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnOptionsButtonClick ), NULL, this );
+ ReadOnlyCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnReadOnlyCheckBoxClick ), NULL, this );
+ ProtectionCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnProtectionCheckBoxClick ), NULL, this );
+ ProtectionHyperlinkCtrl->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MountOptionsDialogBase::OnProtectionHyperlinkClick ), NULL, this );
+ NoFilesystemCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnNoFilesystemCheckBoxClick ), NULL, this );
+ MountPointButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MountOptionsDialogBase::OnMountPointButtonClick ), NULL, this );
+}
+
+NewSecurityTokenKeyfileDialogBase::NewSecurityTokenKeyfileDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer143;
+ bSizer143 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer144;
+ bSizer144 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer42;
+ sbSizer42 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer7;
+ fgSizer7 = new wxFlexGridSizer( 2, 2, 0, 0 );
+ fgSizer7->SetFlexibleDirection( wxBOTH );
+ fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxStaticText* m_staticText47;
+ m_staticText47 = new wxStaticText( this, wxID_ANY, _("Security token:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );
+ m_staticText47->Wrap( -1 );
+ fgSizer7->Add( m_staticText47, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ wxArrayString SecurityTokenChoiceChoices;
+ SecurityTokenChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, SecurityTokenChoiceChoices, 0 );
+ SecurityTokenChoice->SetSelection( 0 );
+ fgSizer7->Add( SecurityTokenChoice, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxStaticText* m_staticText48;
+ m_staticText48 = new wxStaticText( this, wxID_ANY, _("Keyfile name:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );
+ m_staticText48->Wrap( -1 );
+ fgSizer7->Add( m_staticText48, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ KeyfileNameTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer7->Add( KeyfileNameTextCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
+
+ sbSizer42->Add( fgSizer7, 1, wxEXPAND|wxTOP, 5 );
+
+ bSizer144->Add( sbSizer42, 1, wxEXPAND|wxALL, 5 );
+
+ StdButtons = new wxStdDialogButtonSizer();
+ StdButtonsOK = new wxButton( this, wxID_OK );
+ StdButtons->AddButton( StdButtonsOK );
+ StdButtonsCancel = new wxButton( this, wxID_CANCEL );
+ StdButtons->AddButton( StdButtonsCancel );
+ StdButtons->Realize();
+ bSizer144->Add( StdButtons, 0, wxALIGN_RIGHT|wxALL, 5 );
+
+ bSizer143->Add( bSizer144, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer143 );
+ this->Layout();
+ bSizer143->Fit( this );
+
+ // Connect Events
+ KeyfileNameTextCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( NewSecurityTokenKeyfileDialogBase::OnKeyfileNameChanged ), NULL, this );
+}
+
+NewSecurityTokenKeyfileDialogBase::~NewSecurityTokenKeyfileDialogBase()
+{
+ // Disconnect Events
+ KeyfileNameTextCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( NewSecurityTokenKeyfileDialogBase::OnKeyfileNameChanged ), NULL, this );
+}
+
+PreferencesDialogBase::PreferencesDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
+
+ wxBoxSizer* bSizer32;
+ bSizer32 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer41;
+ bSizer41 = new wxBoxSizer( wxVERTICAL );
+
+ PreferencesNotebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ SecurityPage = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer44;
+ bSizer44 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer33;
+ bSizer33 = new wxBoxSizer( wxVERTICAL );
+
+ AutoDismountSizer = new wxStaticBoxSizer( new wxStaticBox( SecurityPage, wxID_ANY, _("Auto-Dismount") ), wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer13;
+ sbSizer13 = new wxStaticBoxSizer( new wxStaticBox( SecurityPage, wxID_ANY, _("Dismount All Volumes When") ), wxVERTICAL );
+
+ DismountOnLogOffCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("User logs off"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer13->Add( DismountOnLogOffCheckBox, 0, wxALL, 5 );
+
+ DismountOnScreenSaverCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("Screen saver is launched"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer13->Add( DismountOnScreenSaverCheckBox, 0, wxALL, 5 );
+
+ DismountOnPowerSavingCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("System is entering power saving mode"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer13->Add( DismountOnPowerSavingCheckBox, 0, wxALL, 5 );
+
+ AutoDismountSizer->Add( sbSizer13, 0, wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer34;
+ bSizer34 = new wxBoxSizer( wxHORIZONTAL );
+
+ DismountOnInactivityCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("Auto-dismount volume after no data has been read/written to it for"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ bSizer34->Add( DismountOnInactivityCheckBox, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ DismountOnInactivitySpinCtrl = new wxSpinCtrl( SecurityPage, wxID_ANY, wxT("1"), wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 1, 9999, 1 );
+ bSizer34->Add( DismountOnInactivitySpinCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ wxStaticText* m_staticText5;
+ m_staticText5 = new wxStaticText( SecurityPage, wxID_ANY, _("minutes"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText5->Wrap( -1 );
+ bSizer34->Add( m_staticText5, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ AutoDismountSizer->Add( bSizer34, 0, wxEXPAND, 5 );
+
+ ForceAutoDismountCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("Force auto-dismount even if volume contains open files or directories"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ AutoDismountSizer->Add( ForceAutoDismountCheckBox, 0, wxALL, 5 );
+
+ bSizer33->Add( AutoDismountSizer, 0, wxEXPAND|wxALL, 5 );
+
+ FilesystemSecuritySizer = new wxStaticBoxSizer( new wxStaticBox( SecurityPage, wxID_ANY, _("Filesystem") ), wxVERTICAL );
+
+ PreserveTimestampsCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("Preserve modification timestamp of file containers"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ FilesystemSecuritySizer->Add( PreserveTimestampsCheckBox, 0, wxALL, 5 );
+
+ bSizer33->Add( FilesystemSecuritySizer, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer14;
+ sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( SecurityPage, wxID_ANY, _("Password Cache") ), wxVERTICAL );
+
+ WipeCacheOnCloseCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("Wipe after TrueCrypt window has been closed"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer14->Add( WipeCacheOnCloseCheckBox, 0, wxALL, 5 );
+
+ WipeCacheOnAutoDismountCheckBox = new wxCheckBox( SecurityPage, wxID_ANY, _("Wipe after volume has been auto-dismounted"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer14->Add( WipeCacheOnAutoDismountCheckBox, 0, wxALL, 5 );
+
+ bSizer33->Add( sbSizer14, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer44->Add( bSizer33, 1, wxEXPAND|wxALL, 5 );
+
+ SecurityPage->SetSizer( bSizer44 );
+ SecurityPage->Layout();
+ bSizer44->Fit( SecurityPage );
+ PreferencesNotebook->AddPage( SecurityPage, _("Security"), true );
+ DefaultMountOptionsPage = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer46;
+ bSizer46 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer35;
+ bSizer35 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer15;
+ sbSizer15 = new wxStaticBoxSizer( new wxStaticBox( DefaultMountOptionsPage, wxID_ANY, _("Default Mount Options") ), wxVERTICAL );
+
+ MountReadOnlyCheckBox = new wxCheckBox( DefaultMountOptionsPage, wxID_ANY, _("Mount volumes as read-only"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer15->Add( MountReadOnlyCheckBox, 0, wxALL, 5 );
+
+ MountRemovableCheckBox = new wxCheckBox( DefaultMountOptionsPage, wxID_ANY, _("Mount volumes as removable media"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer15->Add( MountRemovableCheckBox, 0, wxALL, 5 );
+
+ CachePasswordsCheckBox = new wxCheckBox( DefaultMountOptionsPage, wxID_ANY, _("Cache passwords in memory"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer15->Add( CachePasswordsCheckBox, 0, wxALL, 5 );
+
+ bSizer35->Add( sbSizer15, 0, wxEXPAND|wxALL, 5 );
+
+ FilesystemSizer = new wxStaticBoxSizer( new wxStaticBox( DefaultMountOptionsPage, wxID_ANY, _("Filesystem") ), wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer3;
+ fgSizer3 = new wxFlexGridSizer( 1, 2, 0, 0 );
+ fgSizer3->AddGrowableCol( 1 );
+ fgSizer3->SetFlexibleDirection( wxBOTH );
+ fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxStaticText* m_staticText6;
+ m_staticText6 = new wxStaticText( DefaultMountOptionsPage, wxID_ANY, _("Mount options:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText6->Wrap( -1 );
+ fgSizer3->Add( m_staticText6, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+
+ FilesystemOptionsTextCtrl = new wxTextCtrl( DefaultMountOptionsPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer3->Add( FilesystemOptionsTextCtrl, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ FilesystemSizer->Add( fgSizer3, 1, wxEXPAND, 5 );
+
+ bSizer35->Add( FilesystemSizer, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer46->Add( bSizer35, 1, wxEXPAND|wxALL, 5 );
+
+ DefaultMountOptionsPage->SetSizer( bSizer46 );
+ DefaultMountOptionsPage->Layout();
+ bSizer46->Fit( DefaultMountOptionsPage );
+ PreferencesNotebook->AddPage( DefaultMountOptionsPage, _("Mount Options"), false );
+ BackgroundTaskPanel = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer61;
+ bSizer61 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer62;
+ bSizer62 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer18;
+ sbSizer18 = new wxStaticBoxSizer( new wxStaticBox( BackgroundTaskPanel, wxID_ANY, _("TrueCrypt Background Task") ), wxVERTICAL );
+
+ BackgroundTaskEnabledCheckBox = new wxCheckBox( BackgroundTaskPanel, wxID_ANY, _("Enabled"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer18->Add( BackgroundTaskEnabledCheckBox, 0, wxALL, 5 );
+
+ CloseBackgroundTaskOnNoVolumesCheckBox = new wxCheckBox( BackgroundTaskPanel, wxID_ANY, _("Exit when there are no mounted volumes"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer18->Add( CloseBackgroundTaskOnNoVolumesCheckBox, 0, wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer26;
+ sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( BackgroundTaskPanel, wxID_ANY, _("Task Icon Menu Items") ), wxVERTICAL );
+
+ BackgroundTaskMenuMountItemsEnabledCheckBox = new wxCheckBox( BackgroundTaskPanel, wxID_ANY, _("Mount Favorite Volumes"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer26->Add( BackgroundTaskMenuMountItemsEnabledCheckBox, 0, wxALL, 5 );
+
+ BackgroundTaskMenuOpenItemsEnabledCheckBox = new wxCheckBox( BackgroundTaskPanel, wxID_ANY, _("Open Mounted Volumes"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer26->Add( BackgroundTaskMenuOpenItemsEnabledCheckBox, 0, wxALL, 5 );
+
+ BackgroundTaskMenuDismountItemsEnabledCheckBox = new wxCheckBox( BackgroundTaskPanel, wxID_ANY, _("Dismount Mounted Volumes"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer26->Add( BackgroundTaskMenuDismountItemsEnabledCheckBox, 0, wxALL, 5 );
+
+ sbSizer18->Add( sbSizer26, 1, wxEXPAND|wxALL, 5 );
+
+ bSizer62->Add( sbSizer18, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer61->Add( bSizer62, 1, wxEXPAND|wxALL, 5 );
+
+ BackgroundTaskPanel->SetSizer( bSizer61 );
+ BackgroundTaskPanel->Layout();
+ bSizer61->Fit( BackgroundTaskPanel );
+ PreferencesNotebook->AddPage( BackgroundTaskPanel, _("Background Task"), false );
+ SystemIntegrationPage = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer49;
+ bSizer49 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer37;
+ bSizer37 = new wxBoxSizer( wxVERTICAL );
+
+ LogOnSizer = new wxStaticBoxSizer( new wxStaticBox( SystemIntegrationPage, wxID_ANY, _("Actions to Perform when User Logs On") ), wxVERTICAL );
+
+ StartOnLogonCheckBox = new wxCheckBox( SystemIntegrationPage, wxID_ANY, _("Start TrueCrypt Background Task"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ LogOnSizer->Add( StartOnLogonCheckBox, 0, wxALL, 5 );
+
+ MountFavoritesOnLogonCheckBox = new wxCheckBox( SystemIntegrationPage, wxID_ANY, _("Mount favorite volumes"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ LogOnSizer->Add( MountFavoritesOnLogonCheckBox, 0, wxALL, 5 );
+
+ MountDevicesOnLogonCheckBox = new wxCheckBox( SystemIntegrationPage, wxID_ANY, _("Mount all device-hosted TrueCrypt volumes"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ LogOnSizer->Add( MountDevicesOnLogonCheckBox, 0, wxALL, 5 );
+
+ bSizer37->Add( LogOnSizer, 0, wxALL|wxEXPAND, 5 );
+
+ ExplorerSizer = new wxStaticBoxSizer( new wxStaticBox( SystemIntegrationPage, wxID_ANY, _("Filesystem Explorer") ), wxVERTICAL );
+
+ OpenExplorerWindowAfterMountCheckBox = new wxCheckBox( SystemIntegrationPage, wxID_ANY, _("Open Explorer window for successfully mounted volume"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ ExplorerSizer->Add( OpenExplorerWindowAfterMountCheckBox, 0, wxALL, 5 );
+
+ CloseExplorerWindowsOnDismountCheckBox = new wxCheckBox( SystemIntegrationPage, wxID_ANY, _("Close all Explorer windows of volume being dismounted"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ ExplorerSizer->Add( CloseExplorerWindowsOnDismountCheckBox, 0, wxALL, 5 );
+
+ bSizer37->Add( ExplorerSizer, 0, wxEXPAND|wxALL, 5 );
+
+ KernelServicesSizer = new wxStaticBoxSizer( new wxStaticBox( SystemIntegrationPage, wxID_ANY, _("Kernel Services") ), wxVERTICAL );
+
+ NoKernelCryptoCheckBox = new wxCheckBox( SystemIntegrationPage, wxID_ANY, _("Do not use kernel cryptographic services"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ KernelServicesSizer->Add( NoKernelCryptoCheckBox, 0, wxALL, 5 );
+
+ bSizer37->Add( KernelServicesSizer, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer49->Add( bSizer37, 1, wxEXPAND|wxALL, 5 );
+
+ SystemIntegrationPage->SetSizer( bSizer49 );
+ SystemIntegrationPage->Layout();
+ bSizer49->Fit( SystemIntegrationPage );
+ PreferencesNotebook->AddPage( SystemIntegrationPage, _("System Integration"), false );
+ PerformanceOptionsPage = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer151;
+ bSizer151 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer152;
+ bSizer152 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer44;
+ sbSizer44 = new wxStaticBoxSizer( new wxStaticBox( PerformanceOptionsPage, wxID_ANY, _("Hardware Acceleration") ), wxVERTICAL );
+
+ wxBoxSizer* bSizer158;
+ bSizer158 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticText* m_staticText57;
+ m_staticText57 = new wxStaticText( PerformanceOptionsPage, wxID_ANY, _("Processor (CPU) in this computer supports hardware acceleration for AES:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText57->Wrap( -1 );
+ bSizer158->Add( m_staticText57, 0, wxALL, 5 );
+
+ AesHwCpuSupportedStaticText = new wxStaticText( PerformanceOptionsPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0|wxSUNKEN_BORDER );
+ AesHwCpuSupportedStaticText->Wrap( -1 );
+ bSizer158->Add( AesHwCpuSupportedStaticText, 0, wxALL, 5 );
+
+ sbSizer44->Add( bSizer158, 1, wxEXPAND, 5 );
+
+
+ sbSizer44->Add( 0, 0, 0, wxBOTTOM, 5 );
+
+ NoHardwareCryptoCheckBox = new wxCheckBox( PerformanceOptionsPage, wxID_ANY, _("Do not accelerate AES encryption/decryption by using the AES instructions of the processor"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer44->Add( NoHardwareCryptoCheckBox, 0, wxALL, 5 );
+
+ bSizer152->Add( sbSizer44, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer151->Add( bSizer152, 1, wxALL|wxEXPAND, 5 );
+
+ PerformanceOptionsPage->SetSizer( bSizer151 );
+ PerformanceOptionsPage->Layout();
+ bSizer151->Fit( PerformanceOptionsPage );
+ PreferencesNotebook->AddPage( PerformanceOptionsPage, _("Performance"), false );
+ DefaultKeyfilesPage = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer40;
+ bSizer40 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer43;
+ bSizer43 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* bSizer42;
+ bSizer42 = new wxStaticBoxSizer( new wxStaticBox( DefaultKeyfilesPage, wxID_ANY, _("Default Keyfiles") ), wxVERTICAL );
+
+ DefaultKeyfilesSizer = new wxBoxSizer( wxVERTICAL );
+
+ bSizer42->Add( DefaultKeyfilesSizer, 1, wxEXPAND, 5 );
+
+ bSizer43->Add( bSizer42, 1, wxEXPAND|wxALL, 5 );
+
+ UseKeyfilesCheckBox = new wxCheckBox( DefaultKeyfilesPage, wxID_ANY, _("Use keyfiles by default"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ bSizer43->Add( UseKeyfilesCheckBox, 0, wxALL, 5 );
+
+ bSizer40->Add( bSizer43, 1, wxEXPAND|wxALL, 5 );
+
+ DefaultKeyfilesPage->SetSizer( bSizer40 );
+ DefaultKeyfilesPage->Layout();
+ bSizer40->Fit( DefaultKeyfilesPage );
+ PreferencesNotebook->AddPage( DefaultKeyfilesPage, _("Keyfiles"), false );
+ SecurityTokensPage = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer127;
+ bSizer127 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer128;
+ bSizer128 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer36;
+ sbSizer36 = new wxStaticBoxSizer( new wxStaticBox( SecurityTokensPage, wxID_ANY, _("PKCS #11 Library Path") ), wxVERTICAL );
+
+ wxBoxSizer* bSizer129;
+ bSizer129 = new wxBoxSizer( wxHORIZONTAL );
+
+ Pkcs11ModulePathTextCtrl = new wxTextCtrl( SecurityTokensPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer129->Add( Pkcs11ModulePathTextCtrl, 1, wxALL, 5 );
+
+ SelectPkcs11ModuleButton = new wxButton( SecurityTokensPage, wxID_ANY, _("Select &Library..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer129->Add( SelectPkcs11ModuleButton, 0, wxALL, 5 );
+
+ sbSizer36->Add( bSizer129, 1, wxEXPAND, 5 );
+
+ bSizer128->Add( sbSizer36, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer37;
+ sbSizer37 = new wxStaticBoxSizer( new wxStaticBox( SecurityTokensPage, wxID_ANY, _("Security Options") ), wxVERTICAL );
+
+ CloseSecurityTokenSessionsAfterMountCheckBox = new wxCheckBox( SecurityTokensPage, wxID_ANY, _("&Close token session (log out) after a volume is successfully mounted"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer37->Add( CloseSecurityTokenSessionsAfterMountCheckBox, 0, wxALL, 5 );
+
+ bSizer128->Add( sbSizer37, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer127->Add( bSizer128, 1, wxEXPAND|wxALL, 5 );
+
+ SecurityTokensPage->SetSizer( bSizer127 );
+ SecurityTokensPage->Layout();
+ bSizer127->Fit( SecurityTokensPage );
+ PreferencesNotebook->AddPage( SecurityTokensPage, _("Security Tokens"), false );
+ HotkeysPage = new wxPanel( PreferencesNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer51;
+ bSizer51 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer38;
+ bSizer38 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer21;
+ sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( HotkeysPage, wxID_ANY, _("System-Wide Hotkeys") ), wxVERTICAL );
+
+ HotkeyListCtrl = new wxListCtrl( HotkeysPage, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_VRULES|wxSUNKEN_BORDER );
+ sbSizer21->Add( HotkeyListCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer23;
+ sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( HotkeysPage, wxID_ANY, _("Shortcut") ), wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer4;
+ fgSizer4 = new wxFlexGridSizer( 2, 3, 0, 0 );
+ fgSizer4->SetFlexibleDirection( wxBOTH );
+ fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxStaticText* m_staticText10;
+ m_staticText10 = new wxStaticText( HotkeysPage, wxID_ANY, _("Key to assign:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText10->Wrap( -1 );
+ fgSizer4->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ HotkeyTextCtrl = new wxTextCtrl( HotkeysPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer4->Add( HotkeyTextCtrl, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ AssignHotkeyButton = new wxButton( HotkeysPage, wxID_ANY, _("Assign"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer4->Add( AssignHotkeyButton, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ wxGridSizer* gSizer4;
+ gSizer4 = new wxGridSizer( 1, 4, 0, 0 );
+
+ HotkeyControlCheckBox = new wxCheckBox( HotkeysPage, wxID_ANY, _("Control"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ gSizer4->Add( HotkeyControlCheckBox, 0, wxALL, 5 );
+
+ HotkeyShiftCheckBox = new wxCheckBox( HotkeysPage, wxID_ANY, _("Shift"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ gSizer4->Add( HotkeyShiftCheckBox, 0, wxALL, 5 );
+
+ HotkeyAltCheckBox = new wxCheckBox( HotkeysPage, wxID_ANY, _("Alt"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ gSizer4->Add( HotkeyAltCheckBox, 0, wxALL, 5 );
+
+ HotkeyWinCheckBox = new wxCheckBox( HotkeysPage, wxID_ANY, _("Win"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ gSizer4->Add( HotkeyWinCheckBox, 0, wxALL, 5 );
+
+ fgSizer4->Add( gSizer4, 1, wxEXPAND, 5 );
+
+ RemoveHotkeyButton = new wxButton( HotkeysPage, wxID_ANY, _("Remove"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer4->Add( RemoveHotkeyButton, 1, wxALL, 5 );
+
+ sbSizer23->Add( fgSizer4, 1, wxALIGN_RIGHT, 5 );
+
+ sbSizer21->Add( sbSizer23, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer24;
+ sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( HotkeysPage, wxID_ANY, _("Options") ), wxVERTICAL );
+
+ BeepAfterHotkeyMountDismountCheckBox = new wxCheckBox( HotkeysPage, wxID_ANY, _("Play system notification sound after mount/dismount"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer24->Add( BeepAfterHotkeyMountDismountCheckBox, 0, wxALL, 5 );
+
+ DisplayMessageAfterHotkeyDismountCheckBox = new wxCheckBox( HotkeysPage, wxID_ANY, _("Display confirmation message box after dismount"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer24->Add( DisplayMessageAfterHotkeyDismountCheckBox, 0, wxALL, 5 );
+
+ sbSizer21->Add( sbSizer24, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer38->Add( sbSizer21, 1, wxEXPAND|wxALL, 5 );
+
+ bSizer51->Add( bSizer38, 1, wxEXPAND|wxALL, 5 );
+
+ HotkeysPage->SetSizer( bSizer51 );
+ HotkeysPage->Layout();
+ bSizer51->Fit( HotkeysPage );
+ PreferencesNotebook->AddPage( HotkeysPage, _("Hotkeys"), false );
+
+ bSizer41->Add( PreferencesNotebook, 1, wxEXPAND | wxALL, 5 );
+
+ StdButtons = new wxStdDialogButtonSizer();
+ StdButtonsOK = new wxButton( this, wxID_OK );
+ StdButtons->AddButton( StdButtonsOK );
+ StdButtonsCancel = new wxButton( this, wxID_CANCEL );
+ StdButtons->AddButton( StdButtonsCancel );
+ StdButtons->Realize();
+ bSizer41->Add( StdButtons, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer32->Add( bSizer41, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer32 );
+ this->Layout();
+ bSizer32->Fit( this );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( PreferencesDialogBase::OnClose ) );
+ DismountOnScreenSaverCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnDismountOnScreenSaverCheckBoxClick ), NULL, this );
+ DismountOnPowerSavingCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnDismountOnPowerSavingCheckBoxClick ), NULL, this );
+ ForceAutoDismountCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnForceAutoDismountCheckBoxClick ), NULL, this );
+ PreserveTimestampsCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnPreserveTimestampsCheckBoxClick ), NULL, this );
+ BackgroundTaskEnabledCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnBackgroundTaskEnabledCheckBoxClick ), NULL, this );
+ NoKernelCryptoCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnNoKernelCryptoCheckBoxClick ), NULL, this );
+ NoHardwareCryptoCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnNoHardwareCryptoCheckBoxClick ), NULL, this );
+ SelectPkcs11ModuleButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnSelectPkcs11ModuleButtonClick ), NULL, this );
+ HotkeyListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( PreferencesDialogBase::OnHotkeyListItemDeselected ), NULL, this );
+ HotkeyListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( PreferencesDialogBase::OnHotkeyListItemSelected ), NULL, this );
+ AssignHotkeyButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnAssignHotkeyButtonClick ), NULL, this );
+ RemoveHotkeyButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnRemoveHotkeyButtonClick ), NULL, this );
+ StdButtonsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnCancelButtonClick ), NULL, this );
+ StdButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+PreferencesDialogBase::~PreferencesDialogBase()
+{
+ // Disconnect Events
+ this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( PreferencesDialogBase::OnClose ) );
+ DismountOnScreenSaverCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnDismountOnScreenSaverCheckBoxClick ), NULL, this );
+ DismountOnPowerSavingCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnDismountOnPowerSavingCheckBoxClick ), NULL, this );
+ ForceAutoDismountCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnForceAutoDismountCheckBoxClick ), NULL, this );
+ PreserveTimestampsCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnPreserveTimestampsCheckBoxClick ), NULL, this );
+ BackgroundTaskEnabledCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnBackgroundTaskEnabledCheckBoxClick ), NULL, this );
+ NoKernelCryptoCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnNoKernelCryptoCheckBoxClick ), NULL, this );
+ NoHardwareCryptoCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnNoHardwareCryptoCheckBoxClick ), NULL, this );
+ SelectPkcs11ModuleButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnSelectPkcs11ModuleButtonClick ), NULL, this );
+ HotkeyListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( PreferencesDialogBase::OnHotkeyListItemDeselected ), NULL, this );
+ HotkeyListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( PreferencesDialogBase::OnHotkeyListItemSelected ), NULL, this );
+ AssignHotkeyButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnAssignHotkeyButtonClick ), NULL, this );
+ RemoveHotkeyButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnRemoveHotkeyButtonClick ), NULL, this );
+ StdButtonsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnCancelButtonClick ), NULL, this );
+ StdButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PreferencesDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+RandomPoolEnrichmentDialogBase::RandomPoolEnrichmentDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ MainSizer = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer144;
+ bSizer144 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer145;
+ bSizer145 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer145->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ wxStaticText* m_staticText49;
+ m_staticText49 = new wxStaticText( this, wxID_ANY, _("Mixing PRF:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText49->Wrap( -1 );
+ bSizer145->Add( m_staticText49, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxArrayString HashChoiceChoices;
+ HashChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, HashChoiceChoices, 0 );
+ HashChoice->SetSelection( 0 );
+ bSizer145->Add( HashChoice, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer145->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizer144->Add( bSizer145, 0, wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer43;
+ sbSizer43 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ wxBoxSizer* bSizer147;
+ bSizer147 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticText* m_staticText52;
+ m_staticText52 = new wxStaticText( this, wxID_ANY, _("Random Pool:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText52->Wrap( -1 );
+ bSizer147->Add( m_staticText52, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ RandomPoolStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ RandomPoolStaticText->Wrap( -1 );
+ RandomPoolStaticText->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier New") ) );
+
+ bSizer147->Add( RandomPoolStaticText, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ ShowRandomPoolCheckBox = new wxCheckBox( this, wxID_ANY, _("Show"), wxDefaultPosition, wxDefaultSize, 0 );
+ ShowRandomPoolCheckBox->SetValue(true);
+
+ bSizer147->Add( ShowRandomPoolCheckBox, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ sbSizer43->Add( bSizer147, 0, wxEXPAND|wxTOP, 5 );
+
+
+ sbSizer43->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ MouseStaticText = new wxStaticText( this, wxID_ANY, _("IMPORTANT: Move your mouse as randomly as possible within this window. The longer you move it, the better. This significantly increases security. When done, click 'Continue'."), wxDefaultPosition, wxDefaultSize, 0 );
+ MouseStaticText->Wrap( -1 );
+ sbSizer43->Add( MouseStaticText, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ sbSizer43->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizer144->Add( sbSizer43, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer146;
+ bSizer146 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer146->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ ContinueButton = new wxButton( this, wxID_OK, _("&Continue"), wxDefaultPosition, wxDefaultSize, 0 );
+ ContinueButton->SetDefault();
+ bSizer146->Add( ContinueButton, 0, wxALL, 5 );
+
+
+ bSizer146->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizer144->Add( bSizer146, 0, wxEXPAND, 5 );
+
+ MainSizer->Add( bSizer144, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( MainSizer );
+ this->Layout();
+ MainSizer->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_MOTION, wxMouseEventHandler( RandomPoolEnrichmentDialogBase::OnMouseMotion ) );
+ HashChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( RandomPoolEnrichmentDialogBase::OnHashSelected ), NULL, this );
+ ShowRandomPoolCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( RandomPoolEnrichmentDialogBase::OnShowRandomPoolCheckBoxClicked ), NULL, this );
+}
+
+RandomPoolEnrichmentDialogBase::~RandomPoolEnrichmentDialogBase()
+{
+ // Disconnect Events
+ this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( RandomPoolEnrichmentDialogBase::OnMouseMotion ) );
+ HashChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( RandomPoolEnrichmentDialogBase::OnHashSelected ), NULL, this );
+ ShowRandomPoolCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( RandomPoolEnrichmentDialogBase::OnShowRandomPoolCheckBoxClicked ), NULL, this );
+}
+
+SecurityTokenKeyfilesDialogBase::SecurityTokenKeyfilesDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetExtraStyle( wxWS_EX_VALIDATE_RECURSIVELY );
+
+ wxBoxSizer* bSizer3;
+ bSizer3 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer138;
+ bSizer138 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer142;
+ bSizer142 = new wxBoxSizer( wxVERTICAL );
+
+ SecurityTokenKeyfileListCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_VRULES|wxSUNKEN_BORDER );
+ bSizer142->Add( SecurityTokenKeyfileListCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer141;
+ bSizer141 = new wxBoxSizer( wxHORIZONTAL );
+
+ ExportButton = new wxButton( this, wxID_ANY, _("&Export..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer141->Add( ExportButton, 0, wxALL, 5 );
+
+ DeleteButton = new wxButton( this, wxID_ANY, _("&Delete"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer141->Add( DeleteButton, 0, wxALL, 5 );
+
+
+ bSizer141->Add( 0, 0, 1, wxEXPAND|wxLEFT, 5 );
+
+ ImportButton = new wxButton( this, wxID_ANY, _("&Import Keyfile to Token..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer141->Add( ImportButton, 0, wxALL, 5 );
+
+ bSizer142->Add( bSizer141, 0, wxEXPAND, 5 );
+
+ bSizer138->Add( bSizer142, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer139;
+ bSizer139 = new wxBoxSizer( wxVERTICAL );
+
+ OKButton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+ OKButton->SetDefault();
+ bSizer139->Add( OKButton, 0, wxALL, 5 );
+
+ CancelButton = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer139->Add( CancelButton, 0, wxALL, 5 );
+
+ bSizer138->Add( bSizer139, 0, wxEXPAND, 5 );
+
+ bSizer3->Add( bSizer138, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer3 );
+ this->Layout();
+ bSizer3->Fit( this );
+
+ // Connect Events
+ SecurityTokenKeyfileListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( SecurityTokenKeyfilesDialogBase::OnListItemActivated ), NULL, this );
+ SecurityTokenKeyfileListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( SecurityTokenKeyfilesDialogBase::OnListItemDeselected ), NULL, this );
+ SecurityTokenKeyfileListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( SecurityTokenKeyfilesDialogBase::OnListItemSelected ), NULL, this );
+ ExportButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnExportButtonClick ), NULL, this );
+ DeleteButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnDeleteButtonClick ), NULL, this );
+ ImportButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnImportButtonClick ), NULL, this );
+ OKButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+SecurityTokenKeyfilesDialogBase::~SecurityTokenKeyfilesDialogBase()
+{
+ // Disconnect Events
+ SecurityTokenKeyfileListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( SecurityTokenKeyfilesDialogBase::OnListItemActivated ), NULL, this );
+ SecurityTokenKeyfileListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( SecurityTokenKeyfilesDialogBase::OnListItemDeselected ), NULL, this );
+ SecurityTokenKeyfileListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( SecurityTokenKeyfilesDialogBase::OnListItemSelected ), NULL, this );
+ ExportButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnExportButtonClick ), NULL, this );
+ DeleteButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnDeleteButtonClick ), NULL, this );
+ ImportButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnImportButtonClick ), NULL, this );
+ OKButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SecurityTokenKeyfilesDialogBase::OnOKButtonClick ), NULL, this );
+}
+
+VolumePropertiesDialogBase::VolumePropertiesDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer49;
+ bSizer49 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer50;
+ bSizer50 = new wxBoxSizer( wxVERTICAL );
+
+ PropertiesListCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_VRULES|wxSUNKEN_BORDER );
+ bSizer50->Add( PropertiesListCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ StdButtons = new wxStdDialogButtonSizer();
+ StdButtonsOK = new wxButton( this, wxID_OK );
+ StdButtons->AddButton( StdButtonsOK );
+ StdButtons->Realize();
+ bSizer50->Add( StdButtons, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizer49->Add( bSizer50, 1, wxEXPAND|wxALL, 5 );
+
+ this->SetSizer( bSizer49 );
+ this->Layout();
+ bSizer49->Fit( this );
+}
+
+VolumePropertiesDialogBase::~VolumePropertiesDialogBase()
+{
+}
+
+EncryptionOptionsWizardPageBase::EncryptionOptionsWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer93;
+ bSizer93 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer94;
+ bSizer94 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer95;
+ bSizer95 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer29;
+ sbSizer29 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Encryption Algorithm") ), wxVERTICAL );
+
+ wxBoxSizer* bSizer96;
+ bSizer96 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxArrayString EncryptionAlgorithmChoiceChoices;
+ EncryptionAlgorithmChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, EncryptionAlgorithmChoiceChoices, 0 );
+ EncryptionAlgorithmChoice->SetSelection( 0 );
+ bSizer96->Add( EncryptionAlgorithmChoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ TestButton = new wxButton( this, wxID_ANY, _("&Test"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer96->Add( TestButton, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ sbSizer29->Add( bSizer96, 0, wxEXPAND, 5 );
+
+ EncryptionAlgorithmStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ EncryptionAlgorithmStaticText->Wrap( -1 );
+ sbSizer29->Add( EncryptionAlgorithmStaticText, 1, wxALL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer97;
+ bSizer97 = new wxBoxSizer( wxHORIZONTAL );
+
+ EncryptionAlgorithmHyperlink = new wxHyperlinkCtrl( this, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+
+ EncryptionAlgorithmHyperlink->SetHoverColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ EncryptionAlgorithmHyperlink->SetNormalColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ EncryptionAlgorithmHyperlink->SetVisitedColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ bSizer97->Add( EncryptionAlgorithmHyperlink, 0, wxALL, 5 );
+
+
+ bSizer97->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ BenchmarkButton = new wxButton( this, wxID_ANY, _("&Benchmark"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer97->Add( BenchmarkButton, 0, wxALL, 5 );
+
+ sbSizer29->Add( bSizer97, 0, wxEXPAND, 5 );
+
+ bSizer95->Add( sbSizer29, 1, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer30;
+ sbSizer30 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Hash Algorithm") ), wxHORIZONTAL );
+
+ wxArrayString HashChoiceChoices;
+ HashChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, HashChoiceChoices, 0 );
+ HashChoice->SetSelection( 0 );
+ sbSizer30->Add( HashChoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ HashHyperlink = new wxHyperlinkCtrl( this, wxID_ANY, _("Information on hash algorithms"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+
+ HashHyperlink->SetHoverColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ HashHyperlink->SetNormalColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ HashHyperlink->SetVisitedColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ) );
+ sbSizer30->Add( HashHyperlink, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer95->Add( sbSizer30, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer94->Add( bSizer95, 1, wxEXPAND, 5 );
+
+ bSizer93->Add( bSizer94, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer93 );
+ this->Layout();
+ bSizer93->Fit( this );
+
+ // Connect Events
+ EncryptionAlgorithmChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( EncryptionOptionsWizardPageBase::OnEncryptionAlgorithmSelected ), NULL, this );
+ TestButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionOptionsWizardPageBase::OnTestButtonClick ), NULL, this );
+ EncryptionAlgorithmHyperlink->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( EncryptionOptionsWizardPageBase::OnEncryptionAlgorithmHyperlinkClick ), NULL, this );
+ BenchmarkButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionOptionsWizardPageBase::OnBenchmarkButtonClick ), NULL, this );
+ HashHyperlink->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( EncryptionOptionsWizardPageBase::OnHashHyperlinkClick ), NULL, this );
+}
+
+EncryptionOptionsWizardPageBase::~EncryptionOptionsWizardPageBase()
+{
+ // Disconnect Events
+ EncryptionAlgorithmChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( EncryptionOptionsWizardPageBase::OnEncryptionAlgorithmSelected ), NULL, this );
+ TestButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionOptionsWizardPageBase::OnTestButtonClick ), NULL, this );
+ EncryptionAlgorithmHyperlink->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( EncryptionOptionsWizardPageBase::OnEncryptionAlgorithmHyperlinkClick ), NULL, this );
+ BenchmarkButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( EncryptionOptionsWizardPageBase::OnBenchmarkButtonClick ), NULL, this );
+ HashHyperlink->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( EncryptionOptionsWizardPageBase::OnHashHyperlinkClick ), NULL, this );
+}
+
+InfoWizardPageBase::InfoWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer71;
+ bSizer71 = new wxBoxSizer( wxVERTICAL );
+
+ InfoPageSizer = new wxBoxSizer( wxVERTICAL );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ InfoPageSizer->Add( InfoStaticText, 1, wxALL|wxEXPAND, 5 );
+
+ bSizer71->Add( InfoPageSizer, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer71 );
+ this->Layout();
+ bSizer71->Fit( this );
+}
+
+InfoWizardPageBase::~InfoWizardPageBase()
+{
+}
+
+KeyfilesPanelBase::KeyfilesPanelBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer19;
+ bSizer19 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer20;
+ bSizer20 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer21;
+ bSizer21 = new wxBoxSizer( wxVERTICAL );
+
+ KeyfilesListCtrl = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxSUNKEN_BORDER );
+ bSizer21->Add( KeyfilesListCtrl, 1, wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer137;
+ bSizer137 = new wxBoxSizer( wxHORIZONTAL );
+
+ AddFilesButton = new wxButton( this, wxID_ANY, _("Add &Files..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer137->Add( AddFilesButton, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ AddDirectoryButton = new wxButton( this, wxID_ANY, _("Add &Path..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer137->Add( AddDirectoryButton, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ AddSecurityTokenSignatureButton = new wxButton( this, wxID_ANY, _("Add &Token Files..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer137->Add( AddSecurityTokenSignatureButton, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ RemoveButton = new wxButton( this, wxID_ANY, _("&Remove"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer137->Add( RemoveButton, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ RemoveAllButton = new wxButton( this, wxID_ANY, _("Remove &All"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer137->Add( RemoveAllButton, 0, wxEXPAND|wxALL, 5 );
+
+ bSizer21->Add( bSizer137, 0, wxEXPAND, 5 );
+
+ bSizer20->Add( bSizer21, 1, wxEXPAND, 5 );
+
+ bSizer19->Add( bSizer20, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer19 );
+ this->Layout();
+
+ // Connect Events
+ KeyfilesListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( KeyfilesPanelBase::OnListItemDeselected ), NULL, this );
+ KeyfilesListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( KeyfilesPanelBase::OnListItemSelected ), NULL, this );
+ KeyfilesListCtrl->Connect( wxEVT_SIZE, wxSizeEventHandler( KeyfilesPanelBase::OnListSizeChanged ), NULL, this );
+ AddFilesButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnAddFilesButtonClick ), NULL, this );
+ AddDirectoryButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnAddDirectoryButtonClick ), NULL, this );
+ AddSecurityTokenSignatureButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnAddSecurityTokenSignatureButtonClick ), NULL, this );
+ RemoveButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnRemoveButtonClick ), NULL, this );
+ RemoveAllButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnRemoveAllButtonClick ), NULL, this );
+}
+
+KeyfilesPanelBase::~KeyfilesPanelBase()
+{
+ // Disconnect Events
+ KeyfilesListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( KeyfilesPanelBase::OnListItemDeselected ), NULL, this );
+ KeyfilesListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( KeyfilesPanelBase::OnListItemSelected ), NULL, this );
+ KeyfilesListCtrl->Disconnect( wxEVT_SIZE, wxSizeEventHandler( KeyfilesPanelBase::OnListSizeChanged ), NULL, this );
+ AddFilesButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnAddFilesButtonClick ), NULL, this );
+ AddDirectoryButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnAddDirectoryButtonClick ), NULL, this );
+ AddSecurityTokenSignatureButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnAddSecurityTokenSignatureButtonClick ), NULL, this );
+ RemoveButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnRemoveButtonClick ), NULL, this );
+ RemoveAllButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( KeyfilesPanelBase::OnRemoveAllButtonClick ), NULL, this );
+}
+
+ProgressWizardPageBase::ProgressWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer81;
+ bSizer81 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer82;
+ bSizer82 = new wxBoxSizer( wxVERTICAL );
+
+ ProgressSizer = new wxBoxSizer( wxHORIZONTAL );
+
+ ProgressGauge = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,-1 ), wxGA_HORIZONTAL|wxGA_SMOOTH );
+ ProgressGauge->SetValue( 0 );
+ ProgressSizer->Add( ProgressGauge, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ AbortButton = new wxButton( this, wxID_ANY, _("&Abort"), wxDefaultPosition, wxDefaultSize, 0 );
+ AbortButton->Enable( false );
+
+ ProgressSizer->Add( AbortButton, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer82->Add( ProgressSizer, 0, wxEXPAND, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ bSizer82->Add( InfoStaticText, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer81->Add( bSizer82, 0, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer81 );
+ this->Layout();
+ bSizer81->Fit( this );
+
+ // Connect Events
+ AbortButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ProgressWizardPageBase::OnAbortButtonClick ), NULL, this );
+}
+
+ProgressWizardPageBase::~ProgressWizardPageBase()
+{
+ // Disconnect Events
+ AbortButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ProgressWizardPageBase::OnAbortButtonClick ), NULL, this );
+}
+
+SelectDirectoryWizardPageBase::SelectDirectoryWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer68;
+ bSizer68 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer69;
+ bSizer69 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer70;
+ bSizer70 = new wxBoxSizer( wxHORIZONTAL );
+
+ DirectoryTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer70->Add( DirectoryTextCtrl, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ BrowseButton = new wxButton( this, wxID_ANY, _("&Browse..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer70->Add( BrowseButton, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer69->Add( bSizer70, 0, wxEXPAND, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( 300 );
+ bSizer69->Add( InfoStaticText, 1, wxALL|wxEXPAND, 5 );
+
+ bSizer68->Add( bSizer69, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer68 );
+ this->Layout();
+
+ // Connect Events
+ DirectoryTextCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SelectDirectoryWizardPageBase::OnDirectoryTextChanged ), NULL, this );
+ BrowseButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectDirectoryWizardPageBase::OnBrowseButtonClick ), NULL, this );
+}
+
+SelectDirectoryWizardPageBase::~SelectDirectoryWizardPageBase()
+{
+ // Disconnect Events
+ DirectoryTextCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SelectDirectoryWizardPageBase::OnDirectoryTextChanged ), NULL, this );
+ BrowseButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectDirectoryWizardPageBase::OnBrowseButtonClick ), NULL, this );
+}
+
+SingleChoiceWizardPageBase::SingleChoiceWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer71;
+ bSizer71 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer77;
+ bSizer77 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer77->Add( 0, 0, 0, wxEXPAND|wxTOP, 5 );
+
+ OuterChoicesSizer = new wxBoxSizer( wxVERTICAL );
+
+ ChoicesSizer = new wxBoxSizer( wxVERTICAL );
+
+ OuterChoicesSizer->Add( ChoicesSizer, 0, wxEXPAND, 5 );
+
+ bSizer77->Add( OuterChoicesSizer, 0, wxEXPAND, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ bSizer77->Add( InfoStaticText, 1, wxALL|wxEXPAND, 5 );
+
+ bSizer71->Add( bSizer77, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer71 );
+ this->Layout();
+ bSizer71->Fit( this );
+}
+
+SingleChoiceWizardPageBase::~SingleChoiceWizardPageBase()
+{
+}
+
+VolumeCreationProgressWizardPageBase::VolumeCreationProgressWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer104;
+ bSizer104 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer105;
+ bSizer105 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer31;
+ sbSizer31 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ KeySamplesUpperSizer = new wxBoxSizer( wxVERTICAL );
+
+ KeySamplesUpperInnerSizer = new wxBoxSizer( wxVERTICAL );
+
+ KeySamplesUpperSizer->Add( KeySamplesUpperInnerSizer, 1, wxEXPAND|wxTOP, 3 );
+
+ sbSizer31->Add( KeySamplesUpperSizer, 1, wxEXPAND, 30 );
+
+ wxFlexGridSizer* fgSizer5;
+ fgSizer5 = new wxFlexGridSizer( 3, 2, 0, 0 );
+ fgSizer5->SetFlexibleDirection( wxBOTH );
+ fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxStaticText* m_staticText25;
+ m_staticText25 = new wxStaticText( this, wxID_ANY, _("Random Pool:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText25->Wrap( -1 );
+ fgSizer5->Add( m_staticText25, 0, wxALL|wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 );
+
+ wxBoxSizer* bSizer126;
+ bSizer126 = new wxBoxSizer( wxHORIZONTAL );
+
+ RandomPoolSampleStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ RandomPoolSampleStaticText->Wrap( -1 );
+ RandomPoolSampleStaticText->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier New") ) );
+
+ bSizer126->Add( RandomPoolSampleStaticText, 0, wxEXPAND|wxTOP|wxRIGHT|wxALIGN_BOTTOM, 7 );
+
+ DisplayKeysCheckBox = new wxCheckBox( this, wxID_ANY, _("Show"), wxDefaultPosition, wxDefaultSize, 0 );
+ DisplayKeysCheckBox->SetValue(true);
+
+ bSizer126->Add( DisplayKeysCheckBox, 0, wxEXPAND|wxRIGHT, 5 );
+
+ fgSizer5->Add( bSizer126, 1, wxEXPAND|wxALIGN_BOTTOM, 5 );
+
+ wxStaticText* m_staticText28;
+ m_staticText28 = new wxStaticText( this, wxID_ANY, _("Header Key:"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticText28->Wrap( -1 );
+ fgSizer5->Add( m_staticText28, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_BOTTOM, 5 );
+
+ HeaderKeySampleStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ HeaderKeySampleStaticText->Wrap( -1 );
+ HeaderKeySampleStaticText->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier New") ) );
+
+ fgSizer5->Add( HeaderKeySampleStaticText, 0, wxALIGN_BOTTOM|wxEXPAND|wxTOP|wxRIGHT, 2 );
+
+ wxStaticText* m_staticText29;
+ m_staticText29 = new wxStaticText( this, wxID_ANY, _("Master Key:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText29->Wrap( -1 );
+ fgSizer5->Add( m_staticText29, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_BOTTOM, 5 );
+
+ MasterKeySampleStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ MasterKeySampleStaticText->Wrap( -1 );
+ MasterKeySampleStaticText->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Courier New") ) );
+
+ fgSizer5->Add( MasterKeySampleStaticText, 0, wxEXPAND|wxALIGN_BOTTOM|wxTOP|wxRIGHT, 2 );
+
+ sbSizer31->Add( fgSizer5, 0, wxEXPAND, 5 );
+
+ bSizer105->Add( sbSizer31, 0, wxALL|wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer32;
+ sbSizer32 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+ wxBoxSizer* bSizer106;
+ bSizer106 = new wxBoxSizer( wxHORIZONTAL );
+
+ ProgressGauge = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL|wxGA_SMOOTH );
+ bSizer106->Add( ProgressGauge, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ AbortButton = new wxButton( this, wxID_ANY, _("Abort"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer106->Add( AbortButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ sbSizer32->Add( bSizer106, 0, wxEXPAND, 5 );
+
+ wxGridSizer* gSizer6;
+ gSizer6 = new wxGridSizer( 1, 3, 0, 0 );
+
+ wxBoxSizer* bSizer108;
+ bSizer108 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText31 = new wxStaticText( this, wxID_ANY, _("Done"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText31->Wrap( -1 );
+ bSizer108->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_panel12 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSUNKEN_BORDER );
+ wxBoxSizer* bSizer115;
+ bSizer115 = new wxBoxSizer( wxHORIZONTAL );
+
+ SizeDoneStaticText = new wxStaticText( m_panel12, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE );
+ SizeDoneStaticText->Wrap( -1 );
+ bSizer115->Add( SizeDoneStaticText, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 3 );
+
+ m_panel12->SetSizer( bSizer115 );
+ m_panel12->Layout();
+ bSizer115->Fit( m_panel12 );
+ bSizer108->Add( m_panel12, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ gSizer6->Add( bSizer108, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer1081;
+ bSizer1081 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText311 = new wxStaticText( this, wxID_ANY, _("Speed"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText311->Wrap( -1 );
+ bSizer1081->Add( m_staticText311, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_panel121 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER );
+ wxBoxSizer* bSizer1151;
+ bSizer1151 = new wxBoxSizer( wxHORIZONTAL );
+
+ SpeedStaticText = new wxStaticText( m_panel121, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE );
+ SpeedStaticText->Wrap( -1 );
+ bSizer1151->Add( SpeedStaticText, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 3 );
+
+ m_panel121->SetSizer( bSizer1151 );
+ m_panel121->Layout();
+ bSizer1151->Fit( m_panel121 );
+ bSizer1081->Add( m_panel121, 1, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ gSizer6->Add( bSizer1081, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ wxBoxSizer* bSizer1082;
+ bSizer1082 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText312 = new wxStaticText( this, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText312->Wrap( -1 );
+ bSizer1082->Add( m_staticText312, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_panel122 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1152;
+ bSizer1152 = new wxBoxSizer( wxHORIZONTAL );
+
+ TimeLeftStaticText = new wxStaticText( m_panel122, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT|wxST_NO_AUTORESIZE );
+ TimeLeftStaticText->Wrap( -1 );
+ bSizer1152->Add( TimeLeftStaticText, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 3 );
+
+ m_panel122->SetSizer( bSizer1152 );
+ m_panel122->Layout();
+ bSizer1152->Fit( m_panel122 );
+ bSizer1082->Add( m_panel122, 1, wxALL|wxEXPAND, 5 );
+
+ gSizer6->Add( bSizer1082, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+
+ sbSizer32->Add( gSizer6, 0, wxEXPAND|wxTOP, 2 );
+
+ bSizer105->Add( sbSizer32, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer105->Add( 0, 0, 0, wxTOP|wxBOTTOM, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ bSizer105->Add( InfoStaticText, 0, wxALL, 5 );
+
+ bSizer104->Add( bSizer105, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer104 );
+ this->Layout();
+ bSizer104->Fit( this );
+
+ // Connect Events
+ DisplayKeysCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumeCreationProgressWizardPageBase::OnDisplayKeysCheckBoxClick ), NULL, this );
+ AbortButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumeCreationProgressWizardPageBase::OnAbortButtonClick ), NULL, this );
+}
+
+VolumeCreationProgressWizardPageBase::~VolumeCreationProgressWizardPageBase()
+{
+ // Disconnect Events
+ DisplayKeysCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumeCreationProgressWizardPageBase::OnDisplayKeysCheckBoxClick ), NULL, this );
+ AbortButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumeCreationProgressWizardPageBase::OnAbortButtonClick ), NULL, this );
+}
+
+VolumeLocationWizardPageBase::VolumeLocationWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer86;
+ bSizer86 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer87;
+ bSizer87 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer87->Add( 0, 0, 0, wxEXPAND|wxTOP, 5 );
+
+ wxBoxSizer* bSizer88;
+ bSizer88 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer89;
+ bSizer89 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer126;
+ bSizer126 = new wxBoxSizer( wxHORIZONTAL );
+
+ VolumePathComboBox = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN );
+ bSizer126->Add( VolumePathComboBox, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer90;
+ bSizer90 = new wxBoxSizer( wxVERTICAL );
+
+ SelectFileButton = new wxButton( this, wxID_ANY, _("Select &File..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer90->Add( SelectFileButton, 0, wxALL|wxEXPAND, 5 );
+
+ SelectDeviceButton = new wxButton( this, wxID_ANY, _("Select D&evice..."), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer90->Add( SelectDeviceButton, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer126->Add( bSizer90, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer89->Add( bSizer126, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer91;
+ bSizer91 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer91->Add( 0, 0, 0, wxLEFT, 5 );
+
+ NoHistoryCheckBox = new wxCheckBox( this, wxID_ANY, _("&Never save history"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ bSizer91->Add( NoHistoryCheckBox, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer89->Add( bSizer91, 0, wxEXPAND, 5 );
+
+ bSizer88->Add( bSizer89, 1, wxEXPAND, 5 );
+
+ bSizer87->Add( bSizer88, 0, wxEXPAND, 5 );
+
+
+ bSizer87->Add( 0, 0, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ bSizer87->Add( InfoStaticText, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer86->Add( bSizer87, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer86 );
+ this->Layout();
+ bSizer86->Fit( this );
+
+ // Connect Events
+ VolumePathComboBox->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnVolumePathTextChanged ), NULL, this );
+ SelectFileButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnSelectFileButtonClick ), NULL, this );
+ SelectDeviceButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnSelectDeviceButtonClick ), NULL, this );
+ NoHistoryCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnNoHistoryCheckBoxClick ), NULL, this );
+}
+
+VolumeLocationWizardPageBase::~VolumeLocationWizardPageBase()
+{
+ // Disconnect Events
+ VolumePathComboBox->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnVolumePathTextChanged ), NULL, this );
+ SelectFileButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnSelectFileButtonClick ), NULL, this );
+ SelectDeviceButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnSelectDeviceButtonClick ), NULL, this );
+ NoHistoryCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumeLocationWizardPageBase::OnNoHistoryCheckBoxClick ), NULL, this );
+}
+
+VolumeFormatOptionsWizardPageBase::VolumeFormatOptionsWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer124;
+ bSizer124 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer125;
+ bSizer125 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer33;
+ sbSizer33 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Filesystem Options") ), wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer6;
+ fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 0 );
+ fgSizer6->SetFlexibleDirection( wxBOTH );
+ fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticText43 = new wxStaticText( this, wxID_ANY, _("Filesystem type:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText43->Wrap( -1 );
+ fgSizer6->Add( m_staticText43, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ wxArrayString FilesystemTypeChoiceChoices;
+ FilesystemTypeChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, FilesystemTypeChoiceChoices, 0 );
+ FilesystemTypeChoice->SetSelection( 0 );
+ fgSizer6->Add( FilesystemTypeChoice, 0, wxALL, 5 );
+
+ sbSizer33->Add( fgSizer6, 1, wxEXPAND, 5 );
+
+ bSizer125->Add( sbSizer33, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer34;
+ sbSizer34 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Volume Format Options") ), wxVERTICAL );
+
+ QuickFormatCheckBox = new wxCheckBox( this, wxID_ANY, _("Quick format"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ sbSizer34->Add( QuickFormatCheckBox, 0, wxALL, 5 );
+
+ bSizer125->Add( sbSizer34, 0, wxEXPAND|wxALL, 5 );
+
+
+ bSizer125->Add( 0, 0, 1, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ bSizer125->Add( InfoStaticText, 0, wxALL, 5 );
+
+ bSizer124->Add( bSizer125, 0, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer124 );
+ this->Layout();
+ bSizer124->Fit( this );
+
+ // Connect Events
+ FilesystemTypeChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( VolumeFormatOptionsWizardPageBase::OnFilesystemTypeSelected ), NULL, this );
+ QuickFormatCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumeFormatOptionsWizardPageBase::OnQuickFormatCheckBoxClick ), NULL, this );
+}
+
+VolumeFormatOptionsWizardPageBase::~VolumeFormatOptionsWizardPageBase()
+{
+ // Disconnect Events
+ FilesystemTypeChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( VolumeFormatOptionsWizardPageBase::OnFilesystemTypeSelected ), NULL, this );
+ QuickFormatCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumeFormatOptionsWizardPageBase::OnQuickFormatCheckBoxClick ), NULL, this );
+}
+
+VolumePasswordPanelBase::VolumePasswordPanelBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer7;
+ bSizer7 = new wxBoxSizer( wxVERTICAL );
+
+ GridBagSizer = new wxGridBagSizer( 0, 0 );
+ GridBagSizer->AddGrowableCol( 1 );
+ GridBagSizer->SetFlexibleDirection( wxBOTH );
+ GridBagSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ GridBagSizer->SetEmptyCellSize( wxSize( 0,0 ) );
+
+ PasswordStaticText = new wxStaticText( this, wxID_ANY, _("Password:"), wxDefaultPosition, wxDefaultSize, 0 );
+ PasswordStaticText->Wrap( -1 );
+ GridBagSizer->Add( PasswordStaticText, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxRIGHT, 5 );
+
+ PasswordTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD );
+ PasswordTextCtrl->SetMaxLength( 1 );
+ PasswordTextCtrl->SetMinSize( wxSize( 232,-1 ) );
+
+ GridBagSizer->Add( PasswordTextCtrl, wxGBPosition( 1, 1 ), wxGBSpan( 1, 2 ), wxBOTTOM|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ ConfirmPasswordStaticText = new wxStaticText( this, wxID_ANY, _("Confirm password:"), wxDefaultPosition, wxDefaultSize, 0 );
+ ConfirmPasswordStaticText->Wrap( -1 );
+ GridBagSizer->Add( ConfirmPasswordStaticText, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+
+ ConfirmPasswordTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD );
+ ConfirmPasswordTextCtrl->SetMaxLength( 1 );
+ ConfirmPasswordTextCtrl->SetMinSize( wxSize( 232,-1 ) );
+
+ GridBagSizer->Add( ConfirmPasswordTextCtrl, wxGBPosition( 2, 1 ), wxGBSpan( 1, 2 ), wxBOTTOM|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ CacheCheckBox = new wxCheckBox( this, wxID_ANY, _("Cach&e passwords and keyfiles in memory "), wxDefaultPosition, wxDefaultSize, 0 );
+
+ GridBagSizer->Add( CacheCheckBox, wxGBPosition( 3, 1 ), wxGBSpan( 1, 2 ), wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ DisplayPasswordCheckBox = new wxCheckBox( this, wxID_ANY, _("&Display password"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ GridBagSizer->Add( DisplayPasswordCheckBox, wxGBPosition( 4, 1 ), wxGBSpan( 1, 2 ), wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ UseKeyfilesCheckBox = new wxCheckBox( this, wxID_ANY, _("U&se keyfiles"), wxDefaultPosition, wxDefaultSize, 0 );
+
+ GridBagSizer->Add( UseKeyfilesCheckBox, wxGBPosition( 5, 1 ), wxGBSpan( 1, 1 ), wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ KeyfilesButton = new wxButton( this, wxID_ANY, _("&Keyfiles..."), wxDefaultPosition, wxDefaultSize, 0 );
+ GridBagSizer->Add( KeyfilesButton, wxGBPosition( 5, 2 ), wxGBSpan( 1, 1 ), wxALIGN_RIGHT|wxALIGN_BOTTOM|wxLEFT, 5 );
+
+ Pkcs5PrfSizer = new wxBoxSizer( wxVERTICAL );
+
+ GridBagSizer->Add( Pkcs5PrfSizer, wxGBPosition( 6, 1 ), wxGBSpan( 1, 1 ), wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ Pkcs5PrfStaticText = new wxStaticText( this, wxID_ANY, _("PKCS-5 PRF:"), wxDefaultPosition, wxDefaultSize, 0 );
+ Pkcs5PrfStaticText->Wrap( -1 );
+ GridBagSizer->Add( Pkcs5PrfStaticText, wxGBPosition( 7, 0 ), wxGBSpan( 1, 1 ), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ wxString Pkcs5PrfChoiceChoices[] = { _("Unchanged") };
+ int Pkcs5PrfChoiceNChoices = sizeof( Pkcs5PrfChoiceChoices ) / sizeof( wxString );
+ Pkcs5PrfChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, Pkcs5PrfChoiceNChoices, Pkcs5PrfChoiceChoices, 0 );
+ Pkcs5PrfChoice->SetSelection( 0 );
+ GridBagSizer->Add( Pkcs5PrfChoice, wxGBPosition( 7, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+ PasswordPlaceholderSizer = new wxBoxSizer( wxVERTICAL );
+
+ GridBagSizer->Add( PasswordPlaceholderSizer, wxGBPosition( 8, 1 ), wxGBSpan( 1, 2 ), wxTOP|wxEXPAND, 5 );
+
+ bSizer7->Add( GridBagSizer, 1, wxALL|wxEXPAND, 5 );
+
+ this->SetSizer( bSizer7 );
+ this->Layout();
+ bSizer7->Fit( this );
+
+ // Connect Events
+ PasswordTextCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumePasswordPanelBase::OnTextChanged ), NULL, this );
+ ConfirmPasswordTextCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumePasswordPanelBase::OnTextChanged ), NULL, this );
+ DisplayPasswordCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumePasswordPanelBase::OnDisplayPasswordCheckBoxClick ), NULL, this );
+ UseKeyfilesCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumePasswordPanelBase::OnUseKeyfilesCheckBoxClick ), NULL, this );
+ KeyfilesButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumePasswordPanelBase::OnKeyfilesButtonClick ), NULL, this );
+ KeyfilesButton->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( VolumePasswordPanelBase::OnKeyfilesButtonRightDown ), NULL, this );
+ KeyfilesButton->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( VolumePasswordPanelBase::OnKeyfilesButtonRightClick ), NULL, this );
+}
+
+VolumePasswordPanelBase::~VolumePasswordPanelBase()
+{
+ // Disconnect Events
+ PasswordTextCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumePasswordPanelBase::OnTextChanged ), NULL, this );
+ ConfirmPasswordTextCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumePasswordPanelBase::OnTextChanged ), NULL, this );
+ DisplayPasswordCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumePasswordPanelBase::OnDisplayPasswordCheckBoxClick ), NULL, this );
+ UseKeyfilesCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( VolumePasswordPanelBase::OnUseKeyfilesCheckBoxClick ), NULL, this );
+ KeyfilesButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( VolumePasswordPanelBase::OnKeyfilesButtonClick ), NULL, this );
+ KeyfilesButton->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( VolumePasswordPanelBase::OnKeyfilesButtonRightDown ), NULL, this );
+ KeyfilesButton->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( VolumePasswordPanelBase::OnKeyfilesButtonRightClick ), NULL, this );
+}
+
+VolumePasswordWizardPageBase::VolumePasswordWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer101;
+ bSizer101 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer102;
+ bSizer102 = new wxBoxSizer( wxVERTICAL );
+
+ PasswordPanelSizer = new wxBoxSizer( wxVERTICAL );
+
+ bSizer102->Add( PasswordPanelSizer, 0, wxEXPAND, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ bSizer102->Add( InfoStaticText, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer101->Add( bSizer102, 1, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer101 );
+ this->Layout();
+ bSizer101->Fit( this );
+}
+
+VolumePasswordWizardPageBase::~VolumePasswordWizardPageBase()
+{
+}
+
+VolumeSizeWizardPageBase::VolumeSizeWizardPageBase( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : WizardPage( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer98;
+ bSizer98 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer99;
+ bSizer99 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer99->Add( 0, 0, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer100;
+ bSizer100 = new wxBoxSizer( wxHORIZONTAL );
+
+ VolumeSizeTextCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer100->Add( VolumeSizeTextCtrl, 0, wxALL, 5 );
+
+ wxArrayString VolumeSizePrefixChoiceChoices;
+ VolumeSizePrefixChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, VolumeSizePrefixChoiceChoices, 0 );
+ VolumeSizePrefixChoice->SetSelection( 0 );
+ bSizer100->Add( VolumeSizePrefixChoice, 0, wxALL, 5 );
+
+ bSizer99->Add( bSizer100, 0, wxEXPAND, 5 );
+
+
+ bSizer99->Add( 0, 0, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ FreeSpaceStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ FreeSpaceStaticText->Wrap( -1 );
+ bSizer99->Add( FreeSpaceStaticText, 0, wxALL|wxEXPAND, 5 );
+
+
+ bSizer99->Add( 0, 0, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ InfoStaticText = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ InfoStaticText->Wrap( -1 );
+ bSizer99->Add( InfoStaticText, 0, wxALL|wxEXPAND, 5 );
+
+ bSizer98->Add( bSizer99, 0, wxEXPAND, 5 );
+
+ this->SetSizer( bSizer98 );
+ this->Layout();
+ bSizer98->Fit( this );
+
+ // Connect Events
+ VolumeSizeTextCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumeSizeWizardPageBase::OnVolumeSizeTextChanged ), NULL, this );
+ VolumeSizePrefixChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( VolumeSizeWizardPageBase::OnVolumeSizePrefixSelected ), NULL, this );
+}
+
+VolumeSizeWizardPageBase::~VolumeSizeWizardPageBase()
+{
+ // Disconnect Events
+ VolumeSizeTextCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( VolumeSizeWizardPageBase::OnVolumeSizeTextChanged ), NULL, this );
+ VolumeSizePrefixChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( VolumeSizeWizardPageBase::OnVolumeSizePrefixSelected ), NULL, this );
+}
diff --git a/src/Main/Forms/Forms.h b/src/Main/Forms/Forms.h
new file mode 100644
index 00000000..cbc6f6e1
--- /dev/null
+++ b/src/Main/Forms/Forms.h
@@ -0,0 +1,1023 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#ifndef __Forms__
+#define __Forms__
+
+#include <wx/intl.h>
+
+class WizardPage;
+
+#include "WizardPage.h"
+#include <wx/string.h>
+#include <wx/bitmap.h>
+#include <wx/image.h>
+#include <wx/icon.h>
+#include <wx/menu.h>
+#include <wx/gdicmn.h>
+#include <wx/font.h>
+#include <wx/colour.h>
+#include <wx/settings.h>
+#include <wx/listctrl.h>
+#include <wx/sizer.h>
+#include <wx/statbox.h>
+#include <wx/button.h>
+#include <wx/statbmp.h>
+#include <wx/combobox.h>
+#include <wx/checkbox.h>
+#include <wx/gbsizer.h>
+#include <wx/panel.h>
+#include <wx/frame.h>
+#include <wx/stattext.h>
+#include <wx/hyperlink.h>
+#include <wx/statline.h>
+#include <wx/textctrl.h>
+#include <wx/dialog.h>
+#include <wx/choice.h>
+#include <wx/spinctrl.h>
+#include <wx/notebook.h>
+#include <wx/gauge.h>
+
+///////////////////////////////////////////////////////////////////////////
+
+namespace TrueCrypt
+{
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class MainFrameBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class MainFrameBase : public wxFrame
+ {
+ private:
+
+ protected:
+ wxMenuBar* MainMenuBar;
+ wxMenu* VolumesMenu;
+ wxMenuItem* MountVolumeMenuItem;
+ wxMenuItem* DismountVolumeMenuItem;
+ wxMenuItem* DismountAllMenuItem;
+ wxMenuItem* VolumePropertiesMenuItem;
+ wxMenu* FavoritesMenu;
+ wxMenuItem* AddToFavoritesMenuItem;
+ wxMenuItem* AddAllMountedToFavoritesMenuItem;
+ wxMenu* ToolsMenu;
+ wxMenuItem* BackupVolumeHeadersMenuItem;
+ wxMenuItem* RestoreVolumeHeaderMenuItem;
+ wxMenuItem* WipeCachedPasswordsMenuItem;
+ wxMenu* SettingsMenu;
+ wxMenuItem* HotkeysMenuItem;
+ wxMenuItem* PreferencesMenuItem;
+ wxMenu* HelpMenu;
+ wxPanel* MainPanel;
+ wxListCtrl* SlotListCtrl;
+ wxStaticBoxSizer* LowStaticBoxSizer;
+ wxBoxSizer* HigherButtonSizer;
+ wxButton* CreateVolumeButton;
+ wxButton* VolumePropertiesButton;
+ wxButton* WipeCacheButton;
+
+ wxStaticBoxSizer* VolumeStaticBoxSizer;
+ wxGridBagSizer* VolumeGridBagSizer;
+ wxStaticBitmap* LogoBitmap;
+ wxComboBox* VolumePathComboBox;
+ wxButton* SelectFileButton;
+ wxCheckBox* NoHistoryCheckBox;
+ wxButton* VolumeToolsButton;
+ wxButton* SelectDeviceButton;
+
+ wxButton* VolumeButton;
+ wxButton* MountAllDevicesButton;
+ wxButton* DismountAllButton;
+ wxButton* ExitButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnActivate( wxActivateEvent& event ){ event.Skip(); }
+ virtual void OnClose( wxCloseEvent& event ){ event.Skip(); }
+ virtual void OnCreateVolumeButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnMountVolumeMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnMountAllDevicesButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDismountVolumeMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDismountAllButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnChangePasswordMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnChangePkcs5PrfMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnChangeKeyfilesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnRemoveKeyfilesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnVolumePropertiesButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnAddToFavoritesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnAddAllMountedToFavoritesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnOrganizeFavoritesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnMountAllFavoritesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnBenchmarkMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnEncryptionTestMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnBackupVolumeHeadersMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnRestoreVolumeHeaderMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnCreateKeyfileMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnManageSecurityTokenKeyfilesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnCloseAllSecurityTokenSessionsMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnWipeCacheButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnHotkeysMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDefaultKeyfilesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnSecurityTokenPreferencesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnPreferencesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnUserGuideMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnOnlineHelpMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnBeginnersTutorialMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnFaqMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnWebsiteMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDownloadsMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnNewsMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnVersionHistoryMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnContactMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnLegalNoticesMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnAboutMenuItemSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnListItemActivated( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemDeselected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemRightClick( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemSelected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnLogoBitmapClick( wxMouseEvent& event ){ event.Skip(); }
+ virtual void OnSelectFileButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnNoHistoryCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnVolumeToolsButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnSelectDeviceButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnVolumeButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnExitButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ MainFrameBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("TrueCrypt"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,496 ), long style = wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxTAB_TRAVERSAL );
+ ~MainFrameBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class WizardFrameBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class WizardFrameBase : public wxFrame
+ {
+ private:
+
+ protected:
+ wxPanel* MainPanel;
+ wxStaticBitmap* WizardBitmap;
+ wxStaticText* PageTitleStaticText;
+ wxBoxSizer* PageSizer;
+
+ wxButton* HelpButton;
+
+ wxButton* PreviousButton;
+ wxButton* NextButton;
+
+ wxButton* CancelButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnActivate( wxActivateEvent& event ){ event.Skip(); }
+ virtual void OnClose( wxCloseEvent& event ){ event.Skip(); }
+ virtual void OnMouseMotion( wxMouseEvent& event ){ event.Skip(); }
+ virtual void OnHelpButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnPreviousButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnNextButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnCancelButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ WizardFrameBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxTAB_TRAVERSAL );
+ ~WizardFrameBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class AboutDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class AboutDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxPanel* m_panel14;
+
+ wxStaticBitmap* LogoBitmap;
+ wxStaticText* VersionStaticText;
+
+ wxStaticText* CopyrightStaticText;
+
+ wxHyperlinkCtrl* WebsiteHyperlink;
+ wxStaticLine* m_staticline3;
+ wxTextCtrl* CreditsTextCtrl;
+
+ wxStaticLine* m_staticline4;
+ wxStaticLine* m_staticline5;
+
+
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnWebsiteHyperlinkClick( wxHyperlinkEvent& event ){ event.Skip(); }
+
+
+ public:
+ AboutDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~AboutDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class BenchmarkDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class BenchmarkDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxChoice* BufferSizeChoice;
+ wxListCtrl* BenchmarkListCtrl;
+ wxBoxSizer* RightSizer;
+ wxButton* BenchmarkButton;
+
+ wxStaticText* BenchmarkNoteStaticText;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnBenchmarkButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ BenchmarkDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("TrueCrypt - Encryption Algorithm Benchmark"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~BenchmarkDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class ChangePasswordDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class ChangePasswordDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxStaticBoxSizer* CurrentSizer;
+ wxBoxSizer* CurrentPasswordPanelSizer;
+ wxStaticBoxSizer* NewSizer;
+ wxBoxSizer* NewPasswordPanelSizer;
+ wxButton* OKButton;
+ wxButton* CancelButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnOKButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ ChangePasswordDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~ChangePasswordDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class DeviceSelectionDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class DeviceSelectionDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxListCtrl* DeviceListCtrl;
+ wxStdDialogButtonSizer* StdButtons;
+ wxButton* StdButtonsOK;
+ wxButton* StdButtonsCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnListItemActivated( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemDeselected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemSelected( wxListEvent& event ){ event.Skip(); }
+
+
+ public:
+ DeviceSelectionDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select a Partition or Device"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE );
+ ~DeviceSelectionDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class EncryptionTestDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class EncryptionTestDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxChoice* EncryptionAlgorithmChoice;
+ wxCheckBox* XtsModeCheckBox;
+ wxTextCtrl* KeyTextCtrl;
+ wxStaticText* KeySizeStaticText;
+ wxTextCtrl* SecondaryKeyTextCtrl;
+ wxTextCtrl* DataUnitNumberTextCtrl;
+ wxTextCtrl* BlockNumberTextCtrl;
+ wxTextCtrl* PlainTextTextCtrl;
+ wxTextCtrl* CipherTextTextCtrl;
+ wxButton* EncryptButton;
+ wxButton* DecryptButton;
+ wxButton* AutoTestAllButton;
+ wxButton* ResetButton;
+ wxButton* CloseButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnEncryptionAlgorithmSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnXtsModeCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnEncryptButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDecryptButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnAutoTestAllButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnResetButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ EncryptionTestDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("TrueCrypt - Test Vectors"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~EncryptionTestDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class FavoriteVolumesDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class FavoriteVolumesDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxListCtrl* FavoritesListCtrl;
+ wxButton* MoveUpButton;
+ wxButton* MoveDownButton;
+ wxButton* RemoveButton;
+ wxButton* RemoveAllButton;
+
+ wxButton* OKButton;
+ wxButton* CancelButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnListItemDeselected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemSelected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnMoveUpButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnMoveDownButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnRemoveButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnRemoveAllButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnOKButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ FavoriteVolumesDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Favorite Volumes"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~FavoriteVolumesDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class KeyfilesDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class KeyfilesDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxBoxSizer* UpperSizer;
+ wxBoxSizer* PanelSizer;
+ wxButton* OKButton;
+ wxButton* CancelButton;
+ wxStaticText* WarningStaticText;
+ wxBoxSizer* KeyfilesNoteSizer;
+ wxStaticText* KeyfilesNoteStaticText;
+ wxHyperlinkCtrl* KeyfilesHyperlink;
+ wxButton* CreateKeyfileButtton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnKeyfilesHyperlinkClick( wxHyperlinkEvent& event ){ event.Skip(); }
+ virtual void OnCreateKeyfileButttonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ KeyfilesDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Keyfiles"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~KeyfilesDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class KeyfileGeneratorDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class KeyfileGeneratorDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxBoxSizer* MainSizer;
+
+ wxChoice* HashChoice;
+
+ wxStaticText* RandomPoolStaticText;
+ wxCheckBox* ShowRandomPoolCheckBox;
+
+ wxStaticText* MouseStaticText;
+
+ wxButton* GenerateButton;
+
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnMouseMotion( wxMouseEvent& event ){ event.Skip(); }
+ virtual void OnHashSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnShowRandomPoolCheckBoxClicked( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnGenerateButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ KeyfileGeneratorDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~KeyfileGeneratorDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class LegalNoticesDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class LegalNoticesDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxTextCtrl* LegalNoticesTextCtrl;
+
+ public:
+ LegalNoticesDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("TrueCrypt - Legal Notices"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~LegalNoticesDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class MountOptionsDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class MountOptionsDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxBoxSizer* PasswordSizer;
+ wxButton* OKButton;
+ wxButton* CancelButton;
+
+ wxButton* OptionsButton;
+ wxPanel* OptionsPanel;
+ wxStaticBoxSizer* OptionsSizer;
+
+ wxCheckBox* ReadOnlyCheckBox;
+ wxCheckBox* RemovableCheckBox;
+ wxCheckBox* PartitionInSystemEncryptionScopeCheckBox;
+ wxStaticBoxSizer* ProtectionSizer;
+ wxCheckBox* ProtectionCheckBox;
+ wxBoxSizer* ProtectionPasswordSizer;
+ wxHyperlinkCtrl* ProtectionHyperlinkCtrl;
+ wxBoxSizer* FilesystemSizer;
+ wxPanel* m_panel8;
+ wxCheckBox* NoFilesystemCheckBox;
+ wxGridBagSizer* FilesystemOptionsSizer;
+ wxBoxSizer* FilesystemSpacer;
+ wxStaticText* MountPointTextCtrlStaticText;
+ wxTextCtrl* MountPointTextCtrl;
+ wxButton* MountPointButton;
+ wxStaticText* FilesystemOptionsStaticText;
+ wxTextCtrl* FilesystemOptionsTextCtrl;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnInitDialog( wxInitDialogEvent& event ){ event.Skip(); }
+ virtual void OnOKButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnOptionsButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnReadOnlyCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnProtectionCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnProtectionHyperlinkClick( wxHyperlinkEvent& event ){ event.Skip(); }
+ virtual void OnNoFilesystemCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnMountPointButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ MountOptionsDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Enter TrueCrypt Volume Password"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE );
+ ~MountOptionsDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class NewSecurityTokenKeyfileDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class NewSecurityTokenKeyfileDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxChoice* SecurityTokenChoice;
+ wxTextCtrl* KeyfileNameTextCtrl;
+ wxStdDialogButtonSizer* StdButtons;
+ wxButton* StdButtonsOK;
+ wxButton* StdButtonsCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnKeyfileNameChanged( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ NewSecurityTokenKeyfileDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("New Security Token Keyfile Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~NewSecurityTokenKeyfileDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class PreferencesDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class PreferencesDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxNotebook* PreferencesNotebook;
+ wxPanel* SecurityPage;
+ wxStaticBoxSizer* AutoDismountSizer;
+ wxCheckBox* DismountOnLogOffCheckBox;
+ wxCheckBox* DismountOnScreenSaverCheckBox;
+ wxCheckBox* DismountOnPowerSavingCheckBox;
+ wxCheckBox* DismountOnInactivityCheckBox;
+ wxSpinCtrl* DismountOnInactivitySpinCtrl;
+ wxCheckBox* ForceAutoDismountCheckBox;
+ wxStaticBoxSizer* FilesystemSecuritySizer;
+ wxCheckBox* PreserveTimestampsCheckBox;
+ wxCheckBox* WipeCacheOnCloseCheckBox;
+ wxCheckBox* WipeCacheOnAutoDismountCheckBox;
+ wxPanel* DefaultMountOptionsPage;
+ wxCheckBox* MountReadOnlyCheckBox;
+ wxCheckBox* MountRemovableCheckBox;
+ wxCheckBox* CachePasswordsCheckBox;
+ wxStaticBoxSizer* FilesystemSizer;
+ wxTextCtrl* FilesystemOptionsTextCtrl;
+ wxPanel* BackgroundTaskPanel;
+ wxCheckBox* BackgroundTaskEnabledCheckBox;
+ wxCheckBox* CloseBackgroundTaskOnNoVolumesCheckBox;
+ wxCheckBox* BackgroundTaskMenuMountItemsEnabledCheckBox;
+ wxCheckBox* BackgroundTaskMenuOpenItemsEnabledCheckBox;
+ wxCheckBox* BackgroundTaskMenuDismountItemsEnabledCheckBox;
+ wxPanel* SystemIntegrationPage;
+ wxStaticBoxSizer* LogOnSizer;
+ wxCheckBox* StartOnLogonCheckBox;
+ wxCheckBox* MountFavoritesOnLogonCheckBox;
+ wxCheckBox* MountDevicesOnLogonCheckBox;
+ wxStaticBoxSizer* ExplorerSizer;
+ wxCheckBox* OpenExplorerWindowAfterMountCheckBox;
+ wxCheckBox* CloseExplorerWindowsOnDismountCheckBox;
+ wxStaticBoxSizer* KernelServicesSizer;
+ wxCheckBox* NoKernelCryptoCheckBox;
+ wxPanel* PerformanceOptionsPage;
+ wxStaticText* AesHwCpuSupportedStaticText;
+
+ wxCheckBox* NoHardwareCryptoCheckBox;
+ wxBoxSizer* DefaultKeyfilesSizer;
+ wxCheckBox* UseKeyfilesCheckBox;
+ wxTextCtrl* Pkcs11ModulePathTextCtrl;
+ wxButton* SelectPkcs11ModuleButton;
+ wxCheckBox* CloseSecurityTokenSessionsAfterMountCheckBox;
+ wxListCtrl* HotkeyListCtrl;
+ wxTextCtrl* HotkeyTextCtrl;
+ wxButton* AssignHotkeyButton;
+
+ wxCheckBox* HotkeyControlCheckBox;
+ wxCheckBox* HotkeyShiftCheckBox;
+ wxCheckBox* HotkeyAltCheckBox;
+ wxCheckBox* HotkeyWinCheckBox;
+ wxButton* RemoveHotkeyButton;
+ wxCheckBox* BeepAfterHotkeyMountDismountCheckBox;
+ wxCheckBox* DisplayMessageAfterHotkeyDismountCheckBox;
+ wxStdDialogButtonSizer* StdButtons;
+ wxButton* StdButtonsOK;
+ wxButton* StdButtonsCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ){ event.Skip(); }
+ virtual void OnDismountOnScreenSaverCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDismountOnPowerSavingCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnForceAutoDismountCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnPreserveTimestampsCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnBackgroundTaskEnabledCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnNoKernelCryptoCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnNoHardwareCryptoCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnSelectPkcs11ModuleButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnHotkeyListItemDeselected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnHotkeyListItemSelected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnAssignHotkeyButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnRemoveHotkeyButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnCancelButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnOKButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ wxPanel* DefaultKeyfilesPage;
+ wxPanel* SecurityTokensPage;
+ wxPanel* HotkeysPage;
+ PreferencesDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Preferences"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~PreferencesDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class RandomPoolEnrichmentDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class RandomPoolEnrichmentDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxBoxSizer* MainSizer;
+
+ wxChoice* HashChoice;
+
+ wxStaticText* RandomPoolStaticText;
+ wxCheckBox* ShowRandomPoolCheckBox;
+
+ wxStaticText* MouseStaticText;
+
+
+ wxButton* ContinueButton;
+
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnMouseMotion( wxMouseEvent& event ){ event.Skip(); }
+ virtual void OnHashSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnShowRandomPoolCheckBoxClicked( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ RandomPoolEnrichmentDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("TrueCrypt - Random Pool Enrichment"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~RandomPoolEnrichmentDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class SecurityTokenKeyfilesDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class SecurityTokenKeyfilesDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxListCtrl* SecurityTokenKeyfileListCtrl;
+ wxButton* ExportButton;
+ wxButton* DeleteButton;
+
+ wxButton* ImportButton;
+ wxButton* OKButton;
+ wxButton* CancelButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnListItemActivated( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemDeselected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemSelected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnExportButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDeleteButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnImportButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnOKButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ SecurityTokenKeyfilesDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Security Token Keyfiles"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE );
+ ~SecurityTokenKeyfilesDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class VolumePropertiesDialogBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class VolumePropertiesDialogBase : public wxDialog
+ {
+ private:
+
+ protected:
+ wxListCtrl* PropertiesListCtrl;
+ wxStdDialogButtonSizer* StdButtons;
+ wxButton* StdButtonsOK;
+
+ public:
+ VolumePropertiesDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Volume Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~VolumePropertiesDialogBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class EncryptionOptionsWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class EncryptionOptionsWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+ wxChoice* EncryptionAlgorithmChoice;
+ wxButton* TestButton;
+ wxStaticText* EncryptionAlgorithmStaticText;
+ wxHyperlinkCtrl* EncryptionAlgorithmHyperlink;
+
+ wxButton* BenchmarkButton;
+ wxChoice* HashChoice;
+ wxHyperlinkCtrl* HashHyperlink;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnEncryptionAlgorithmSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnTestButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnEncryptionAlgorithmHyperlinkClick( wxHyperlinkEvent& event ){ event.Skip(); }
+ virtual void OnBenchmarkButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnHashHyperlinkClick( wxHyperlinkEvent& event ){ event.Skip(); }
+
+
+ public:
+ EncryptionOptionsWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~EncryptionOptionsWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class InfoWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class InfoWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+ wxBoxSizer* InfoPageSizer;
+ wxStaticText* InfoStaticText;
+
+ public:
+ InfoWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~InfoWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class KeyfilesPanelBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class KeyfilesPanelBase : public wxPanel
+ {
+ private:
+
+ protected:
+ wxListCtrl* KeyfilesListCtrl;
+ wxButton* AddFilesButton;
+ wxButton* AddDirectoryButton;
+ wxButton* AddSecurityTokenSignatureButton;
+ wxButton* RemoveButton;
+ wxButton* RemoveAllButton;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnListItemDeselected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListItemSelected( wxListEvent& event ){ event.Skip(); }
+ virtual void OnListSizeChanged( wxSizeEvent& event ){ event.Skip(); }
+ virtual void OnAddFilesButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnAddDirectoryButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnAddSecurityTokenSignatureButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnRemoveButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnRemoveAllButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ KeyfilesPanelBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,300 ), long style = wxTAB_TRAVERSAL );
+ ~KeyfilesPanelBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class ProgressWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class ProgressWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+ wxBoxSizer* ProgressSizer;
+ wxGauge* ProgressGauge;
+ wxButton* AbortButton;
+ wxStaticText* InfoStaticText;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnAbortButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ ProgressWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~ProgressWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class SelectDirectoryWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class SelectDirectoryWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+ wxTextCtrl* DirectoryTextCtrl;
+ wxButton* BrowseButton;
+ wxStaticText* InfoStaticText;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnDirectoryTextChanged( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnBrowseButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ SelectDirectoryWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 200,65 ), long style = wxTAB_TRAVERSAL );
+ ~SelectDirectoryWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class SingleChoiceWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class SingleChoiceWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+
+ wxBoxSizer* OuterChoicesSizer;
+ wxBoxSizer* ChoicesSizer;
+ wxStaticText* InfoStaticText;
+
+ public:
+ SingleChoiceWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~SingleChoiceWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class VolumeCreationProgressWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class VolumeCreationProgressWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+ wxBoxSizer* KeySamplesUpperSizer;
+ wxBoxSizer* KeySamplesUpperInnerSizer;
+ wxStaticText* RandomPoolSampleStaticText;
+ wxCheckBox* DisplayKeysCheckBox;
+ wxStaticText* HeaderKeySampleStaticText;
+ wxStaticText* MasterKeySampleStaticText;
+ wxGauge* ProgressGauge;
+ wxButton* AbortButton;
+ wxStaticText* m_staticText31;
+ wxPanel* m_panel12;
+ wxStaticText* SizeDoneStaticText;
+ wxStaticText* m_staticText311;
+ wxPanel* m_panel121;
+ wxStaticText* SpeedStaticText;
+ wxStaticText* m_staticText312;
+ wxPanel* m_panel122;
+ wxStaticText* TimeLeftStaticText;
+
+ wxStaticText* InfoStaticText;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnDisplayKeysCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnAbortButtonClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ VolumeCreationProgressWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~VolumeCreationProgressWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class VolumeLocationWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class VolumeLocationWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+
+ wxComboBox* VolumePathComboBox;
+ wxButton* SelectFileButton;
+ wxButton* SelectDeviceButton;
+
+ wxCheckBox* NoHistoryCheckBox;
+
+ wxStaticText* InfoStaticText;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnVolumePathTextChanged( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnSelectFileButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnSelectDeviceButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnNoHistoryCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ VolumeLocationWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~VolumeLocationWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class VolumeFormatOptionsWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class VolumeFormatOptionsWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+ wxStaticText* m_staticText43;
+ wxChoice* FilesystemTypeChoice;
+ wxCheckBox* QuickFormatCheckBox;
+
+ wxStaticText* InfoStaticText;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnFilesystemTypeSelected( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnQuickFormatCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ VolumeFormatOptionsWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~VolumeFormatOptionsWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class VolumePasswordPanelBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class VolumePasswordPanelBase : public wxPanel
+ {
+ private:
+
+ protected:
+ wxGridBagSizer* GridBagSizer;
+ wxStaticText* PasswordStaticText;
+ wxTextCtrl* PasswordTextCtrl;
+ wxStaticText* ConfirmPasswordStaticText;
+ wxTextCtrl* ConfirmPasswordTextCtrl;
+ wxCheckBox* CacheCheckBox;
+ wxCheckBox* DisplayPasswordCheckBox;
+ wxCheckBox* UseKeyfilesCheckBox;
+ wxButton* KeyfilesButton;
+ wxBoxSizer* Pkcs5PrfSizer;
+ wxStaticText* Pkcs5PrfStaticText;
+ wxChoice* Pkcs5PrfChoice;
+ wxBoxSizer* PasswordPlaceholderSizer;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnTextChanged( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnDisplayPasswordCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnUseKeyfilesCheckBoxClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnKeyfilesButtonClick( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnKeyfilesButtonRightDown( wxMouseEvent& event ){ event.Skip(); }
+ virtual void OnKeyfilesButtonRightClick( wxMouseEvent& event ){ event.Skip(); }
+
+
+ public:
+ VolumePasswordPanelBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~VolumePasswordPanelBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class VolumePasswordWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class VolumePasswordWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+ wxBoxSizer* PasswordPanelSizer;
+ wxStaticText* InfoStaticText;
+
+ public:
+ VolumePasswordWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~VolumePasswordWizardPageBase();
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /// Class VolumeSizeWizardPageBase
+ ///////////////////////////////////////////////////////////////////////////////
+ class VolumeSizeWizardPageBase : public WizardPage
+ {
+ private:
+
+ protected:
+
+ wxTextCtrl* VolumeSizeTextCtrl;
+ wxChoice* VolumeSizePrefixChoice;
+
+ wxStaticText* FreeSpaceStaticText;
+
+ wxStaticText* InfoStaticText;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnVolumeSizeTextChanged( wxCommandEvent& event ){ event.Skip(); }
+ virtual void OnVolumeSizePrefixSelected( wxCommandEvent& event ){ event.Skip(); }
+
+
+ public:
+ VolumeSizeWizardPageBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~VolumeSizeWizardPageBase();
+
+ };
+
+} // namespace TrueCrypt
+
+#endif //__Forms__
diff --git a/src/Main/Forms/InfoWizardPage.cpp b/src/Main/Forms/InfoWizardPage.cpp
new file mode 100644
index 00000000..286ba476
--- /dev/null
+++ b/src/Main/Forms/InfoWizardPage.cpp
@@ -0,0 +1,33 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "InfoWizardPage.h"
+
+namespace TrueCrypt
+{
+ InfoWizardPage::InfoWizardPage (wxPanel *parent, const wxString &actionButtonText, shared_ptr <Functor> actionFunctor)
+ : InfoWizardPageBase (parent)
+ {
+ if (!actionButtonText.empty())
+ {
+ wxButton *actionButton = new wxButton (this, wxID_ANY, actionButtonText);
+ ActionFunctor = actionFunctor;
+ actionButton->Connect (wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (InfoWizardPage::OnActionButtonClick), nullptr, this);
+
+ InfoPageSizer->Add (actionButton, 0, wxALL, 5);
+ }
+
+ InfoStaticText->SetFocus();
+ }
+
+ void InfoWizardPage::SetMaxStaticTextWidth (int width)
+ {
+ InfoStaticText->Wrap (width);
+ }
+}
diff --git a/src/Main/Forms/InfoWizardPage.h b/src/Main/Forms/InfoWizardPage.h
new file mode 100644
index 00000000..a3938b03
--- /dev/null
+++ b/src/Main/Forms/InfoWizardPage.h
@@ -0,0 +1,32 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_InfoWizardPage
+#define TC_HEADER_Main_Forms_InfoWizardPage
+
+#include "Forms.h"
+
+namespace TrueCrypt
+{
+ class InfoWizardPage : public InfoWizardPageBase
+ {
+ public:
+ InfoWizardPage (wxPanel *parent, const wxString &actionButtonText = wxEmptyString, shared_ptr <Functor> actionFunctor = shared_ptr <Functor> ());
+
+ bool IsValid () { return true; }
+ void SetMaxStaticTextWidth (int width);
+ void SetPageText (const wxString &text) { InfoStaticText->SetLabel (text); }
+
+ protected:
+ virtual void OnActionButtonClick (wxCommandEvent& event) { (*ActionFunctor)(); }
+
+ shared_ptr <Functor> ActionFunctor;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_InfoWizardPage
diff --git a/src/Main/Forms/KeyfileGeneratorDialog.cpp b/src/Main/Forms/KeyfileGeneratorDialog.cpp
new file mode 100644
index 00000000..c217d40a
--- /dev/null
+++ b/src/Main/Forms/KeyfileGeneratorDialog.cpp
@@ -0,0 +1,118 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/GraphicUserInterface.h"
+#include "Volume/Hash.h"
+#include "KeyfileGeneratorDialog.h"
+
+namespace TrueCrypt
+{
+ KeyfileGeneratorDialog::KeyfileGeneratorDialog (wxWindow* parent) : KeyfileGeneratorDialogBase (parent)
+ {
+ RandomNumberGenerator::Start();
+
+ Hashes = Hash::GetAvailableAlgorithms();
+ foreach (shared_ptr <Hash> hash, Hashes)
+ {
+ if (!hash->IsDeprecated())
+ HashChoice->Append (hash->GetName(), hash.get());
+ }
+
+ HashChoice->Select (0);
+ RandomNumberGenerator::SetHash (Gui->GetSelectedData <Hash> (HashChoice)->GetNew());
+
+ ShowBytes (RandomPoolStaticText, RandomNumberGenerator::PeekPool().GetRange (0, 24));
+ MouseStaticText->Wrap (Gui->GetCharWidth (MouseStaticText) * 70);
+
+ MainSizer->SetMinSize (wxSize (-1, Gui->GetCharHeight (this) * 24));
+
+ Layout();
+ Fit();
+ Center();
+
+ foreach (wxWindow *c, this->GetChildren())
+ c->Connect (wxEVT_MOTION, wxMouseEventHandler (KeyfileGeneratorDialog::OnMouseMotion), nullptr, this);
+ }
+
+ KeyfileGeneratorDialog::~KeyfileGeneratorDialog ()
+ {
+ }
+
+ void KeyfileGeneratorDialog::OnGenerateButtonClick (wxCommandEvent& event)
+ {
+ try
+ {
+ FilePathList files = Gui->SelectFiles (Gui->GetActiveWindow(), wxEmptyString, true);
+
+ if (files.empty())
+ return;
+
+ SecureBuffer keyfileBuffer (VolumePassword::MaxSize);
+ RandomNumberGenerator::GetData (keyfileBuffer);
+
+ {
+ File keyfile;
+ keyfile.Open (*files.front(), File::CreateWrite);
+ keyfile.Write (keyfileBuffer);
+ }
+
+ Gui->ShowInfo ("KEYFILE_CREATED");
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void KeyfileGeneratorDialog::OnHashSelected (wxCommandEvent& event)
+ {
+ RandomNumberGenerator::SetHash (Gui->GetSelectedData <Hash> (HashChoice)->GetNew());
+ }
+
+ void KeyfileGeneratorDialog::OnMouseMotion (wxMouseEvent& event)
+ {
+ event.Skip();
+
+ RandomNumberGenerator::AddToPool (ConstBufferPtr (reinterpret_cast <byte *> (&event), sizeof (event)));
+
+ long coord = event.GetX();
+ RandomNumberGenerator::AddToPool (ConstBufferPtr (reinterpret_cast <byte *> (&coord), sizeof (coord)));
+ coord = event.GetY();
+ RandomNumberGenerator::AddToPool (ConstBufferPtr (reinterpret_cast <byte *> (&coord), sizeof (coord)));
+
+ if (ShowRandomPoolCheckBox->IsChecked())
+ ShowBytes (RandomPoolStaticText, RandomNumberGenerator::PeekPool().GetRange (0, 24));
+ }
+
+ void KeyfileGeneratorDialog::OnShowRandomPoolCheckBoxClicked (wxCommandEvent& event)
+ {
+ if (!event.IsChecked())
+ RandomPoolStaticText->SetLabel (L"");
+ }
+
+ void KeyfileGeneratorDialog::ShowBytes (wxStaticText *textCtrl, const ConstBufferPtr &buffer, bool appendDots)
+ {
+ wxString str;
+
+ for (size_t i = 0; i < buffer.Size(); ++i)
+ {
+ str += wxString::Format (L"%02X", buffer[i]);
+ }
+
+ if (appendDots)
+ str += L"..";
+
+ textCtrl->SetLabel (str.c_str());
+
+ for (size_t i = 0; i < str.size(); ++i)
+ {
+ str[i] = L'X';
+ }
+ }
+}
diff --git a/src/Main/Forms/KeyfileGeneratorDialog.h b/src/Main/Forms/KeyfileGeneratorDialog.h
new file mode 100644
index 00000000..bc4748f2
--- /dev/null
+++ b/src/Main/Forms/KeyfileGeneratorDialog.h
@@ -0,0 +1,34 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_KeyfileGeneratorDialog
+#define TC_HEADER_Main_Forms_KeyfileGeneratorDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+
+namespace TrueCrypt
+{
+ class KeyfileGeneratorDialog : public KeyfileGeneratorDialogBase
+ {
+ public:
+ KeyfileGeneratorDialog (wxWindow* parent);
+ ~KeyfileGeneratorDialog ();
+
+ protected:
+ void OnGenerateButtonClick (wxCommandEvent& event);
+ void OnHashSelected (wxCommandEvent& event);
+ void OnMouseMotion (wxMouseEvent& event);
+ void OnShowRandomPoolCheckBoxClicked (wxCommandEvent& event);
+ void ShowBytes (wxStaticText *textCtrl, const ConstBufferPtr &buffer, bool appendDots = true);
+
+ HashList Hashes;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_KeyfileGeneratorDialog
diff --git a/src/Main/Forms/KeyfilesDialog.cpp b/src/Main/Forms/KeyfilesDialog.cpp
new file mode 100644
index 00000000..267f8554
--- /dev/null
+++ b/src/Main/Forms/KeyfilesDialog.cpp
@@ -0,0 +1,44 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/GraphicUserInterface.h"
+#include "KeyfilesDialog.h"
+
+namespace TrueCrypt
+{
+ KeyfilesDialog::KeyfilesDialog (wxWindow* parent, shared_ptr <KeyfileList> keyfiles)
+ : KeyfilesDialogBase (parent), Keyfiles (keyfiles)
+ {
+ mKeyfilesPanel = new KeyfilesPanel (this, keyfiles);
+ PanelSizer->Add (mKeyfilesPanel, 1, wxALL | wxEXPAND);
+
+ WarningStaticText->SetLabel (LangString["IDT_KEYFILE_WARNING"]);
+ WarningStaticText->Wrap (Gui->GetCharWidth (this) * 15);
+
+ Layout();
+ Fit();
+
+ KeyfilesNoteStaticText->SetLabel (LangString["KEYFILES_NOTE"]);
+ KeyfilesNoteStaticText->Wrap (UpperSizer->GetSize().GetWidth() - Gui->GetCharWidth (this) * 2);
+
+ Layout();
+ Fit();
+ Center();
+ }
+
+ void KeyfilesDialog::OnCreateKeyfileButttonClick (wxCommandEvent& event)
+ {
+ Gui->CreateKeyfile();
+ }
+
+ void KeyfilesDialog::OnKeyfilesHyperlinkClick (wxHyperlinkEvent& event)
+ {
+ Gui->OpenHomepageLink (this, L"keyfiles");
+ }
+}
diff --git a/src/Main/Forms/KeyfilesDialog.h b/src/Main/Forms/KeyfilesDialog.h
new file mode 100644
index 00000000..722cc8ba
--- /dev/null
+++ b/src/Main/Forms/KeyfilesDialog.h
@@ -0,0 +1,33 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_KeyfilesDialog
+#define TC_HEADER_Main_Forms_KeyfilesDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+#include "KeyfilesPanel.h"
+
+namespace TrueCrypt
+{
+ class KeyfilesDialog : public KeyfilesDialogBase
+ {
+ public:
+ KeyfilesDialog (wxWindow* parent, shared_ptr <KeyfileList> keyfiles);
+ shared_ptr <KeyfileList> GetKeyfiles () const { return mKeyfilesPanel->GetKeyfiles(); }
+
+ protected:
+ void OnCreateKeyfileButttonClick (wxCommandEvent& event);
+ void OnKeyfilesHyperlinkClick (wxHyperlinkEvent& event);
+
+ shared_ptr <KeyfileList> Keyfiles;
+ KeyfilesPanel *mKeyfilesPanel;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_KeyfilesDialog
diff --git a/src/Main/Forms/KeyfilesPanel.cpp b/src/Main/Forms/KeyfilesPanel.cpp
new file mode 100644
index 00000000..506e008a
--- /dev/null
+++ b/src/Main/Forms/KeyfilesPanel.cpp
@@ -0,0 +1,160 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/GraphicUserInterface.h"
+#include "KeyfilesPanel.h"
+#include "SecurityTokenKeyfilesDialog.h"
+
+namespace TrueCrypt
+{
+ KeyfilesPanel::KeyfilesPanel (wxWindow* parent, shared_ptr <KeyfileList> keyfiles)
+ : KeyfilesPanelBase (parent)
+ {
+ KeyfilesListCtrl->InsertColumn (0, LangString["KEYFILE"], wxLIST_FORMAT_LEFT, 1);
+ Gui->SetListCtrlHeight (KeyfilesListCtrl, 10);
+
+ Layout();
+ Fit();
+
+ if (keyfiles)
+ {
+ foreach_ref (const Keyfile &k, *keyfiles)
+ {
+ vector <wstring> fields;
+ fields.push_back (FilesystemPath (k));
+ Gui->AppendToListCtrl (KeyfilesListCtrl, fields);
+ }
+ }
+
+ class FileDropTarget : public wxFileDropTarget
+ {
+ public:
+ FileDropTarget (KeyfilesPanel *panel) : Panel (panel) { }
+
+ wxDragResult OnDragOver (wxCoord x, wxCoord y, wxDragResult def)
+ {
+ return wxDragLink;
+ }
+
+ bool OnDropFiles (wxCoord x, wxCoord y, const wxArrayString &filenames)
+ {
+ foreach (const wxString &f, filenames)
+ Panel->AddKeyfile (make_shared <Keyfile> (wstring (f)));
+ return true;
+ }
+
+ protected:
+ KeyfilesPanel *Panel;
+ };
+
+ SetDropTarget (new FileDropTarget (this));
+ KeyfilesListCtrl->SetDropTarget (new FileDropTarget (this));
+#ifdef TC_MACOSX
+ foreach (wxWindow *c, GetChildren())
+ c->SetDropTarget (new FileDropTarget (this));
+#endif
+
+ UpdateButtons();
+ }
+
+ void KeyfilesPanel::AddKeyfile (shared_ptr <Keyfile> keyfile)
+ {
+ vector <wstring> fields;
+ fields.push_back (FilesystemPath (*keyfile));
+ Gui->AppendToListCtrl (KeyfilesListCtrl, fields);
+ UpdateButtons();
+ }
+
+ shared_ptr <KeyfileList> KeyfilesPanel::GetKeyfiles () const
+ {
+ make_shared_auto (KeyfileList, keyfiles);
+
+ for (long i = 0; i < KeyfilesListCtrl->GetItemCount(); i++)
+ keyfiles->push_back (make_shared <Keyfile> (wstring (KeyfilesListCtrl->GetItemText (i))));
+
+ return keyfiles;
+ }
+
+ void KeyfilesPanel::OnAddDirectoryButtonClick (wxCommandEvent& event)
+ {
+ DirectoryPath dir = Gui->SelectDirectory (this, LangString["SELECT_KEYFILE_PATH"]);
+ if (!dir.IsEmpty())
+ {
+ vector <wstring> fields;
+ fields.push_back (dir);
+ Gui->AppendToListCtrl (KeyfilesListCtrl, fields);
+ UpdateButtons();
+ }
+ }
+
+ void KeyfilesPanel::OnAddFilesButtonClick (wxCommandEvent& event)
+ {
+ FilePathList files = Gui->SelectFiles (this, LangString["SELECT_KEYFILES"], false, true);
+
+ foreach_ref (const FilePath &f, files)
+ {
+ vector <wstring> fields;
+ fields.push_back (f);
+ Gui->AppendToListCtrl (KeyfilesListCtrl, fields);
+ }
+ UpdateButtons();
+ }
+
+ void KeyfilesPanel::OnAddSecurityTokenSignatureButtonClick (wxCommandEvent& event)
+ {
+ try
+ {
+ SecurityTokenKeyfilesDialog dialog (this);
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ foreach (const SecurityTokenKeyfilePath &path, dialog.GetSelectedSecurityTokenKeyfilePaths())
+ {
+ vector <wstring> fields;
+ fields.push_back (path);
+ Gui->AppendToListCtrl (KeyfilesListCtrl, fields);
+ }
+
+ UpdateButtons();
+ }
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void KeyfilesPanel::OnListSizeChanged (wxSizeEvent& event)
+ {
+ list <int> colPermilles;
+ colPermilles.push_back (1000);
+ Gui->SetListCtrlColumnWidths (KeyfilesListCtrl, colPermilles);
+ event.Skip();
+ }
+
+ void KeyfilesPanel::OnRemoveAllButtonClick (wxCommandEvent& event)
+ {
+ KeyfilesListCtrl->DeleteAllItems();
+ UpdateButtons();
+ }
+
+ void KeyfilesPanel::OnRemoveButtonClick (wxCommandEvent& event)
+ {
+ long offset = 0;
+ foreach (long item, Gui->GetListCtrlSelectedItems (KeyfilesListCtrl))
+ KeyfilesListCtrl->DeleteItem (item - offset++);
+
+ UpdateButtons();
+ }
+
+ void KeyfilesPanel::UpdateButtons ()
+ {
+ RemoveAllButton->Enable (KeyfilesListCtrl->GetItemCount() > 0);
+ RemoveButton->Enable (KeyfilesListCtrl->GetSelectedItemCount() > 0);
+ }
+}
diff --git a/src/Main/Forms/KeyfilesPanel.h b/src/Main/Forms/KeyfilesPanel.h
new file mode 100644
index 00000000..c7617453
--- /dev/null
+++ b/src/Main/Forms/KeyfilesPanel.h
@@ -0,0 +1,37 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_KeyfilesPanel
+#define TC_HEADER_Main_Forms_KeyfilesPanel
+
+#include "Forms.h"
+#include "Main/Main.h"
+
+namespace TrueCrypt
+{
+ class KeyfilesPanel : public KeyfilesPanelBase
+ {
+ public:
+ KeyfilesPanel (wxWindow* parent, shared_ptr <KeyfileList> keyfiles);
+ void AddKeyfile (shared_ptr <Keyfile> keyfile);
+ shared_ptr <KeyfileList> GetKeyfiles () const;
+
+ protected:
+ void OnAddFilesButtonClick (wxCommandEvent& event);
+ void OnAddDirectoryButtonClick (wxCommandEvent& event);
+ void OnAddSecurityTokenSignatureButtonClick (wxCommandEvent& event);
+ void OnListItemDeselected (wxListEvent& event) { UpdateButtons(); }
+ void OnListItemSelected (wxListEvent& event) { UpdateButtons(); }
+ void OnListSizeChanged (wxSizeEvent& event);
+ void OnRemoveButtonClick (wxCommandEvent& event);
+ void OnRemoveAllButtonClick (wxCommandEvent& event);
+ void UpdateButtons ();
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_KeyfilesPanel
diff --git a/src/Main/Forms/LegalNoticesDialog.cpp b/src/Main/Forms/LegalNoticesDialog.cpp
new file mode 100644
index 00000000..8029965d
--- /dev/null
+++ b/src/Main/Forms/LegalNoticesDialog.cpp
@@ -0,0 +1,28 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "LegalNoticesDialog.h"
+#include "Main/GraphicUserInterface.h"
+#include "Main/Resources.h"
+
+namespace TrueCrypt
+{
+ LegalNoticesDialog::LegalNoticesDialog (wxWindow* parent) : LegalNoticesDialogBase (parent)
+ {
+ LegalNoticesTextCtrl->SetMinSize (wxSize (
+ Gui->GetCharWidth (LegalNoticesTextCtrl) * 88,
+ Gui->GetCharHeight (LegalNoticesTextCtrl) * 28));
+
+ Layout();
+ Fit();
+ Center();
+
+ LegalNoticesTextCtrl->ChangeValue (StringConverter::ToWide (Resources::GetLegalNotices()));
+ }
+}
diff --git a/src/Main/Forms/LegalNoticesDialog.h b/src/Main/Forms/LegalNoticesDialog.h
new file mode 100644
index 00000000..609ed83a
--- /dev/null
+++ b/src/Main/Forms/LegalNoticesDialog.h
@@ -0,0 +1,23 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_LegalNoticesDialog
+#define TC_HEADER_Main_Forms_LegalNoticesDialog
+
+#include "Forms.h"
+
+namespace TrueCrypt
+{
+ class LegalNoticesDialog : public LegalNoticesDialogBase
+ {
+ public:
+ LegalNoticesDialog (wxWindow* parent);
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_LegalNoticesDialog
diff --git a/src/Main/Forms/MainFrame.cpp b/src/Main/Forms/MainFrame.cpp
new file mode 100644
index 00000000..cf313a8e
--- /dev/null
+++ b/src/Main/Forms/MainFrame.cpp
@@ -0,0 +1,1585 @@
+/*
+ Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+
+#ifdef TC_UNIX
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#endif
+
+#include "Common/SecurityToken.h"
+#include "Main/Main.h"
+#include "Main/Resources.h"
+#include "Main/Application.h"
+#include "Main/GraphicUserInterface.h"
+#include "Main/VolumeHistory.h"
+#include "Main/Xml.h"
+#include "MainFrame.h"
+#include "AboutDialog.h"
+#include "BenchmarkDialog.h"
+#include "ChangePasswordDialog.h"
+#include "EncryptionTestDialog.h"
+#include "FavoriteVolumesDialog.h"
+#include "LegalNoticesDialog.h"
+#include "PreferencesDialog.h"
+#include "SecurityTokenKeyfilesDialog.h"
+#include "VolumeCreationWizard.h"
+#include "VolumePropertiesDialog.h"
+
+namespace TrueCrypt
+{
+ MainFrame::MainFrame (wxWindow* parent) : MainFrameBase (parent),
+ ListItemRightClickEventPending (false),
+ SelectedItemIndex (-1),
+ SelectedSlotNumber (0),
+ ShowRequestFifo (-1)
+ {
+ wxBusyCursor busy;
+
+ SetName (Application::GetName());
+ SetTitle (Application::GetName());
+ SetIcon (Resources::GetTrueCryptIcon());
+
+#if defined(TC_UNIX) && !defined(TC_MACOSX)
+ try
+ {
+ string fifoPath = GetShowRequestFifoPath();
+
+ remove (fifoPath.c_str());
+ throw_sys_if (mkfifo (fifoPath.c_str(), S_IRUSR | S_IWUSR) == -1);
+
+ ShowRequestFifo = open (fifoPath.c_str(), O_RDONLY | O_NONBLOCK);
+ throw_sys_if (ShowRequestFifo == -1);
+ }
+ catch (...)
+ {
+#ifdef DEBUG
+ throw;
+#endif
+ }
+#endif
+
+ InitControls();
+ InitPreferences();
+ InitTaskBarIcon();
+ InitEvents();
+ InitMessageFilter();
+
+ if (!GetPreferences().SecurityTokenModule.IsEmpty() && !SecurityToken::IsInitialized())
+ {
+ try
+ {
+ Gui->InitSecurityTokenLibrary();
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+ }
+
+ MainFrame::~MainFrame ()
+ {
+#if defined(TC_UNIX) && !defined(TC_MACOSX)
+ if (ShowRequestFifo != -1)
+ {
+ try
+ {
+ close (ShowRequestFifo);
+ remove (string (GetShowRequestFifoPath()).c_str());
+ }
+ catch (...) { }
+ }
+#endif
+
+ Core->VolumeMountedEvent.Disconnect (this);
+ Core->VolumeDismountedEvent.Disconnect (this);
+ Gui->OpenVolumeSystemRequestEvent.Disconnect (this);
+ Gui->PreferencesUpdatedEvent.Disconnect (this);
+
+ VolumeHistory::DisconnectComboBox (VolumePathComboBox);
+
+#ifdef TC_WINDOWS
+ Hotkey::UnregisterList (this, GetPreferences().Hotkeys);
+#endif
+ }
+
+ void MainFrame::AddToFavorites (const VolumeInfoList &volumes)
+ {
+ try
+ {
+ FavoriteVolumeList newFavorites;
+
+ // Delete duplicates
+ foreach (shared_ptr <FavoriteVolume> favorite, FavoriteVolume::LoadList())
+ {
+ bool mounted = false;
+ foreach_ref (const VolumeInfo &volume, volumes)
+ {
+ if (volume.Path == favorite->Path)
+ {
+ mounted = true;
+ break;
+ }
+ }
+ if (!mounted)
+ newFavorites.push_back (favorite);
+ }
+
+ size_t newItemCount = 0;
+ foreach_ref (const VolumeInfo &volume, volumes)
+ {
+ newFavorites.push_back (shared_ptr <FavoriteVolume> (new FavoriteVolume (volume.Path, volume.MountPoint, volume.SlotNumber, volume.Protection == VolumeProtection::ReadOnly, volume.SystemEncryption)));
+ ++newItemCount;
+ }
+
+ OrganizeFavorites (newFavorites, newItemCount);
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ bool MainFrame::CanExit () const
+ {
+ return Gui->IsTheOnlyTopLevelWindow (this);
+ }
+
+ void MainFrame::ChangePassword (ChangePasswordDialog::Mode::Enum mode)
+ {
+ if (!CheckVolumePathNotEmpty ())
+ return;
+
+ shared_ptr <VolumePath> volumePath = GetSelectedVolumePath();
+
+#ifdef TC_WINDOWS
+ if (Core->IsVolumeMounted (*volumePath))
+ {
+ Gui->ShowInfo (LangString [mode == ChangePasswordDialog::Mode::ChangePkcs5Prf ? "MOUNTED_NO_PKCS5_PRF_CHANGE" : "MOUNTED_NOPWCHANGE"]);
+ return;
+ }
+#endif
+
+ ChangePasswordDialog dialog (this, volumePath, mode);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::CheckFilesystem (bool repair)
+ {
+ shared_ptr <VolumeInfo> selectedVolume = GetSelectedVolume();
+ if (selectedVolume)
+ {
+ try
+ {
+#ifdef TC_WINDOWS
+ string mountPoint = selectedVolume->MountPoint;
+
+ wstring args = StringFormatter (repair ? L"/C echo {0} & chkdsk {1} /F /X & pause" : L"/C echo {0} & chkdsk {1} & pause",
+ StringFormatter (LangString[repair ? "REPAIRING_FS" : "CHECKING_FS"], mountPoint), mountPoint);
+
+ ShellExecute (static_cast <HWND> (GetHandle()),
+ L"runas",
+ L"cmd.exe", args.c_str(), nullptr, SW_SHOW);
+#else
+# ifdef TC_MACOSX
+ Gui->ShowInfo (_("Disk Utility will be launched after you press 'OK'.\n\nPlease select your volume in the Disk Utility window and press 'Verify Disk' or 'Repair Disk' button on the 'First Aid' page."));
+# endif
+ Core->CheckFilesystem (selectedVolume, repair);
+ UpdateVolumeList();
+#endif
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+ }
+
+ bool MainFrame::CheckVolumePathNotEmpty () const
+ {
+ if (VolumePathComboBox->GetValue().empty())
+ {
+ Gui->ShowInfo ("NO_VOLUME_SELECTED");
+ return false;
+ }
+ return true;
+ }
+
+ void MainFrame::DismountVolume (shared_ptr <VolumeInfo> volume)
+ {
+ try
+ {
+ if (!volume)
+ volume = GetSelectedVolume();
+
+ if (volume)
+ Gui->DismountVolume (volume);
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ shared_ptr <VolumeInfo> MainFrame::GetSelectedVolume () const
+ {
+ return Core->GetMountedVolume (SelectedSlotNumber);
+ }
+
+ void MainFrame::InitControls ()
+ {
+ LogoBitmap->SetBitmap (Resources::GetLogoBitmap());
+
+ list <int> colPermilles;
+
+#ifndef TC_WINDOWS
+ SettingsMenu->Remove (HotkeysMenuItem);
+#endif
+
+#ifdef TC_MACOSX
+ SettingsMenu->Remove (PreferencesMenuItem);
+ SettingsMenu->AppendSeparator();
+ SettingsMenu->Append (PreferencesMenuItem);
+
+ LowStaticBoxSizer->Detach (HigherButtonSizer);
+ VolumeStaticBoxSizer->Detach (VolumeGridBagSizer);
+ VolumeStaticBoxSizer->Add (VolumeGridBagSizer, 1, wxEXPAND, 0);
+
+ ExitButton->SetLabel (_("Close"));
+ MountAllDevicesButton->SetLabel (_("Mount All Devices"));
+#endif
+
+#ifdef TC_WINDOWS
+ SlotListCtrl->InsertColumn (ColumnSlot, LangString["DRIVE"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (75);
+#else
+ SlotListCtrl->InsertColumn (ColumnSlot, _("Slot"), wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (82);
+#endif
+
+ SlotListCtrl->InsertColumn (ColumnPath, LangString["VOLUME"], wxLIST_FORMAT_LEFT, 1);
+#ifdef TC_WINDOWS
+ colPermilles.push_back (487);
+#else
+ colPermilles.push_back (429);
+#endif
+
+ SlotListCtrl->InsertColumn (ColumnSize, LangString["SIZE"], wxLIST_FORMAT_RIGHT, 1);
+#ifdef TC_WINDOWS
+ colPermilles.push_back (126);
+#else
+ colPermilles.push_back (130);
+#endif
+
+#ifdef TC_WINDOWS
+ SlotListCtrl->InsertColumn (ColumnEA, LangString["ENCRYPTION_ALGORITHM_LV"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (233);
+#else
+ SlotListCtrl->InsertColumn (ColumnMountPoint, LangString["MOUNT_POINT"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (259);
+#endif
+
+ SlotListCtrl->InsertColumn (ColumnType, LangString["TYPE"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (100);
+
+ wxImageList *imageList = new wxImageList (16, 12, true);
+ imageList->Add (Resources::GetDriveIconBitmap(), Resources::GetDriveIconMaskBitmap());
+ SlotListCtrl->AssignImageList (imageList, wxIMAGE_LIST_SMALL);
+
+ SetMinSize (wxSize (-1, -1));
+
+ size_t slotListRowCount = 12;
+
+#ifndef TC_WINDOWS
+ int screenHeight = wxSystemSettings::GetMetric (wxSYS_SCREEN_Y);
+
+ if (screenHeight < 480)
+ slotListRowCount = 1;
+ else if (screenHeight <= 600)
+ slotListRowCount = slotListRowCount * screenHeight / 1000;
+#endif
+
+ Gui->SetListCtrlHeight (SlotListCtrl, slotListRowCount);
+
+#ifdef __WXGTK__
+ wxSize size (-1, (int) ((double) Gui->GetCharHeight (this) * 1.53));
+ CreateVolumeButton->SetMinSize (size);
+ VolumePropertiesButton->SetMinSize (size);
+ WipeCacheButton->SetMinSize (size);
+ VolumePathComboBox->SetMinSize (size);
+ SelectFileButton->SetMinSize (size);
+ SelectDeviceButton->SetMinSize (size);
+ VolumeToolsButton->SetMinSize (size);
+ size = wxSize (-1, 38);
+ VolumeButton->SetMinSize (size);
+#endif
+ Fit();
+ Layout();
+ Center();
+
+ VolumePathComboBox->SetMinSize (VolumePathComboBox->GetSize());
+ VolumePathComboBox->SetMaxSize (VolumePathComboBox->GetSize());
+
+ SetMinSize (GetSize());
+ SetMaxSize (GetSize());
+
+ Gui->SetListCtrlColumnWidths (SlotListCtrl, colPermilles);
+
+ UpdateVolumeList();
+ UpdateWipeCacheButton();
+ }
+
+ void MainFrame::InitEvents ()
+ {
+ Core->VolumeMountedEvent.Connect (EventConnector <MainFrame> (this, &MainFrame::OnVolumeMounted));
+ Core->VolumeDismountedEvent.Connect (EventConnector <MainFrame> (this, &MainFrame::OnVolumeDismounted));
+ Gui->OpenVolumeSystemRequestEvent.Connect (EventConnector <MainFrame> (this, &MainFrame::OnOpenVolumeSystemRequestEvent));
+ Gui->PreferencesUpdatedEvent.Connect (EventConnector <MainFrame> (this, &MainFrame::OnPreferencesUpdated));
+
+ // Drag & drop
+ class FileDropTarget : public wxFileDropTarget
+ {
+ public:
+ FileDropTarget (MainFrame *frame) : Frame (frame) { }
+
+ wxDragResult OnDragOver (wxCoord x, wxCoord y, wxDragResult def)
+ {
+ wxPoint p;
+ wxWindow *w = wxFindWindowAtPointer (p);
+ if (w == Frame || wxGetTopLevelParent (w) == Frame)
+ return wxDragLink;
+ return wxDragNone;
+ }
+
+ bool OnDropFiles (wxCoord x, wxCoord y, const wxArrayString &filenames)
+ {
+ if (!filenames.empty())
+ Frame->SetVolumePath (wstring (filenames.front()));
+ return true;
+ }
+
+ MainFrame *Frame;
+ };
+
+ SetDropTarget (new FileDropTarget (this));
+#ifdef TC_MACOSX
+ foreach (wxWindow *c, MainPanel->GetChildren())
+ c->SetDropTarget (new FileDropTarget (this));
+#endif
+
+ // Volume history
+ VolumeHistory::ConnectComboBox (VolumePathComboBox);
+
+#ifdef TC_WINDOWS
+ // Hotkeys
+ Hotkey::RegisterList (this, GetPreferences().Hotkeys);
+ Connect (wxEVT_HOTKEY, wxKeyEventHandler (MainFrame::OnHotkey));
+#endif
+
+ // Timer
+ class Timer : public wxTimer
+ {
+ public:
+ Timer (MainFrame *frame) : Frame (frame) { }
+
+ void Notify()
+ {
+ Frame->OnTimer();
+ }
+
+ MainFrame *Frame;
+ };
+
+ mTimer.reset (dynamic_cast <wxTimer *> (new Timer (this)));
+ mTimer->Start (2000);
+ }
+
+#ifdef TC_WINDOWS
+#include <dbt.h>
+ static WNDPROC MainFrameWndProc;
+ static LRESULT CALLBACK MainFrameWndProcFilter (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+ {
+ if (message == WM_DEVICECHANGE && !Core->IsDeviceChangeInProgress())
+ {
+ MainFrame *frame = dynamic_cast <MainFrame *> (Gui->GetMainFrame());
+ PDEV_BROADCAST_HDR hdr = (PDEV_BROADCAST_HDR) lParam;
+
+ if (wParam == DBT_DEVICEREMOVECOMPLETE && hdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
+ {
+ PDEV_BROADCAST_VOLUME vol = (PDEV_BROADCAST_VOLUME) lParam;
+ for (wchar_t driveNo = 0; driveNo < 26; ++driveNo)
+ {
+ if (vol->dbcv_unitmask & (1 << driveNo))
+ frame->OnDeviceChange (wstring (StringFormatter (L"{0}:\\", wchar_t (L'A' + driveNo))));
+ }
+ }
+ else
+ {
+ frame->OnDeviceChange ();
+ }
+ }
+
+ return CallWindowProc (MainFrameWndProc, hwnd, message, wParam, lParam);
+ }
+#endif
+
+ void MainFrame::InitMessageFilter ()
+ {
+#ifdef TC_WINDOWS
+ HWND mainFrameHwnd = static_cast <HWND> (GetHandle());
+ MainFrameWndProc = (WNDPROC) GetWindowLongPtr (mainFrameHwnd, GWL_WNDPROC);
+ SetWindowLongPtr (mainFrameHwnd, GWL_WNDPROC, (LONG_PTR) MainFrameWndProcFilter);
+#endif
+ }
+
+ void MainFrame::InitPreferences ()
+ {
+ try
+ {
+ LoadPreferences();
+
+ VolumeSlotNumber lastSelectedSlotNumber = GetPreferences().LastSelectedSlotNumber;
+ if (Core->IsSlotNumberValid (lastSelectedSlotNumber))
+ {
+ long slotIndex = SlotNumberToItemIndex (lastSelectedSlotNumber);
+ if (slotIndex >= 0)
+ {
+ SlotListCtrl->SetItemState (slotIndex, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
+ SlotListCtrl->EnsureVisible (slotIndex);
+ }
+ }
+
+ LoadFavoriteVolumes();
+ VolumeHistory::Load();
+
+ if (VolumePathComboBox->GetValue().empty() && !VolumeHistory::Get().empty())
+ SetVolumePath (VolumeHistory::Get().front());
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ Gui->ShowError (_("Error while loading configuration files located in ") + wstring (Application::GetConfigFilePath (L"")));
+ }
+ }
+
+ void MainFrame::InitTaskBarIcon ()
+ {
+ class TaskBarIcon : public wxTaskBarIcon
+ {
+ public:
+ TaskBarIcon (MainFrame *frame) : Busy (false), Frame (frame)
+ {
+ Connect (wxEVT_TASKBAR_LEFT_DOWN, wxTaskBarIconEventHandler (TaskBarIcon::OnLeftButtonDown));
+ }
+
+ wxMenu *CreatePopupMenu ()
+ {
+ auto_ptr <wxMenu> popup (new wxMenu);
+
+ Gui->AppendToMenu (*popup, LangString[Gui->IsInBackgroundMode() ? "SHOW_TC" : "HIDE_TC"], this, wxCommandEventHandler (TaskBarIcon::OnShowHideMenuItemSelected));
+
+ popup->AppendSeparator();
+ Gui->AppendToMenu (*popup, _("Mount All Favorite Volumes"), this, wxCommandEventHandler (TaskBarIcon::OnMountAllFavoritesMenuItemSelected))->Enable (!Busy);
+ Gui->AppendToMenu (*popup, _("Dismount All Mounted Volumes"), this, wxCommandEventHandler (TaskBarIcon::OnDismountAllMenuItemSelected))->Enable (!Busy);
+
+ // Favorite volumes
+ if (Gui->GetPreferences().BackgroundTaskMenuMountItemsEnabled && !Frame->FavoriteVolumesMenuMap.empty())
+ {
+ popup->AppendSeparator();
+ typedef pair <int, FavoriteVolume> FavMapPair;
+ foreach (FavMapPair fp, Frame->FavoriteVolumesMenuMap)
+ {
+ Gui->AppendToMenu (*popup, LangString["MOUNT"] + L" " + wstring (fp.second.Path) + (fp.second.MountPoint.IsEmpty() ? L"" : L" " + wstring (fp.second.MountPoint)),
+ this, wxCommandEventHandler (TaskBarIcon::OnFavoriteVolumeMenuItemSelected), fp.first)->Enable (!Busy);
+ }
+ }
+
+ // Mounted volumes
+ VolumeInfoList mountedVolumes = Core->GetMountedVolumes();
+ if (!mountedVolumes.empty())
+ {
+ if (Gui->GetPreferences().BackgroundTaskMenuOpenItemsEnabled)
+ {
+ popup->AppendSeparator();
+ OpenMap.clear();
+ foreach (shared_ptr <VolumeInfo> volume, mountedVolumes)
+ {
+ if (!volume->MountPoint.IsEmpty())
+ {
+ wxString label = LangString["OPEN"] + L" " + wstring (volume->MountPoint) + L" (" + wstring (volume->Path) + L")";
+ wxMenuItem *item = Gui->AppendToMenu (*popup, label, this, wxCommandEventHandler (TaskBarIcon::OnOpenMenuItemSelected));
+ OpenMap[item->GetId()] = volume;
+ }
+ }
+ }
+
+ if (Gui->GetPreferences().BackgroundTaskMenuDismountItemsEnabled)
+ {
+ popup->AppendSeparator();
+ DismountMap.clear();
+ foreach (shared_ptr <VolumeInfo> volume, mountedVolumes)
+ {
+ wxString label = LangString["DISMOUNT"] + L" ";
+
+ if (!volume->MountPoint.IsEmpty())
+ label += wstring (volume->MountPoint) + L" (" + wstring (volume->Path) + L")";
+ else
+ label += wstring (volume->Path);
+
+ wxMenuItem *item = Gui->AppendToMenu (*popup, label, this, wxCommandEventHandler (TaskBarIcon::OnDismountMenuItemSelected));
+ item->Enable (!Busy);
+ DismountMap[item->GetId()] = volume;
+ }
+ }
+ }
+
+ popup->AppendSeparator();
+ Gui->AppendToMenu (*popup, _("Preferences..."), this, wxCommandEventHandler (TaskBarIcon::OnPreferencesMenuItemSelected))->Enable (!Busy);
+#ifndef TC_MACOSX
+ popup->AppendSeparator();
+ Gui->AppendToMenu (*popup, _("Exit"), this, wxCommandEventHandler (TaskBarIcon::OnExitMenuItemSelected))->Enable (!Busy && Frame->CanExit());
+#endif
+ return popup.release();
+ }
+
+ void OnDismountAllMenuItemSelected (wxCommandEvent& event) { Busy = true; Frame->OnDismountAllButtonClick (event); Busy = false; }
+ void OnDismountMenuItemSelected (wxCommandEvent& event) { Busy = true; Frame->DismountVolume (DismountMap[event.GetId()]); Busy = false; }
+ void OnFavoriteVolumeMenuItemSelected (wxCommandEvent& event) { Busy = true; Frame->OnFavoriteVolumeMenuItemSelected (event); Busy = false; }
+ void OnMountAllFavoritesMenuItemSelected (wxCommandEvent& event) { Busy = true; Frame->MountAllFavorites (); Busy = false; }
+
+ void OnExitMenuItemSelected (wxCommandEvent& event)
+ {
+ Busy = true;
+ if (Core->GetMountedVolumes().empty() || Gui->AskYesNo (LangString ["CONFIRM_EXIT"], false, true))
+ Frame->Close (true);
+ Busy = false;
+ }
+
+ void OnLeftButtonDown (wxTaskBarIconEvent& event) { Gui->SetBackgroundMode (false); }
+ void OnOpenMenuItemSelected (wxCommandEvent& event) { Gui->OpenExplorerWindow (OpenMap[event.GetId()]->MountPoint); }
+ void OnPreferencesMenuItemSelected (wxCommandEvent& event) { Busy = true; Frame->OnPreferencesMenuItemSelected (event); Busy = false; }
+ void OnShowHideMenuItemSelected (wxCommandEvent& event) { Gui->SetBackgroundMode (!Gui->IsInBackgroundMode()); }
+
+ bool Busy;
+ map < int, shared_ptr <VolumeInfo> > DismountMap;
+ MainFrame *Frame;
+ map < int, shared_ptr <VolumeInfo> > OpenMap;
+ };
+
+ mTaskBarIcon.reset (new TaskBarIcon (this));
+ ShowTaskBarIcon (GetPreferences().BackgroundTaskEnabled);
+ }
+
+ void MainFrame::LoadFavoriteVolumes ()
+ {
+ typedef pair <int, FavoriteVolume> FavMapPair;
+ foreach (FavMapPair p, FavoriteVolumesMenuMap)
+ {
+ FavoritesMenu->Delete (p.first);
+ }
+ FavoriteVolumesMenuMap.clear();
+
+ foreach_ref (const FavoriteVolume &favorite, FavoriteVolume::LoadList())
+ {
+ wstring label = wstring (favorite.Path);
+ if (!favorite.MountPoint.IsEmpty())
+ label += wstring (L" ") + wstring (favorite.MountPoint);
+
+ wxMenuItem *item = Gui->AppendToMenu (*FavoritesMenu, label, this, wxCommandEventHandler (MainFrame::OnFavoriteVolumeMenuItemSelected));
+ FavoriteVolumesMenuMap[item->GetId()] = favorite;
+ }
+ }
+
+ void MainFrame::LoadPreferences ()
+ {
+ UserPreferences prefs;
+ prefs.Load();
+ Gui->SetPreferences (prefs);
+ NoHistoryCheckBox->SetValue (!prefs.SaveHistory);
+ }
+
+ void MainFrame::MountAllDevices ()
+ {
+ try
+ {
+ MountOptions mountOptions (GetPreferences().DefaultMountOptions);
+
+ if (SlotListCtrl->GetSelectedItemCount() == 1)
+ mountOptions.SlotNumber = SelectedSlotNumber;
+
+ Gui->MountAllDeviceHostedVolumes (mountOptions);
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::MountAllFavorites ()
+ {
+ try
+ {
+ MountOptions mountOptions (GetPreferences().DefaultMountOptions);
+ Gui->MountAllFavoriteVolumes (mountOptions);
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::MountVolume ()
+ {
+ if (!IsFreeSlotSelected())
+ {
+ Gui->ShowWarning (_("Please select a free drive slot from the list."));
+ return;
+ }
+
+ if (!CheckVolumePathNotEmpty())
+ return;
+
+ MountOptions mountOptions (GetPreferences().DefaultMountOptions);
+ mountOptions.SlotNumber = SelectedSlotNumber;
+ mountOptions.Path = GetSelectedVolumePath();
+
+ try
+ {
+ if (Gui->MountVolume (mountOptions) && GetPreferences().SaveHistory)
+ VolumeHistory::Add (*mountOptions.Path);
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnAboutMenuItemSelected (wxCommandEvent& event)
+ {
+ AboutDialog dialog (this);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::OnActivate (wxActivateEvent& event)
+ {
+ Gui->SetActiveFrame (this);
+
+#ifdef TC_MACOSX
+ if (event.GetActive() && Gui->IsInBackgroundMode())
+ Gui->SetBackgroundMode (false);
+#endif
+ event.Skip();
+ }
+
+ void MainFrame::OnAddAllMountedToFavoritesMenuItemSelected (wxCommandEvent& event)
+ {
+ AddToFavorites (MountedVolumes);
+ }
+
+ void MainFrame::OnAddToFavoritesMenuItemSelected (wxCommandEvent& event)
+ {
+ shared_ptr <VolumeInfo> selectedVolume = GetSelectedVolume();
+ if (selectedVolume)
+ {
+ VolumeInfoList volumes;
+ volumes.push_back (selectedVolume);
+ AddToFavorites (volumes);
+ }
+ }
+
+ void MainFrame::OnBackupVolumeHeadersMenuItemSelected (wxCommandEvent& event)
+ {
+ if (!CheckVolumePathNotEmpty ())
+ return;
+
+ try
+ {
+ Gui->BackupVolumeHeaders (GetSelectedVolumePath());
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnBenchmarkMenuItemSelected (wxCommandEvent& event)
+ {
+ BenchmarkDialog dialog (this);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::OnClearSlotSelectionMenuItemSelected (wxCommandEvent& event)
+ {
+ Gui->ClearListCtrlSelection (SlotListCtrl);
+ UpdateControls();
+ }
+
+ void MainFrame::OnClose (wxCloseEvent& event)
+ {
+ if (GetPreferences().WipeCacheOnClose)
+ Core->WipePasswordCache();
+
+#ifdef TC_MACOSX
+ if (!event.CanVeto() && GetPreferences().DismountOnLogOff)
+ {
+ try
+ {
+ Gui->DismountVolumes (Core->GetMountedVolumes(), GetPreferences().ForceAutoDismount, false);
+ }
+ catch (...) { }
+ }
+#endif
+
+ if (!Gui->IsTheOnlyTopLevelWindow (this))
+ {
+ // Bring first frame to foreground
+ wxFrame *frame = nullptr;
+ foreach (wxWindow *window, wxTopLevelWindows)
+ {
+ if (window != this
+ && dynamic_cast <wxFrame *> (window)
+ && StringConverter::GetTypeName (typeid (*window)).find ("wxTaskBarIcon") == string::npos)
+ {
+ frame = dynamic_cast <wxFrame *> (window);
+ if (window->IsShown())
+ break;
+ }
+ }
+
+ if (frame)
+ {
+ frame->Show();
+ if (frame->IsIconized())
+ frame->Iconize(false);
+ frame->Raise();
+ }
+ }
+ else if (event.CanVeto() && GetPreferences().BackgroundTaskEnabled
+ && (!GetPreferences().CloseBackgroundTaskOnNoVolumes || !MountedVolumes.empty()))
+ {
+ // Enter background mode
+ if (!Gui->IsInBackgroundMode())
+ Gui->SetBackgroundMode (true);
+ }
+ else
+ {
+#ifdef __WXGTK__
+ Show();
+#endif
+ SavePreferences();
+
+ Destroy();
+ }
+
+ // Cancel close - veto is not used to prevent aborting log off procedure on Windows
+ return;
+ }
+
+ void MainFrame::OnCloseAllSecurityTokenSessionsMenuItemSelected (wxCommandEvent& event)
+ {
+ try
+ {
+ {
+ wxBusyCursor busy;
+ SecurityToken::CloseAllSessions();
+ }
+ Gui->ShowInfo ("ALL_TOKEN_SESSIONS_CLOSED");
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnCreateVolumeButtonClick (wxCommandEvent& event)
+ {
+ try
+ {
+ (new VolumeCreationWizard (nullptr))->Show();
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnDefaultKeyfilesMenuItemSelected (wxCommandEvent& event)
+ {
+ PreferencesDialog dialog (this);
+ dialog.SelectPage (dialog.DefaultKeyfilesPage);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::OnDeviceChange (const DirectoryPath &mountPoint)
+ {
+ // Check if any host device has been removed and force dismount of volumes accordingly
+ VolumeInfoList removedVolumes;
+ foreach (shared_ptr <VolumeInfo> volume, Core->GetMountedVolumes())
+ {
+ // File-hosted volumes
+ if (!volume->Path.IsDevice() && !mountPoint.IsEmpty())
+ {
+ if (wxString (volume->Path).Upper().StartsWith (wstring (mountPoint).c_str()))
+ {
+ removedVolumes.push_back (volume);
+ continue;
+ }
+ }
+
+ // Device-hosted volumes
+ if (volume->Path.IsDevice() && !Core->IsDevicePresent (volume->Path))
+ removedVolumes.push_back (volume);
+ }
+
+ if (!removedVolumes.empty())
+ Gui->AutoDismountVolumes (removedVolumes, true);
+ }
+
+ void MainFrame::OnDismountAllButtonClick (wxCommandEvent& event)
+ {
+ Gui->DismountAllVolumes();
+ }
+
+ void MainFrame::OnEncryptionTestMenuItemSelected (wxCommandEvent& event)
+ {
+ EncryptionTestDialog dialog (this);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::OnExitButtonClick (wxCommandEvent& event)
+ {
+ Close();
+ }
+
+ void MainFrame::OnFavoriteVolumeMenuItemSelected (wxCommandEvent& event)
+ {
+ FavoriteVolume favorite = FavoriteVolumesMenuMap[event.GetId()];
+ if (!favorite.Path.IsEmpty())
+ {
+ SetVolumePath (favorite.Path);
+
+ MountOptions mountOptions (GetPreferences().DefaultMountOptions);
+ favorite.ToMountOptions (mountOptions);
+
+ shared_ptr <VolumeInfo> volume = Gui->MountVolume (mountOptions);
+ if (volume)
+ SlotListCtrl->EnsureVisible (SlotNumberToItemIndex (volume->SlotNumber));
+ }
+ }
+
+ void MainFrame::OnHiddenVolumeProtectionTriggered (shared_ptr <VolumeInfo> protectedVolume)
+ {
+ Gui->ShowWarningTopMost (StringFormatter (LangString["DAMAGE_TO_HIDDEN_VOLUME_PREVENTED"], wstring (protectedVolume->Path)));
+ }
+
+ void MainFrame::OnHotkey (wxKeyEvent& event)
+ {
+#ifdef TC_WINDOWS
+ switch (event.GetId())
+ {
+ case Hotkey::Id::CloseAllSecurityTokenSessions:
+ try
+ {
+ SecurityToken::CloseAllSessions();
+ Gui->ShowInfo ("ALL_TOKEN_SESSIONS_CLOSED");
+ }
+ catch (exception &e) { Gui->ShowError (e); }
+ break;
+
+ case Hotkey::Id::DismountAll:
+ case Hotkey::Id::DismountAllWipeCache:
+ {
+ if (event.GetId() == Hotkey::Id::DismountAllWipeCache)
+ WipeCache();
+
+ size_t mountedCount = Core->GetMountedVolumes().size();
+ Gui->DismountAllVolumes();
+ size_t newMountedCount = Core->GetMountedVolumes().size();
+
+ if (newMountedCount < mountedCount)
+ {
+ if (newMountedCount == 0 && GetPreferences().DisplayMessageAfterHotkeyDismount)
+ Gui->ShowInfo ("MOUNTED_VOLUMES_DISMOUNTED");
+ else if (GetPreferences().BeepAfterHotkeyMountDismount)
+ MessageBeep((UINT) -1);
+ }
+ }
+ break;
+
+ case Hotkey::Id::ForceDismountAllWipeCache:
+ case Hotkey::Id::ForceDismountAllWipeCacheExit:
+ {
+ bool mounted = !Core->GetMountedVolumes().empty();
+
+ WipeCache();
+ Gui->DismountAllVolumes (true, true);
+
+ if (mounted && GetPreferences().DisplayMessageAfterHotkeyDismount)
+ Gui->ShowInfo ("VOLUMES_DISMOUNTED_CACHE_WIPED");
+ else if (mounted && GetPreferences().BeepAfterHotkeyMountDismount)
+ MessageBeep((UINT) -1);
+
+ if (event.GetId() == Hotkey::Id::ForceDismountAllWipeCacheExit)
+ Close (true);
+ }
+ break;
+
+ case Hotkey::Id::MountAllDevices:
+ case Hotkey::Id::MountAllFavorites:
+ {
+ size_t mountedCount = Core->GetMountedVolumes().size();
+
+ if (event.GetId() == Hotkey::Id::MountAllDevices)
+ MountAllDevices();
+ else
+ MountAllFavorites();
+
+ if (Core->GetMountedVolumes().size() > mountedCount && GetPreferences().BeepAfterHotkeyMountDismount)
+ MessageBeep((UINT) -1);
+ }
+ break;
+
+ case Hotkey::Id::ShowHideApplication:
+ Gui->SetBackgroundMode (!Gui->IsInBackgroundMode());
+ break;
+
+ case Hotkey::Id::WipeCache:
+ WipeCache();
+ Gui->ShowInfo ("PASSWORD_CACHE_WIPED");
+ break;
+
+ default:
+ assert (false);
+ break;
+ }
+#endif // TC_WINDOWS
+ }
+
+ void MainFrame::OnHotkeysMenuItemSelected (wxCommandEvent& event)
+ {
+ PreferencesDialog dialog (this);
+ dialog.SelectPage (dialog.HotkeysPage);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::OnLegalNoticesMenuItemSelected (wxCommandEvent& event)
+ {
+ LegalNoticesDialog dialog (this);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::OnListChanged ()
+ {
+ OnListItemSelectionChanged();
+ UpdateControls();
+ }
+
+ void MainFrame::OnListItemActivated (wxListEvent& event)
+ {
+ if (IsMountedSlotSelected())
+ OpenSelectedVolume();
+ else
+ MountVolume();
+ }
+
+ void MainFrame::OnListItemDeleted (long itemIndex)
+ {
+ if (SelectedItemIndex > itemIndex)
+ --SelectedItemIndex;
+ }
+
+ void MainFrame::OnListItemDeselected (wxListEvent& event)
+ {
+ OnListItemSelectionChanged();
+ }
+
+ void MainFrame::OnListItemInserted (long itemIndex)
+ {
+ if (SelectedItemIndex >= itemIndex)
+ ++SelectedItemIndex;
+ }
+
+ void MainFrame::OnListItemRightClick (wxListEvent& event)
+ {
+#ifdef TC_MACOSX
+ if (SelectedItemIndex != event.GetIndex())
+ {
+ SelectedItemIndex = event.GetIndex();
+ OnListItemSelectionChanged();
+ }
+
+ if (!ListItemRightClickEventPending)
+ {
+ ListItemRightClickEventPending = true;
+ SlotListCtrl->AddPendingEvent (event);
+ return;
+ }
+
+ ListItemRightClickEventPending = false;
+#endif
+
+ wxMenu popup;
+ if (IsMountedSlotSelected())
+ {
+ Gui->AppendToMenu (popup, LangString["DISMOUNT"], this, wxCommandEventHandler (MainFrame::OnDismountVolumeMenuItemSelected));
+ Gui->AppendToMenu (popup, LangString["OPEN"], this, wxCommandEventHandler (MainFrame::OnOpenVolumeMenuItemSelected));
+ Gui->AppendToMenu (popup, _("Deselect"), this, wxCommandEventHandler (MainFrame::OnClearSlotSelectionMenuItemSelected));
+
+ popup.AppendSeparator();
+ Gui->AppendToMenu (popup, _("Add to Favorites..."), this, wxCommandEventHandler (MainFrame::OnAddToFavoritesMenuItemSelected));
+
+ popup.AppendSeparator();
+ Gui->AppendToMenu (popup, LangString["IDPM_CHECK_FILESYS"], this, wxCommandEventHandler (MainFrame::OnCheckFilesystemMenuItemSelected));
+ Gui->AppendToMenu (popup, LangString["IDPM_REPAIR_FILESYS"], this, wxCommandEventHandler (MainFrame::OnRepairFilesystemMenuItemSelected));
+
+ popup.AppendSeparator();
+ Gui->AppendToMenu (popup, LangString["IDPM_PROPERTIES"], this, wxCommandEventHandler (MainFrame::OnVolumePropertiesButtonClick));
+
+ PopupMenu (&popup);
+ }
+ else if (IsFreeSlotSelected())
+ {
+ Gui->AppendToMenu (popup, _("Mount Volume"), this, wxCommandEventHandler (MainFrame::OnMountVolumeMenuItemSelected));
+
+ popup.AppendSeparator();
+
+ Gui->AppendToMenu (popup, LangString["SELECT_FILE_AND_MOUNT"], this, wxCommandEventHandler (MainFrame::OnSelectFileAndMountMenuItemSelected));
+ Gui->AppendToMenu (popup, LangString["SELECT_DEVICE_AND_MOUNT"], this, wxCommandEventHandler (MainFrame::OnSelectDeviceAndMountMenuItemSelected));
+
+ popup.AppendSeparator();
+
+ Gui->AppendToMenu (popup, _("Deselect"), this, wxCommandEventHandler (MainFrame::OnClearSlotSelectionMenuItemSelected));
+
+ PopupMenu (&popup);
+ }
+ }
+
+ void MainFrame::OnListItemSelected (wxListEvent& event)
+ {
+ SelectedItemIndex = event.GetIndex();
+ OnListItemSelectionChanged();
+ }
+
+ void MainFrame::OnListItemSelectionChanged ()
+ {
+ if (SlotListCtrl->GetSelectedItemCount() < 1)
+ SelectedItemIndex = -1;
+
+ if (SelectedItemIndex >= 0)
+ SelectedSlotNumber = (VolumeSlotNumber) SlotListCtrl->GetItemData (SelectedItemIndex);
+ else
+ SelectedSlotNumber = 0;
+
+ UpdateControls();
+ }
+
+ void MainFrame::OnManageSecurityTokenKeyfilesMenuItemSelected (wxCommandEvent& event)
+ {
+ try
+ {
+ SecurityTokenKeyfilesDialog dialog (this, false);
+ dialog.ShowModal();
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnMountAllDevicesButtonClick (wxCommandEvent& event)
+ {
+ MountAllDevices();
+ }
+
+ void MainFrame::OnMountAllFavoritesMenuItemSelected (wxCommandEvent& event)
+ {
+ MountAllFavorites();
+ }
+
+ void MainFrame::OnNoHistoryCheckBoxClick (wxCommandEvent& event)
+ {
+ UserPreferences prefs = GetPreferences();
+ prefs.SaveHistory = !event.IsChecked();
+ Gui->SetPreferences (prefs);
+
+ if (event.IsChecked())
+ {
+ try
+ {
+ VolumeHistory::Clear();
+ }
+ catch (exception &e) { Gui->ShowError (e); }
+ }
+ }
+
+ void MainFrame::OnOrganizeFavoritesMenuItemSelected (wxCommandEvent& event)
+ {
+ try
+ {
+ OrganizeFavorites (FavoriteVolume::LoadList());
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnPreferencesMenuItemSelected (wxCommandEvent& event)
+ {
+ PreferencesDialog dialog (this);
+ dialog.ShowModal();
+ }
+
+ void MainFrame::OnPreferencesUpdated (EventArgs &args)
+ {
+ const UserPreferences &prefs = GetPreferences();
+
+ NoHistoryCheckBox->SetValue (!prefs.SaveHistory);
+
+ ShowTaskBarIcon (prefs.BackgroundTaskEnabled);
+ if (Gui->IsInBackgroundMode() && !prefs.BackgroundTaskEnabled)
+ Close (true);
+
+ SavePreferences();
+ }
+
+ void MainFrame::OnRestoreVolumeHeaderMenuItemSelected (wxCommandEvent& event)
+ {
+ if (!CheckVolumePathNotEmpty ())
+ return;
+
+ try
+ {
+ Gui->RestoreVolumeHeaders (GetSelectedVolumePath());
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnSecurityTokenPreferencesMenuItemSelected (wxCommandEvent& event)
+ {
+ PreferencesDialog dialog (this);
+ dialog.SelectPage (dialog.SecurityTokensPage);
+ dialog.ShowModal();
+ }
+
+
+ void MainFrame::OnSelectDeviceAndMountMenuItemSelected (wxCommandEvent& event)
+ {
+ DevicePath path = Gui->SelectDevice (this);
+
+ if (!path.IsEmpty())
+ {
+ SetVolumePath (path);
+ OnMountVolumeMenuItemSelected (event);
+ }
+ }
+
+ void MainFrame::OnSelectDeviceButtonClick (wxCommandEvent& event)
+ {
+ DevicePath path = Gui->SelectDevice (this);
+
+ if (!path.IsEmpty())
+ SetVolumePath (path);
+ }
+
+ void MainFrame::OnSelectFileAndMountMenuItemSelected (wxCommandEvent& event)
+ {
+ FilePath path = Gui->SelectVolumeFile (this);
+
+ if (!path.IsEmpty())
+ {
+ SetVolumePath (path);
+ OnMountVolumeMenuItemSelected (event);
+ }
+ }
+
+ void MainFrame::OnSelectFileButtonClick (wxCommandEvent& event)
+ {
+ FilePath path = Gui->SelectVolumeFile (this);
+ if (!path.IsEmpty())
+ SetVolumePath (path);
+ }
+
+ void MainFrame::OnTimer ()
+ {
+ try
+ {
+ UpdateVolumeList();
+ UpdateWipeCacheButton();
+
+ if (GetPreferences().BackgroundTaskEnabled)
+ {
+ // Inactivity auto-dismount
+ if (GetPreferences().DismountOnInactivity)
+ {
+ VolumeInfoList inactiveVolumes;
+ wxLongLong currentTime = wxGetLocalTimeMillis().GetValue();
+
+ map <wstring, VolumeActivityMapEntry> newActivityTimeMap;
+
+ foreach (shared_ptr <VolumeInfo> volume, MountedVolumes)
+ {
+ if (VolumeActivityMap.find (volume->Path) != VolumeActivityMap.end()
+ && VolumeActivityMap[volume->Path].SerialInstanceNumber == volume->SerialInstanceNumber)
+ {
+ VolumeActivityMapEntry ae = VolumeActivityMap[volume->Path];
+
+ if (volume->TotalDataRead != ae.TotalDataRead || volume->TotalDataWritten != ae.TotalDataWritten)
+ {
+ ae.LastActivityTime = currentTime;
+ ae.TotalDataRead = volume->TotalDataRead;
+ ae.TotalDataWritten = volume->TotalDataWritten;
+ }
+ else if ((currentTime - ae.LastActivityTime) > GetPreferences().MaxVolumeIdleTime * 1000LL * 60)
+ {
+ inactiveVolumes.push_back (volume);
+ }
+
+ newActivityTimeMap[volume->Path] = ae;
+ }
+ else
+ {
+ newActivityTimeMap[volume->Path] = VolumeActivityMapEntry (*volume, currentTime);
+ }
+ }
+
+ VolumeActivityMap = newActivityTimeMap;
+
+ if (!inactiveVolumes.empty())
+ Gui->AutoDismountVolumes (inactiveVolumes);
+ }
+
+ // Screen saver auto-dismount
+ if (GetPreferences().DismountOnScreenSaver)
+ {
+#ifdef TC_WINDOWS
+ bool running;
+ if (SystemParametersInfo (SPI_GETSCREENSAVERRUNNING, 0, &running, 0) != 0)
+ {
+ static bool previousState = false;
+ if (running && !previousState)
+ {
+ previousState = true;
+ Gui->OnAutoDismountAllEvent();
+ }
+ else
+ {
+ previousState = running;
+ }
+ }
+#endif
+ }
+ }
+
+ if (Gui->IsInBackgroundMode())
+ {
+ if (!GetPreferences().BackgroundTaskEnabled)
+ {
+ Close (true);
+ }
+ else if (MountedVolumes.empty() && (GetPreferences().CloseBackgroundTaskOnNoVolumes || Core->IsInPortableMode()))
+ {
+ Close (true);
+ }
+ }
+
+#if defined(TC_UNIX) && !defined(TC_MACOSX)
+ try
+ {
+ byte buf[128];
+ if (read (ShowRequestFifo, buf, sizeof (buf)) > 0 && Gui->IsInBackgroundMode())
+ Gui->SetBackgroundMode (false);
+ }
+ catch (...)
+ {
+#ifdef DEBUG
+ throw;
+#endif
+ }
+#endif
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::OnVolumeButtonClick (wxCommandEvent& event)
+ {
+ if (IsMountedSlotSelected())
+ DismountVolume();
+ else
+ MountVolume();
+ }
+
+ void MainFrame::OnVolumePropertiesButtonClick (wxCommandEvent& event)
+ {
+ shared_ptr <VolumeInfo> selectedVolume = GetSelectedVolume();
+ if (selectedVolume)
+ {
+ VolumePropertiesDialog dialog (this, *selectedVolume);
+ dialog.ShowModal();
+ }
+ }
+
+ void MainFrame::OnVolumeToolsButtonClick (wxCommandEvent& event)
+ {
+ if (!CheckVolumePathNotEmpty())
+ return;
+
+ wxMenu popup;
+
+ Gui->AppendToMenu (popup, _("Change Volume Password..."), this, wxCommandEventHandler (MainFrame::OnChangePasswordMenuItemSelected));
+
+ popup.AppendSeparator ();
+
+ Gui->AppendToMenu (popup, _("Add/Remove Keyfiles to/from Volume..."), this, wxCommandEventHandler (MainFrame::OnChangeKeyfilesMenuItemSelected));
+ Gui->AppendToMenu (popup, _("Remove All Keyfiles from Volume..."), this, wxCommandEventHandler (MainFrame::OnRemoveKeyfilesMenuItemSelected));
+
+ popup.AppendSeparator ();
+
+ Gui->AppendToMenu (popup, _("Change Header Key Derivation Algorithm..."), this, wxCommandEventHandler (MainFrame::OnChangePkcs5PrfMenuItemSelected));
+
+ popup.AppendSeparator ();
+
+ Gui->AppendToMenu (popup, _("Backup Volume Header..."), this, wxCommandEventHandler (MainFrame::OnBackupVolumeHeadersMenuItemSelected));
+ Gui->AppendToMenu (popup, _("Restore Volume Header..."), this, wxCommandEventHandler (MainFrame::OnRestoreVolumeHeaderMenuItemSelected));
+
+ PopupMenu (&popup, VolumeToolsButton->GetPosition().x + 2, VolumeToolsButton->GetPosition().y + 2);
+ }
+
+ void MainFrame::OnWipeCacheButtonClick (wxCommandEvent& event)
+ {
+ WipeCache();
+ Gui->ShowInfo ("PASSWORD_CACHE_WIPED");
+ }
+
+ void MainFrame::OpenSelectedVolume () const
+ {
+ shared_ptr <VolumeInfo> selectedVolume = GetSelectedVolume();
+ if (selectedVolume)
+ {
+ try
+ {
+ wxBusyCursor busy;
+ Gui->OpenExplorerWindow (selectedVolume->MountPoint);
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+ }
+ }
+
+ void MainFrame::OrganizeFavorites (const FavoriteVolumeList &favorites, size_t newItemCount)
+ {
+ FavoriteVolumesDialog dialog (this, favorites, newItemCount);
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ FavoriteVolume::SaveList (dialog.GetFavorites());
+ LoadFavoriteVolumes();
+ }
+ }
+
+ void MainFrame::SavePreferences () const
+ {
+ try
+ {
+ UserPreferences prefs = GetPreferences();
+ prefs.LastSelectedSlotNumber = SelectedSlotNumber;
+ prefs.Save();
+
+ VolumeHistory::Save();
+ }
+ catch (exception &e)
+ {
+ if (!Core->IsInPortableMode())
+ Gui->ShowError (e);
+ }
+ }
+
+ void MainFrame::ShowTaskBarIcon (bool show)
+ {
+ if (!show && mTaskBarIcon->IsIconInstalled())
+ {
+ mTaskBarIcon->RemoveIcon();
+ }
+ else if (show && !mTaskBarIcon->IsIconInstalled())
+ {
+#ifndef TC_MACOSX
+ mTaskBarIcon->SetIcon (Resources::GetTrueCryptIcon(), L"TrueCrypt");
+#endif
+ }
+ }
+
+ long MainFrame::SlotNumberToItemIndex (uint32 slotNumber) const
+ {
+ for (long itemIndex = 0; itemIndex < SlotListCtrl->GetItemCount(); itemIndex++)
+ {
+ wxListItem item;
+ item.SetId (itemIndex);
+ if (slotNumber == (uint32) SlotListCtrl->GetItemData (item))
+ return itemIndex;
+ }
+ return -1;
+ }
+
+ void MainFrame::UpdateControls ()
+ {
+ bool mounted = IsMountedSlotSelected();
+
+ VolumeButton->SetLabel (mounted ? LangString["DISMOUNT"] : wxString (_("Mount")));
+ VolumePropertiesButton->Enable (mounted);
+
+ DismountVolumeMenuItem->Enable (mounted);
+ MountVolumeMenuItem->Enable (!mounted);
+ VolumePropertiesMenuItem->Enable (mounted);
+ AddToFavoritesMenuItem->Enable (mounted);
+ AddAllMountedToFavoritesMenuItem->Enable (!MountedVolumes.empty());
+ UpdateWipeCacheButton();
+ }
+
+ void MainFrame::UpdateVolumeList ()
+ {
+ static Mutex mutex;
+ ScopeLock lock (mutex);
+
+ bool listChanged = false;
+
+ MountedVolumes = Core->GetMountedVolumes();
+
+ map < VolumeSlotNumber, shared_ptr <VolumeInfo> > mountedVolumesMap;
+ foreach (shared_ptr <VolumeInfo> volume, MountedVolumes)
+ {
+ mountedVolumesMap[volume->SlotNumber] = volume;
+ }
+
+ VolumeInfoList protectionTriggeredVolumes;
+
+ // Update list
+ long prevItemIndex = -1;
+ for (VolumeSlotNumber slotNumber = Core->GetFirstSlotNumber(); slotNumber <= Core->GetLastSlotNumber(); ++slotNumber)
+ {
+ long itemIndex = SlotNumberToItemIndex (slotNumber);
+ vector <wstring> fields (SlotListCtrl->GetColumnCount());
+
+ if (mountedVolumesMap.find (slotNumber) != mountedVolumesMap.end())
+ {
+ shared_ptr <VolumeInfo> volume = mountedVolumesMap[slotNumber];
+
+#ifdef TC_WINDOWS
+ fields[ColumnSlot] = volume->MountPoint;
+ fields[ColumnEA] = volume->EncryptionAlgorithmName;
+#else
+ fields[ColumnSlot] = StringConverter::FromNumber (slotNumber);
+ fields[ColumnMountPoint] = volume->MountPoint;
+#endif
+ fields[ColumnPath] = volume->Path;
+ fields[ColumnSize] = Gui->SizeToString (volume->Size);
+ fields[ColumnType] = Gui->VolumeTypeToString (volume->Type, volume->Protection);
+
+ if (volume->HiddenVolumeProtectionTriggered)
+ {
+ fields[ColumnType] += L"(!)";
+ }
+
+ bool slotUpdated = false;
+ if (itemIndex == -1)
+ {
+ Gui->InsertToListCtrl (SlotListCtrl, ++prevItemIndex, fields, 0, (void *) volume->SlotNumber);
+ OnListItemInserted (prevItemIndex);
+
+ listChanged |= true;
+ slotUpdated = true;
+ }
+ else
+ {
+ if (Gui->UpdateListCtrlItem (SlotListCtrl, itemIndex, fields))
+ {
+ listChanged = true;
+ slotUpdated = true;
+ }
+ prevItemIndex = itemIndex;
+ }
+
+ if (slotUpdated && volume->HiddenVolumeProtectionTriggered)
+ protectionTriggeredVolumes.push_back (volume);
+ }
+ else
+ {
+#ifdef TC_WINDOWS
+ fields[ColumnSlot] = Core->SlotNumberToMountPoint (slotNumber);
+#else
+ fields[ColumnSlot] = StringConverter::FromNumber (slotNumber);
+#endif
+
+#ifdef TC_WINDOWS
+ if (Core->IsMountPointAvailable (fields[ColumnSlot]))
+#else
+ if (true)
+#endif
+ {
+ if (itemIndex == -1)
+ {
+ Gui->InsertToListCtrl (SlotListCtrl, ++prevItemIndex, fields, 0, (void *) slotNumber);
+ OnListItemInserted (prevItemIndex);
+ listChanged |= true;
+ }
+ else
+ {
+ listChanged |= Gui->UpdateListCtrlItem (SlotListCtrl, itemIndex, fields);
+ prevItemIndex = itemIndex;
+ }
+ }
+ else if (itemIndex != -1)
+ {
+ SlotListCtrl->DeleteItem (itemIndex);
+ OnListItemDeleted (itemIndex);
+ listChanged = true;
+ }
+ }
+ }
+
+ if (listChanged)
+ OnListChanged();
+
+ foreach (shared_ptr <VolumeInfo> volume, protectionTriggeredVolumes)
+ OnHiddenVolumeProtectionTriggered (volume);
+ }
+
+ void MainFrame::UpdateWipeCacheButton ()
+ {
+ bool enabled = WipeCacheButton->IsEnabled();
+ bool empty = Core->IsPasswordCacheEmpty();
+
+ if (empty && enabled)
+ {
+ WipeCacheButton->Disable();
+ WipeCachedPasswordsMenuItem->Enable (false);
+ }
+ else if (!empty && !enabled)
+ {
+ WipeCacheButton->Enable();
+ WipeCachedPasswordsMenuItem->Enable();
+ }
+ }
+
+ void MainFrame::WipeCache ()
+ {
+ Core->WipePasswordCache();
+ UpdateWipeCacheButton();
+ }
+}
diff --git a/src/Main/Forms/MainFrame.h b/src/Main/Forms/MainFrame.h
new file mode 100644
index 00000000..5b775abc
--- /dev/null
+++ b/src/Main/Forms/MainFrame.h
@@ -0,0 +1,173 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_MainFrame
+#define TC_HEADER_Main_Forms_MainFrame
+
+#include "Forms.h"
+#include "ChangePasswordDialog.h"
+
+namespace TrueCrypt
+{
+ struct FavoriteVolume;
+
+ class MainFrame : public MainFrameBase
+ {
+ public:
+ MainFrame (wxWindow* parent);
+ virtual ~MainFrame ();
+
+ void OnDeviceChange (const DirectoryPath &mountPoint = DirectoryPath());
+#ifdef TC_UNIX
+ static FilePath GetShowRequestFifoPath () { return Application::GetConfigFilePath (L".show-request-queue", true); }
+#endif
+
+ protected:
+ enum
+ {
+ ColumnSlot = 0,
+ ColumnPath,
+ ColumnSize,
+#ifdef TC_WINDOWS
+ ColumnEA,
+#else
+ ColumnMountPoint,
+#endif
+ ColumnType
+ };
+
+ void AddToFavorites (const VolumeInfoList &volumes);
+ bool CanExit () const;
+ void ChangePassword (ChangePasswordDialog::Mode::Enum mode = ChangePasswordDialog::Mode::ChangePasswordAndKeyfiles);
+ void CheckFilesystem (bool repair = false);
+ bool CheckVolumePathNotEmpty () const;
+ void DismountVolume (shared_ptr <VolumeInfo> volume = shared_ptr <VolumeInfo> ());
+ const UserPreferences &GetPreferences () const { return Gui->GetPreferences(); }
+ shared_ptr <VolumeInfo> GetSelectedVolume () const;
+ shared_ptr <VolumePath> GetSelectedVolumePath () const { return make_shared <VolumePath> (wstring (VolumePathComboBox->GetValue())); }
+ void InitControls ();
+ void InitEvents ();
+ void InitMessageFilter ();
+ void InitPreferences ();
+ void InitTaskBarIcon ();
+ bool IsFreeSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); }
+ bool IsMountedSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && !Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); }
+ void LoadFavoriteVolumes ();
+ void LoadPreferences ();
+ void MountAllDevices ();
+ void MountAllFavorites ();
+ void MountVolume ();
+ void OnAboutMenuItemSelected (wxCommandEvent& event);
+ void OnActivate (wxActivateEvent& event);
+ void OnAddAllMountedToFavoritesMenuItemSelected (wxCommandEvent& event);
+ void OnAddToFavoritesMenuItemSelected (wxCommandEvent& event);
+ void OnBackupVolumeHeadersMenuItemSelected (wxCommandEvent& event);
+ void OnBeginnersTutorialMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"tutorial"); }
+ void OnBenchmarkMenuItemSelected (wxCommandEvent& event);
+ void OnChangeKeyfilesMenuItemSelected (wxCommandEvent& event) { ChangePassword (ChangePasswordDialog::Mode::ChangeKeyfiles); }
+ void OnChangePasswordMenuItemSelected (wxCommandEvent& event) { ChangePassword (); }
+ void OnChangePkcs5PrfMenuItemSelected (wxCommandEvent& event) { ChangePassword (ChangePasswordDialog::Mode::ChangePkcs5Prf); }
+ void OnCheckFilesystemMenuItemSelected( wxCommandEvent& event ) { CheckFilesystem (); }
+ void OnClearSlotSelectionMenuItemSelected (wxCommandEvent& event);
+ void OnClose (wxCloseEvent& event);
+ void OnCloseAllSecurityTokenSessionsMenuItemSelected (wxCommandEvent& event);
+ void OnContactMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"contact"); }
+ void OnCreateKeyfileMenuItemSelected (wxCommandEvent& event) { Gui->CreateKeyfile(); }
+ void OnCreateVolumeButtonClick (wxCommandEvent& event);
+ void OnDefaultKeyfilesMenuItemSelected (wxCommandEvent& event);
+ void OnDismountAllButtonClick (wxCommandEvent& event);
+ void OnDismountVolumeMenuItemSelected (wxCommandEvent& event) { DismountVolume(); }
+ void OnDownloadsMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"downloads"); }
+ void OnEncryptionTestMenuItemSelected (wxCommandEvent& event);
+ void OnExitButtonClick (wxCommandEvent& event);
+ void OnFavoriteVolumeMenuItemSelected (wxCommandEvent& event);
+ void OnFaqMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"faq"); }
+ void OnHiddenVolumeProtectionTriggered (shared_ptr <VolumeInfo> protectedVolume);
+ void OnHotkey (wxKeyEvent& event);
+ void OnHotkeysMenuItemSelected (wxCommandEvent& event);
+ void OnLegalNoticesMenuItemSelected (wxCommandEvent& event);
+ void OnListChanged ();
+ void OnListItemActivated (wxListEvent& event);
+ void OnListItemDeleted (long itemIndex);
+ void OnListItemDeselected (wxListEvent& event);
+ void OnListItemInserted (long itemIndex);
+ void OnListItemRightClick (wxListEvent& event);
+ void OnListItemSelected (wxListEvent& event);
+ void OnListItemSelectionChanged ();
+ void OnLogoBitmapClick (wxMouseEvent &event) { wxCommandEvent ev; OnAboutMenuItemSelected (ev); }
+ void OnManageSecurityTokenKeyfilesMenuItemSelected (wxCommandEvent& event);
+ void OnMountAllDevicesButtonClick (wxCommandEvent& event);
+ void OnMountAllFavoritesMenuItemSelected (wxCommandEvent& event);
+ void OnMountVolumeMenuItemSelected (wxCommandEvent& event) { MountVolume(); }
+ void OnNewsMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"news"); }
+ void OnNoHistoryCheckBoxClick (wxCommandEvent& event);
+ void OnOnlineHelpMenuItemSelected (wxCommandEvent& event) { Gui->OpenOnlineHelp (this); }
+ void OnOpenVolumeMenuItemSelected (wxCommandEvent& event) { OpenSelectedVolume(); }
+ void OnOpenVolumeSystemRequestEvent (EventArgs &args) { SetVolumePath (wstring (dynamic_cast <OpenVolumeSystemRequestEventArgs &> (args).mVolumePath)); }
+ void OnOrganizeFavoritesMenuItemSelected (wxCommandEvent& event);
+ void OnPreferencesMenuItemSelected (wxCommandEvent& event);
+ void OnPreferencesUpdated (EventArgs &args);
+ void OnRemoveKeyfilesMenuItemSelected (wxCommandEvent& event) { ChangePassword (ChangePasswordDialog::Mode::RemoveAllKeyfiles); }
+ void OnRepairFilesystemMenuItemSelected( wxCommandEvent& event ) { CheckFilesystem (true); }
+ void OnRestoreVolumeHeaderMenuItemSelected (wxCommandEvent& event);
+ void OnSecurityTokenPreferencesMenuItemSelected (wxCommandEvent& event);
+ void OnSelectDeviceAndMountMenuItemSelected (wxCommandEvent& event);
+ void OnSelectDeviceButtonClick (wxCommandEvent& event);
+ void OnSelectFileAndMountMenuItemSelected (wxCommandEvent& event);
+ void OnSelectFileButtonClick (wxCommandEvent& event);
+ void OnTimer ();
+ void OnVersionHistoryMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"history"); }
+ void OnVolumePropertiesButtonClick (wxCommandEvent& event);
+ void OnVolumeToolsButtonClick (wxCommandEvent& event);
+ void OnVolumeButtonClick (wxCommandEvent& event);
+ void OnVolumeDismounted (EventArgs &args) { UpdateVolumeList(); }
+ void OnVolumeMounted (EventArgs &args) { UpdateVolumeList(); }
+ void OnUserGuideMenuItemSelected (wxCommandEvent& event) { Gui->OpenUserGuide (this); }
+ void OnWebsiteMenuItemSelected (wxCommandEvent& event) { Gui->OpenHomepageLink (this, L"website"); }
+ void OnWipeCacheButtonClick (wxCommandEvent& event);
+ void OrganizeFavorites (const FavoriteVolumeList &favorites, size_t newItemCount = 0);
+ void OpenSelectedVolume () const;
+ void SavePreferences () const;
+ long SlotNumberToItemIndex (uint32 slotNumber) const;
+ void SetVolumePath (const VolumePath &path) { VolumePathComboBox->SetValue (wstring (path)); }
+ void ShowTaskBarIcon (bool show = true);
+ void UpdateControls ();
+ void UpdateVolumeList ();
+ void UpdateWipeCacheButton ();
+ void WipeCache ();
+
+ struct VolumeActivityMapEntry
+ {
+ VolumeActivityMapEntry () { }
+
+ VolumeActivityMapEntry (const VolumeInfo &volume, wxLongLong lastActivityTime)
+ : LastActivityTime (lastActivityTime),
+ SerialInstanceNumber (volume.SerialInstanceNumber),
+ TotalDataRead (volume.TotalDataRead),
+ TotalDataWritten (volume.TotalDataWritten)
+ { }
+
+ wxLongLong LastActivityTime;
+ uint64 SerialInstanceNumber;
+ uint64 TotalDataRead;
+ uint64 TotalDataWritten;
+ };
+
+ map <int, FavoriteVolume> FavoriteVolumesMenuMap;
+ bool ListItemRightClickEventPending;
+ VolumeInfoList MountedVolumes;
+ auto_ptr <wxTaskBarIcon> mTaskBarIcon;
+ auto_ptr <wxTimer> mTimer;
+ long SelectedItemIndex;
+ VolumeSlotNumber SelectedSlotNumber;
+ int ShowRequestFifo;
+ map <wstring, VolumeActivityMapEntry> VolumeActivityMap;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_MainFrame
diff --git a/src/Main/Forms/MountOptionsDialog.cpp b/src/Main/Forms/MountOptionsDialog.cpp
new file mode 100644
index 00000000..f4fea7a6
--- /dev/null
+++ b/src/Main/Forms/MountOptionsDialog.cpp
@@ -0,0 +1,174 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/Main.h"
+#include "Main/GraphicUserInterface.h"
+#include "MountOptionsDialog.h"
+
+namespace TrueCrypt
+{
+ MountOptionsDialog::MountOptionsDialog (wxWindow *parent, MountOptions &options, const wxString &title, bool disableMountOptions)
+ : MountOptionsDialogBase (parent, wxID_ANY, wxString()
+#ifdef __WXGTK__ // GTK apparently needs wxRESIZE_BORDER to support dynamic resizing
+ , wxDefaultPosition, wxSize (-1,-1), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER
+#endif
+ ), Options (options)
+ {
+ if (!title.empty())
+ this->SetTitle (title);
+ else if (options.Path && !options.Path->IsEmpty())
+ this->SetTitle (StringFormatter (LangString["ENTER_PASSWORD_FOR"], wstring (*options.Path)));
+ else
+ this->SetTitle (LangString["ENTER_TC_VOL_PASSWORD"]);
+
+ if (disableMountOptions)
+ OptionsButton->Show (false);
+
+ PasswordPanel = new VolumePasswordPanel (this, options.Password, options.Keyfiles, !disableMountOptions);
+ PasswordPanel->SetCacheCheckBoxValidator (wxGenericValidator (&Options.CachePassword));
+
+ PasswordSizer->Add (PasswordPanel, 1, wxALL | wxEXPAND);
+
+#ifdef __WXGTK__
+ FilesystemOptionsSizer->Remove (FilesystemSpacer);
+ OptionsPanel->Show (false);
+ Fit();
+ Layout();
+ SetMinSize (GetSize());
+#endif
+
+ NoFilesystemCheckBox->SetValidator (wxGenericValidator (&Options.NoFilesystem));
+ RemovableCheckBox->SetValidator (wxGenericValidator (&Options.Removable));
+ PartitionInSystemEncryptionScopeCheckBox->SetValidator (wxGenericValidator (&Options.PartitionInSystemEncryptionScope));
+
+ TransferDataToWindow();
+
+ if (Options.MountPoint && !Options.MountPoint->IsEmpty())
+ MountPointTextCtrl->SetValue (wstring (*Options.MountPoint));
+
+ FilesystemOptionsTextCtrl->SetValue (Options.FilesystemOptions);
+
+ ReadOnlyCheckBox->SetValue (Options.Protection == VolumeProtection::ReadOnly);
+ ProtectionCheckBox->SetValue (Options.Protection == VolumeProtection::HiddenVolumeReadOnly);
+
+ OptionsButtonLabel = OptionsButton->GetLabel();
+ OptionsButton->SetLabel (OptionsButtonLabel + L" >");
+ OptionsPanel->Show (false);
+
+ ProtectionPasswordPanel = new VolumePasswordPanel (OptionsPanel, options.ProtectionPassword, options.ProtectionKeyfiles, false, true, true, false, false, _("P&assword to hidden volume:"));
+ ProtectionPasswordSizer->Add (ProtectionPasswordPanel, 1, wxALL | wxEXPAND);
+
+ UpdateDialog();
+ Center();
+ }
+
+ void MountOptionsDialog::OnInitDialog (wxInitDialogEvent& event)
+ {
+ PasswordPanel->SetFocusToPasswordTextCtrl();
+ }
+
+ void MountOptionsDialog::OnMountPointButtonClick (wxCommandEvent& event)
+ {
+ DirectoryPath dir = Gui->SelectDirectory (this, wxEmptyString, false);
+ if (!dir.IsEmpty())
+ MountPointTextCtrl->SetValue (wstring (dir));
+ }
+
+ void MountOptionsDialog::OnOKButtonClick (wxCommandEvent& event)
+ {
+ TransferDataFromWindow();
+
+ Options.Password = PasswordPanel->GetPassword();
+ Options.Keyfiles = PasswordPanel->GetKeyfiles();
+
+ if (ReadOnlyCheckBox->IsChecked())
+ {
+ Options.Protection = VolumeProtection::ReadOnly;
+ }
+ else if (ProtectionCheckBox->IsChecked())
+ {
+ Options.Protection = VolumeProtection::HiddenVolumeReadOnly;
+ Options.ProtectionPassword = ProtectionPasswordPanel->GetPassword();
+ Options.ProtectionKeyfiles = ProtectionPasswordPanel->GetKeyfiles();
+ }
+ else
+ {
+ Options.Protection = VolumeProtection::None;
+ }
+
+ wstring mountPoint (MountPointTextCtrl->GetValue());
+ if (!mountPoint.empty())
+ Options.MountPoint = make_shared <DirectoryPath> (mountPoint);
+
+ Options.FilesystemOptions = FilesystemOptionsTextCtrl->GetValue();
+
+ try
+ {
+ if (Options.Password)
+ Options.Password->CheckPortability();
+ }
+ catch (UnportablePassword &)
+ {
+ Gui->ShowWarning (LangString ["UNSUPPORTED_CHARS_IN_PWD_RECOM"]);
+ }
+
+ EndModal (wxID_OK);
+ }
+
+ void MountOptionsDialog::OnOptionsButtonClick (wxCommandEvent& event)
+ {
+ FreezeScope freeze (this);
+ OptionsPanel->Show (!OptionsPanel->IsShown());
+ UpdateDialog();
+ OptionsButton->SetLabel (OptionsButtonLabel + (OptionsPanel->IsShown() ? L" <" : L" >"));
+ }
+
+ void MountOptionsDialog::OnProtectionCheckBoxClick (wxCommandEvent& event)
+ {
+ FreezeScope freeze (this);
+ ProtectionPasswordPanel->Show (event.IsChecked());
+ Fit();
+ Layout();
+ ProtectionPasswordPanel->SetFocusToPasswordTextCtrl();
+ }
+
+ void MountOptionsDialog::OnProtectionHyperlinkClick (wxHyperlinkEvent& event)
+ {
+ Gui->OpenHomepageLink (this, L"hiddenvolprotection");
+ }
+
+ void MountOptionsDialog::UpdateDialog ()
+ {
+ FreezeScope freeze (this);
+
+#ifdef TC_WINDOWS
+ FilesystemSizer->Show (false);
+#else
+ FilesystemOptionsSizer->Show (!NoFilesystemCheckBox->IsChecked());
+
+# ifdef TC_MACOSX
+ FilesystemOptionsStaticText->Show (false);
+ FilesystemOptionsTextCtrl->Show (false);
+# endif
+
+ if (!Options.Path || Options.Path->IsEmpty())
+ {
+ MountPointTextCtrlStaticText->Show (false);
+ MountPointTextCtrl->Show (false);
+ MountPointButton->Show (false);
+ }
+ RemovableCheckBox->Show (false);
+#endif
+ ProtectionSizer->Show (!ReadOnlyCheckBox->IsChecked());
+ ProtectionPasswordPanel->Show (!ReadOnlyCheckBox->IsChecked() && ProtectionCheckBox->IsChecked());
+
+ Fit();
+ Layout();
+ }
+}
diff --git a/src/Main/Forms/MountOptionsDialog.h b/src/Main/Forms/MountOptionsDialog.h
new file mode 100644
index 00000000..c5ef8097
--- /dev/null
+++ b/src/Main/Forms/MountOptionsDialog.h
@@ -0,0 +1,42 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_MountOptionsDialog
+#define TC_HEADER_Main_Forms_MountOptionsDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+#include "VolumePasswordPanel.h"
+
+namespace TrueCrypt
+{
+ class MountOptionsDialog : public MountOptionsDialogBase
+ {
+ public:
+ MountOptionsDialog (wxWindow* parent, MountOptions &options, const wxString &title = wxEmptyString, bool disableMountOptions = false);
+ void OnShow ();
+
+ protected:
+ void OnInitDialog (wxInitDialogEvent& event);
+ void OnMountPointButtonClick (wxCommandEvent& event);
+ void OnNoFilesystemCheckBoxClick (wxCommandEvent& event) { UpdateDialog(); }
+ void OnOKButtonClick (wxCommandEvent& event);
+ void OnOptionsButtonClick (wxCommandEvent& event);
+ void OnProtectionCheckBoxClick (wxCommandEvent& event);
+ void OnProtectionHyperlinkClick (wxHyperlinkEvent& event);
+ void OnReadOnlyCheckBoxClick (wxCommandEvent& event) { UpdateDialog(); }
+ void UpdateDialog ();
+
+ MountOptions &Options;
+ wxString OptionsButtonLabel;
+ VolumePasswordPanel *PasswordPanel;
+ VolumePasswordPanel *ProtectionPasswordPanel;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_MountOptionsDialog
diff --git a/src/Main/Forms/NewSecurityTokenKeyfileDialog.cpp b/src/Main/Forms/NewSecurityTokenKeyfileDialog.cpp
new file mode 100644
index 00000000..ed728254
--- /dev/null
+++ b/src/Main/Forms/NewSecurityTokenKeyfileDialog.cpp
@@ -0,0 +1,45 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/GraphicUserInterface.h"
+#include "NewSecurityTokenKeyfileDialog.h"
+
+namespace TrueCrypt
+{
+ NewSecurityTokenKeyfileDialog::NewSecurityTokenKeyfileDialog (wxWindow* parent, const wstring &keyfileName) : NewSecurityTokenKeyfileDialogBase (parent)
+ {
+ list <SecurityTokenInfo> tokens = SecurityToken::GetAvailableTokens();
+
+ if (tokens.empty())
+ throw_err (LangString ["NO_TOKENS_FOUND"]);
+
+ foreach (const SecurityTokenInfo &token, tokens)
+ {
+ wstringstream tokenLabel;
+ tokenLabel << L"[" << token.SlotId << L"] " << token.Label;
+
+ SecurityTokenChoice->Append (tokenLabel.str(), (void *) token.SlotId);
+ }
+
+ SecurityTokenChoice->Select (0);
+ KeyfileNameTextCtrl->SetValue (keyfileName);
+
+ KeyfileNameTextCtrl->SetMinSize (wxSize (Gui->GetCharWidth (KeyfileNameTextCtrl) * 32, -1));
+
+ Fit();
+ Layout();
+ Center();
+ }
+
+ void NewSecurityTokenKeyfileDialog::OnKeyfileNameChanged (wxCommandEvent& event)
+ {
+ StdButtonsOK->Enable (!KeyfileNameTextCtrl->GetValue().empty());
+ event.Skip();
+ }
+}
diff --git a/src/Main/Forms/NewSecurityTokenKeyfileDialog.h b/src/Main/Forms/NewSecurityTokenKeyfileDialog.h
new file mode 100644
index 00000000..11891dbb
--- /dev/null
+++ b/src/Main/Forms/NewSecurityTokenKeyfileDialog.h
@@ -0,0 +1,30 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_NewSecurityTokenKeyfileDialog
+#define TC_HEADER_Main_Forms_NewSecurityTokenKeyfileDialog
+
+#include "Forms.h"
+#include "Common/SecurityToken.h"
+
+namespace TrueCrypt
+{
+ class NewSecurityTokenKeyfileDialog : public NewSecurityTokenKeyfileDialogBase
+ {
+ public:
+ NewSecurityTokenKeyfileDialog (wxWindow* parent, const wstring &keyfileName);
+
+ wstring GetKeyfileName () const { return wstring (KeyfileNameTextCtrl->GetValue()); }
+ CK_SLOT_ID GetSelectedSlotId () const { return reinterpret_cast <CK_SLOT_ID> (SecurityTokenChoice->GetClientData (SecurityTokenChoice->GetSelection())); }
+
+ protected:
+ void OnKeyfileNameChanged (wxCommandEvent& event);
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_NewSecurityTokenKeyfileDialog
diff --git a/src/Main/Forms/PreferencesDialog.cpp b/src/Main/Forms/PreferencesDialog.cpp
new file mode 100644
index 00000000..b10a5cdd
--- /dev/null
+++ b/src/Main/Forms/PreferencesDialog.cpp
@@ -0,0 +1,488 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include <wx/dynlib.h>
+#ifdef TC_WINDOWS
+#include <wx/msw/registry.h>
+#endif
+#include "Common/SecurityToken.h"
+#include "Main/Main.h"
+#include "Main/Application.h"
+#include "Main/GraphicUserInterface.h"
+#include "Volume/Cipher.h"
+#include "PreferencesDialog.h"
+
+namespace TrueCrypt
+{
+ PreferencesDialog::PreferencesDialog (wxWindow* parent)
+ : PreferencesDialogBase (parent),
+ LastVirtualKeyPressed (0),
+ Preferences (Gui->GetPreferences()),
+ RestoreValidatorBell (false)
+ {
+#define TC_CHECK_BOX_VALIDATOR(NAME) (TC_JOIN(NAME,CheckBox))->SetValidator (wxGenericValidator (&Preferences.NAME));
+
+#ifdef TC_MACOSX
+ PreferencesNotebook->SetMinSize (wxSize (Gui->GetCharWidth (PreferencesNotebook) * 108, -1));
+#endif
+ // Security
+ TC_CHECK_BOX_VALIDATOR (DismountOnLogOff);
+ TC_CHECK_BOX_VALIDATOR (DismountOnPowerSaving);
+ TC_CHECK_BOX_VALIDATOR (DismountOnScreenSaver);
+ TC_CHECK_BOX_VALIDATOR (DismountOnInactivity);
+ DismountOnInactivitySpinCtrl->SetValidator (wxGenericValidator (&Preferences.MaxVolumeIdleTime));
+ TC_CHECK_BOX_VALIDATOR (ForceAutoDismount);
+ PreserveTimestampsCheckBox->SetValidator (wxGenericValidator (&Preferences.DefaultMountOptions.PreserveTimestamps));
+ TC_CHECK_BOX_VALIDATOR (WipeCacheOnAutoDismount);
+ TC_CHECK_BOX_VALIDATOR (WipeCacheOnClose);
+
+ // Mount options
+ CachePasswordsCheckBox->SetValidator (wxGenericValidator (&Preferences.DefaultMountOptions.CachePassword));
+ MountReadOnlyCheckBox->SetValue (Preferences.DefaultMountOptions.Protection == VolumeProtection::ReadOnly);
+ MountRemovableCheckBox->SetValidator (wxGenericValidator (&Preferences.DefaultMountOptions.Removable));
+
+ FilesystemOptionsTextCtrl->SetValue (Preferences.DefaultMountOptions.FilesystemOptions);
+
+ // Keyfiles
+ TC_CHECK_BOX_VALIDATOR (UseKeyfiles);
+
+ DefaultKeyfilesPanel = new KeyfilesPanel (DefaultKeyfilesPage, make_shared <KeyfileList> (Preferences.DefaultKeyfiles));
+ DefaultKeyfilesSizer->Add (DefaultKeyfilesPanel, 1, wxALL | wxEXPAND);
+ DefaultKeyfilesSizer->Layout();
+
+ TC_CHECK_BOX_VALIDATOR (BackgroundTaskEnabled);
+ TC_CHECK_BOX_VALIDATOR (CloseBackgroundTaskOnNoVolumes);
+ CloseBackgroundTaskOnNoVolumesCheckBox->Show (!Core->IsInPortableMode());
+ TC_CHECK_BOX_VALIDATOR (BackgroundTaskMenuDismountItemsEnabled);
+ TC_CHECK_BOX_VALIDATOR (BackgroundTaskMenuMountItemsEnabled);
+ TC_CHECK_BOX_VALIDATOR (BackgroundTaskMenuOpenItemsEnabled);
+
+ // Encryption
+ AesHwCpuSupportedStaticText->SetLabel (
+#ifdef TC_AES_HW_CPU
+ (is_aes_hw_cpu_supported() ? LangString["UISTR_YES"] : LangString["UISTR_NO"]));
+#else
+ LangString["NOT_APPLICABLE_OR_NOT_AVAILABLE"]);
+#endif
+ NoHardwareCryptoCheckBox->SetValidator (wxGenericValidator (&Preferences.DefaultMountOptions.NoHardwareCrypto));
+
+ // Security tokens
+ Pkcs11ModulePathTextCtrl->SetValue (wstring (Preferences.SecurityTokenModule));
+ TC_CHECK_BOX_VALIDATOR (CloseSecurityTokenSessionsAfterMount);
+
+ // System integration
+ TC_CHECK_BOX_VALIDATOR (StartOnLogon);
+ TC_CHECK_BOX_VALIDATOR (MountDevicesOnLogon);
+ TC_CHECK_BOX_VALIDATOR (MountFavoritesOnLogon);
+
+ TC_CHECK_BOX_VALIDATOR (CloseExplorerWindowsOnDismount);
+ TC_CHECK_BOX_VALIDATOR (OpenExplorerWindowAfterMount);
+
+ NoKernelCryptoCheckBox->SetValidator (wxGenericValidator (&Preferences.DefaultMountOptions.NoKernelCrypto));
+
+#ifdef TC_WINDOWS
+ // Hotkeys
+ TC_CHECK_BOX_VALIDATOR (BeepAfterHotkeyMountDismount);
+ TC_CHECK_BOX_VALIDATOR (DisplayMessageAfterHotkeyDismount);
+#endif
+
+ TransferDataToWindow(); // Code below relies on TransferDataToWindow() called at this point
+
+#if defined (TC_WINDOWS) || defined (TC_MACOSX)
+ FilesystemSizer->Show (false);
+#else
+ // Auto-dismount is not supported on Linux as dismount may require the user to enter admin password
+ AutoDismountSizer->Show (false);
+ WipeCacheOnAutoDismountCheckBox->Show (false);
+#endif
+
+#ifndef TC_WINDOWS
+ LogOnSizer->Show (false);
+ MountRemovableCheckBox->Show (false);
+ CloseExplorerWindowsOnDismountCheckBox->Show (false);
+#endif
+
+#ifndef wxHAS_POWER_EVENTS
+ DismountOnPowerSavingCheckBox->Show (false);
+#endif
+
+#ifdef TC_MACOSX
+ DismountOnScreenSaverCheckBox->Show (false);
+ DismountOnLogOffCheckBox->SetLabel (_("TrueCrypt quits"));
+ OpenExplorerWindowAfterMountCheckBox->SetLabel (_("Open Finder window for successfully mounted volume"));
+
+ MountRemovableCheckBox->Show (false);
+ FilesystemSizer->Show (false);
+ LogOnSizer->Show (false);
+ CloseExplorerWindowsOnDismountCheckBox->Show (false);
+#endif
+
+#ifndef TC_LINUX
+ KernelServicesSizer->Show (false);
+#endif
+
+#ifdef TC_WINDOWS
+ // Hotkeys
+ list <int> colPermilles;
+ HotkeyListCtrl->InsertColumn (ColumnHotkeyDescription, LangString["ACTION"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (642);
+ HotkeyListCtrl->InsertColumn (ColumnHotkey, LangString["SHORTCUT"], wxLIST_FORMAT_LEFT, 1);
+ colPermilles.push_back (358);
+
+ vector <wstring> fields (HotkeyListCtrl->GetColumnCount());
+
+ UnregisteredHotkeys = Preferences.Hotkeys;
+ Hotkey::UnregisterList (Gui->GetMainFrame(), UnregisteredHotkeys);
+
+ foreach (shared_ptr <Hotkey> hotkey, Preferences.Hotkeys)
+ {
+ fields[ColumnHotkeyDescription] = hotkey->Description;
+ fields[ColumnHotkey] = hotkey->GetShortcutString();
+ Gui->AppendToListCtrl (HotkeyListCtrl, fields, -1, hotkey.get());
+ }
+
+ Gui->SetListCtrlHeight (HotkeyListCtrl, 5);
+
+ Layout();
+ Fit();
+ Gui->SetListCtrlColumnWidths (HotkeyListCtrl, colPermilles);
+
+ RestoreValidatorBell = !wxTextValidator::IsSilent();
+ wxTextValidator::SetBellOnError (true);
+ HotkeyTextCtrl->SetValidator (wxTextValidator (wxFILTER_INCLUDE_CHAR_LIST));
+
+ UpdateHotkeyButtons();
+#endif
+
+ // Page setup
+ for (size_t page = 0; page < PreferencesNotebook->GetPageCount(); page++)
+ {
+ wxNotebookPage *np = PreferencesNotebook->GetPage (page);
+ if (np == HotkeysPage)
+ {
+#ifndef TC_WINDOWS
+ PreferencesNotebook->RemovePage (page--);
+ continue;
+#endif
+ }
+
+ np->Layout();
+ }
+
+ Layout();
+ Fit();
+ Center();
+
+ StdButtonsOK->SetDefault();
+
+#ifdef TC_WINDOWS
+ // Hotkey timer
+ class Timer : public wxTimer
+ {
+ public:
+ Timer (PreferencesDialog *dialog) : Dialog (dialog) { }
+
+ void Notify()
+ {
+ Dialog->OnTimer();
+ }
+
+ PreferencesDialog *Dialog;
+ };
+
+ mTimer.reset (dynamic_cast <wxTimer *> (new Timer (this)));
+ mTimer->Start (25);
+#endif
+ }
+
+ PreferencesDialog::~PreferencesDialog ()
+ {
+ if (RestoreValidatorBell)
+ wxTextValidator::SetBellOnError (false);
+ }
+
+ void PreferencesDialog::SelectPage (wxPanel *page)
+ {
+ for (size_t pageIndex = 0; pageIndex < PreferencesNotebook->GetPageCount(); pageIndex++)
+ {
+ if (PreferencesNotebook->GetPage (pageIndex) == page)
+ PreferencesNotebook->ChangeSelection (pageIndex);
+ }
+ }
+
+ void PreferencesDialog::OnAssignHotkeyButtonClick (wxCommandEvent& event)
+ {
+#ifdef TC_WINDOWS
+ foreach (long item, Gui->GetListCtrlSelectedItems (HotkeyListCtrl))
+ {
+ Hotkey *hotkey = reinterpret_cast <Hotkey *> (HotkeyListCtrl->GetItemData (item));
+
+ int mods = 0;
+ mods |= HotkeyShiftCheckBox->IsChecked() ? wxMOD_SHIFT : 0;
+ mods |= HotkeyControlCheckBox->IsChecked() ? wxMOD_CONTROL : 0;
+ mods |= HotkeyAltCheckBox->IsChecked() ? wxMOD_ALT : 0;
+ mods |= HotkeyWinCheckBox->IsChecked() ? wxMOD_WIN : 0;
+
+ // F1 is help and F12 is reserved for use by the debugger at all times
+ if (mods == 0 && (LastVirtualKeyPressed == VK_F1 || LastVirtualKeyPressed == VK_F12))
+ {
+ Gui->ShowError ("CANNOT_USE_RESERVED_KEY");
+ return;
+ }
+
+ // Test if the hotkey can be registered
+ if (!this->RegisterHotKey (hotkey->Id, mods, LastVirtualKeyPressed))
+ {
+ Gui->ShowError (SystemException (SRC_POS));
+ return;
+ }
+ UnregisterHotKey (hotkey->Id);
+
+ foreach_ref (const Hotkey &h, Preferences.Hotkeys)
+ {
+ if (h.Id != hotkey->Id && h.VirtualKeyCode == LastVirtualKeyPressed && h.VirtualKeyModifiers == mods)
+ {
+ Gui->ShowError ("SHORTCUT_ALREADY_IN_USE");
+ return;
+ }
+ }
+
+ hotkey->VirtualKeyCode = LastVirtualKeyPressed;
+ hotkey->VirtualKeyModifiers = mods;
+
+ vector <wstring> fields (HotkeyListCtrl->GetColumnCount());
+ fields[ColumnHotkeyDescription] = hotkey->Description;
+ fields[ColumnHotkey] = hotkey->GetShortcutString();
+ Gui->UpdateListCtrlItem (HotkeyListCtrl, item, fields);
+
+ UpdateHotkeyButtons();
+ }
+#endif // TC_WINDOWS
+ }
+
+ void PreferencesDialog::OnBackgroundTaskEnabledCheckBoxClick (wxCommandEvent& event)
+ {
+ if (!event.IsChecked())
+ BackgroundTaskEnabledCheckBox->SetValue (!Gui->AskYesNo (LangString["CONFIRM_BACKGROUND_TASK_DISABLED"], false, true));
+ }
+
+ void PreferencesDialog::OnNoHardwareCryptoCheckBoxClick (wxCommandEvent& event)
+ {
+ if (event.IsChecked())
+ {
+ if (Gui->AskYesNo (LangString["CONFIRM_SETTING_DEGRADES_PERFORMANCE"], true, true))
+ {
+#ifdef TC_LINUX
+ Gui->ShowWarning (_("Please note that this setting takes effect only if use of the kernel cryptographic services is disabled."));
+#endif
+ }
+ else
+ NoHardwareCryptoCheckBox->SetValue (false);
+ }
+
+ Gui->ShowWarning (_("Please note that any currently mounted volumes need to be remounted before they can use this setting."));
+ }
+
+ void PreferencesDialog::OnNoKernelCryptoCheckBoxClick (wxCommandEvent& event)
+ {
+ if (event.IsChecked())
+ NoKernelCryptoCheckBox->SetValue (Gui->AskYesNo (_("Disabling the use of kernel cryptographic services can degrade performance.\n\nAre you sure?"), false, true));
+ }
+
+ void PreferencesDialog::OnClose (wxCloseEvent& event)
+ {
+#ifdef TC_WINDOWS
+ Hotkey::RegisterList (Gui->GetMainFrame(), UnregisteredHotkeys);
+#endif
+ event.Skip();
+ }
+
+ void PreferencesDialog::OnDismountOnPowerSavingCheckBoxClick (wxCommandEvent& event)
+ {
+ if (event.IsChecked() && !ForceAutoDismountCheckBox->IsChecked())
+ Gui->ShowWarning ("WARN_PREF_AUTO_DISMOUNT");
+ }
+
+ void PreferencesDialog::OnDismountOnScreenSaverCheckBoxClick (wxCommandEvent& event)
+ {
+ if (event.IsChecked() && !ForceAutoDismountCheckBox->IsChecked())
+ Gui->ShowWarning ("WARN_PREF_AUTO_DISMOUNT");
+ }
+
+ void PreferencesDialog::OnForceAutoDismountCheckBoxClick (wxCommandEvent& event)
+ {
+ if (!event.IsChecked())
+ ForceAutoDismountCheckBox->SetValue (!Gui->AskYesNo (LangString["CONFIRM_NO_FORCED_AUTODISMOUNT"], false, true));
+ }
+
+ void PreferencesDialog::OnHotkeyListItemDeselected (wxListEvent& event)
+ {
+ UpdateHotkeyButtons();
+ }
+
+ void PreferencesDialog::OnHotkeyListItemSelected (wxListEvent& event)
+ {
+ UpdateHotkeyButtons();
+ HotkeyTextCtrl->ChangeValue (LangString ["PRESS_A_KEY_TO_ASSIGN"]);
+ AssignHotkeyButton->Enable (false);
+ }
+
+ void PreferencesDialog::OnOKButtonClick (wxCommandEvent& event)
+ {
+#ifdef TC_WINDOWS
+ HotkeyTextCtrl->SetValidator (wxTextValidator (wxFILTER_NONE));
+#endif
+ if (!Validate())
+ return;
+
+ TransferDataFromWindow();
+
+ Preferences.DefaultMountOptions.Protection = MountReadOnlyCheckBox->IsChecked() ? VolumeProtection::ReadOnly : VolumeProtection::None;
+ Preferences.DefaultMountOptions.FilesystemOptions = FilesystemOptionsTextCtrl->GetValue();
+ Preferences.DefaultKeyfiles = *DefaultKeyfilesPanel->GetKeyfiles();
+
+ bool securityTokenModuleChanged = (Preferences.SecurityTokenModule != wstring (Pkcs11ModulePathTextCtrl->GetValue()));
+ Preferences.SecurityTokenModule = wstring (Pkcs11ModulePathTextCtrl->GetValue());
+
+ Gui->SetPreferences (Preferences);
+
+ try
+ {
+ if (securityTokenModuleChanged)
+ {
+ if (Preferences.SecurityTokenModule.IsEmpty())
+ {
+ if (SecurityToken::IsInitialized())
+ SecurityToken::CloseLibrary ();
+ }
+ else
+ {
+ Gui->InitSecurityTokenLibrary();
+ }
+ }
+ }
+ catch (exception &e)
+ {
+ Gui->ShowError (e);
+ }
+
+#ifdef TC_WINDOWS
+ // Hotkeys
+ Hotkey::RegisterList (Gui->GetMainFrame(), Preferences.Hotkeys);
+#endif
+
+ EndModal (wxID_OK);
+ }
+
+ void PreferencesDialog::OnPreserveTimestampsCheckBoxClick (wxCommandEvent& event)
+ {
+#ifdef TC_LINUX
+ if (!event.IsChecked())
+ Gui->ShowInfo (_("Please note that disabling this option may have no effect on volumes mounted using kernel cryptographic services."));
+#endif
+ }
+
+ void PreferencesDialog::OnRemoveHotkeyButtonClick (wxCommandEvent& event)
+ {
+#ifdef TC_WINDOWS
+ foreach (long item, Gui->GetListCtrlSelectedItems (HotkeyListCtrl))
+ {
+ Hotkey *hotkey = reinterpret_cast <Hotkey *> (HotkeyListCtrl->GetItemData (item));
+ hotkey->VirtualKeyCode = 0;
+ hotkey->VirtualKeyModifiers = 0;
+
+ vector <wstring> fields (HotkeyListCtrl->GetColumnCount());
+ fields[ColumnHotkeyDescription] = hotkey->Description;
+ fields[ColumnHotkey] = hotkey->GetShortcutString();
+ Gui->UpdateListCtrlItem (HotkeyListCtrl, item, fields);
+
+ UpdateHotkeyButtons();
+ }
+#endif
+ }
+
+ void PreferencesDialog::OnSelectPkcs11ModuleButtonClick (wxCommandEvent& event)
+ {
+ list < pair <wstring, wstring> > extensions;
+ wxString libExtension;
+ libExtension = wxDynamicLibrary::CanonicalizeName (L"x");
+
+#ifdef TC_MACOSX
+ extensions.push_back (make_pair (L"dylib", LangString["DLL_FILES"]));
+#endif
+ if (!libExtension.empty())
+ {
+ extensions.push_back (make_pair (libExtension.Mid (libExtension.find (L'.') + 1), LangString["DLL_FILES"]));
+ extensions.push_back (make_pair (L"*", L""));
+ }
+
+ string libDir;
+
+#ifdef TC_WINDOWS
+
+ char sysDir[TC_MAX_PATH];
+ GetSystemDirectoryA (sysDir, sizeof (sysDir));
+ libDir = sysDir;
+
+#elif defined (TC_MACOSX)
+ libDir = "/usr/local/lib";
+#elif defined (TC_UNIX)
+ libDir = "/usr/lib";
+#endif
+
+ Gui->ShowInfo ("SELECT_PKCS11_MODULE_HELP");
+
+ FilePathList files = Gui->SelectFiles (this, LangString["SELECT_PKCS11_MODULE"], false, false, extensions, libDir);
+ if (!files.empty())
+ Pkcs11ModulePathTextCtrl->SetValue (wstring (*files.front()));
+ }
+
+ void PreferencesDialog::OnTimer ()
+ {
+#ifdef TC_WINDOWS
+ for (UINT vKey = 0; vKey <= 0xFF; vKey++)
+ {
+ if (GetAsyncKeyState (vKey) < 0)
+ {
+ bool shift = wxGetKeyState (WXK_SHIFT);
+ bool control = wxGetKeyState (WXK_CONTROL);
+ bool alt = wxGetKeyState (WXK_ALT);
+ bool win = wxGetKeyState (WXK_WINDOWS_LEFT) || wxGetKeyState (WXK_WINDOWS_RIGHT);
+
+ if (!Hotkey::GetVirtualKeyCodeString (vKey).empty()) // If the key is allowed and its name has been resolved
+ {
+ LastVirtualKeyPressed = vKey;
+
+ HotkeyShiftCheckBox->SetValue (shift);
+ HotkeyControlCheckBox->SetValue (control);
+ HotkeyAltCheckBox->SetValue (alt);
+ HotkeyWinCheckBox->SetValue (win);
+
+ HotkeyTextCtrl->ChangeValue (Hotkey::GetVirtualKeyCodeString (LastVirtualKeyPressed));
+ UpdateHotkeyButtons();
+ return;
+ }
+ }
+ }
+#endif
+ }
+
+ void PreferencesDialog::UpdateHotkeyButtons()
+ {
+ AssignHotkeyButton->Enable (!HotkeyTextCtrl->IsEmpty() && HotkeyListCtrl->GetSelectedItemCount() > 0);
+
+ bool remove = false;
+ foreach (long item, Gui->GetListCtrlSelectedItems (HotkeyListCtrl))
+ {
+ if (reinterpret_cast <Hotkey *> (HotkeyListCtrl->GetItemData (item))->VirtualKeyCode != 0)
+ remove = true;
+ }
+ RemoveHotkeyButton->Enable (remove);
+ }
+}
diff --git a/src/Main/Forms/PreferencesDialog.h b/src/Main/Forms/PreferencesDialog.h
new file mode 100644
index 00000000..412d7c44
--- /dev/null
+++ b/src/Main/Forms/PreferencesDialog.h
@@ -0,0 +1,60 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_PreferencesDialog
+#define TC_HEADER_Main_Forms_PreferencesDialog
+
+#include "Forms.h"
+#include "Main/Main.h"
+#include "KeyfilesPanel.h"
+
+namespace TrueCrypt
+{
+ class PreferencesDialog : public PreferencesDialogBase
+ {
+ public:
+ PreferencesDialog (wxWindow* parent);
+ ~PreferencesDialog ();
+
+ void SelectPage (wxPanel *page);
+
+ protected:
+ void OnAssignHotkeyButtonClick (wxCommandEvent& event);
+ void OnBackgroundTaskEnabledCheckBoxClick (wxCommandEvent& event);
+ void OnCancelButtonClick (wxCommandEvent& event) { Close(); }
+ void OnClose (wxCloseEvent& event);
+ void OnDismountOnPowerSavingCheckBoxClick (wxCommandEvent& event);
+ void OnDismountOnScreenSaverCheckBoxClick (wxCommandEvent& event);
+ void OnForceAutoDismountCheckBoxClick (wxCommandEvent& event);
+ void OnHotkeyListItemDeselected (wxListEvent& event);
+ void OnHotkeyListItemSelected (wxListEvent& event);
+ void OnNoHardwareCryptoCheckBoxClick (wxCommandEvent& event);
+ void OnNoKernelCryptoCheckBoxClick (wxCommandEvent& event);
+ void OnOKButtonClick (wxCommandEvent& event);
+ void OnPreserveTimestampsCheckBoxClick (wxCommandEvent& event);
+ void OnRemoveHotkeyButtonClick (wxCommandEvent& event);
+ void OnSelectPkcs11ModuleButtonClick (wxCommandEvent& event);
+ void OnTimer ();
+ void UpdateHotkeyButtons();
+
+ enum
+ {
+ ColumnHotkeyDescription = 0,
+ ColumnHotkey
+ };
+
+ KeyfilesPanel *DefaultKeyfilesPanel;
+ int LastVirtualKeyPressed;
+ auto_ptr <wxTimer> mTimer;
+ UserPreferences Preferences;
+ bool RestoreValidatorBell;
+ HotkeyList UnregisteredHotkeys;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_PreferencesDialog
diff --git a/src/Main/Forms/ProgressWizardPage.cpp b/src/Main/Forms/ProgressWizardPage.cpp
new file mode 100644
index 00000000..113d9872
--- /dev/null
+++ b/src/Main/Forms/ProgressWizardPage.cpp
@@ -0,0 +1,80 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#include "System.h"
+#include "Main/GraphicUserInterface.h"
+#include "ProgressWizardPage.h"
+
+namespace TrueCrypt
+{
+ ProgressWizardPage::ProgressWizardPage (wxPanel* parent, bool enableAbort)
+ : ProgressWizardPageBase (parent),
+ PreviousGaugeValue (0),
+ ProgressBarRange (1),
+ RealProgressBarRange (1)
+ {
+#ifdef TC_MACOSX
+ ProgressGauge->SetMinSize (wxSize (-1, 12)); // OS X apparently supports only up to 12px thick progress bars
+#else
+ ProgressGauge->SetMinSize (wxSize (-1, Gui->GetCharHeight (this) * 2));
+#endif
+
+ ProgressValue.Set (0);
+ ProgressGauge->SetValue (0);
+
+ AbortButton->Show (enableAbort);
+
+ class Timer : public wxTimer
+ {
+ public:
+ Timer (ProgressWizardPage *page) : Page (page) { }
+
+ void Notify()
+ {
+ Page->OnTimer();
+ }
+
+ ProgressWizardPage *Page;
+ };
+
+ mTimer.reset (dynamic_cast <wxTimer *> (new Timer (this)));
+ mTimer->Start (30);
+ }
+
+ void ProgressWizardPage::OnAbortButtonClick (wxCommandEvent& event)
+ {
+ AbortEvent.Raise();
+ }
+
+ void ProgressWizardPage::OnTimer ()
+ {
+ uint64 value = ProgressValue.Get();
+ int gaugeValue = static_cast <int> (value * RealProgressBarRange / ProgressBarRange);
+
+ if (value == ProgressBarRange)
+ gaugeValue = RealProgressBarRange; // Prevent round-off error
+
+ if (gaugeValue != PreviousGaugeValue)
+ {
+ ProgressGauge->SetValue (gaugeValue);
+ PreviousGaugeValue = gaugeValue;
+ }
+ }
+
+ void ProgressWizardPage::SetMaxStaticTextWidth (int width)
+ {
+ InfoStaticText->Wrap (width);
+ }
+
+ void ProgressWizardPage::SetProgressRange (uint64 progressBarRange)
+ {
+ ProgressBarRange = progressBarRange;
+ RealProgressBarRange = ProgressGauge->GetSize().GetWidth();
+ ProgressGauge->SetRange (RealProgressBarRange);
+ }
+}
diff --git a/src/Main/Forms/ProgressWizardPage.h b/src/Main/Forms/ProgressWizardPage.h
new file mode 100644
index 00000000..541edd66
--- /dev/null
+++ b/src/Main/Forms/ProgressWizardPage.h
@@ -0,0 +1,42 @@
+/*
+ Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+
+#ifndef TC_HEADER_Main_Forms_ProgressWizardPage
+#define TC_HEADER_Main_Forms_ProgressWizardPage
+
+#include "Forms.h"
+
+namespace TrueCrypt
+{
+ class ProgressWizardPage : public ProgressWizardPageBase
+ {
+ public:
+ ProgressWizardPage (wxPanel* parent, bool enableAbort = false);
+ ~ProgressWizardPage () { }
+
+ void EnableAbort (bool enable = true) { AbortButton->Enable (enable); }
+ bool IsValid () { return true; }
+ void SetMaxStaticTextWidth (int width);
+ void SetPageText (const wxString &text) { InfoStaticText->SetLabel (text); }
+ void SetProgressRange (uint64 progressBarRange);
+
+ Event AbortEvent;
+ SharedVal <uint64> ProgressValue;
+
+ protected:
+ void OnAbortButtonClick (wxCommandEvent& event);
+ void OnTimer ();
+
+ auto_ptr <wxTimer> mTimer;
+ int PreviousGaugeValue;
+ uint64 ProgressBarRange;
+ int RealProgressBarRange;
+ };
+}
+
+#endif // TC_HEADER_Main_Forms_ProgressWizardPage
diff --git a/src/Main/Forms/RandomPoolEnrichmentDialog.cpp b/src/Main/Forms/RandomPoolEnrichmentDialog.cpp
new file mode 100644
index 00000000..44e45db8
--- /dev/null
+++ b/src/Main/Forms/RandomPoolEnrichmentDialog.cpp
@@ -0,0 +1,93 @@
+/*
+ Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
+
+ Governed by the TrueCrypt License 3.0 the full text of which is contained in
+ the file License.txt included in TrueCrypt binary and source code distribution
+ packages.
+*/
+