📄 ceditorwindow.cpp
字号:
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 + -