clprefsfiles.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 791 行 · 第 1/2 页

C
791
字号
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.
	
	CLprefsFiles.c - handle PGP file preferences dialogs

	$Id: CLprefsFiles.c,v 1.22 2002/10/19 00:18:58 wjb Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
#include <direct.h>
#include <shlobj.h>

// project header files
#include "PGPclx.h"
#include "CLprefs.h"

#include "pgpFileSpec.h"
#include "pgpRandomPool.h"

// external globals
extern HINSTANCE		g_hInst;
extern PGPContextRef	g_context;


static DWORD aFileIds[] = {			// Help IDs
    IDC_PUBRING,			IDH_PGPCLPREF_PRIVATEKEYRING,
	IDC_PUBRINGBROWSE,		IDH_PGPCLPREF_BROWSEPRIVATEKEYRING,
    IDC_SECRING,			IDH_PGPCLPREF_PUBLICKEYRING,
	IDC_SECRINGBROWSE,		IDH_PGPCLPREF_BROWSEPUBLICKEYRING,
	IDC_NETPUBRING,			IDH_PGPCLPREF_NETPUBKEYRING,
	IDC_NETPUBRINGBROWSE,	IDH_PGPCLPREF_BROWSENETPUBKEYRING,
	IDC_NETSECRING,			IDH_PGPCLPREF_NETSECKEYRING,
	IDC_NETSECRINGBROWSE,	IDH_PGPCLPREF_BROWSENETSECKEYRING,
	IDC_NETSETTOCURRENT,	IDH_PGPCLPREF_USEMYKEYRINGS,
	IDC_RNGSEEDFILE,		IDH_PGPCLPREF_RANDOMSEEDFILE,
	IDC_RNGSEEDFILEBROWSE,	IDH_PGPCLPREF_BROWSERANDOMSEEDFILE,
	IDC_NETKEYRINGGROUP,	-1,
	0,0
};


//	____________________________________
//
//	compare set keyrings to current user's and enable button accordingly

static VOID
sCompareNetToPGPKeyringFiles (
		HWND			hwnd)
{
	BOOL			bSameAsCurrentUser	= TRUE;
	CHAR			szNet[MAX_PATH];
	CHAR			szPGP[MAX_PATH];

	GetDlgItemText (hwnd, IDC_PUBRING, szPGP, sizeof(szPGP));
	GetDlgItemText (hwnd, IDC_NETPUBRING, szNet, sizeof(szNet));
	if (lstrcmpi (szPGP, szNet))
		bSameAsCurrentUser = FALSE;

	GetDlgItemText (hwnd, IDC_SECRING, szPGP, sizeof(szPGP));
	GetDlgItemText (hwnd, IDC_NETSECRING, szNet, sizeof(szNet));
	if (lstrcmpi (szPGP, szNet))
		bSameAsCurrentUser = FALSE;

	if (bSameAsCurrentUser)
		EnableWindow (GetDlgItem (hwnd, IDC_NETSETTOCURRENT), FALSE);
	else
		EnableWindow (GetDlgItem (hwnd, IDC_NETSETTOCURRENT), TRUE);
}


//	____________________________
//
//  Check for illegal file names

static BOOL
sIsFileNameOK (LPSTR sz)
{
	UINT	uLen;
	DWORD	dwAttrib;

	uLen = lstrlen (sz);

	if (uLen < 4) return FALSE;
	if ((sz[1] != ':') && (sz[1] != '\\')) return FALSE;
	if ((sz[1] == ':') && (sz[2] != '\\')) return FALSE;
	if (strcspn (sz, "/*?""<>|") != uLen) return FALSE;
	if (sz[uLen-1] == ':') return FALSE;
	if (sz[uLen-1] == '\\') return FALSE;

	dwAttrib = GetFileAttributes (sz);
	if (dwAttrib == 0xFFFFFFFF) return TRUE;	// file doesn't exist
	if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) return FALSE;
	if (dwAttrib & FILE_ATTRIBUTE_SYSTEM) return FALSE;

	return TRUE;
}


//	____________________________
//
//  Check for illegal file names

static BOOL
sCheckFileName (
	HWND	hwnd,
	INT		idc)
{
	CHAR	sz[MAX_PATH];

	GetDlgItemText (hwnd, idc, sz, sizeof(sz));

	if (!sIsFileNameOK (sz))
	{
		PGPclMessageBox (GetParent (hwnd),
				IDS_CAPTIONINFO, IDS_ILLEGALFILENAME,
				MB_OK|MB_ICONINFORMATION);

		SendDlgItemMessage (hwnd, idc, EM_SETSEL, 0, -1);
		SetFocus (GetDlgItem (hwnd, idc));

		return FALSE;
	}

	return TRUE;
}

//	_____________________________________________________
//
//  verify that file or backup of file exists.
//	if not, replace with default file name in install dir
//	if no install dir found, use Windows dir

static BOOL
sVerifyFileExists (
		LPSTR		pszFile)
{
	CHAR		sz[MAX_PATH];
	PGPUInt32	uStatus;
	CHAR*		p;

	uStatus = PGPclTestPathNameStatus (pszFile);

	if (uStatus & kPGPclMediaNotInserted)
		return FALSE;

	if ((uStatus & kPGPclInvalidPath) || 
		(uStatus & kPGPclIsFolder))
	{
		lstrcpy (sz, pszFile);
		p = strrchr (sz, '\\');
		if (p) 
			p++;
		else 
			p = sz;

		if (IsPGPError (PGPclGetPath (
					kPGPclDefaultKeyringFolder, pszFile, MAX_PATH)))
		{
			GetWindowsDirectory (pszFile, MAX_PATH);
		}

		lstrcat (pszFile, p);
	}

	return TRUE;
}

//	_____________________________________________________
//
//  put up common dialog to browse for keyring file

static VOID
sBrowseForKeyringFile (
		HWND			hwnd,
		PPREFSDLGSTRUCT	ppds,
		INT				idc,
		INT				idsFilter,
		INT				idsCaption,
		INT				idsDefaultExt,
		BOOL			bRandseed,
		LPSTR			pszFile,
		INT				iLen)
{
	OPENFILENAME	ofn;
	CHAR			szFilter[128];
	CHAR			szTitle[128];
	CHAR			szInitDir[MAX_PATH];
	LPSTR			pszInitDir;
	CHAR			szDefExt[8];
	CHAR*			p;
	DWORD			dw;

	GetDlgItemText (hwnd, idc, pszFile, iLen);
	dw = GetFileAttributes (pszFile);
	if (dw != 0xFFFFFFFF)
	{
		if (ppds->file.szInitDir[0] == '\0')
		{
			lstrcpy (ppds->file.szInitDir, pszFile);
			p = strrchr (ppds->file.szInitDir, '\\');
			if (p)
				*p = '\0';
			if (dw & FILE_ATTRIBUTE_DIRECTORY)
				pszFile[0] = '\0';
			else
				lstrcpy (pszFile, ++p);
		}
		else
			pszFile[0] = '\0';

		pszInitDir = ppds->file.szInitDir;
	}
	else 
	{
		if (bRandseed)
		{
			PGPclGetPath (kPGPclDefaultRandseedFolder, 
					szInitDir, sizeof(szInitDir));
			pszInitDir = szInitDir;
		}
		else
		{
			if (ppds->file.szInitDir[0])
				pszFile[0] = '\0';
			else
			{
				PGPclGetPath (kPGPclDefaultKeyringFolder, 
						ppds->file.szInitDir, sizeof(ppds->file.szInitDir));
			}
			pszInitDir = ppds->file.szInitDir;
		}
	}

	LoadString (g_hInst, idsCaption, szTitle, sizeof(szTitle));
	LoadString (g_hInst, idsDefaultExt, szDefExt, sizeof(szDefExt));
	LoadString (g_hInst, idsFilter, szFilter, sizeof(szFilter));
	while (p = strrchr (szFilter, '@')) *p = '\0';

	ofn.lStructSize			 = sizeof (ofn);
	ofn.hwndOwner			= hwnd;
	ofn.hInstance			= (HANDLE)g_hInst;
	ofn.lpstrFilter			= szFilter;
	ofn.lpstrCustomFilter	= (LPTSTR)NULL;
	ofn.nMaxCustFilter		= 0L;
	ofn.nFilterIndex		= 1L;
	ofn.lpstrFile			= pszFile;
	ofn.nMaxFile			= iLen;
	ofn.lpstrFileTitle		= NULL;
	ofn.nMaxFileTitle		= 0;
	ofn.lpstrInitialDir		= pszInitDir;
	ofn.lpstrTitle			= szTitle;
	ofn.Flags				= OFN_HIDEREADONLY|OFN_SHAREAWARE|OFN_NOCHANGEDIR;
	ofn.nFileOffset			= 0;
	ofn.nFileExtension		= 0;
	ofn.lpstrDefExt			= szDefExt;
	ofn.lCustData			= 0;

	if (GetOpenFileName (&ofn)) 
	{
		SetDlgItemText (hwnd, idc, pszFile);
		if (ofn.nFileOffset > 0)
			pszFile[ofn.nFileOffset-1] = '\0';

		if (!bRandseed)
			lstrcpy (ppds->file.szInitDir, pszFile);
	}
}


