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

📄 ceditorwindow.cpp

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	pAdd->tbButton.iString = (mPPrefs->showText ? 
		mToolbar.AddString(0, Get(kEditorAddUserCaption)) : NULL);

	pAdd->index = mToolbar.AddButtons(1, &pAdd->tbButton);

	// Add remove user button.
	pRemUser->tbButton.iBitmap		= ImageIDs::kPGPdiskRemUser;
	pRemUser->tbButton.idCommand	= IDM_REMOVEUSER;
	pRemUser->tbButton.fsState		= TBSTATE_ENABLED;
	pRemUser->tbButton.fsStyle		= TBSTYLE_BUTTON;
	pRemUser->tbButton.dwData		= reinterpret_cast<PGPUInt32>(pRemUser);

	pRemUser->tbButton.iString = (mPPrefs->showText ? 
		mToolbar.AddString(0, Get(kEditorRemUserCaption)) : NULL);

	pRemUser->index = mToolbar.AddButtons(1, &pRemUser->tbButton);

	// Add the toolbar to the rebar.
	REBARBANDINFO	rbbInfo;
	pgpClearMemory(&rbbInfo, sizeof(rbbInfo));

	rbbInfo.cbSize		= sizeof(rbbInfo);
	rbbInfo.fMask		= RBBIM_CHILD | RBBIM_STYLE;
	rbbInfo.fStyle		= RBBS_CHILDEDGE | RBBS_FIXEDSIZE;
	rbbInfo.hwndChild	= mToolbar.Handle();

	mTBRebar.InsertBand(0, rbbInfo);

	ResizeToolbar();

	// Show the toolbar.
	if (mPPrefs->showToolbar)
	{
		mTBRebar.ShowWindow(SW_SHOW);
		mToolbar.ShowWindow(SW_SHOW);
	}
}

void 
CEditorWindow::DestroyToolbar()
{
	mTBRebar.DestroyWindow();
	mImages.Clear();

	mButtons.EmptyWithDelete();
}

