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

📄 pkuser.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.
	
	PKUser.c - miscellaneous user interface routines
	
	$Id: PKUser.c,v 1.25 2002/10/29 17:44:44 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"	/* or pgpConfig.h in the CDK */

// project header files
#include "PGPkeysx.h"
#include "pgpUnicodeWin32.h"
#include "UTF8Edit.h"

// system header files
#include <commdlg.h>

// local globals
static CHAR			s_szPubring[MAX_PATH];
static CHAR			s_szSecring[MAX_PATH];

// external global variables
extern HINSTANCE			g_hinst;
extern PGPContextRef		g_context;
extern PGPtlsContextRef		g_tlscontext;

//	____________________________________
//
//	Message box routine
//
//	iCaption and iMessage are string table resource IDs.

LRESULT 
PKMessageBox (
		HWND	hWnd, 
		INT		iCaption, 
		INT		iMessage,
		ULONG	ulFlags) 
{
	CHAR szCaption [128];
	CHAR szMessage [512];

	LoadString (g_hinst, iCaption, szCaption, sizeof(szCaption));
	LoadString (g_hinst, iMessage, szMessage, sizeof(szMessage));

	ulFlags |= MB_SETFOREGROUND;
	return (MessageBox (hWnd, szMessage, szCaption, ulFlags));
}

//	____________________________________
//
//	Backup warning dialog message procedure

static BOOL CALLBACK 
sBackupWarnDlgProc(
		HWND	hWndDlg, 
		UINT	uMsg, 
		WPARAM	wParam, 
		LPARAM	lParam) 
{
	switch (uMsg) {

	case WM_INITDIALOG:
		return TRUE;

	case WM_COMMAND:

		switch (LOWORD(wParam)) {
		case IDC_BACKUPNOW:
			EndDialog (hWndDlg, IDC_BACKUPNOW);
			break;

		case IDC_DONTBACKUP :
			EndDialog (hWndDlg, IDC_DONTBACKUP);
			break;

		case IDCANCEL:
			EndDialog (hWndDlg, IDCANCEL);
			break;

		}
		return TRUE;
	}
	return FALSE;
}


//	____________________________________
//
//	Warn user of need for backup

BOOL 
PKBackupWarn (
	HWND	hWnd, 
	BOOL	bClosingPGPkeys,
	BOOL*	pbBackup) 
{
	INT		iReturn;

	if (bClosingPGPkeys)
	{
		iReturn = DialogBox (g_hinst, MAKEINTRESOURCE (IDD_BACKUPWARN), 
			hWnd, sBackupWarnDlgProc);
	}
	else
	{
		iReturn = DialogBox (g_hinst, MAKEINTRESOURCE (IDD_BACKUPWARN2), 
			hWnd, sBackupWarnDlgProc);
	}

	if (iReturn == IDCANCEL) {
		*pbBackup = FALSE;
		return FALSE;
	}

	else if (iReturn == IDC_BACKUPNOW) {
		*pbBackup = TRUE;
		return TRUE;
	}

	else {
		*pbBackup = FALSE;
		return TRUE;
	}
}


//	____________________________________
//
//	Warn user of existing split key dialogs

BOOL 
PKSplitKeyWarn (HWND hwnd) 
{
	PKMessageBox (hwnd, IDS_CAPTIONINFO, IDS_SPLITKEYWARNING, 
			MB_OK|MB_ICONINFORMATION|MB_SYSTEMMODAL);

	return FALSE;
}


//	______________________________________________
//
//  create the specified path if it doesn't already exist
//	assumes path ends in '\' if it is a folder name

static BOOL
sCreatePath (
		LPSTR	pszPath)
{
	DWORD	dw;
	LPSTR	p;

	dw = GetFileAttributes (pszPath);
	if ((dw != 0xFFFFFFFF) &&
		(dw & FILE_ATTRIBUTE_DIRECTORY))
	{
		return TRUE;
	}

	if (dw != 0xFFFFFFFF)
		return FALSE;

	p = strchr (pszPath, '\\');
	while (p)
	{
		*p = '\0';
		CreateDirectory (pszPath, NULL);
		*p = '\\';
		p++;
		p = strchr (p, '\\');
	}
	return TRUE;
}


//	____________________________________
//
//	backup the keydb to the specified files

static PGPError
sBackupKeyDB (
		PGPKeyDBRef		keydbToBackup,
		LPSTR			pszPubring,
		LPSTR			pszSecring)
{
	PGPError	err;

	PGPFileSpecRef	filespecPubring;
	PGPFileSpecRef	filespecSecring;
	PGPKeyDBRef		keydb;

	if (PGPclTestPathNameStatus (pszPubring) & kPGPclIsFile)
	{
		if (!DeleteFile (pszPubring))
			return kPGPError_FileOpFailed;
	}

	if (PGPclTestPathNameStatus (pszSecring) & kPGPclIsFile)
	{
		if (!DeleteFile (pszSecring))
			return kPGPError_FileOpFailed;
	}
		
	err = PGPNewFileSpecFromFullPath (
			g_context, pszPubring, &filespecPubring);
	if (IsntPGPError (err))
	{
		err = PGPNewFileSpecFromFullPath (
				g_context, pszSecring, &filespecSecring);
		if (IsntPGPError (err))
		{
			err = PGPOpenKeyDBFile (g_context, 
					kPGPOpenKeyDBFileOptions_Create |
					kPGPOpenKeyDBFileOptions_Mutable,
					filespecPubring, filespecSecring, &keydb);

			if (IsntPGPError (err))
			{
				err = PGPCopyKeys (
						PGPPeekKeyDBRootKeySet (keydbToBackup),
						keydb, NULL);
			
				PGPFreeKeyDB (keydb);
			}
			PGPFreeFileSpec (filespecSecring);
		}
		PGPFreeFileSpec (filespecPubring);
	}

	return err;
}


