📄 cnewuserpages.cpp
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: CNewUserPages.cpp,v 1.27 2002/11/05 02:10:53 wjb Exp $
____________________________________________________________________________*/
#include "pgpClassesConfig.h"
#include "pgpBuild.h"
#include "pgpPassphraseUtils.h"
#include "CSecureString.h"
#include "CString.h"
#include "CButton.h"
#include "CDC.h"
#include "CEdit.h"
#include "CUTF8Edit.h"
#include "CInfoBar.h"
#include "CMessageBox.h"
#include "CProgressBar.h"
#include "CRect.h"
#include "CSecureRichEdit.h"
#include "UModuleInstance.h"
#include "UCommonStrings.h"
#include "CPGPclPrefs.h"
#include "CPGPdiskEngine.h"
#include "CPGPKey.h"
#include "CPGPKeyDB.h"
#include "PGPdiskUIPriv.h"
#include "CNewUserPages.h"
#include "CPGPdiskPage.h"
#include "CPublicKeysView.h"
#include "PGPdiskHelp.h"
#include "Resource.h"
_USING_PGP
_UNNAMED_BEGIN
// Constants
enum
{
kEnforcePassMinLength = 0x01,
kEnforcePassMinQuality = 0x02,
kBadPassConfirm = 0x01,
kBadPassMinLength = 0x02,
kBadPassMinQuality = 0x04,
kDLUMarginControl = 4,
kDLUMarginDialog = 7
};
DWORD WizAskChoicePageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_DISKSTATIC3, -1,
IDC_HEADING, -1,
IDC_PUBKEY_RADIO, IDH_PGPDISKUI_WIZASKCHOICEPAGE_PUBKEY,
IDC_PASS_RADIO, IDH_PGPDISKUI_WIZASKCHOICEPAGE_PASSPHRASE,
IDC_USERNAME_CAPTION, IDH_PGPDISKUI_WIZASKCHOICEPAGE_USERNAME,
IDC_USERNAME_EDIT, IDH_PGPDISKUI_WIZASKCHOICEPAGE_USERNAME,
IDC_ROUSER_CHECK, IDH_PGPDISKUI_WIZASKCHOICEPAGE_READONLY,
0, 0
};
DWORD WizAskPassPageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_HEADING, -1,
IDC_PHRASELENGTH_TEXT, -1,
IDC_HIDETYPE_CHECK, IDH_PGPDISKUI_WIZASKPASSPAGE_HIDETYPING,
IDC_PASSPHRASE_CAPTION, IDH_PGPDISKUI_WIZASKPASSPAGE_PASSPHRASE,
IDC_PASSPHRASE_EDIT, IDH_PGPDISKUI_WIZASKPASSPAGE_PASSPHRASE,
IDC_CONFIRM_CAPTION, IDH_PGPDISKUI_WIZASKPASSPAGE_CONFIRMPHRASE,
IDC_QUALITY_CAPTION, IDH_PGPDISKUI_WIZASKPASSPAGE_QUALITYBAR,
IDC_QUALITY_BAR, IDH_PGPDISKUI_WIZASKPASSPAGE_QUALITYBAR,
IDC_MINQUALITY_CAPTION, IDH_PGPDISKUI_WIZASKPASSPAGE_MINQUALITYBAR,
IDC_MINQUALITY_BAR, IDH_PGPDISKUI_WIZASKPASSPAGE_MINQUALITYBAR,
IDC_CONFIRM_EDIT, IDH_PGPDISKUI_WIZASKPASSPAGE_CONFIRMPHRASE,
0, 0
};
DWORD WizAskPubKeyPageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_HEADING, -1,
IDC_KEYS_VIEW, IDH_PGPDISKUI_WIZASKPUBKEYPAGE_PUBKEYSVIEW,
0, 0
};
DWORD WizBadPassPageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_HEADING, -1,
IDC_REJECT_TEXT, -1,
0, 0
};
_UNNAMED_END
// Types
struct CNewUserPages::PagesInfo
{
PGPBoolean isFinished;
const CPGPdiskContext *pContext;
const CPGPdiskUserSet *pDiskUsers;
CPGPKeySet keysToChoose;
PGPBoolean autoUseDefKey;
PGPBoolean defKeyPrefExists;
PGPBoolean defKeySeen;
CPGPKeyID defKeyID;
PGPBoolean isForAdminUser;
CString warnDlgTitle;
PGPUInt32 enforcePassFlags;
PGPUInt32 badPassFlags;
PGPUInt32 minPassLength;
PGPUInt32 minPassQuality;
PGPBoolean userChosePub;
PGPBoolean userChoseRO;
CPGPKey pgpKey[100];
PGPUInt32 uNumPubKeys;
PGPBoolean singleSelect;
CString userName;
CSecureString securePass;
};
// Class CNewUserAskChoicePage
class PGP::CNewUserAskChoicePage : public CPGPdiskPage
{
public:
CNewUserAskChoicePage(CNewUserPages::PagesInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, CNewUserPages::PagesInfo);
}
~CNewUserAskChoicePage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_WIZ_ASKCHOICE;
}
private:
CButton mPassRadio;
CButton mPubKeyRadio;
CButton mROUserCheck;
CUTF8Edit mUserNameEdit;
CStatic mUserNameText;
CNewUserPages::PagesInfo *mPInfo;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_WIZASKCHOICEPAGE;}
PVOID GetPageHelpIds() const {return WizAskChoicePageHelpIDs;}
void InitControls();
PGPBoolean ValidateUserName(const char * userName);
void OnPassRadio();
void OnPubKeyRadio();
BOOL OnCommand(PGPUInt16 notifyCode, PGPUInt16 itemId, HWND ctrl);
BOOL OnInitDialog(HWND focusCtrl);
PGPInt32 OnPsnSetActive();
PGPInt32 OnPsnWizNext();
};
// Class CNewUserBadPassPage
class PGP::CNewUserBadPassPage : public CPGPdiskPage
{
private:
enum
{
kDLUStartYForInfoBar = 37,
kBadConfirmStringId = 0,
kBadMinLengthStringId = 1,
kBadMinQualityStringId = 2,
kMinNewPassLength = 8,
};
public:
CNewUserBadPassPage(CNewUserPages::PagesInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, PagesInfo);
}
~CNewUserBadPassPage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_WIZ_BADPASS;
}
private:
CInfoBar mBadPassBar;
CStatic mRejectText;
CNewUserPages::PagesInfo *mPInfo;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_WIZBADPASSPAGE;}
PVOID GetPageHelpIds() const {return WizBadPassPageHelpIDs;}
void InitControls();
BOOL OnInitDialog(HWND focusCtrl);
PGPInt32 OnPsnSetActive();
PGPInt32 OnPsnWizNext();
};
// Class CNewUserAskPassPage
class PGP::CNewUserAskPassPage : public CPGPdiskPage
{
private:
enum
{
kDLUYOffsetCapsLockBar = 15,
kDLUWidthCapsLockBar = 110,
kCapsLockStringId = 0
};
public:
CNewUserAskPassPage(CNewUserPages::PagesInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, CNewUserPages::PagesInfo);
}
~CNewUserAskPassPage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_WIZ_ASKPASS;
}
private:
CNewUserPages::PagesInfo *mPInfo;
CButton mHideTypingCheck;
CInfoBar mCapsLockBar;
CProgressBar mMinQualityBar;
CProgressBar mQualityBar;
CSecureRichEdit mPassphraseEdit;
CSecureRichEdit mConfirmEdit;
CStatic mMinQualityText;
CStatic mPhraseLengthText;
CSecureRichEdit *mIHadFocus;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_WIZASKPASSPAGE;}
PVOID GetPageHelpIds() const {return WizAskPassPageHelpIDs;}
void CreateCapsLockBar();
void InitControls();
void InitDialogText();
void InitQualityPrefs();
void UpdatePassphraseFlags();
void UpdatePassphraseQuality();
void SetCapsLockMessageState();
void WarnCapsLock(PGPBoolean warn);
void OnHideTypeCheck();
BOOL OnCommand(PGPUInt16 notifyCode, PGPUInt16 itemId, HWND ctrl);
BOOL OnInitDialog(HWND focusCtrl);
void OnKeyUp(PGPUInt32 vKey, PGPUInt32 keyData);
PGPInt32 OnPsnSetActive();
PGPInt32 OnPsnWizNext();
PGPUInt32 OnSecureEditEvent(HWND view, PGPUInt32 event);
PGPBoolean PreProcess(const CMessage& msg, LRESULT& result);
};
// Class CNewUserAskPubKeyPage
class PGP::CNewUserAskPubKeyPage : public CPGPdiskPage
{
public:
CNewUserAskPubKeyPage(CNewUserPages::PagesInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, CNewUserPages::PagesInfo);
}
~CNewUserAskPubKeyPage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_WIZ_ASKPUBKEY;
}
private:
CNewUserPages::PagesInfo *mPInfo;
CPublicKeysView mPubKeysView;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_WIZASKPUBKEYPAGE;}
PVOID GetPageHelpIds() const {return WizAskPubKeyPageHelpIDs;}
void InitPublicKeysView();
BOOL OnInitDialog(HWND focusCtrl);
PGPUInt32 OnNotify(PGPUInt16 ctrlId, LPNMHDR pNMHDR);
PGPInt32 OnPsnSetActive();
PGPInt32 OnPsnWizNext();
};
// Class CNewUserAskChoicePage member functions
void
CNewUserAskChoicePage::InitControls()
{
if (mPInfo->keysToChoose.Count() == 0)
{
mPubKeyRadio.EnableWindow(FALSE);
OnPassRadio();
}
else
{
OnPubKeyRadio();
}
if (mPInfo->isForAdminUser)
{
mROUserCheck.EnableWindow(FALSE);
mROUserCheck.ShowWindow(FALSE);
}
}
PGPBoolean
CNewUserAskChoicePage::ValidateUserName(const char *userName)
{
using namespace UCommonStrings;
pgpAssertStrValid(userName);
CMessageBox messageBox;
PGPUInt32 length = strlen(userName);
if (length == 0)
{
messageBox.Display(Get(kTellUserNameEmpty), mPInfo->warnDlgTitle,
Handle());
return FALSE;
}
else if (length > kPGPdiskMaxUserNameSize)
{
CString tooShort;
tooShort.Format(Get(kTellUserNameTooLong), kPGPdiskMaxUserNameSize);
messageBox.Display(tooShort, mPInfo->warnDlgTitle, Handle());
return FALSE;
}
CPGPdiskUserIter keyIter(*mPInfo->pDiskUsers);
CPGPdiskUser key;
if (keyIter.SearchOnUserName(userName, key))
{
messageBox.Display(Get(kTellUserNameInUse), mPInfo->warnDlgTitle,
Handle());
return FALSE;
}
return TRUE;
}
void
CNewUserAskChoicePage::OnPassRadio()
{
mPassRadio.SetCheck(BST_CHECKED);
mPubKeyRadio.SetCheck(BST_UNCHECKED);
mUserNameEdit.EnableWindow(TRUE);
mUserNameText.EnableWindow(TRUE);
mUserNameEdit.SetFocus();
}
void
CNewUserAskChoicePage::OnPubKeyRadio()
{
mPassRadio.SetCheck(BST_UNCHECKED);
mPubKeyRadio.SetCheck(BST_CHECKED);
mUserNameEdit.EnableWindow(FALSE);
mUserNameText.EnableWindow(FALSE);
}
BOOL
CNewUserAskChoicePage::OnCommand(
PGPUInt16 notifyCode,
PGPUInt16 itemId,
HWND ctrl)
{
if (notifyCode == BN_CLICKED)
{
switch (itemId)
{
case IDC_PASS_RADIO:
OnPassRadio();
return TRUE;
case IDC_PUBKEY_RADIO:
OnPubKeyRadio();
return TRUE;
}
}
return CPGPdiskPage::OnCommand(notifyCode, itemId, ctrl);
}
BOOL
CNewUserAskChoicePage::OnInitDialog(HWND focusCtrl)
{
CPGPdiskPage::OnInitDialog(focusCtrl);
// Attach controls.
mPassRadio.Subclass(GetDlgItem(IDC_PASS_RADIO));
mPubKeyRadio.Subclass(GetDlgItem(IDC_PUBKEY_RADIO));
mROUserCheck.Subclass(GetDlgItem(IDC_ROUSER_CHECK));
mUserNameEdit.Subclass(GetDlgItem(IDC_USERNAME_EDIT));
mUserNameText.Subclass(GetDlgItem(IDC_USERNAME_CAPTION));
// Prepare controls.
InitControls();
return TRUE;
}
PGPInt32
CNewUserAskChoicePage::OnPsnSetActive()
{
PGPInt32 result = CPGPdiskPage::OnPsnSetActive();
if (result != 0)
return result;
if (mPInfo->autoUseDefKey &&
(mPInfo->keysToChoose.Count() > 0))
{
mPInfo->userChoseRO = FALSE;
mPInfo->userChosePub = TRUE;
return -1;
}
SetWizButtons(PSWIZB_BACK | PSWIZB_NEXT);
return 0;
}
PGPInt32
CNewUserAskChoicePage::OnPsnWizNext()
{
PGPInt32 result = CPGPdiskPage::OnPsnWizNext();
if (result != 0)
return result;
if (mPassRadio.GetCheck() == BST_CHECKED)
{
mPInfo->userChosePub = FALSE;
CString userName;
mUserNameEdit.GetWindowText(userName);
if (!ValidateUserName(userName))
{
mUserNameEdit.SetFocus();
mUserNameEdit.SetSel(0, -1);
result = -1;
}
else
{
mPInfo->userName = userName;
}
}
else
{
mPInfo->userChosePub = TRUE;
}
if (!mPInfo->isForAdminUser)
mPInfo->userChoseRO = (mROUserCheck.GetCheck() == BST_CHECKED);
else
mPInfo->userChoseRO = FALSE;
return result;
}
// Class CNewUserBadPassPage member functions
void
CNewUserBadPassPage::InitControls()
{
// Create bad pass info bar.
CRect messageRect;
mRejectText.GetWindowRect(messageRect);
ScreenToClient(messageRect);
CPoint origin(messageRect.Left(), VertDLUToPixel(kDLUStartYForInfoBar));
PGPUInt32 width = messageRect.Right() - messageRect.Left();
mBadPassBar.Create(UModuleInstance::Get(), Handle(), origin, width);
}
BOOL
CNewUserBadPassPage::OnInitDialog(HWND focusCtrl)
{
CPGPdiskPage::OnInitDialog(focusCtrl);
// Attach controls.
mRejectText.Subclass(GetDlgItem(IDC_REJECT_TEXT));
// Initialize controls.
InitControls();
return TRUE;
}
PGPInt32
CNewUserBadPassPage::OnPsnSetActive()
{
using namespace UCommonStrings;
PGPInt32 result = CPGPdiskPage::OnPsnSetActive();
if (result != 0)
return result;
if (mPInfo->userChosePub || (mPInfo->badPassFlags == 0))
return -1;
mBadPassBar.Empty();
PGPBoolean rejected = FALSE;
if (mPInfo->badPassFlags & kBadPassConfirm)
{
rejected = TRUE;
mBadPassBar.AddString(mBadPassBar.NumLines(),
Get(kNewUserBadPassConfirm), kBadConfirmStringId);
}
else
{
if ((mPInfo->badPassFlags & kBadPassMinLength) &&
(mPInfo->enforcePassFlags & kEnforcePassMinLength))
{
rejected = TRUE;
CString minLengthString;
minLengthString.Format(Get(kNewUserBadPassMinLengthReject),
mPInfo->minPassLength);
mBadPassBar.AddString(mBadPassBar.NumLines(), minLengthString,
kBadMinLengthStringId);
}
if ((mPInfo->enforcePassFlags & kEnforcePassMinQuality) &&
(mPInfo->badPassFlags & kBadPassMinQuality))
{
rejected = TRUE;
CString minQualityString;
minQualityString.Format(Get(kNewUserBadPassMinQualityReject),
mPInfo->minPassQuality);
mBadPassBar.AddString(mBadPassBar.NumLines(), minQualityString,
kBadMinQualityStringId);
}
}
if (!rejected && (mPInfo->badPassFlags & kBadPassMinLength))
{
CString minLengthString;
minLengthString.Format(Get(kNewUserBadPassMinLengthWarn),
mPInfo->minPassLength);
mBadPassBar.AddString(mBadPassBar.NumLines(), minLengthString,
kBadMinLengthStringId);
}
if (rejected)
{
SetWizButtons(PSWIZB_BACK);
mBadPassBar.SetIcon(CInfoBar::kStopIcon);
mRejectText.SetWindowText(Get(kNewUserPassRejectedText));
}
else
{
SetWizButtons(PSWIZB_BACK | PSWIZB_NEXT);
mBadPassBar.SetIcon(CInfoBar::kInfoIcon);
mRejectText.SetWindowText(Get(kNewUserPassWarningText));
}
mBadPassBar.ResizeRedraw();
return 0;
}
PGPInt32
CNewUserBadPassPage::OnPsnWizNext()
{
PGPInt32 result = CPGPdiskPage::OnPsnWizNext();
if (result != 0)
return result;
mPInfo->isFinished = TRUE;
return 0;
}
// Class CNewUserAskPassPage member functions
void
CNewUserAskPassPage::CreateCapsLockBar()
{
// Create caps lock info bar.
CRect passRect;
mPassphraseEdit.GetWindowRect(passRect);
ScreenToClient(passRect);
CPoint origin(passRect.Left(), passRect.Top() -
VertDLUToPixel(kDLUYOffsetCapsLockBar));
PGPUInt32 width = HorizDLUToPixel(kDLUWidthCapsLockBar);
mCapsLockBar.Create(UModuleInstance::Get(), Handle(), origin, width);
}
void
CNewUserAskPassPage::InitDialogText()
{
using namespace UCommonStrings;
CString lengthText;
if (mPInfo->enforcePassFlags & kEnforcePassMinLength)
{
lengthText.Format(Get(kNewUserPassTellMinLengthText),
mPInfo->minPassLength);
}
else
{
lengthText.Format(Get(kNewUserPassSugMinLengthText),
mPInfo->minPassLength);
}
mPhraseLengthText.SetWindowText(lengthText);
}
void
CNewUserAskPassPage::InitControls()
{
mHideTypingCheck.SetCheck(BST_CHECKED);
mPassphraseEdit.SetHideTypingPref(TRUE);
mConfirmEdit.SetHideTypingPref(TRUE);
mPassphraseEdit.SetMaxSizeContents(kPGPdiskMaxPassLength);
mConfirmEdit.SetMaxSizeContents(kPGPdiskMaxPassLength);
mIHadFocus = &mPassphraseEdit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -