📄 pnstatus.c
字号:
CHAR sz[256];
INT iEncrTrns;
INT iAuthTrns;
INT iCompTrns;
INT ids;
INT i;
struct in_addr ia;
PGPipsecEncapsulation encap;
PSALISTSTRUCT psals;
iEncrTrns = sGetEncryptionTransformIndex (pSA);
iAuthTrns = sGetAuthenticationTransformIndex (pSA);
iCompTrns = sGetCompressionTransformIndex (pSA);
// we should always have an authentication or encryption transform
pgpAssert ((iAuthTrns >= 0) || (iEncrTrns >= 0));
if ((iAuthTrns < 0) && (iEncrTrns < 0))
return;
// prepare to insert SA into list
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
lvi.iItem = s_iCurrentIndex;
lvi.iSubItem = 0;
// get text for SA (ip address)
ia.S_un.S_addr = pSA->ipAddress;
lstrcpyn (sz, inet_ntoa (ia), sizeof(sz));
lvi.pszText = sz;
// determine icon
if (iEncrTrns >= 0)
encap = pSA->transform[iEncrTrns].u.ipsec.u.esp.t.mode;
else
encap = pSA->transform[iAuthTrns].u.ipsec.u.ah.t.mode;
if (encap == kPGPike_PM_Tunnel)
lvi.iImage = IDX_GATEWAY;
else
lvi.iImage = IDX_SECUREHOST;
psals = (PSALISTSTRUCT)malloc (sizeof (SALISTSTRUCT));
if (!psals)
return;
// store IP addresses
psals->dwIP = pSA->ipAddress;
psals->dwIPstart = pSA->ipAddrStart;
psals->dwIPmask = pSA->ipMaskEnd;
// use inSPI of first transform as index
memcpy (&(psals->lSPI),
&(pSA->transform[0].u.ipsec.inSPI), sizeof(DWORD));
lvi.lParam = (LPARAM)psals;
i = ListView_InsertItem (hwndList, &lvi);
if (i != -1)
{
PNIncStatusSACount ();
lvi.iItem = i;
s_iCurrentIndex = i +1;
// the rest are just strings
lvi.mask = LVIF_TEXT;
// set protocol text string
sz[0] = '\0';
if (iEncrTrns >= 0)
PNCommaCat (sz, IDS_ESP);
if (iAuthTrns >= 0)
PNCommaCat (sz, IDS_AH);
if (iCompTrns >= 0)
PNCommaCat (sz, IDS_IPCOMP);
lvi.iSubItem = COL_PROTOCOL;
ListView_SetItem (hwndList, &lvi);
// set encryption string
if (iEncrTrns >= 0)
{
switch (pSA->transform[iEncrTrns].u.ipsec.u.esp.t.cipher) {
case kPGPike_ET_DES_IV64 : ids = IDS_DES64; break;
case kPGPike_ET_DES : ids = IDS_DES; break;
case kPGPike_ET_3DES : ids = IDS_3DES; break;
case kPGPike_ET_RC5 : ids = IDS_RC5; break;
case kPGPike_ET_IDEA : ids = IDS_IDEA; break;
case kPGPike_ET_CAST : ids = IDS_CAST; break;
case kPGPike_ET_Blowfish : ids = IDS_BLOWFISH; break;
case kPGPike_ET_3IDEA : ids = IDS_3IDEA; break;
case kPGPike_ET_DES_IV32 : ids = IDS_DES32; break;
case kPGPike_ET_RC4 : ids = IDS_RC4; break;
case kPGPike_ET_NULL : ids = IDS_NULL; break;
default : ids = IDS_UNKNOWN; break;
}
}
else
ids = IDS_NA;
lvi.iSubItem = COL_ENCRYPTION;
LoadString (g_hinst, ids, sz, sizeof(sz));
ListView_SetItem (hwndList, &lvi);
// set authentication string
sz[0] = '\0';
if (iEncrTrns >= 0)
{
switch (pSA->transform[iEncrTrns].u.ipsec.u.esp.t.authAttr) {
case kPGPike_AA_HMAC_MD5 : ids = IDS_HMAC_MD5; break;
case kPGPike_AA_HMAC_SHA : ids = IDS_HMAC_SHA; break;
case kPGPike_AA_DES_MAC : ids = IDS_DES_MAC; break;
case kPGPike_AA_KPDK : ids = IDS_KPDK; break;
default : ids = IDS_UNKNOWN; break;
}
PNCommaCat (sz, ids);
}
if (iAuthTrns >= 0)
{
switch (pSA->transform[iAuthTrns].u.ipsec.u.ah.t.authAttr) {
case kPGPike_AA_HMAC_MD5 : ids = IDS_HMAC_MD5; break;
case kPGPike_AA_HMAC_SHA : ids = IDS_HMAC_SHA; break;
case kPGPike_AA_DES_MAC : ids = IDS_DES_MAC; break;
case kPGPike_AA_KPDK : ids = IDS_KPDK; break;
default : ids = IDS_UNKNOWN; break;
}
PNCommaCat (sz, ids);
}
if (sz[0] == '\0')
LoadString (g_hinst, IDS_NA, sz, sizeof(sz));
lvi.iSubItem = COL_AUTHENTICATION;
ListView_SetItem (hwndList, &lvi);
// set expiration string
if (pSA->secLifeTime == 0)
{
LoadString (g_hinst, IDS_NEVER, sz, sizeof(sz));
}
else
{
PGPTime timeExpires = pSA->birthTime + pSA->secLifeTime;
PNConvertTimeToString (timeExpires, sz, sizeof(sz));
}
lvi.iSubItem = COL_EXPIRATION;
ListView_SetItem (hwndList, &lvi);
// set remaining string
sComputeRemaining (pSA->kbLifeTime, pSA->kbLifeTime, sz, sizeof(sz));
lvi.iSubItem = COL_REMAINING;
ListView_SetItem (hwndList, &lvi);
}
}
// ____________________________________
//
// compare entries for sorting purposes
static INT CALLBACK
sCompareFunction (
LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
HWND hwndList = (HWND)lParamSort;
LV_FINDINFO lvfi;
LV_ITEM lvi;
INT index1, index2;
CHAR sz1[32], sz2[32];
lvfi.flags = LVFI_PARAM;
lvfi.lParam = lParam1;
index1 = ListView_FindItem (hwndList, -1, &lvfi);
lvfi.lParam = lParam2;
index2 = ListView_FindItem (hwndList, -1, &lvfi);
lvi.mask = LVIF_TEXT;
lvi.iSubItem = s_ColumnPrefs.iSortField;
lvi.iItem = index1;
lvi.pszText = sz1;
lvi.cchTextMax = sizeof(sz1);
ListView_GetItem (hwndList, &lvi);
lvi.iItem = index2;
lvi.pszText = sz2;
lvi.cchTextMax = sizeof(sz2);
ListView_GetItem (hwndList, &lvi);
return (s_ColumnPrefs.iSortDirection * lstrcmp (sz1, sz2));
}
// ____________________________________
//
// ask user if OK to delete SA, then ask service to delete it
static VOID
sSendRemoveSAMessage (
HWND hwnd)
{
INT i;
LV_FINDINFO lvfi;
lvfi.flags = LVFI_PARAM;
lvfi.lParam = (LPARAM)g_pSelectedItem;
i = ListView_FindItem (GetDlgItem (hwnd, IDC_STATUSLIST), -1, &lvfi);
if (i != -1)
{
COPYDATASTRUCT cds;
PGPipsecSPI spi;
memcpy (spi, &g_pSelectedItem->lSPI, sizeof(PGPipsecSPI));
cds.dwData = PGPNET_STATUSREMOVESA;
cds.cbData = sizeof(PGPipsecSPI);
cds.lpData = spi;
if (!PNSendServiceMessage (WM_COPYDATA,
(WPARAM)hwnd, (LPARAM)&cds))
{
PNMessageBox (hwnd, IDS_CAPTION, IDS_SERVICENOTAVAIL,
MB_OK|MB_ICONSTOP);
}
else
{
// now remove the SA from the list
sFreeSAListStruct (GetDlgItem (hwnd, IDC_STATUSLIST), i);
ListView_DeleteItem (GetDlgItem (hwnd, IDC_STATUSLIST), i);
PNDecStatusSACount ();
}
}
}
// ____________________________________
//
// process status message from service
static VOID
sProcessStatusMessage (
HWND hwnd,
PCOPYDATASTRUCT pcds)
{
HWND hwndList;
hwndList = GetDlgItem (hwnd, IDC_STATUSLIST);
switch (pcds->dwData) {
case PGPNET_STATUSFULL :
{
INT iNumSAs;
INT i;
PGPikeSA* pSAs;
sFreeAllSAListStructs (hwndList);
ListView_DeleteAllItems (hwndList);
PNSetStatusSACount (0);
iNumSAs = pcds->cbData / sizeof(PGPikeSA);
pSAs = (PGPikeSA*)(pcds->lpData);
for (i=0; i<iNumSAs; i++)
{
sAddSAToList (hwndList, pSAs);
pSAs++;
}
ListView_SortItems (hwndList, sCompareFunction, hwndList);
InvalidateRect (hwndList, NULL, FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_SAVE), TRUE);
break;
}
case PGPNET_STATUSNEWSA :
sAddSAToList (hwndList, (PGPikeSA*)(pcds->lpData));
ListView_SortItems (hwndList, sCompareFunction, hwndList);
InvalidateRect (hwndList, NULL, FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_SAVE), TRUE);
break;
case PGPNET_STATUSREMOVESA :
sSADied (hwndList, (LPARAM*)(pcds->lpData));
break;
}
g_AOS.bUpdateHostList = TRUE;
}
// ____________________________________
//
// kill all SAs related to a host
BOOL
PNRemoveHostSAs (
DWORD dwHostAddress,
DWORD dwHostMask)
{
BOOL bHostRemoved = FALSE;
LV_ITEM lvi;
PSALISTSTRUCT psals;
HWND hwndList;
lvi.mask = LVIF_PARAM;
lvi.iItem = 0;
hwndList = GetDlgItem (g_AOS.hwndStatusDlg, IDC_STATUSLIST);
while (ListView_GetItem (hwndList, &lvi))
{
psals = (PSALISTSTRUCT)lvi.lParam;
if ((psals->dwIP == dwHostAddress) ||
((psals->dwIP & dwHostMask) == (dwHostAddress & dwHostMask)))
{
COPYDATASTRUCT cds;
PGPipsecSPI spi;
memcpy (spi, &psals->lSPI, sizeof(PGPipsecSPI));
cds.dwData = PGPNET_STATUSREMOVESA;
cds.cbData = sizeof(PGPipsecSPI);
cds.lpData = spi;
if (!PNSendServiceMessage (WM_COPYDATA,
(WPARAM)g_AOS.hwndStatusDlg, (LPARAM)&cds))
{
PNMessageBox (g_AOS.hwndStatusDlg, IDS_CAPTION,
IDS_SERVICENOTAVAIL, MB_OK|MB_ICONSTOP);
lvi.iItem++;
}
else
{
// now remove the SA from the list
sFreeSAListStruct (hwndList, lvi.iItem);
ListView_DeleteItem (hwndList, lvi.iItem);
PNDecStatusSACount ();
bHostRemoved = TRUE;
}
}
else
lvi.iItem++;
}
return bHostRemoved;
}
// ____________________________________
//
// determine if specified host has an SA in list
BOOL
PNDoesHostHaveSA (
BOOL bBehindGateway,
DWORD dwHostAddress,
DWORD dwHostMask)
{
LV_ITEM lvi;
PSALISTSTRUCT psals;
HWND hwndList;
lvi.mask = LVIF_PARAM;
lvi.iItem = 0;
hwndList = GetDlgItem (g_AOS.hwndStatusDlg, IDC_STATUSLIST);
while (ListView_GetItem (hwndList, &lvi))
{
psals = (PSALISTSTRUCT)lvi.lParam;
if (psals->dwIP == dwHostAddress)
return TRUE;
if ((psals->dwIP & dwHostMask) == (dwHostAddress & dwHostMask))
return TRUE;
if (bBehindGateway)
{
if ((psals->dwIPstart == dwHostAddress) &&
(psals->dwIPmask == dwHostMask))
return TRUE;
}
lvi.iItem++;
}
return FALSE;
}
// ____________________________________
//
// dialog proc of status dialog
BOOL CALLBACK
PNStatusDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG :
{
RECT rc;
sInitStatusList (hwnd);
// setup control size values
GetWindowRect (GetDlgItem (hwnd, IDC_SAVE), &rc);
g_uButtonWidth = rc.right - rc.left;
g_uButtonHeight = rc.bottom - rc.top;
g_uBottomListOffset = 2 * (rc.bottom - rc.top);
GetWindowRect (GetDlgItem (hwnd, IDC_ONOFFBOX), &rc);
g_uOnOffBoxWidth = rc.right - rc.left;
g_uOnOffBoxHeight = rc.bottom - rc.top;
GetWindowRect (GetDlgItem (hwnd, IDC_STATUSLIST), &rc);
MapWindowPoints (NULL, hwnd, (LPPOINT)&rc, 2);
g_iMinWindowWidth = max (g_iMinWindowWidth,
(rc.right-rc.left) + (6*HOR_TAB_OFFSET));
// disable "On/Off" buttons if we don't have privileges
if (g_bReadOnly)
{
EnableWindow (GetDlgItem (hwnd, IDC_PGPNETON), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_PGPNETOFF), FALSE);
}
PostMessage (hwnd, WM_APP, 0, 0);
return FALSE;
}
case WM_APP :
PNSendServiceMessage (PGPNET_M_APPMESSAGE,
(WPARAM)PGPNET_ENABLESTATUSMESSAGES, (LPARAM)hwnd);
break;
case PGPNET_M_ACTIVATEPAGE :
// init on/off buttons
if (g_AOS.pnconfig.bPGPnetEnabled)
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETON);
else
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETOFF);
break;
case PGPNET_M_SETFOCUS :
SetFocus (GetDlgItem (hwnd, IDC_STATUSLIST));
break;
case PGPNET_M_CLEARSALIST :
sFreeAllSAListStructs (GetDlgItem (hwnd, IDC_STATUSLIST));
ListView_DeleteAllItems (GetDlgItem (hwnd, IDC_STATUSLIST));
g_AOS.bUpdateHostList = TRUE;
PostMessage (g_hwndHostDlg, PGPNET_M_UPDATELIST, 0, 0);
break;
case WM_SIZE :
sSizeControls (hwnd, LOWORD(lParam), HIWORD(lParam));
return 0;
case WM_DESTROY :
PNSendServiceMessage (PGPNET_M_APPMESSAGE,
(WPARAM)PGPNET_DISABLESTATUSMESSAGES, (LPARAM)hwnd);
sSetColumnPreferences (GetDlgItem (hwnd, IDC_STATUSLIST));
sFreeAllSAListStructs (GetDlgItem (hwnd, IDC_STATUSLIST));
ImageList_Destroy (hil);
break;
case PGPNET_M_INTERNALCOPYDATA :
sProcessStatusMessage (hwnd, (PCOPYDATASTRUCT)lParam);
break;
case WM_NOTIFY :
if (wParam == IDC_STATUSLIST)
{
NM_LISTVIEW* pnmlv = (NM_LISTVIEW*)lParam;
switch (pnmlv->hdr.code) {
case LVN_COLUMNCLICK:
if (s_ColumnPrefs.iSortField == pnmlv->iSubItem)
{
s_ColumnPrefs.iSortDirection *= -1;
}
else
{
s_ColumnPrefs.iSortField = pnmlv->iSubItem;
s_ColumnPrefs.iSortDirection = SORT_ASCENDING;
}
ListView_SortItems (GetDlgItem (hwnd, IDC_STATUSLIST),
sCompareFunction, GetDlgItem (hwnd, IDC_STATUSLIST));
InvalidateRect (
GetDlgItem (hwnd, IDC_STATUSLIST), NULL, FALSE);
break;
case LVN_ITEMCHANGED :
if (pnmlv->iItem >= 0)
{
if (pnmlv->uNewState & LVIS_SELECTED)
{
if (!g_bReadOnly)
{
g_pSelectedItem = (PSALISTSTRUCT)pnmlv->lParam;
EnableWindow (
GetDlgItem (hwnd, IDC_REMOVE), TRUE);
}
}
else
{
g_pSelectedItem = NULL;
EnableWindow (
GetDlgItem (hwnd, IDC_REMOVE), FALSE);
}
}
break;
case LVN_KEYDOWN :
if (((LV_KEYDOWN*)lParam)->wVKey == VK_DELETE)
{
if (g_pSelectedItem)
PostMessage (hwnd, WM_COMMAND, IDC_REMOVE, 0);
}
break;
}
}
break;
case WM_HELP:
WinHelp (((LPHELPINFO) lParam)->hItemHandle, g_szHelpFile,
HELP_WM_HELP, (DWORD) (LPSTR) aStatusIds);
return TRUE;
case WM_CONTEXTMENU:
WinHelp ((HWND) wParam, g_szHelpFile, HELP_CONTEXTMENU,
(DWORD) (LPVOID) aStatusIds);
return TRUE;
case WM_COMMAND :
switch (LOWORD (wParam)) {
case IDC_SAVE :
if (IsWindowEnabled (GetDlgItem (hwnd, IDC_SAVE)))
{
PNSaveStatusToFile (hwnd);
SetFocus (GetDlgItem (hwnd, IDC_SAVE));
}
break;
case IDC_REMOVE :
if (IsWindowEnabled (GetDlgItem (hwnd, IDC_REMOVE)))
{
sSendRemoveSAMessage (hwnd);
SetFocus (GetDlgItem (hwnd, IDC_REMOVE));
}
break;
case IDC_PGPNETOFF :
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETOFF);
PNSaveOnOffButtons (hwnd, g_context);
SetFocus (GetDlgItem (hwnd, IDC_PGPNETOFF));
break;
case IDC_PGPNETON :
CheckRadioButton (hwnd,
IDC_PGPNETON, IDC_PGPNETOFF, IDC_PGPNETON);
PNSaveOnOffButtons (hwnd, g_context);
SetFocus (GetDlgItem (hwnd, IDC_PGPNETON));
break;
}
return 0;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -