📄 kmkeyops.c
字号:
MapWindowPoints (NULL, hDlg, (LPPOINT)&rc, 2);
ImageList_Draw (pccs->hIml, IDX_TRUSTEDCERT, hdc,
rc.left-22, rc.top, ILD_TRANSPARENT);
GetWindowRect (GetDlgItem (hDlg, IDC_META), &rc);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rc, 2);
ImageList_Draw (pccs->hIml, IDX_METACERT, hdc,
rc.left-22, rc.top, ILD_TRANSPARENT);
ReleaseDC (hDlg, hdc);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDCANCEL:
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
pccs->bSyncWithServer = FALSE;
ImageList_Destroy (pccs->hIml);
EndDialog (hDlg, 1);
break;
case IDOK:
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
if (!(pccs->bExpandedChoices)) {
pccs->bExpires = FALSE;
if (IsDlgButtonChecked (hDlg, IDC_EXPORTABLECHECK)
== BST_CHECKED)
{
pccs->iSigType = SIG_EXPORTABLE;
}
else {
pccs->iSigType = SIG_NONEXPORTABLE;
}
}
else {
if (IsDlgButtonChecked (hDlg, IDC_NEVEREXPIRES)
== BST_CHECKED)
pccs->bExpires = FALSE;
else {
SYSTEMTIME st;
pccs->bExpires = TRUE;
SendMessage (pccs->hwndDTPicker, DTM_GETSYSTEMTIME, 0,
(LPARAM)&st);
PGPclSystemTimeToDays (&st, &(pccs->iExpireDays));
}
}
GetDlgItemText (hDlg, IDC_DOMAIN,
pccs->szDomain, sizeof(pccs->szDomain));
ImageList_Destroy (pccs->hIml);
EndDialog (hDlg, 0);
break;
case IDC_EXPORTABLECHECK :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
if (IsDlgButtonChecked (hDlg, IDC_EXPORTABLECHECK)
== BST_CHECKED) {
pccs->iSigType = SIG_EXPORTABLE;
}
else {
pccs->iSigType = SIG_NONEXPORTABLE;
}
break;
case IDC_NONEXPORTABLE :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
pccs->iSigType = SIG_NONEXPORTABLE;
EnableWindow (GetDlgItem (hDlg, IDC_DOMAIN), FALSE);
break;
case IDC_EXPORTABLE :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
pccs->iSigType = SIG_EXPORTABLE;
EnableWindow (GetDlgItem (hDlg, IDC_DOMAIN), FALSE);
break;
case IDC_TRUSTED :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
pccs->iSigType = SIG_TRUST;
EnableWindow (GetDlgItem (hDlg, IDC_DOMAIN), TRUE);
break;
case IDC_META :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
pccs->iSigType = SIG_META;
EnableWindow (GetDlgItem (hDlg, IDC_DOMAIN), FALSE);
break;
case IDC_NEVEREXPIRES :
case IDC_EXPIRES :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
if (IsDlgButtonChecked (hDlg, IDC_EXPIRES) == BST_CHECKED) {
SYSTEMTIME st;
EnableWindow (pccs->hwndDTPicker, TRUE);
SendMessage (pccs->hwndDTPicker, DTM_GETSYSTEMTIME,
0, (LPARAM)&st);
PGPclSystemTimeToDays (&st, &(pccs->iExpireDays));
if (pccs->iExpireDays > 0)
EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
else
EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
}
else {
EnableWindow (pccs->hwndDTPicker, FALSE);
EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
}
break;
case IDC_MORECHOICES :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
pccs->bExpandedChoices = TRUE;
ShowWindow (GetDlgItem (hDlg, IDC_MORECHOICES), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_EXPORTABLECHECK), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_FEWERCHOICES), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_SIGTYPE), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_NONEXPORTABLE), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_EXPORTABLE), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_TRUSTED), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_META), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_EXPIRATION), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_NEVEREXPIRES), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_EXPIRES), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_DOMAINTEXT), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_DOMAIN), SW_SHOW);
ShowWindow (pccs->hwndDTPicker, SW_SHOW);
// user "fewer" button as desired Y location
hwndControl = GetDlgItem (hDlg, IDC_FEWERCHOICES);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
GetWindowRect (hDlg, &rc);
iOffset = rc.bottom-rc.top;
GetClientRect (hDlg, &rc);
iOffset -= rc.bottom;
iOffset += (rectControl.bottom - rectControl.top) / 2;
iNewY = rectControl.top;
iNewWindowHeight = rectControl.bottom + iOffset;
// move OK Button
hwndControl = GetDlgItem (hDlg, IDOK);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// move Cancel Button
hwndControl = GetDlgItem (hDlg, IDCANCEL);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// move Help Button
hwndControl = GetDlgItem (hDlg, IDHELP);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// set radio buttons
CheckRadioButton (hDlg, IDC_NONEXPORTABLE, IDC_META,
IDC_NONEXPORTABLE + pccs->iSigType);
EnableWindow (GetDlgItem (hDlg, IDC_DOMAIN),
(pccs->iSigType == SIG_META));
// size Window
GetWindowRect (hDlg, &rectControl);
MoveWindow( hDlg,
rectControl.left,
rectControl.top,
rectControl.right - rectControl.left,
iNewWindowHeight,
TRUE);
break;
case IDC_FEWERCHOICES :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
pccs->bExpandedChoices = FALSE;
ShowWindow (GetDlgItem (hDlg, IDC_MORECHOICES), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_EXPORTABLECHECK), SW_SHOW);
ShowWindow (GetDlgItem (hDlg, IDC_FEWERCHOICES), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_SIGTYPE), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_NONEXPORTABLE), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_EXPORTABLE), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_TRUSTED), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_META), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_EXPIRATION), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_NEVEREXPIRES), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_EXPIRES), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_DOMAINTEXT), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_DOMAIN), SW_HIDE);
ShowWindow (pccs->hwndDTPicker, SW_HIDE);
// user "more" button as desired Y location
hwndControl = GetDlgItem (hDlg, IDC_MORECHOICES);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
GetWindowRect (hDlg, &rc);
iOffset = rc.bottom-rc.top;
GetClientRect (hDlg, &rc);
iOffset -= rc.bottom;
iOffset += (rectControl.bottom - rectControl.top) / 2;
iNewY = rectControl.top;
iNewWindowHeight = rectControl.bottom + iOffset;
// move OK Button
hwndControl = GetDlgItem (hDlg, IDOK);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// move Cancel Button
hwndControl = GetDlgItem (hDlg, IDCANCEL);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// move Help Button
hwndControl = GetDlgItem (hDlg, IDHELP);
GetWindowRect (hwndControl, &rectControl);
MapWindowPoints (NULL, hDlg, (LPPOINT)&rectControl, 2);
MoveWindow( hwndControl,
rectControl.left,
iNewY,
rectControl.right - rectControl.left,
rectControl.bottom - rectControl.top,
TRUE);
// set radio buttons
if (pccs->iSigType == SIG_EXPORTABLE)
CheckDlgButton (hDlg, IDC_EXPORTABLECHECK, BST_CHECKED);
else
CheckDlgButton (hDlg, IDC_EXPORTABLECHECK, BST_UNCHECKED);
// size Window
GetWindowRect (hDlg, &rectControl);
MoveWindow( hDlg,
rectControl.left,
rectControl.top,
rectControl.right - rectControl.left,
iNewWindowHeight,
TRUE);
break;
case IDHELP :
pccs = (PCERTIFYCONFIRMSTRUCT)GetWindowLong (hDlg, GWL_USERDATA);
WinHelp (hDlg, pccs->pKM->szHelpFile, HELP_CONTEXT,
IDH_PGPKM_SIGNDIALOG);
break;
}
return TRUE;
}
return FALSE;
}
// _______________________________________________
//
// Certify selected key or userid
BOOL
KMCertifyKeyOrUserID (PKEYMAN pKM)
{
CHAR sz256[256];
PGPError err;
CERTIFYSTRUCT cs;
CERTIFYCONFIRMSTRUCT ccs;
PGPPrefRef prefref;
// initialize structures
cs.lpfnCallback = sCertifySingleObject;
cs.pKM = pKM;
cs.bItemModified = FALSE;
cs.keySigning = NULL;
cs.pPasskey = NULL;
ccs.pKM = pKM;
ccs.iSigType = SIG_NONEXPORTABLE;
ccs.bExpires = FALSE;
ccs.iExpireDays = 0;
PGPclOpenClientPrefs (PGPGetContextMemoryMgr (pKM->Context), &prefref);
PGPGetPrefBoolean (prefref, kPGPPrefKeyServerSyncOnKeySign,
&(ccs.bSyncWithServer));
PGPclCloseClientPrefs (prefref, FALSE);
if (DialogBoxParam (g_hInst, MAKEINTRESOURCE(IDD_SIGNCONFIRM),
pKM->hWndParent, sSignKeyDlgProc, (LPARAM)&ccs)) {
return FALSE;
}
// convert user-entered signature type to flags to pass
// and setup domain regular expression
switch (ccs.iSigType) {
case SIG_NONEXPORTABLE :
cs.bExportable = FALSE;
cs.uTrustLevel = 0;
cs.szRegExpression[0] = '\0';
break;
case SIG_EXPORTABLE :
cs.bExportable = TRUE;
cs.uTrustLevel = 0;
cs.szRegExpression[0] = '\0';
break;
case SIG_TRUST :
cs.bExportable = TRUE;
cs.uTrustLevel = 1;
if (ccs.szDomain[0])
sDomainToRegExpression (ccs.szDomain, cs.szRegExpression);
else
cs.szRegExpression[0] = '\0';
break;
case SIG_META :
cs.bExportable = FALSE;
cs.uTrustLevel = 2;
cs.szRegExpression[0] = '\0';
break;
}
// convert expiration info to expire days
if ((ccs.bExpires) && (ccs.iExpireDays > 0))
cs.uExpireDays = (UINT)ccs.iExpireDays;
else
cs.uExpireDays = 0;
// get valid passphrase
LoadString (g_hInst, IDS_SIGNKEYPASSPHRASE, sz256, 256);
err = KMGetSigningKeyPhrase (pKM->Context, pKM->tlsContext,
pKM->hWndParent, sz256,
pKM->KeySetMain, FALSE, &cs.keySigning,
NULL, &cs.pPasskey, &cs.sizePasskey);
if (IsntPGPError (err)) {
// update from server
if (ccs.bSyncWithServer) {
if (!KMGetFromServerInternal (pKM, FALSE, FALSE, FALSE)) {
if (KMMessageBox (pKM->hWndParent, IDS_CAPTION,
IDS_QUERYCONTINUESIGNING,
MB_YESNO|MB_ICONEXCLAMATION) == IDNO) {
if (cs.pPasskey) {
KMFreePasskey (cs.pPasskey, cs.sizePasskey);
cs.pPasskey = NULL;
}
return FALSE;
}
}
}
// call callback for all selected items
TreeList_IterateSelected (pKM->hWndTree, &cs);
// changes have been made; save them and update all validities
if (cs.bItemModified) {
KMCommitKeyRingChanges (pKM);
KMLoadKeyRingIntoTree (pKM, FALSE, FALSE, FALSE);
InvalidateRect (pKM->hWndTree, NULL, TRUE);
// send key to server, if selected
if (ccs.bSyncWithServer) {
KMSendToServer (pKM, PGPCL_DEFAULTSERVER);
}
}
}
if (cs.pPasskey) {
KMFreePasskey (cs.pPasskey, cs.sizePasskey);
cs.pPasskey = NULL;
}
return (cs.bItemModified);
}
// _______________________________________________
//
// Enable selected key
BOOL
KMEnableKey (PKEYMAN pKM, PGPKeyRef key)
{
if (IsntPGPError (PGPclErrorBox (NULL, PGPEnableKey (key)))) {
KMCommitKeyRingChanges (pKM);
KMUpdateKeyInTree (pKM, key, FALSE);
return TRUE;
}
return FALSE;
}
// _______________________________________________
//
// Disable selected key
BOOL
KMDisableKey (PKEYMAN pKM, PGPKeyRef key)
{
if (IsntPGPError (PGPclErrorBox (NULL, PGPDisableKey (key)))) {
KMCommitKeyRingChanges (pKM);
KMUpdateKeyInTree (pKM, key, FALSE);
return TRUE;
}
return FALSE;
}
// _______________________________________________
//
// Delete All dialog message procedure
static BOOL CALLBACK
sDeleteAllDlgProc (
HWND hWndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PDELETESTRUCT pds;
switch (uMsg) {
case WM_INITDIALOG :
SetWindowLong (hWndDlg, GWL_USERDATA, lParam);
pds = (PDELETESTRUCT)lParam;
SetDlgItemText (hWndDlg, IDC_STRING, pds->pszPrompt);
SetFocus (GetDlgItem (hWndDlg, IDNO));
return FALSE;
case WM_HELP:
pds = (PDELETESTRUCT)GetWindowLong (hWndDlg, GWL_USERDATA);
WinHelp (((LPHELPINFO) lParam)->hItemHandle, pds->pKM->szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aDeleteAllIds);
break;
case WM_CONTEXTMENU:
pds = (PDELETESTRUCT)GetWindowLong (hWndDlg, GWL_USERDATA);
WinHelp ((HWND) wParam, pds->pKM->szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aDeleteAllIds);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDCANCEL:
pds = (PDELETESTRUCT)GetWindowLong (hWndDlg, GWL_USERDATA);
pds->bItemNotDeleted = TRUE;
EndDialog (hWndDlg, IDCANCEL);
break;
case IDOK:
case IDYES:
EndDialog (hWndDlg, IDYES);
break;
case IDNO:
EndDialog (hWndDlg, IDNO);
break;
case IDC_YESTOALL :
pds = (PDELETESTRUCT)GetWindowLong (hWndDlg, GWL_USERDATA);
pds->bDeleteAll = TRUE;
EndDialog (hWndDlg, IDYES);
break;
}
return TRUE;
}
return FALSE;
}
// _______________________________________________
//
// Ask user for delete confirmation
static INT
sDeleteConfirm (
TL_TREEITEM* lptli,
INT iPromptID,
PDELETESTRUCT pds)
{
CHAR sz256[256];
CHAR sz512[512];
INT iRetVal;
if (pds->bDeleteAll) return IDYES;
LoadString (g_hInst, iPromptID, sz256, 256);
wsprintf (sz512, sz256, lptli->pszText);
if (KMMultipleSelected (pds->pKM)) {
pds->pszPrompt = sz512;
iRetVal = DialogBoxParam (g_hInst, MAKEINTRESOURCE (IDD_DELETEALL),
pds->pKM->hWndParent, sDeleteAllDlgProc, (LPARAM)pds);
if (!pds->bItemNotDeleted && (iRetVal == IDNO)) {
pds->bItemNotDeleted = TRUE;
pds->hPostDeleteFocusItem = lptli->hItem;
}
}
else {
LoadString (g_hInst, IDS_DELCONFCAPTION, sz256, 256);
iRetVal = MessageBox (pds->pKM->hWndParent, sz512, sz256,
MB_YESNO|MB_TASKMODAL|MB_DEFBUTTON2|MB_ICONWARNING);
}
return iRetVal;
}
// _______________________________________________
//
// Get handle of nearby item
//
// lptli = pointer to TreeList item
static HTLITEM
sGetAdjacentItem (
HWND hWndTree,
TL_TREEITEM* lptli)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -