[PATCH] winhttp: Implement WinHttpSetOption(WINHTTP_OPTION_CLIENT_CERT_CONTEXT).
Hans Leidekker
hans at codeweavers.com
Mon Jan 28 08:37:27 CST 2019
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/winhttp/session.c | 30 ++++++++++++++++++++++++++++--
dlls/winhttp/winhttp_private.h | 1 +
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 82615ad12f..890894d1c0 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -611,6 +611,7 @@ static void request_destroy( struct object_header *hdr )
release_object( &request->connect->hdr );
CertFreeCertificateContext( request->server_cert );
+ CertFreeCertificateContext( request->client_cert );
destroy_authinfo( request->authinfo );
destroy_authinfo( request->proxy_authinfo );
@@ -1000,14 +1001,39 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b
return TRUE;
}
case WINHTTP_OPTION_CLIENT_CERT_CONTEXT:
+ {
+ const CERT_CONTEXT *cert;
+
if (!(hdr->flags & WINHTTP_FLAG_SECURE))
{
SetLastError( ERROR_WINHTTP_INCORRECT_HANDLE_STATE );
return FALSE;
}
- FIXME("WINHTTP_OPTION_CLIENT_CERT_CONTEXT\n");
- return TRUE;
+ if (!buffer)
+ {
+ CertFreeCertificateContext( request->client_cert );
+ request->client_cert = NULL;
+ }
+ else if (buflen >= sizeof(cert))
+ {
+ if (!(cert = CertDuplicateCertificateContext( buffer ))) return FALSE;
+ CertFreeCertificateContext( request->client_cert );
+ request->client_cert = cert;
+ }
+ else
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ if (request->cred_handle_initialized)
+ {
+ FreeCredentialsHandle( &request->cred_handle );
+ request->cred_handle_initialized = FALSE;
+ }
+
+ return TRUE;
+ }
case WINHTTP_OPTION_ENABLE_FEATURE:
if(buflen == sizeof( DWORD ) && *(DWORD *)buffer == WINHTTP_ENABLE_SSL_REVOCATION)
{
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index b46f7087d8..33b96b97f0 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -182,6 +182,7 @@ struct request
DWORD security_flags;
BOOL check_revocation;
const CERT_CONTEXT *server_cert;
+ const CERT_CONTEXT *client_cert;
int resolve_timeout;
int connect_timeout;
int send_timeout;
--
2.20.1
More information about the wine-devel
mailing list