//	____________________________________
//
//	the main keydb has been opened

VOID
PKKeyDBOpened (
		PPGPKEYSSTRUCT	ppks)
{
	ppks->uBackupFlags = 0;
	PGPclGetPath (kPGPclPublicKeyringFile, s_szPubring, sizeof(s_szPubring));
	PGPclGetPath (kPGPclPrivateKeyringFile, s_szSecring, sizeof(s_szSecring));
}


//	____________________________________
//
//	the main keydb has been modified

VOID
PKKeyDBModified (
		PPGPKEYSSTRUCT	ppks,
		UINT			uModIndex)
{
	ppks->uBackupFlags |= uModIndex;
	if ((ppks->uFlags & (PK_MAINWINDOW|PK_PDAWINDOW)) ||
		((ppks->uFlags & PK_SEARCHWINDOW) && (ppks->bLocalKeySet)))
	{
		PKPostMessageWindowList (
				PK_M_REFRESHKEYRINGS, (WPARAM)ppks->hwndMain, TRUE);
	}
}


//	____________________________________
//
//	auto backup the keyring

VOID
PKAutoBackup (
		PPGPKEYSSTRUCT	ppks)
{
	PGPError	err				= kPGPError_NoErr;

	CHAR		szPubring[MAX_PATH];
	CHAR		szSecring[MAX_PATH];
	CHAR		szTempPubring[MAX_PATH];
	CHAR		szTempSecring[MAX_PATH];
	CHAR		sz[MAX_PATH];
	PGPPrefRef	prefref;
	PGPBoolean	b;
	CHAR*		p;

	PGPclPeekClientLibPrefRefs (&prefref, NULL);
	PGPGetPrefBoolean (prefref, kPGPPrefAutoBackupKeyring, &b);
	if (b)
	{
		PGPGetPrefBoolean (prefref, kPGPPrefAutoBackupToKeyringFolder, &b);
		// use the keyring file path as the base path
		if (b)
		{
			lstrcpy (szPubring, s_szPubring);
			lstrcpy (szSecring, s_szSecring);
		}
		// append the keyring file names to the backup folder
		else
		{
			PGPGetPrefStringBuffer (prefref, 
					kPGPPrefAutoBackupFolder, sizeof(szPubring), szPubring);
			if (szPubring [lstrlen(szPubring)-1] != '\\')
				lstrcat (szPubring, "\\");
			sCreatePath (szPubring);

			lstrcpy (szSecring, szPubring);

			lstrcpy (sz, s_szPubring);
			p = strrchr (sz, '\\');
			if (p) 
				p++;
			else
				p = &sz[0];
			lstrcat (szPubring, p);

			lstrcpy (sz, s_szSecring);
			p = strrchr (sz, '\\');
			if (p)
				p++;
			else
				p = &sz[0];
			lstrcat (szSecring, p);
		}

		// construct the temp backup file names 
		// and the actual backup file names
		p = strrchr (szPubring, '.');
		if (p)
		{
			lstrcpy (sz, p);
			*p = '\0';
		}
		lstrcpy (szTempPubring, szPubring);
		lstrcat (szTempPubring, "-tmp");
		lstrcat (szTempPubring, sz);

		lstrcat (szPubring, "-bak");
		lstrcat (szPubring, sz);

		p = strrchr (szSecring, '.');
		if (p)
		{
			lstrcpy (sz, p);
			*p = '\0';
		}
		lstrcpy (szTempSecring, szSecring);
		lstrcat (szTempSecring, "-tmp");
		lstrcat (szTempSecring, sz);

		lstrcat (szSecring, "-bak");
		lstrcat (szSecring, sz);

		// actually perform the backup if the flags indicate a backup
		// is due, or if the backup files do not already exist
		if ((ppks->uBackupFlags) ||
			!(PGPclTestPathNameStatus (szPubring) & kPGPclIsFile) ||
			!(PGPclTestPathNameStatus (szSecring) & kPGPclIsFile))
		{
			// backup to temp files
			err = sBackupKeyDB (ppks->keydbMain, szTempPubring, szTempSecring);
			if (IsntPGPError (err))
			{
				// delete pre-existing backups
				if (PGPclTestPathNameStatus (szPubring) & kPGPclIsFile)
				{
					if (!DeleteFile (szPubring))
						err = kPGPError_FileOpFailed;
				}

				if (PGPclTestPathNameStatus (szSecring) & kPGPclIsFile)
				{
					if (!DeleteFile (szSecring))
						err = kPGPError_FileOpFailed;
				}

				// rename temp files to backups
				if (!MoveFile (szTempPubring, szPubring))
					err = kPGPError_FileOpFailed;

				if (!MoveFile (szTempSecring, szSecring))
					err = kPGPError_FileOpFailed;

				if (IsntPGPError (err))
					ppks->uBackupFlags = 0;
			}
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -