From aebb77850dc9adfe0c80323fc7c1e63ff8f3224b Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Fri, 28 Sep 2007 08:38:12 -0700 Subject: [PATCH] Allow file stores to support more than one type of file --- dlls/crypt32/filestore.c | 28 ++++++++++++++++++++++------ 1 files changed, 22 insertions(+), 6 deletions(-) diff --git a/dlls/crypt32/filestore.c b/dlls/crypt32/filestore.c index ffd9889..9dde31c 100644 --- a/dlls/crypt32/filestore.c +++ b/dlls/crypt32/filestore.c @@ -30,6 +30,7 @@ typedef struct _WINE_FILESTOREINFO DWORD dwOpenFlags; HCERTSTORE memStore; HANDLE file; + DWORD type; BOOL dirty; } WINE_FILESTOREINFO, *PWINE_FILESTOREINFO; @@ -40,7 +41,7 @@ static void WINAPI CRYPT_FileCloseStore( TRACE("(%p, %08x)\n", store, dwFlags); if (store->dirty) CertSaveStore(store->memStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, - CERT_STORE_SAVE_AS_STORE, CERT_STORE_SAVE_TO_FILE, store->file, 0); + store->type, CERT_STORE_SAVE_TO_FILE, store->file, 0); CertCloseStore(store->memStore, dwFlags); CloseHandle(store->file); CryptMemFree(store); @@ -100,7 +101,19 @@ static BOOL WINAPI CRYPT_FileControl(HCE case CERT_STORE_CTRL_RESYNC: CRYPT_EmptyStore(store->memStore); store->dirty = FALSE; - ret = CRYPT_ReadSerializedStoreFromFile(store->file, store->memStore); + if (store->type == CERT_STORE_SAVE_AS_STORE) + ret = CRYPT_ReadSerializedStoreFromFile(store->file, + store->memStore); + else if (store->type == CERT_STORE_SAVE_AS_PKCS7) + { + FIXME("unimplemented for PKCS stores\n"); + ret = FALSE; + } + else + { + WARN("unknown type %d\n", store->type); + ret = FALSE; + } break; case CERT_STORE_CTRL_COMMIT: if (!(store->dwOpenFlags & CERT_FILE_STORE_COMMIT_ENABLE_FLAG)) @@ -111,7 +124,7 @@ static BOOL WINAPI CRYPT_FileControl(HCE else if (store->dirty) ret = CertSaveStore(store->memStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, - CERT_STORE_SAVE_AS_STORE, CERT_STORE_SAVE_TO_FILE, store->file, 0); + store->type, CERT_STORE_SAVE_TO_FILE, store->file, 0); else ret = TRUE; break; @@ -140,7 +153,7 @@ static void *fileProvFuncs[] = { }; static PWINECRYPT_CERTSTORE CRYPT_CreateFileStore(DWORD dwFlags, - HCERTSTORE memStore, HANDLE file) + HCERTSTORE memStore, HANDLE file, DWORD type) { PWINECRYPT_CERTSTORE store = NULL; PWINE_FILESTOREINFO info = CryptMemAlloc(sizeof(WINE_FILESTOREINFO)); @@ -152,6 +165,7 @@ static PWINECRYPT_CERTSTORE CRYPT_Create info->dwOpenFlags = dwFlags; info->memStore = memStore; info->file = file; + info->type = type; info->dirty = FALSE; provInfo.cbSize = sizeof(provInfo); provInfo.cStoreProvFunc = sizeof(fileProvFuncs) / @@ -200,7 +214,8 @@ PWINECRYPT_CERTSTORE CRYPT_FileOpenStore { if (CRYPT_ReadSerializedStoreFromFile(file, memStore)) { - store = CRYPT_CreateFileStore(dwFlags, memStore, file); + store = CRYPT_CreateFileStore(dwFlags, memStore, file, + CERT_STORE_SAVE_AS_STORE); /* File store doesn't need crypto provider, so close it */ if (hCryptProv && !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG)) @@ -255,7 +270,8 @@ PWINECRYPT_CERTSTORE CRYPT_FileNameOpenS { if (CRYPT_ReadSerializedStoreFromFile(file, memStore)) { - store = CRYPT_CreateFileStore(dwFlags, memStore, file); + store = CRYPT_CreateFileStore(dwFlags, memStore, file, + CERT_STORE_SAVE_AS_STORE); /* File store doesn't need crypto provider, so close it */ if (hCryptProv && !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG)) -- 1.4.1