📄 kmprops.c
字号:
PGPONullOption (pkmpss->pKM->Context),
PGPOLastOption (pkmpss->pKM->Context));
KMReleaseSDKAccess (pkmpss->pKM);
if (IsntPGPError (PGPclErrorBox (hDlg, err))) {
pkmpss->bNeedsCommit = TRUE;
lvI.mask = LVIF_IMAGE;
lvI.iItem = iIndex;
lvI.iSubItem = 0;
lvI.iImage = IDX_DSAPUBREVKEY;
ListView_SetItem (pkmpss->hwndSubKeys, &lvI);
}
}
}
if (pPasskey)
KMFreePasskey (pPasskey, sizePasskey);
return TRUE;
}
// ___________________________________________________
//
// Populate ListView with subkeys
static BOOL
sInsertSubkeysIntoList (
HWND hwndList,
PGPKeyRef key,
PGPKeySetRef keyset)
{
PGPSubKeyRef subkey;
PGPKeyListRef keylist;
PGPKeyIterRef keyiter;
LV_ITEM lvI;
CHAR szSize[16];
CHAR szValid[32];
CHAR szExpires[32];
PGPBoolean bRevoked;
PGPBoolean bExpired;
INT iItem;
PGPTime time;
PSUBKEYSTRUCT psks;
iItem = 0;
PGPOrderKeySet (keyset, kPGPAnyOrdering, &keylist);
PGPNewKeyIter (keylist, &keyiter);
PGPKeyIterSeek (keyiter, key);
PGPKeyIterNextSubKey (keyiter, &subkey);
while (subkey) {
// allocate structure to hold info
psks = KMAlloc (sizeof(SUBKEYSTRUCT));
if (!psks) break;
// initialize structure
psks->subkey = subkey;
psks->uSize = 0;
// get subkey info
PGPGetSubKeyNumber (subkey, kPGPKeyPropBits, &psks->uSize);
wsprintf (szSize, "%i", psks->uSize);
PGPGetSubKeyBoolean (subkey, kPGPKeyPropIsExpired, &bExpired);
PGPGetSubKeyBoolean (subkey, kPGPKeyPropIsRevoked, &bRevoked);
PGPGetSubKeyTime (subkey, kPGPKeyPropCreation, &psks->timeStart);
KMConvertTimeToString (psks->timeStart, szValid, sizeof (szValid));
PGPGetSubKeyTime (subkey, kPGPKeyPropExpiration, &time);
if (time != kPGPExpirationTime_Never) {
psks->bNeverExpires = FALSE;
KMConvertTimeToDays (time, &psks->iExpireDays);
KMConvertTimeToString (time, szExpires, sizeof (szExpires));
}
else {
psks->bNeverExpires = TRUE;
psks->iExpireDays = 0;
LoadString (g_hInst, IDS_NEVER, szExpires, sizeof (szExpires));
}
// insert listview item
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.state = 0;
lvI.stateMask = 0;
if (bRevoked)
lvI.iImage = IDX_DSAPUBREVKEY;
else if (bExpired)
lvI.iImage = IDX_DSAPUBEXPKEY;
else
lvI.iImage = IDX_DSAPUBKEY;
lvI.iItem = iItem;
lvI.iSubItem = 0;
lvI.pszText = szValid;
lvI.cchTextMax = 0;
lvI.lParam = (LPARAM)psks;
if (ListView_InsertItem (hwndList, &lvI) == -1) return FALSE;
// add strings for other columns
ListView_SetItemText (hwndList, iItem, 1, szExpires);
ListView_SetItemText (hwndList, iItem, 2, szSize);
PGPKeyIterNextSubKey (keyiter, &subkey);
iItem++;
}
PGPFreeKeyIter (keyiter);
PGPFreeKeyList (keylist);
return TRUE;
}
// ___________________________________________________
//
// destroy all data structures associated with ListView
static VOID
sDestroySubKeyListAndStructures (KMPROPSHEETSTRUCT* pkmpss)
{
INT iIndex;
INT iNumItems;
LV_ITEM lvI;
iNumItems = ListView_GetItemCount (pkmpss->hwndSubKeys);
for (iIndex=0; iIndex<iNumItems; iIndex++) {
lvI.mask = LVIF_PARAM;
lvI.iItem = iIndex;
lvI.iSubItem = 0;
ListView_GetItem (pkmpss->hwndSubKeys, &lvI);
KMFree ((VOID*)(lvI.lParam));
}
ListView_DeleteAllItems (pkmpss->hwndSubKeys);
ImageList_Destroy (pkmpss->hIml);
}
// ___________________________________________________
//
// create imagelist
static VOID
sCreateImageList (KMPROPSHEETSTRUCT* pkmpss)
{
HBITMAP hBmp;
HDC hDC;
INT iNumBits;
if (pkmpss->hIml)
return;
// create image list
hDC = GetDC (NULL); // DC for desktop
iNumBits = GetDeviceCaps (hDC, BITSPIXEL) * GetDeviceCaps (hDC, PLANES);
ReleaseDC (NULL, hDC);
if (!pkmpss->hIml) {
if (iNumBits <= 8) {
pkmpss->hIml = ImageList_Create (16, 16, ILC_COLOR|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES4BIT));
ImageList_AddMasked (pkmpss->hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
else {
pkmpss->hIml = ImageList_Create (16, 16, ILC_COLOR24|ILC_MASK,
NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hInst, MAKEINTRESOURCE (IDB_IMAGES24BIT));
ImageList_AddMasked (pkmpss->hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
}
}
// ___________________________________________________
//
// setup subkey ListView
static VOID
sFillSubKeyList (HWND hDlg, KMPROPSHEETSTRUCT* pkmpss)
{
LV_COLUMN lvC;
CHAR sz[256];
sCreateImageList (pkmpss);
ListView_SetImageList (pkmpss->hwndSubKeys, pkmpss->hIml, LVSIL_SMALL);
lvC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
lvC.fmt = LVCFMT_CENTER;
lvC.pszText = sz;
LoadString (g_hInst, IDS_VALIDFROM, sz, sizeof(sz));
lvC.cx = 120;
lvC.iSubItem = 0;
if (ListView_InsertColumn (pkmpss->hwndSubKeys, 0, &lvC) == -1) return;
LoadString (g_hInst, IDS_EXPIRES, sz, sizeof(sz));
lvC.cx = 70;
lvC.iSubItem = 1;
if (ListView_InsertColumn (pkmpss->hwndSubKeys, 1, &lvC) == -1) return;
LoadString (g_hInst, IDS_SIZE, sz, sizeof(sz));
lvC.cx = 70;
lvC.iSubItem = 2;
if (ListView_InsertColumn (pkmpss->hwndSubKeys, 2, &lvC) == -1) return;
// populate control by iterating through subkeys
sInsertSubkeysIntoList (pkmpss->hwndSubKeys, pkmpss->key,
pkmpss->keyset);
}
// ___________________________________________________
//
// Key Properties Dialog Message procedure - subkey panel
static BOOL CALLBACK
sKeyPropDlgProcSubkey (
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
KMPROPSHEETSTRUCT* pkmpss;
INT iIndex;
NMHDR* pnmh;
pkmpss = (KMPROPSHEETSTRUCT*)GetWindowLong (hDlg, GWL_USERDATA);
switch (uMsg) {
case WM_INITDIALOG:
// store pointer to data structure
SetWindowLong (hDlg, GWL_USERDATA, ((PROPSHEETPAGE*)lParam)->lParam);
pkmpss = (KMPROPSHEETSTRUCT*)GetWindowLong (hDlg, GWL_USERDATA);
pkmpss->hwndSubKeys = GetDlgItem (hDlg, IDC_SUBKEYLIST);
// hide explanatory text for non-keypairs
if (!pkmpss->bSecret) {
ShowWindow (GetDlgItem (hDlg, IDC_STATICTEXT1), SW_HIDE);
ShowWindow (GetDlgItem (hDlg, IDC_STATICTEXT2), SW_HIDE);
}
// initialize all controls
PostMessage (hDlg, WM_APP, SERIALIZE, 0);
return TRUE;
case WM_APP :
if (wParam == SERIALIZE)
KMRequestSDKAccess (pkmpss->pKM);
sFillSubKeyList (hDlg, pkmpss);
if (wParam == SERIALIZE)
KMReleaseSDKAccess (pkmpss->pKM);
if (pkmpss->bKeyGenEnabled) {
if (pkmpss->bSecret && !pkmpss->bRevoked &&
!pkmpss->bExpired && !pkmpss->bReadOnly)
EnableWindow (GetDlgItem (hDlg, IDC_NEWSUBKEY), TRUE);
}
break;
case WM_COMMAND:
switch(LOWORD (wParam)) {
case IDC_NEWSUBKEY :
DialogBoxParam (g_hInst, MAKEINTRESOURCE (IDD_NEWSUBKEY),
hDlg, sNewSubkeyDlgProc, (LPARAM)pkmpss);
break;
case IDC_REVOKESUBKEY :
if (sRevokeSubKey (hDlg, pkmpss)) {
EnableWindow (GetDlgItem (hDlg, IDC_REVOKESUBKEY), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_REMOVESUBKEY), FALSE);
}
break;
case IDC_REMOVESUBKEY :
if (sRemoveSubKey (hDlg, pkmpss)) {
EnableWindow (GetDlgItem (hDlg, IDC_REVOKESUBKEY), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_REMOVESUBKEY), FALSE);
}
break;
}
return TRUE;
case WM_HELP:
WinHelp (((LPHELPINFO) lParam)->hItemHandle, pkmpss->pKM->szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aSubkeyIds);
break;
case WM_CONTEXTMENU:
WinHelp ((HWND) wParam, pkmpss->pKM->szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aSubkeyIds);
break;
case WM_DESTROY :
sDestroySubKeyListAndStructures (pkmpss);
break;
case WM_NOTIFY :
pnmh = (NMHDR*)lParam;
switch (pnmh->code) {
case PSN_HELP :
WinHelp (hDlg, pkmpss->pKM->szHelpFile, HELP_CONTEXT,
IDH_PGPKM_PROPDIALOG);
break;
case NM_CLICK :
case LVN_KEYDOWN :
if ((pnmh->idFrom == IDC_SUBKEYLIST) &&
pkmpss->bSecret &&
!pkmpss->bReadOnly)
{
iIndex =
ListView_GetNextItem (pkmpss->hwndSubKeys,
-1, LVNI_SELECTED);
if (iIndex > -1) {
LV_ITEM lvI;
lvI.mask = LVIF_IMAGE|LVIF_PARAM;
lvI.iItem = iIndex;
lvI.iSubItem = 0;
ListView_GetItem(pkmpss->hwndSubKeys, &lvI);
if ((lvI.iImage == IDX_DSAPUBKEY) && (pkmpss->bSecret))
EnableWindow (
GetDlgItem (hDlg, IDC_REVOKESUBKEY), TRUE);
else
EnableWindow (
GetDlgItem (hDlg,IDC_REVOKESUBKEY), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_REMOVESUBKEY), TRUE);
}
else {
EnableWindow (GetDlgItem (hDlg,IDC_REVOKESUBKEY), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_REMOVESUBKEY), FALSE);
}
}
break;
}
}
return FALSE;
}
// ___________________________________________________
//
// Populate ListView with ADKs
static VOID
sInsertADKsIntoTree (
PKEYMAN pKM,
HWND hwndTree,
PGPKeyRef key,
PGPKeySetRef keyset,
UINT uNumberADKs)
{
TL_TREEITEM tlI;
TL_LISTITEM tlL;
TL_INSERTSTRUCT tlIns;
HTLITEM hTNew;
PGPKeyRef keyADK;
PGPKeyID keyidADK;
CHAR szName[256];
PGPError err;
CHAR szID[kPGPMaxKeyIDStringSize];
UINT u;
PGPByte byteClass;
BOOL bItalics;
tlI.hItem = NULL;
tlI.mask = TLIF_TEXT | TLIF_IMAGE | TLIF_STATE;
tlI.stateMask = TLIS_ITALICS;
tlI.pszText = szName;
for (u=0; u<uNumberADKs; u++) {
byteClass = 0;
tlI.iImage = IDX_DSAPUBDISKEY;
tlI.state = 0;
err = PGPGetIndexedAdditionalRecipientRequestKey (key,
keyset, u, &keyADK, &keyidADK, &byteClass);
if (IsntPGPError (err)) {
if (PGPKeyRefIsValid (keyADK)) {
KMGetKeyName (keyADK, szName, sizeof(szName));
tlI.iImage = KMDetermineKeyIcon (pKM, keyADK, &bItalics);
if (bItalics) tlI.state = TLIS_ITALICS;
}
else {
tlI.state = TLIS_ITALICS;
LoadString (g_hInst, IDS_UNKNOWNADK,
szName, sizeof(szName));
err = PGPGetKeyIDString (&keyidADK,
kPGPKeyIDString_Abbreviated, szID);
if (IsntPGPError (err)) {
LoadString (g_hInst, IDS_UNKNOWNADKID,
szName, sizeof(szName));
lstrcat (szName, szID);
}
}
}
else {
LoadString (g_hInst, IDS_ERRONEOUSADK, szName, sizeof(szName));
}
tlI.cchTextMax = lstrlen (szName);
tlIns.hInsertAfter = (HTLITEM)TLI_SORT;
tlIns.item = tlI;
tlIns.hParent = NULL;
hTNew = TreeList_InsertItem (hwndTree, &tlIns);
tlL.pszText = NULL;
tlL.hItem = hTNew;
tlL.stateMask = TLIS_VISIBLE;
tlL.iSubItem = 1;
tlL.mask = TLIF_DATAVALUE | TLIF_STATE;
tlL.state = TLIS_VISIBLE;
if (byteClass & 0x80) tlL.lDataValue = IDX_ADK;
else tlL.lDataValue = IDX_NOADK;
TreeList_SetListItem (hwndTree, &tlL, FALSE);
}
}
// _____________________________________________________
//
// add columns to treelist
static BOOL
sAddADKColumns (HWND hWndTree, INT iWidth) {
TL_COLUMN tlc;
CHAR sz[64];
TreeList_DeleteAllColumns (hWndTree);
tlc.mask = TLCF_FMT | TLCF_WIDTH | TLCF_TEXT |
TLCF_SUBITEM | TLCF_DATATYPE | TLCF_DATAMAX;
tlc.pszText = sz;
tlc.iSubItem = 0;
tlc.fmt = TLCFMT_LEFT;
tlc.iDataType = TLC_DATASTRING;
tlc.cx = iWidth - ENFORCELISTWIDTH - 20;
tlc.bMouseNotify = FALSE;
LoadString (g_hInst, IDS_NAMEFIELD, sz, sizeof(sz));
TreeList_InsertColumn (hWndTree, 0, &tlc);
tlc.fmt = TLCFMT_IMAGE;
tlc.iDataType = TLC_DATALONG;
tlc.cx = ENFORCELISTWIDTH;
tlc.bMouseNotify = FALSE;
LoadString (g_hInst, IDS_ENFORCEFIELD, sz, sizeof(sz));
TreeList_InsertColumn (hWndTree, 1, &tlc);
return TRUE;
}
// ___________________________________________________
//
// Key Properties Dialog Message procedure - ADK panel
static BOOL CALLBACK
sKeyPropDlgProcADK (
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
KMPROPSHEETSTRUCT* pkmpss;
RECT rc;
pkmpss = (KMPROPSHEETSTRUCT*)GetWindowLong (hDlg, GWL_USERDATA);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -