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 + -
显示快捷键?