📄 creencryptwizard.cpp
字号:
}
PGPBoolean
CReEncryptWizReEncryptPage::ReEncryptStatusCallback(
PGPUInt32 percent,
void *userVal)
{
CReEncryptWizReEncryptPage *pPage = static_cast<
CReEncryptWizReEncryptPage *>(userVal);
pgpAssertAddrValid(pPage, CReEncryptWizReEncryptPage);
return pPage->ReEncryptStatusCallbackAux(percent);
}
void
CReEncryptWizReEncryptPage::ReEncryptCallbackAux()
{
try
{
CSecureArray<char> passphrase;
mPInfo->pPassphrase->Extract(passphrase);
if (IsntNull(mPInfo->pReEncryptionBegun))
*mPInfo->pReEncryptionBegun = TRUE;
mPInfo->pDisk->ReEncryptDisk(passphrase.Get(), mPInfo->algorithm,
ReEncryptStatusCallback, this);
PostMessage(WM_CONVERT_DONE);
}
catch (CComboError& error)
{
mPInfo->error = error;
PostMessage(WM_CONVERT_DONE);
}
}
void
_cdecl
CReEncryptWizReEncryptPage::ReEncryptCallback(void *userVal)
{
CReEncryptWizReEncryptPage *pPage = static_cast<
CReEncryptWizReEncryptPage *>(userVal);
pgpAssertAddrValid(pPage, CReEncryptWizReEncryptPage);
pPage->ReEncryptCallbackAux();
}
void
CReEncryptWizReEncryptPage::InitImages()
{
// initialize image list
CDC dc;
dc.AttachFromWindow(NULL, TRUE); // DC for desktop
PGPUInt32 numBits = dc.GetDeviceCaps(BITSPIXEL) *
dc.GetDeviceCaps(PLANES);
if (numBits <= 8)
{
mImages.Create(CIcon::kSmallIconWidth, CIcon::kSmallIconHeight,
ILC_COLOR | ILC_MASK, ImageIDs::kNumImageBitmaps, 0);
CBitmap images(UModuleInstance::Get(),
MAKEINTRESOURCE(IDB_IMAGES4BIT));
mImages.AddMasked(images, ImageIDs::kMaskColor);
}
else
{
mImages.Create(CIcon::kSmallIconWidth, CIcon::kSmallIconHeight,
ILC_COLOR24 | ILC_MASK, ImageIDs::kNumImageBitmaps, 0);
CBitmap images(UModuleInstance::Get(),
MAKEINTRESOURCE(IDB_IMAGES24BIT));
mImages.AddMasked(images, ImageIDs::kMaskColor);
}
// load icons
mDoingIcon.Attach(
mImages.GetIcon(ImageIDs::kDoingIcon, ILD_TRANSPARENT), TRUE);
mDoneIcon.Attach(
mImages.GetIcon(ImageIDs::kDoneIcon, ILD_TRANSPARENT), TRUE);
mFailedIcon.Attach(
mImages.GetIcon(ImageIDs::kFailedIcon, ILD_TRANSPARENT), TRUE);
}
void
CReEncryptWizReEncryptPage::OnReEncryptDone()
{
using namespace UCommonStrings;
mReEncryptThread.KillThread();
if (mShouldCancel || mPInfo->error.IsError())
{
SetWizButtons(0);
if (mPInfo->error.IsError() &&
(mPInfo->error.pgpErr != kPGPError_UserAbort))
{
ReportError(kTellDiskReEncryptFailed, kReEncryptMsgBoxTitle,
mPInfo->error);
mCurTaskBar.ShowWindow(SW_HIDE);
mCurTaskText.SetWindowText(Get(kReEncryptProgFailedText));
}
else
{
mCurTaskText.SetWindowText(Get(kReEncryptProgCanceledText));
}
mTaskIcon1.SetIcon(mFailedIcon);
}
else
{
SetWizButtons(PSWIZB_NEXT);
mCurTaskText.SetWindowText(Get(kReEncryptProgDoneText));
mTaskIcon1.SetIcon(mDoneIcon);
mCurTaskBar.SetPos(100);
}
}
BOOL
CReEncryptWizReEncryptPage::OnInitDialog(HWND focusCtrl)
{
CPGPdiskPage::OnInitDialog(focusCtrl);
mTaskIcon1.Subclass(GetDlgItem(IDC_TASKICON1));
mCurTaskBar.Subclass(GetDlgItem(IDC_CURTASK_BAR));
mCurTaskText.Subclass(GetDlgItem(IDC_CURTASK_TEXT));
InitImages();
return TRUE;
}
PGPBoolean
CReEncryptWizReEncryptPage::OnPsnQueryCancel()
{
using namespace UCommonStrings;
if (!mReEncryptThread.IsRunning())
return FALSE; // nothing's happening, we're set
else if (mShouldCancel)
return TRUE; // cancel in progress, hold tight
// Pause the conversion thread, ask user for cancel permission.
mCancelMutex.Enter();
CMessageBox messageBox;
CMessageBox::Button result = messageBox.Display(
Get(kAskIfCancelReEncrypt), Get(kReEncryptMsgBoxTitle), Handle(),
CMessageBox::kQuestionTone, CMessageBox::kYesNoStyle,
CMessageBox::kNoButton);
mShouldCancel = (result == CMessageBox::kYesButton);
mCancelMutex.Leave();
if (mShouldCancel && mReEncryptThread.IsRunning())
{
mCurTaskText.SetWindowText(Get(kReEncryptProgFailingText));
mCurTaskBar.SetPos(100);
}
return TRUE;
}
PGPInt32
CReEncryptWizReEncryptPage::OnPsnSetActive()
{
using namespace UCommonStrings;
PGPInt32 result = CPGPdiskPage::OnPsnSetActive();
if (result != 0)
return result;
SetWizButtons(0);
// init controls
mCurTaskBar.SetRange(0, 100);
mCurTaskBar.SetPos(0);
CPath path;
mPInfo->pDisk->GetPath(path);
CPath fileName;
path.GetFileNamePart(mFileName);
mFileName.RemoveExtension();
mCurTaskText.FitFormattedTextToWindow(
Get(kReEncryptProgReEncryptingText), mFileName);
mTaskIcon1.SetIcon(mDoingIcon);
// start re-encryption
mReEncryptThread.StartThread();
try
{
mShouldCancel = FALSE;
mReEncryptThread.PerformAsyncCallback(ReEncryptCallback, this);
}
catch (CComboError&)
{
mReEncryptThread.KillThread();
throw;
}
return 0;
}
PGPBoolean
CReEncryptWizReEncryptPage::PreProcess(const CMessage& msg, LRESULT& result)
{
if (msg.Message() == WM_CONVERT_DONE)
{
OnReEncryptDone();
result = 0;
return TRUE;
}
return FALSE;
}
// Class CReEncryptWizDonePage member functions
PGPInt32
CReEncryptWizDonePage::OnPsnSetActive()
{
PGPInt32 result = CPGPdiskPage::OnPsnSetActive();
if (result != 0)
return result;
SetWizButtons(PSWIZB_FINISH);
return 0;
}
// Class CReEncryptWizIntroPage member functions
BOOL
CReEncryptWizIntroPage::OnInitDialog(HWND focusCtrl)
{
CPGPdiskPage::OnInitDialog(focusCtrl);
CWindow(GetParent()).Center();
return FALSE;
}
PGPInt32
CReEncryptWizIntroPage::OnPsnSetActive()
{
PGPInt32 result = CPGPdiskPage::OnPsnSetActive();
if (result != 0)
return result;
if (mPInfo->resumingConversion)
return IDD_REWIZ_REENCRYPT;
SetWizButtons(PSWIZB_NEXT);
return 0;
}
// Class CReEncryptWizard member functions
void
CReEncryptWizard::Display(
const CPGPdiskContext& context,
const char *path,
HWND parentWnd,
PGPBoolean *pReEncryptionBegun)
{
using namespace UCommonStrings;
pgpAssertStrValid(path);
pgpAssert(CWindow(parentWnd).IsWindow());
if (IsntNull(pReEncryptionBegun))
*pReEncryptionBegun = FALSE;
// Open the PGPdisk.
CPGPdiskDisk disk;
disk.Open(context, path);
// Get admin user.
CPGPdiskUserSet diskSet;
disk.ExportUserSet(diskSet);
CPGPdiskUserIter userIter(diskSet);
CPGPdiskUser adminUser;
if (!userIter.FindAdminUser(adminUser))
THROW_PGPERROR(kPGPError_ItemNotFound);
// Make sure user wants to remove passphrases and missing public keys.
CPGPdiskUser user;
PGPBoolean sawAtRiskUser = FALSE;
userIter.Rewind();
while (userIter.Next(user))
{
if (!user.IsAdminUser() && (user.HasSymmetricKey() ||
IsPubNotInRing(user)))
{
sawAtRiskUser = TRUE;
}
}
if (sawAtRiskUser)
{
CMessageBox messageBox;
CMessageBox::Button result = messageBox.Display(
Get(kAskIfNukeSymsAndMissingPubs),
Get(kReEncryptMsgBoxTitle), parentWnd,
CMessageBox::kWarningTone, CMessageBox::kYesNoStyle,
CMessageBox::kNoButton);
if (result == CMessageBox::kNoButton)
THROW_PGPERROR(kPGPError_UserAbort);
}
// Get passphrase for admin user.
CPath fileName;
CPath(path).GetFileNamePart(fileName);
fileName.RemoveExtension();
CPGPdiskUserSet adminUserSet(adminUser);
CPassphraseDialog adminPassDlg;
adminPassDlg.AskForPassphrase(disk, adminUserSet, parentWnd, adminUser,
Get(kSinglePassAdminText), fileName);
// Create the wizard pages.
ReEncryptInfo ciInfo;
CPGPGlobalRandomPool randomPool(context.PGPContext());
const char *title = Get(kReEncryptTitle);
ciInfo.pContext = &context;
ciInfo.pDisk = &disk;
ciInfo.pPassphrase = &adminPassDlg.Passphrase();
ciInfo.resumingConversion = disk.IsBeingReEncrypted();
ciInfo.pReEncryptionBegun = pReEncryptionBegun;
ciInfo.pRandomPool = &randomPool;
ciInfo.algorithm = disk.Algorithm();
CReEncryptWizAlgoPage algoPage(&ciInfo);
CReEncryptWizReEncryptPage convertPage(&ciInfo);
CReEncryptWizDonePage donePage(&ciInfo);
CReEncryptWizIntroPage introPage(&ciInfo);
CRandomDataPage randomPage(&ciInfo.algorithm,
ciInfo.pRandomPool);
LoadSidebar();
algoPage.Create(title);
randomPage.Create(title);
convertPage.Create(title);
donePage.Create(title, FALSE, &mSidebarBitmap, &mSidebarPalette);
introPage.Create(title, FALSE, &mSidebarBitmap, &mSidebarPalette);
AddPage(&introPage);
AddPage(&algoPage);
AddPage(&randomPage);
AddPage(&convertPage);
AddPage(&donePage);
// Show the wizard.
CPropertySheet::Create(parentWnd, TRUE);
// flush prefs
try
{
CPGPclPrefs prefs(context.PGPclPrefs());
prefs.Flush();
}
catch (CComboError&) { }
}
PGPBoolean
CReEncryptWizard::IsPubNotInRing(const CPGPdiskUser& user) const
{
CPGPKeyID keyID;
user.GetPGPKeyID(keyID);
PGPPublicKeyAlgorithm algorithm = keyID.Algorithm();
try
{
CPGPdiskContext context(user.Context());
CPGPKey pgpKey(context.PGPKeyDB(), keyID);
return FALSE;
}
catch (CComboError&)
{
return TRUE;
}
}
void
CReEncryptWizard::LoadSidebar()
{
CDC dc;
dc.AttachFromWindow(NULL);
PGPUInt32 numBits = dc.GetDeviceCaps(BITSPIXEL) *
dc.GetDeviceCaps(PLANES);
PGPUInt32 uintRsrc;
if (numBits <= 1)
uintRsrc = IDB_SIDEBAR1;
else if (numBits <= 4)
uintRsrc = IDB_SIDEBAR4;
else
uintRsrc = IDB_SIDEBAR8;
mSidebarBitmap.CreateWithPalette(UModuleInstance::Get(),
MAKEINTRESOURCE(uintRsrc), mSidebarPalette);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -