Module: wine Branch: master Commit: e857f383a428f07e7b0f1e0dbbec7ffa62d5e54b URL: http://source.winehq.org/git/wine.git/?a=commit;h=e857f383a428f07e7b0f1e0dbb...
Author: Juan Lang juan.lang@gmail.com Date: Thu Oct 18 11:10:55 2007 -0700
crypt32: Implement I_CertUpdateStore.
---
dlls/crypt32/main.c | 10 ---------- dlls/crypt32/store.c | 32 ++++++++++++++++++++++++++++++++ dlls/crypt32/tests/store.c | 11 ----------- 3 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/dlls/crypt32/main.c b/dlls/crypt32/main.c index fa8b782..12f2885 100644 --- a/dlls/crypt32/main.c +++ b/dlls/crypt32/main.c @@ -60,16 +60,6 @@ HCRYPTPROV CRYPT_GetDefaultProvider(void) return hDefProv; }
-/* Appears to be called to update the contents of store1 with those in store2. - * The second two parameters are unknown. - */ -BOOL WINAPI I_CertUpdateStore(HCERTSTORE store1, HCERTSTORE store2, DWORD unk0, - DWORD unk1) -{ - FIXME("(%p, %p, %08x, %08x)\n", store1, store2, unk0, unk1); - return FALSE; -} - typedef void * HLRUCACHE;
/* this function is called by Internet Explorer when it is about to verify a diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c index c32ae62..28c37d2 100644 --- a/dlls/crypt32/store.c +++ b/dlls/crypt32/store.c @@ -216,6 +216,38 @@ void CRYPT_EmptyStore(HCERTSTORE store) } while (crl); }
+BOOL WINAPI I_CertUpdateStore(HCERTSTORE store1, HCERTSTORE store2, DWORD unk0, + DWORD unk1) +{ + static BOOL warned = FALSE; + PCCERT_CONTEXT cert = NULL; + PCCRL_CONTEXT crl = NULL; + + TRACE("(%p, %p, %08x, %08x)\n", store1, store2, unk0, unk1); + if (!warned) + { + FIXME("semi-stub\n"); + warned = TRUE; + } + + /* Poor-man's resync: empty first store, then add everything from second + * store to it. + */ + CRYPT_EmptyStore(store1); + do { + cert = CertEnumCertificatesInStore(store2, cert); + if (cert) + CertAddCertificateContextToStore(store1, cert, + CERT_STORE_ADD_ALWAYS, NULL); + } while (cert); + do { + crl = CertEnumCRLsInStore(store2, crl); + if (crl) + CertAddCRLContextToStore(store1, crl, CERT_STORE_ADD_ALWAYS, NULL); + } while (crl); + return TRUE; +} + static void WINAPI CRYPT_MemCloseStore(HCERTSTORE hCertStore, DWORD dwFlags) { WINE_MEMSTORE *store = (WINE_MEMSTORE *)hCertStore; diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c index 99fac18..05ea5e0 100644 --- a/dlls/crypt32/tests/store.c +++ b/dlls/crypt32/tests/store.c @@ -1840,32 +1840,25 @@ static void test_I_UpdateStore(void) ret = pI_CertUpdatestore(NULL, store2, 0, 0); */ ret = pI_CertUpdatestore(store1, store2, 0, 0); - todo_wine ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError());
CertAddEncodedCertificateToStore(store2, X509_ASN_ENCODING, bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, &cert); /* I_CertUpdateStore adds the contexts from store2 to store1 */ ret = pI_CertUpdatestore(store1, store2, 0, 0); - todo_wine ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError()); certs = countCertsInStore(store1); - todo_wine ok(certs == 1, "Expected 1 cert, got %d\n", certs); /* Calling it a second time has no effect */ ret = pI_CertUpdatestore(store1, store2, 0, 0); - todo_wine ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError()); certs = countCertsInStore(store1); - todo_wine ok(certs == 1, "Expected 1 cert, got %d\n", certs);
/* The last parameters to I_CertUpdateStore appear to be ignored */ ret = pI_CertUpdatestore(store1, store2, 1, 0); - todo_wine ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError()); ret = pI_CertUpdatestore(store1, store2, 0, 1); - todo_wine ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError());
CertAddEncodedCRLToStore(store2, X509_ASN_ENCODING, signedCRL, @@ -1873,13 +1866,10 @@ static void test_I_UpdateStore(void)
/* I_CertUpdateStore also adds the CRLs from store2 to store1 */ ret = pI_CertUpdatestore(store1, store2, 0, 0); - todo_wine ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError()); certs = countCertsInStore(store1); - todo_wine ok(certs == 1, "Expected 1 cert, got %d\n", certs); certs = countCRLsInStore(store1); - todo_wine ok(certs == 1, "Expected 1 CRL, got %d\n", certs);
CertDeleteCertificateFromStore(cert); @@ -1887,7 +1877,6 @@ static void test_I_UpdateStore(void) * from store1 */ ret = pI_CertUpdatestore(store1, store2, 0, 0); - todo_wine ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError()); certs = countCertsInStore(store1); ok(certs == 0, "Expected 0 certs, got %d\n", certs);