⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cnewuserpages.cpp

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*____________________________________________________________________________
		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 + -