wininet: Allow HTTP_DoAuthorization to accept a NULL username/domain in the non-Basic case.

When using SSPI, pass in a NULL identity in this case so that the SSP
can try to use cached credentials.
This commit is contained in:
Rob Shearman 2008-03-10 16:40:23 +00:00 committed by Alexandre Julliard
parent 8c6ac00820
commit 7631bdf0c1
1 changed files with 36 additions and 20 deletions

View File

@ -404,8 +404,6 @@ static BOOL HTTP_DoAuthorization( LPWININETHTTPREQW lpwhr, LPCWSTR pszAuthValue,
TRACE("%s\n", debugstr_w(pszAuthValue)); TRACE("%s\n", debugstr_w(pszAuthValue));
if (!domain_and_username) return FALSE;
if (!pAuthInfo) if (!pAuthInfo)
{ {
TimeStamp exp; TimeStamp exp;
@ -435,9 +433,8 @@ static BOOL HTTP_DoAuthorization( LPWININETHTTPREQW lpwhr, LPCWSTR pszAuthValue,
} }
else else
{ {
PVOID pAuthData;
SEC_WINNT_AUTH_IDENTITY_W nt_auth_identity; SEC_WINNT_AUTH_IDENTITY_W nt_auth_identity;
WCHAR *user = strchrW(domain_and_username, '\\');
WCHAR *domain = domain_and_username;
pAuthInfo->scheme = WININET_strdupW(pszAuthValue); pAuthInfo->scheme = WININET_strdupW(pszAuthValue);
if (!pAuthInfo->scheme) if (!pAuthInfo->scheme)
@ -446,12 +443,22 @@ static BOOL HTTP_DoAuthorization( LPWININETHTTPREQW lpwhr, LPCWSTR pszAuthValue,
return FALSE; return FALSE;
} }
if (domain_and_username)
{
WCHAR *user = strchrW(domain_and_username, '\\');
WCHAR *domain = domain_and_username;
/* FIXME: make sure scheme accepts SEC_WINNT_AUTH_IDENTITY before calling AcquireCredentialsHandle */
pAuthData = &nt_auth_identity;
if (user) user++; if (user) user++;
else else
{ {
user = domain_and_username; user = domain_and_username;
domain = NULL; domain = NULL;
} }
nt_auth_identity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; nt_auth_identity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
nt_auth_identity.User = user; nt_auth_identity.User = user;
nt_auth_identity.UserLength = strlenW(nt_auth_identity.User); nt_auth_identity.UserLength = strlenW(nt_auth_identity.User);
@ -459,12 +466,14 @@ static BOOL HTTP_DoAuthorization( LPWININETHTTPREQW lpwhr, LPCWSTR pszAuthValue,
nt_auth_identity.DomainLength = domain ? user - domain - 1 : 0; nt_auth_identity.DomainLength = domain ? user - domain - 1 : 0;
nt_auth_identity.Password = password; nt_auth_identity.Password = password;
nt_auth_identity.PasswordLength = strlenW(nt_auth_identity.Password); nt_auth_identity.PasswordLength = strlenW(nt_auth_identity.Password);
}
/* FIXME: make sure scheme accepts SEC_WINNT_AUTH_IDENTITY before calling AcquireCredentialsHandle */ else
/* use default credentials */
pAuthData = NULL;
sec_status = AcquireCredentialsHandleW(NULL, pAuthInfo->scheme, sec_status = AcquireCredentialsHandleW(NULL, pAuthInfo->scheme,
SECPKG_CRED_OUTBOUND, NULL, SECPKG_CRED_OUTBOUND, NULL,
&nt_auth_identity, NULL, pAuthData, NULL,
NULL, &pAuthInfo->cred, NULL, &pAuthInfo->cred,
&exp); &exp);
if (sec_status != SEC_E_OK) if (sec_status != SEC_E_OK)
@ -491,12 +500,19 @@ static BOOL HTTP_DoAuthorization( LPWININETHTTPREQW lpwhr, LPCWSTR pszAuthValue,
if (is_basic_auth_value(pszAuthValue)) if (is_basic_auth_value(pszAuthValue))
{ {
int userlen = WideCharToMultiByte(CP_UTF8, 0, domain_and_username, lstrlenW(domain_and_username), NULL, 0, NULL, NULL); int userlen;
int passlen = WideCharToMultiByte(CP_UTF8, 0, password, lstrlenW(password), NULL, 0, NULL, NULL); int passlen;
char *auth_data; char *auth_data;
TRACE("basic authentication\n"); TRACE("basic authentication\n");
/* we don't cache credentials for basic authentication, so we can't
* retrieve them if the application didn't pass us any credentials */
if (!domain_and_username) return FALSE;
userlen = WideCharToMultiByte(CP_UTF8, 0, domain_and_username, lstrlenW(domain_and_username), NULL, 0, NULL, NULL);
passlen = WideCharToMultiByte(CP_UTF8, 0, password, lstrlenW(password), NULL, 0, NULL, NULL);
/* length includes a nul terminator, which will be re-used for the ':' */ /* length includes a nul terminator, which will be re-used for the ':' */
auth_data = HeapAlloc(GetProcessHeap(), 0, userlen + 1 + passlen); auth_data = HeapAlloc(GetProcessHeap(), 0, userlen + 1 + passlen);
if (!auth_data) if (!auth_data)