void 
CEditorWindow::UpdateUIState(HMENU contextMenu)
{
	using namespace UCommonStrings;

	// Get selected users.
	CPGPdiskUserSet		selUsers;
	CPGPdiskUserIter	selUsersIter(selUsers);

	mUsersView.GetSelectedUsers(&selUsers);

	CPGPdiskUser	firstUser;
	selUsersIter.Next(firstUser);

	// Disk still mounted?
	PGPBoolean	isMounted	= CPGPdiskEngine::IsPathMountedPGPdisk(mPath);

	CMenu	subMenu;

	if (IsNull(contextMenu))
	{
		// Modify toolbar.
		mToolbar.EnableButton(IDM_MOUNT, !isMounted);
		mToolbar.EnableButton(IDM_UNMOUNT, isMounted);
		mToolbar.EnableButton(IDM_ADDUSER, !isMounted);
		mToolbar.EnableButton(IDM_REMOVEUSER, !isMounted && 
			((selUsers.Count() > 1) || ((selUsers.Count() == 1) && 
			!firstUser.IsLocked() && !firstUser.IsAdminUser())));

		if (mPPrefs->showToolbar)
			mTBRebar.ShowWindow(SW_SHOW);
		else
			mTBRebar.ShowWindow(SW_HIDE);

		// Modify file menu.
		mMainMenu.GetSubMenu(kIndexFileMenu, subMenu);

		MENUITEMINFO	mii;

		mii.cbSize = sizeof(mii);
		mii.fMask = MIIM_ID;

		subMenu.GetMenuItemInfo(kMountMenuPos, TRUE, &mii);

		if (isMounted && (mii.wID == IDM_MOUNT))
		{
			subMenu.ModifyMenu(kMountMenuPos, MF_BYPOSITION | MF_ENABLED, 
				IDM_UNMOUNT, Get(kEditorUnmountMenuOption));
		}
		else if (!isMounted && (mii.wID == IDM_UNMOUNT))
		{
			subMenu.ModifyMenu(kMountMenuPos, MF_BYPOSITION | MF_ENABLED, 
				IDM_MOUNT, Get(kEditorMountMenuOption));
		}

		subMenu.EnableMenuItem(IDM_REENCRYPT, MF_BYCOMMAND | 
			(!isMounted ? MF_ENABLED : MF_GRAYED));

		// Modify view menu.
		mMainMenu.GetSubMenu(kIndexViewMenu, subMenu);

		subMenu.CheckMenuItem(IDM_VIEWTOOLBAR, MF_BYCOMMAND | 
			(mPPrefs->showToolbar ? MF_CHECKED : MF_UNCHECKED));

		subMenu.CheckMenuItem(IDM_VIEWRO, MF_BYCOMMAND | 
			((mPPrefs->diskUserColumns & CDiskUsersView::kReadOnlyColFlag) ? 
			MF_CHECKED : MF_UNCHECKED));

		subMenu.CheckMenuItem(IDM_VIEWKIND, MF_BYCOMMAND | 
			((mPPrefs->diskUserColumns & CDiskUsersView::kKindColFlag) ? 
			MF_CHECKED : MF_UNCHECKED));

		mMainMenu.GetSubMenu(kIndexUsersMenu, subMenu);
	}
	else
	{
		subMenu.Attach(contextMenu);
	}

	// Modify either Users menu or the popup menu.
	subMenu.EnableMenuItem(IDM_ADDUSER, MF_BYCOMMAND | 
		(!isMounted ? MF_ENABLED : MF_GRAYED));

	subMenu.EnableMenuItem(IDM_REMOVEUSER, MF_BYCOMMAND | 
		(!isMounted && ((selUsers.Count() > 1) || 
		((selUsers.Count() == 1) && !firstUser.IsLocked() && 
		!firstUser.IsAdminUser())) ? MF_ENABLED : MF_GRAYED));

	subMenu.EnableMenuItem(IDM_MOUNTUSING, MF_BYCOMMAND | 
		(!isMounted && (selUsers.Count() == 1) && 
		!firstUser.IsDisabled() ? MF_ENABLED : MF_GRAYED));

	subMenu.EnableMenuItem(IDM_CHANGEPASS, MF_BYCOMMAND | 
		(!isMounted && (selUsers.Count() == 1) && 
		firstUser.HasSymmetricKey() && !firstUser.IsLocked() && 
		!firstUser.IsDisabled() ? MF_ENABLED : MF_GRAYED));

	CommonString	disableString;
	PGPUInt32		disableFlags	= MF_BYCOMMAND | MF_STRING;

	if (!isMounted && (selUsers.Count() == 1) && !firstUser.IsLocked() && 
		!firstUser.IsAdminUser())
	{
		disableFlags |= MF_ENABLED;

		if (firstUser.IsDisabled())
			disableString = kEditorEnableMenuOption;
		else
			disableString = kEditorDisableMenuOption;
	}
	else
	{
		disableFlags |= MF_GRAYED;
		disableString = kEditorDisableMenuOption;
	}

	subMenu.ModifyMenu(IDM_TOGGLEDISABLE, disableFlags, IDM_TOGGLEDISABLE, 
		Get(disableString));

	subMenu.EnableMenuItem(IDM_TOGGLERO, MF_BYCOMMAND | 
		(!isMounted && (selUsers.Count() == 1) && !firstUser.IsLocked() && 
		!firstUser.IsAdminUser() && !firstUser.IsDisabled() ? 
		MF_ENABLED : MF_GRAYED));

	subMenu.EnableMenuItem(IDM_SETASADMIN, MF_BYCOMMAND | 
		(!isMounted && (selUsers.Count() == 1) && !firstUser.IsLocked() && 
		!firstUser.IsAdminUser() && !firstUser.IsDisabled() && 
		(!firstUser.HasPublicKey() || IsPrivateKeyAvailable(firstUser)) ? 
		MF_ENABLED : MF_GRAYED));

	subMenu.EnableMenuItem(IDM_LOOKUP, MF_BYCOMMAND | 
		(mUsersView.AreUnknownUsers() ? MF_ENABLED : MF_GRAYED));

	DrawMenuBar();
	ResizeUsersView();
}

PGPBoolean 
CEditorWindow::IsPrivateKeyAvailable(const CPGPdiskUser& user) const
{
	try
	{
		CPGPKeyID	keyID;
		user.GetPGPKeyID(keyID);

		CPGPKey		pgpKey(mPContext->PGPKeyDB(), keyID);
		return pgpKey.GetBooleanProp(kPGPKeyProperty_CanDecrypt);
	}
	catch (CComboError&)
	{
		return FALSE;
	}
} 

