[resend PATCH] wininet: Updated Session username/password when cached credentials are used.
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Sun Sep 15 18:23:26 CDT 2019
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
Resent to let the testbox have another go.
dlls/wininet/http.c | 20 +++++++++++++++++---
dlls/wininet/tests/http.c | 8 ++++----
2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index ad01420d45..16f7e3f2c7 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -853,7 +853,7 @@ static void destroy_authinfo( struct HttpAuthInfo *authinfo )
heap_free(authinfo);
}
-static UINT retrieve_cached_basic_authorization(const WCHAR *host, const WCHAR *realm, char **auth_data)
+static UINT retrieve_cached_basic_authorization(http_request_t *req, const WCHAR *host, const WCHAR *realm, char **auth_data)
{
basicAuthorizationData *ad;
UINT rc = 0;
@@ -865,10 +865,24 @@ static UINT retrieve_cached_basic_authorization(const WCHAR *host, const WCHAR *
{
if (!strcmpiW(host, ad->host) && (!realm || !strcmpW(realm, ad->realm)))
{
+ char *colon;
+ DWORD length;
+
TRACE("Authorization found in cache\n");
*auth_data = heap_alloc(ad->authorizationLen);
memcpy(*auth_data,ad->authorization,ad->authorizationLen);
rc = ad->authorizationLen;
+
+ /* Updated Session username and password to reflect current credentials */
+ colon = strstr(ad->authorization, ":");
+ length = colon - ad->authorization;
+
+ heap_free(req->session->userName);
+ heap_free(req->session->password);
+
+ req->session->userName = heap_strndupAtoW(ad->authorization, length, &length);
+ length++;
+ req->session->password = heap_strndupAtoW(&ad->authorization[length], ad->authorizationLen - length, &length);
break;
}
}
@@ -1144,7 +1158,7 @@ static BOOL HTTP_DoAuthorization( http_request_t *request, LPCWSTR pszAuthValue,
if (!domain_and_username)
{
if (host && szRealm)
- auth_data_len = retrieve_cached_basic_authorization(host, szRealm,&auth_data);
+ auth_data_len = retrieve_cached_basic_authorization(request, host, szRealm,&auth_data);
if (auth_data_len == 0)
{
heap_free(szRealm);
@@ -1660,7 +1674,7 @@ static BOOL HTTP_InsertAuthorization( http_request_t *request, struct HttpAuthIn
UINT data_len;
char *data;
- if ((data_len = retrieve_cached_basic_authorization(host, NULL, &data)))
+ if ((data_len = retrieve_cached_basic_authorization(request, host, NULL, &data)))
{
TRACE("Found cached basic authorization for %s\n", debugstr_w(host));
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 80d2aad9f4..b61d5c7030 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -4481,15 +4481,15 @@ static void test_basic_auth_credentials_reuse(int port)
SetLastError(0xdeadbeef);
ret = InternetQueryOptionA(req, INTERNET_OPTION_USERNAME, buffer, &size);
ok(ret, "unexpected failure %u\n", GetLastError());
- todo_wine ok(!strcmp(buffer, "user"), "got %s\n", buffer);
- todo_wine ok(size == 4, "got %u\n", size);
+ ok(!strcmp(buffer, "user"), "got %s\n", buffer);
+ ok(size == 4, "got %u\n", size);
size = sizeof(buffer);
SetLastError(0xdeadbeef);
ret = InternetQueryOptionA(req, INTERNET_OPTION_PASSWORD, buffer, &size);
ok(ret, "unexpected failure %u\n", GetLastError());
- todo_wine ok(!strcmp(buffer, "pwd"), "got %s\n", buffer);
- todo_wine ok(size == 3, "got %u\n", size);
+ ok(!strcmp(buffer, "pwd"), "got %s\n", buffer);
+ ok(size == 3, "got %u\n", size);
status = 0xdeadbeef;
size = sizeof(status);
--
2.17.1
More information about the wine-devel
mailing list