From 64728c618f73fd80993cb5dfa852f608f9b85d9b Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Mon, 11 Oct 2021 16:17:40 +0200 Subject: [PATCH] wininet: Support option INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT for http requests. Signed-off-by: Alistair Leslie-Hughes Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/wininet/http.c | 13 +++++++++++++ dlls/wininet/tests/http.c | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index c9c4a060aac..1ca97cf3eb0 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -2321,6 +2321,19 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe *(ULONG*)buffer = hdr->ErrorMask; *size = sizeof(ULONG); + return ERROR_SUCCESS; + case INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT: + TRACE("INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT\n"); + + if (*size < sizeof(PCCERT_CHAIN_CONTEXT)) + return ERROR_INSUFFICIENT_BUFFER; + + if (!req->server->cert_chain) + return ERROR_INTERNET_INCORRECT_HANDLE_STATE; + + *(PCCERT_CHAIN_CONTEXT *)buffer = CertDuplicateCertificateChain(req->server->cert_chain); + *size = sizeof(PCCERT_CHAIN_CONTEXT); + return ERROR_SUCCESS; } diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index d1d7e678853..3b8f16a9fb2 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -6855,6 +6855,7 @@ static void test_secure_connection(void) INTERNET_CERTIFICATE_INFOW *certificate_structW = NULL; char certstr1[512], certstr2[512]; BOOL ret; + PCCERT_CHAIN_CONTEXT chain; ses = InternetOpenA("Gizmo5", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); ok(ses != NULL, "InternetOpen failed\n"); @@ -6886,6 +6887,13 @@ static void test_secure_connection(void) test_cert_struct(req, &test_winehq_org_cert); + size = sizeof(chain); + SetLastError(0xdeadbeef); + ret = InternetQueryOptionA(req, INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT, &chain, &size); + ok(ret || GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE /* < IE8 */, + "InternetQueryOption failed: %u\n", GetLastError()); + if (ret) CertFreeCertificateChain(chain); + /* Querying the same option through InternetQueryOptionW still results in * ANSI strings being returned. */ @@ -7825,6 +7833,7 @@ static void test_cert_string(void) char actual[512]; DWORD size; BOOL res; + PCCERT_CHAIN_CONTEXT chain; ses = InternetOpenA( "winetest", 0, NULL, NULL, 0 ); ok( ses != NULL, "InternetOpenA failed\n" ); @@ -7845,6 +7854,12 @@ static void test_cert_string(void) ok( size == 0, "unexpected size: %u\n", size ); ok( actual[0] == 0x55, "unexpected byte: %02x\n", actual[0] ); + size = sizeof(chain); + SetLastError(0xdeadbeef); + res = InternetQueryOptionA(req, INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT, &chain, &size); + ok(!res && (GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_STATE), + "InternetQueryOption failed: %u\n", GetLastError()); + InternetCloseHandle( req ); InternetCloseHandle( con ); InternetCloseHandle( ses );