void 
CEditorWindow::ModifyUsersAux(ModifyUsersOp op)
{
	using namespace UCommonStrings;

	if (!UEditMount::CheckWarnCanModifyDisk(*mPContext, mPath, Handle(), 
		Get(kEditorMsgBoxTitle)))
	{
		THROW_PGPERROR(kPGPError_UserAbort);
	}

	// Re-export the user set.
	CPGPdiskDisk	disk;
	disk.Open(*mPContext, mPath);

	CPGPdiskUserSet		diskUsers;
	CPGPdiskUserIter	diskUsersIter(diskUsers);

	disk.ExportUserSet(diskUsers);

	// Get selected users.
	CPGPdiskUserSet		selUsers;
	CPGPdiskUserIter	selUsersIter(selUsers);

	mUsersView.GetSelectedUsers(&selUsers);

	// Get first selected user.
	CPGPdiskUser	firstUser;

	selUsersIter.Next(firstUser);
	selUsersIter.Rewind();

	// Get admin user.
	CPGPdiskUser	adminUser;

	if (!diskUsersIter.FindAdminUser(adminUser))
		THROW_PGPERROR(kPGPError_ItemNotFound);

	// Warn if admin not present.
	if (adminUser.HasPublicKey() && !IsPrivateKeyAvailable(adminUser))
	{
		CMessageBox	messageBox;
		messageBox.Display(Get(kWarnAdminUserNotUsable), 
			Get(kEditorMsgBoxTitle), Handle(), CMessageBox::kWarningTone);
	}

	// Sanity checks.
	if (selUsers.Count() == 0)
		return;

	if (op == kRemoveUsersOp)
	{
		CPGPdiskUser	selUser;

		while (selUsersIter.Next(selUser))
		{
			if (selUser.IsAdminUser() || selUser.IsLocked())
			{
				CMessageBox	messageBox;
				messageBox.Display(Get(kTellCantRemoveALUser), 
					Get(kEditorMsgBoxTitle), Handle());

				return;
			}
		}

		selUsersIter.Rewind();
	}
	else if (op == kChangePassOp)
	{
		if (selUsers.Count() != 1)
			return;

		if (!firstUser.HasSymmetricKey() || firstUser.IsDisabled())
			return;

		selUsersIter.Rewind();
	}
	else if (op == kToggleDisableOp)
	{
		if (selUsers.Count() != 1)
			return;

		if (firstUser.IsAdminUser() || firstUser.IsLocked())
			return;

		selUsersIter.Rewind();
	}
	else if (op == kToggleROOp)
	{
		if (selUsers.Count() != 1)
			return;

		if (firstUser.IsAdminUser() || firstUser.IsLocked())
			return;

		selUsersIter.Rewind();
	}
	else if (op == kSetAsAdminOp)
	{
		if (selUsers.Count() != 1)
			return;

		if (firstUser.IsAdminUser() || firstUser.IsLocked() || 
			firstUser.IsDisabled())
		{
			return;
		}

		selUsersIter.Rewind();
	}

	// Create empty user set.
	CPGPdiskUserSet	usersToAskPass;
	usersToAskPass.CreateEmpty();

	// Determine acceptable users and passphrase dialog text.
	CPGPdiskUserSet	oneUser;

	CString	passDlgSubString;
	CString	passDlgText;

	if (op == kChangePassOp)
	{
		// We can take passphrase of selected user only.
		usersToAskPass.Add(firstUser);

		passDlgText = Get(kSinglePassUserText);
		firstUser.GetUserName(passDlgSubString);
	}
	else if ((op == kRemoveUsersOp) && (selUsers.Count() == 1) && 
		(!firstUser.HasPublicKey() || IsPrivateKeyAvailable(firstUser)))
	{
		// We can take passphrase of either the admin or a specific user.
		usersToAskPass.Add(adminUser);
		usersToAskPass.Add(firstUser);

		passDlgText = Get(kSinglePassUserOrAdminText);
		firstUser.GetUserName(passDlgSubString);
	}
	else
	{
		// We can take passphrase of the admin user only.
		usersToAskPass.Add(adminUser);

		CPath	fileName;
		mPath.GetDisplayFileName(fileName);

		passDlgText = Get(kSinglePassAdminText);
		passDlgSubString = fileName;
	}

	// Ask for the passphrase of one of the target users.
	CPassphraseDialog	passDlg;
	CPGPdiskUser		userForCiphering;

	passDlg.AskForPassphrase(disk, usersToAskPass, Handle(), 
		userForCiphering, passDlgText, passDlgSubString);

	CSecureArray<char>	askedPass;
	passDlg.Passphrase().Extract(askedPass);

	// Perform the modification.
	if (op == kRemoveUsersOp)
	{
		if ((selUsers.Count() > 1) || 
			(adminUser.IsEqualUser(userForCiphering)))
		{
			// Remove the selected users.
			diskUsers.Remove(selUsers);

			// Import the updated user set.
			disk.ImportUserSet(diskUsers, userForCiphering);
		}
		else
		{
			// Remove the selected user only.
			disk.RemoveOneUser(userForCiphering);
		}
	}
	else if (op == kChangePassOp)
	{
		// Ask for a new passphrase.
		CString	userName;
		firstUser.GetUserName(userName);

		CConfirmPassphraseDialog	newPassDlg;

		newPassDlg.AskPassphrase(*mPContext, Handle(), 
			Get(kConfirmPassUserText), userName);

		CSecureArray<char>	newPass;
		newPassDlg.Passphrase().Extract(newPass);

		// Change passphrase on selected user.
		disk.ChangeOnePassphrase(userName, askedPass.Get(), newPass.Get());
	}
	else if (op == kToggleDisableOp)
	{
		// Toggle selected user  in DISK user set.
		CPGPdiskUser	diskUser;

		if (diskUsersIter.FindEqualUser(firstUser, diskUser))
			diskUser.SetIsDisabled(!diskUser.IsDisabled());

		// Import the updated user set.
		disk.ImportUserSet(diskUsers, userForCiphering);
	}
	else if (op == kToggleROOp)
	{
		// Toggle selected user in DISK user set.
		CPGPdiskUser	diskUser;

		if (diskUsersIter.FindEqualUser(firstUser, diskUser))
			diskUser.SetIsReadOnly(!diskUser.IsReadOnly());

		// Import the updated user set.
		disk.ImportUserSet(diskUsers, userForCiphering);
	}
	else if (op == kSetAsAdminOp)
	{
		// Get passphrase of selected user.
		CPassphraseDialog	firstUserPassDlg;
		CPGPdiskUser		firstUserForCiphering;
		CString				userName;

		firstUser.GetUserName(userName);
		oneUser.CreateSingleton(firstUser);

		firstUserPassDlg.AskForPassphrase(disk, oneUser, Handle(), 
			firstUserForCiphering, Get(kSinglePassUserText), userName);

		CSecureArray<char>	firstUserPass;
		firstUserPassDlg.Passphrase().Extract(firstUserPass);

		// Peform operation on users in DISK user set.
		CPGPdiskUser	firstUserDiskKeys;

		if (diskUsersIter.FindEqualUser(firstUser, firstUserDiskKeys))
			// This is just conventional and the zero ok. -wjb
			firstUserDiskKeys.EnableCiphering(disk, firstUserPass.Get(),0); 
		else
			THROW_PGPERROR(kPGPError_ItemNotFound);

		CPGPdiskUser	adminUserDiskKeys;

		if (diskUsersIter.FindEqualUser(adminUser, adminUserDiskKeys))
			// This is just conventional and the zero ok. -wjb
			adminUserDiskKeys.EnableCiphering(disk, askedPass.Get(),0 );
		else
			THROW_PGPERROR(kPGPError_ItemNotFound);

		diskUsersIter.SetAdminUser(firstUserDiskKeys, adminUserDiskKeys);

		// Import the updated user set.
		disk.ImportUserSet(diskUsers, firstUserDiskKeys);
	}

	// Update the PGPdisk users view.
	ReFillUsersView();
}

