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

📄 pnstatus.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -