Module: wine Branch: master Commit: 07de224b54133d8a6d36a66e138b0bcf9fdad40f URL: http://source.winehq.org/git/wine.git/?a=commit;h=07de224b54133d8a6d36a66e13...
Author: Juan Lang juan.lang@gmail.com Date: Fri Aug 29 07:59:37 2008 -0700
crypt32: Implement CertAddCTLContextToStore.
---
dlls/crypt32/ctl.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/crypt32/store.c | 9 ----- dlls/crypt32/tests/ctl.c | 4 -- 3 files changed, 85 insertions(+), 13 deletions(-)
diff --git a/dlls/crypt32/ctl.c b/dlls/crypt32/ctl.c index 12ee19d..9b6d2e0 100644 --- a/dlls/crypt32/ctl.c +++ b/dlls/crypt32/ctl.c @@ -29,6 +29,91 @@
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
+#define CtlContext_CopyProperties(to, from) \ + Context_CopyProperties((to), (from), sizeof(CTL_CONTEXT)) + +BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore, + PCCTL_CONTEXT pCtlContext, DWORD dwAddDisposition, + PCCTL_CONTEXT* ppStoreContext) +{ + PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)hCertStore; + BOOL ret = TRUE; + PCCTL_CONTEXT toAdd = NULL, existing = NULL; + + TRACE("(%p, %p, %08x, %p)\n", hCertStore, pCtlContext, dwAddDisposition, + ppStoreContext); + + if (dwAddDisposition != CERT_STORE_ADD_ALWAYS) + { + existing = CertFindCTLInStore(hCertStore, 0, 0, CTL_FIND_EXISTING, + pCtlContext, NULL); + } + + switch (dwAddDisposition) + { + case CERT_STORE_ADD_ALWAYS: + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_NEW: + if (existing) + { + TRACE("found matching CTL, not adding\n"); + SetLastError(CRYPT_E_EXISTS); + ret = FALSE; + } + else + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_NEWER: + if (existing) + { + LONG newer = CompareFileTime(&existing->pCtlInfo->ThisUpdate, + &pCtlContext->pCtlInfo->ThisUpdate); + + if (newer < 0) + toAdd = CertDuplicateCTLContext(pCtlContext); + else + { + TRACE("existing CTL is newer, not adding\n"); + SetLastError(CRYPT_E_EXISTS); + ret = FALSE; + } + } + else + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_REPLACE_EXISTING: + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES: + toAdd = CertDuplicateCTLContext(pCtlContext); + if (existing) + CtlContext_CopyProperties(toAdd, existing); + break; + case CERT_STORE_ADD_USE_EXISTING: + if (existing) + CtlContext_CopyProperties(existing, pCtlContext); + break; + default: + FIXME("Unimplemented add disposition %d\n", dwAddDisposition); + ret = FALSE; + } + + if (toAdd) + { + if (store) + ret = store->ctls.addContext(store, (void *)toAdd, + (void *)existing, (const void **)ppStoreContext); + else if (ppStoreContext) + *ppStoreContext = CertDuplicateCTLContext(toAdd); + CertFreeCTLContext(toAdd); + } + CertFreeCTLContext(existing); + + TRACE("returning %d\n", ret); + return ret; +} + BOOL WINAPI CertAddEncodedCTLToStore(HCERTSTORE hCertStore, DWORD dwMsgAndCertEncodingType, const BYTE *pbCtlEncoded, DWORD cbCtlEncoded, DWORD dwAddDisposition, PCCTL_CONTEXT *ppCtlContext) diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c index 180740c..6d9177e 100644 --- a/dlls/crypt32/store.c +++ b/dlls/crypt32/store.c @@ -1091,15 +1091,6 @@ PCCRL_CONTEXT WINAPI CertEnumCRLsInStore(HCERTSTORE hCertStore, return ret; }
-BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore, - PCCTL_CONTEXT pCtlContext, DWORD dwAddDisposition, - PCCTL_CONTEXT* ppStoreContext) -{ - FIXME("(%p, %p, %08x, %p): stub\n", hCertStore, pCtlContext, - dwAddDisposition, ppStoreContext); - return TRUE; -} - HCERTSTORE WINAPI CertDuplicateStore(HCERTSTORE hCertStore) { WINECRYPT_CERTSTORE *hcs = (WINECRYPT_CERTSTORE *)hCertStore; diff --git a/dlls/crypt32/tests/ctl.c b/dlls/crypt32/tests/ctl.c index b6cccb2..168b05d 100644 --- a/dlls/crypt32/tests/ctl.c +++ b/dlls/crypt32/tests/ctl.c @@ -333,7 +333,6 @@ static void testAddCTLToStore(void) if (ctl) numCTLs++; } while (ctl); - todo_wine ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); CertCloseStore(store, 0);
@@ -350,7 +349,6 @@ static void testAddCTLToStore(void) signedCTLWithCTLInnerContentAndBadSig, sizeof(signedCTLWithCTLInnerContentAndBadSig), CERT_STORE_ADD_NEW, NULL); - todo_wine ok(!ret && GetLastError() == CRYPT_E_EXISTS, "expected CRYPT_E_EXISTS, got %08x\n", GetLastError()); CertCloseStore(store, 0); @@ -376,7 +374,6 @@ static void testAddCTLToStore(void) if (ctl) numCTLs++; } while (ctl); - todo_wine ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); CertCloseStore(store, 0);
@@ -401,7 +398,6 @@ static void testAddCTLToStore(void) if (ctl) numCTLs++; } while (ctl); - todo_wine ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); CertCloseStore(store, 0); }