void 
CEditorWindow::ModifyUsers(ModifyUsersOp op)
{
	try
	{
		ModifyUsersAux(op);
	}
	catch (CComboError& error)
	{
		using namespace UCommonStrings;
		CommonString	errString;

		switch (op)
		{
		case kRemoveUsersOp:
			errString = kTellDiskRemoveUsersFailed;
			break;

		case kChangePassOp:
			errString = kTellDiskChangeUserPassFailed;
			break;

		case kToggleDisableOp:
			errString = kTellDiskToggleUserDisabledFailed;
			break;

		case kToggleROOp:
			errString = kTellDiskToggleUserROFailed;
			break;

		case kSetAsAdminOp:
			errString = kTellDiskSetAdminUserFailed;
			break;
		}

		ReportError(errString, kEditorMsgBoxTitle, error, Handle());
	}
}

void 
CEditorWindow::OnAddUser()
{
	using namespace UCommonStrings;

	try
	{
		if (!UEditMount::CheckWarnCanModifyDisk(*mPContext, mPath, Handle(), 
			Get(kEditorMsgBoxTitle)))
		{
			THROW_PGPERROR(kPGPError_UserAbort);
		}

		// Get admin user.
		CPGPdiskDisk	disk;
		disk.Open(*mPContext, mPath);

		CPGPdiskUserSet		diskUsers;
		CPGPdiskUserIter	diskUsersIter(diskUsers);
		CPGPdiskUser		adminUser;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -