[PATCH] wininet: Support option INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT for http connections

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Mon Oct 11 05:22:26 CDT 2021


Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/wininet/http.c       | 13 +++++++++++++
 dlls/wininet/tests/http.c | 14 ++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 8e40a4cee2b..d0150c235a3 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2330,6 +2330,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(PCERT_CHAIN_CONTEXT))
+            return ERROR_INSUFFICIENT_BUFFER;
+
+        if(!req->server->cert_chain)
+            return ERROR_INTERNET_INCORRECT_HANDLE_STATE;
+
+        *((PCERT_CHAIN_CONTEXT*)buffer) = (PCERT_CHAIN_CONTEXT)CertDuplicateCertificateChain(req->server->cert_chain);
+        *size = sizeof(PCERT_CHAIN_CONTEXT);
+
         return ERROR_SUCCESS;
     }
 
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index b3fcc93b704..567f63b9c8a 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -7129,6 +7129,7 @@ static void test_secure_connection(void)
     INTERNET_CERTIFICATE_INFOW *certificate_structW = NULL;
     char certstr1[512], certstr2[512];
     BOOL ret;
+    PCCERT_CHAIN_CONTEXT ctx = NULL;
 
     ses = InternetOpenA("Gizmo5", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
     ok(ses != NULL, "InternetOpen failed\n");
@@ -7160,6 +7161,14 @@ static void test_secure_connection(void)
 
     test_cert_struct(req, &test_winehq_org_cert);
 
+    size = sizeof(PCCERT_CHAIN_CONTEXT);
+    ret = InternetQueryOptionA(req, INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT, &ctx, &size);
+    ok(ret || GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE /* < IE8*/, "InternetQueryOption failed: %d\n", GetLastError());
+    if (ret)
+    {
+        CertFreeCertificateChain(ctx);
+    }
+
     /* Querying the same option through InternetQueryOptionW still results in
      * ANSI strings being returned.
      */
@@ -8099,6 +8108,7 @@ static void test_cert_string(void)
     char actual[512];
     DWORD size;
     BOOL res;
+    PCCERT_CHAIN_CONTEXT ctx = NULL;
 
     ses = InternetOpenA( "winetest", 0, NULL, NULL, 0 );
     ok( ses != NULL, "InternetOpenA failed\n" );
@@ -8119,6 +8129,10 @@ 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(PCCERT_CHAIN_CONTEXT);
+    res = InternetQueryOptionA(req, INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT, &ctx, &size);
+    ok(!res && (GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_STATE), "InternetQueryOption failed: %d\n", GetLastError());
+
     InternetCloseHandle( req );
     InternetCloseHandle( con );
     InternetCloseHandle( ses );
-- 
2.33.0




More information about the wine-devel mailing list