//	___________________________________________________
//
//  Open the PGPnet keyring files specified by the prefs file

static PGPError
sOpenKeyrings (
		PGPContextRef				context,
		LPSTR						pszPubPath,
		LPSTR						pszPrivPath,
		PGPOpenKeyDBFileOptions		options,
		PGPKeyDBRef*				keydbOut)
{
	PGPError		err					= kPGPError_NoErr;
	PGPFileSpecRef	filerefPub			= kInvalidPGPFileSpecRef;
	PGPFileSpecRef	filerefPriv			= kInvalidPGPFileSpecRef;
	BOOL			bReadOnly			= FALSE;
	PGPUInt32		uStatus;

	*keydbOut = kInvalidPGPKeyDBRef;

	// test the pubring for various conditions
	uStatus = PGPclTestPathNameStatus (pszPubPath);

	if (uStatus & kPGPclMediaNotInserted)
	{
		err = kPGPError_CantOpenFile;
		goto done;
	}

	if (options & kPGPOpenKeyDBFileOptions_Mutable)
	{
		if (uStatus & (kPGPclIsReadOnly | kPGPclIsInReadOnlyFolder))
		{
			err = kPGPError_FilePermissions;
			goto done;
		}
	}


	// now do the same for the secring
	uStatus = PGPclTestPathNameStatus (pszPrivPath);

	if (uStatus & kPGPclMediaNotInserted)
	{
		err = kPGPError_CantOpenFile;
		goto done;
	}

	if (options & kPGPOpenKeyDBFileOptions_Mutable)
	{
		if (uStatus & (kPGPclIsReadOnly | kPGPclIsInReadOnlyFolder))
		{
			err = kPGPError_FilePermissions;
			goto done;
		}
	}

	err = PGPNewFileSpecFromFullPath (context,
			pszPubPath, &filerefPub);CKERR;
	err = PGPNewFileSpecFromFullPath (context,
			pszPrivPath, &filerefPriv);CKERR;
	err = PGPOpenKeyDBFile (context,
			options, filerefPub, filerefPriv, keydbOut); CKERR;

done:
	if (PGPFileSpecRefIsValid (filerefPub))
		PGPFreeFileSpec (filerefPub );
	if (PGPFileSpecRefIsValid (filerefPriv))
		PGPFreeFileSpec (filerefPriv);

	return err;
}


//	___________________________________________________
//
//  If this is a new, non-existant file, ask user what to do

static VOID
sQueryCopyNewKeyringFile (
		PPREFSDLGSTRUCT	ppds,
		LPSTR			pszFile,
		UINT			uFile,
		LPSTR			pszPub,
		LPSTR			pszPriv)
{
	BOOL			bError			= TRUE;

	CHAR			szTemp[MAX_PATH];
	CHAR			szPref[MAX_PATH];
	CHAR			szText[MAX_PATH+MAX_PATH+128];
	CHAR			sz[128];
	HANDLE			hfile;
	LPSTR			pszPubNew, pszPrivNew;
	PGPKeyDBRef		keydbOld, keydbNew;

	PGPclGetPath (uFile, szPref, sizeof(szPref));

	if (lstrcmpi (pszFile, szPref) == 0)
		return;

	// set the prefs
	if ((uFile == kPGPclNetPublicKeyringFile) ||
		(uFile == kPGPclNetPrivateKeyringFile))
	{
		PGPclSetPath (ppds->prefrefNet, uFile, pszFile);
		ppds->net.bPrefsModified = TRUE;
		ppds->net.bKeyringModified = TRUE;
	}
	else
	{
		PGPclSetPath (ppds->prefref, uFile, pszFile);
		ppds->bKeyringModified = TRUE;
	}

	if (PGPclTestPathNameStatus (pszFile) & kPGPclIsFile)
		return;

	// create new emtpy file
	hfile = CreateFile (pszFile, GENERIC_READ|GENERIC_WRITE,
			0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
	CloseHandle (hfile);

	// ask user what to do
	LoadString (g_hInst, IDS_QUERYKEYRINGCOPY, sz, sizeof(sz));
	wsprintf (szText, sz, pszFile, szPref);
	LoadString (g_hInst, IDS_CAPTIONINFO, sz, sizeof(sz));

⌨️ 快捷键说明

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