Module: wine Branch: master Commit: 63aa94573f0dd0e595d9430da4ede38218b3098d URL: http://source.winehq.org/git/wine.git/?a=commit;h=63aa94573f0dd0e595d9430da4...
Author: Hans Leidekker hans@codeweavers.com Date: Fri Jun 12 15:06:26 2015 +0200
qmgr: Implement IBackgroundCopyJob::SetCredentials and IBackgroundCopyJob::RemoveCredentials.
---
dlls/qmgr/file.c | 50 ++++++++++++++++++++++++++++++++++++++ dlls/qmgr/job.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- dlls/qmgr/qmgr.h | 2 +- 3 files changed, 119 insertions(+), 6 deletions(-)
diff --git a/dlls/qmgr/file.c b/dlls/qmgr/file.c index 55e93aa..a5a41d1 100644 --- a/dlls/qmgr/file.c +++ b/dlls/qmgr/file.c @@ -321,6 +321,55 @@ static DWORD wait_for_completion(BackgroundCopyJobImpl *job) return error; }
+static UINT target_from_index(UINT index) +{ + switch (index) + { + case 0: return WINHTTP_AUTH_TARGET_SERVER; + case 1: return WINHTTP_AUTH_TARGET_PROXY; + default: + ERR("unhandled index %u\n", index); + break; + } + return 0; +} + +static UINT scheme_from_index(UINT index) +{ + switch (index) + { + case 0: return WINHTTP_AUTH_SCHEME_BASIC; + case 1: return WINHTTP_AUTH_SCHEME_NTLM; + case 2: return WINHTTP_AUTH_SCHEME_PASSPORT; + case 3: return WINHTTP_AUTH_SCHEME_DIGEST; + case 4: return WINHTTP_AUTH_SCHEME_NEGOTIATE; + default: + ERR("unhandled index %u\n", index); + break; + } + return 0; +} + +static BOOL set_request_credentials(HINTERNET req, BackgroundCopyJobImpl *job) +{ + UINT i, j; + + for (i = 0; i < BG_AUTH_TARGET_PROXY; i++) + { + UINT target = target_from_index(i); + for (j = 0; j < BG_AUTH_SCHEME_PASSPORT; j++) + { + UINT scheme = scheme_from_index(j); + const WCHAR *username = job->http_options.creds[i][j].Credentials.Basic.UserName; + const WCHAR *password = job->http_options.creds[i][j].Credentials.Basic.Password; + + if (!username) continue; + if (!WinHttpSetCredentials(req, target, scheme, username, password, NULL)) return FALSE; + } + } + return TRUE; +} + static BOOL transfer_file_http(BackgroundCopyFileImpl *file, URL_COMPONENTSW *uc, const WCHAR *tmpfile) { @@ -339,6 +388,7 @@ static BOOL transfer_file_http(BackgroundCopyFileImpl *file, URL_COMPONENTSW *uc
if (!(con = WinHttpConnect(ses, uc->lpszHostName, uc->nPort, 0))) goto done; if (!(req = WinHttpOpenRequest(con, NULL, uc->lpszUrlPath, NULL, NULL, NULL, flags))) goto done; + if (!set_request_credentials(req, job)) goto done;
if (!(WinHttpSendRequest(req, job->http_options.headers, ~0u, NULL, 0, 0, (DWORD_PTR)file))) goto done; if (wait_for_completion(job) || job->error.code) goto done; diff --git a/dlls/qmgr/job.c b/dlls/qmgr/job.c index 9595616..bf48480 100644 --- a/dlls/qmgr/job.c +++ b/dlls/qmgr/job.c @@ -237,7 +237,7 @@ static ULONG WINAPI BackgroundCopyJob_AddRef(IBackgroundCopyJob3 *iface) static ULONG WINAPI BackgroundCopyJob_Release(IBackgroundCopyJob3 *iface) { BackgroundCopyJobImpl *This = impl_from_IBackgroundCopyJob3(iface); - ULONG ref = InterlockedDecrement(&This->ref); + ULONG i, j, ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
@@ -250,6 +250,15 @@ static ULONG WINAPI BackgroundCopyJob_Release(IBackgroundCopyJob3 *iface) HeapFree(GetProcessHeap(), 0, This->displayName); HeapFree(GetProcessHeap(), 0, This->description); HeapFree(GetProcessHeap(), 0, This->http_options.headers); + for (i = 0; i < BG_AUTH_TARGET_PROXY; i++) + { + for (j = 0; j < BG_AUTH_SCHEME_PASSPORT; j++) + { + BG_AUTH_CREDENTIALS *cred = &This->http_options.creds[i][j]; + HeapFree(GetProcessHeap(), 0, cred->Credentials.Basic.UserName); + HeapFree(GetProcessHeap(), 0, cred->Credentials.Basic.Password); + } + } HeapFree(GetProcessHeap(), 0, This); }
@@ -795,12 +804,49 @@ static HRESULT WINAPI BackgroundCopyJob_GetReplyFileName( return E_NOTIMPL; }
+static int index_from_target(BG_AUTH_TARGET target) +{ + if (!target || target > BG_AUTH_TARGET_PROXY) return -1; + return target - 1; +} + +static int index_from_scheme(BG_AUTH_SCHEME scheme) +{ + if (!scheme || scheme > BG_AUTH_SCHEME_PASSPORT) return -1; + return scheme - 1; +} + static HRESULT WINAPI BackgroundCopyJob_SetCredentials( IBackgroundCopyJob3 *iface, BG_AUTH_CREDENTIALS *cred) { - BackgroundCopyJobImpl *This = impl_from_IBackgroundCopyJob3(iface); - FIXME("(%p)->(%p): stub\n", This, cred); + BackgroundCopyJobImpl *job = impl_from_IBackgroundCopyJob3(iface); + BG_AUTH_CREDENTIALS *new_cred; + int idx_target, idx_scheme; + + TRACE("(%p)->(%p)\n", job, cred); + + if ((idx_target = index_from_target(cred->Target)) < 0) return BG_E_INVALID_AUTH_TARGET; + if ((idx_scheme = index_from_scheme(cred->Scheme)) < 0) return BG_E_INVALID_AUTH_SCHEME; + new_cred = &job->http_options.creds[idx_target][idx_scheme]; + + EnterCriticalSection(&job->cs); + + new_cred->Target = cred->Target; + new_cred->Scheme = cred->Scheme; + + if (cred->Credentials.Basic.UserName) + { + HeapFree(GetProcessHeap(), 0, new_cred->Credentials.Basic.UserName); + new_cred->Credentials.Basic.UserName = strdupW(cred->Credentials.Basic.UserName); + } + if (cred->Credentials.Basic.Password) + { + HeapFree(GetProcessHeap(), 0, new_cred->Credentials.Basic.Password); + new_cred->Credentials.Basic.Password = strdupW(cred->Credentials.Basic.Password); + } + + LeaveCriticalSection(&job->cs); return S_OK; }
@@ -809,8 +855,25 @@ static HRESULT WINAPI BackgroundCopyJob_RemoveCredentials( BG_AUTH_TARGET target, BG_AUTH_SCHEME scheme) { - BackgroundCopyJobImpl *This = impl_from_IBackgroundCopyJob3(iface); - FIXME("(%p)->(%d %d): stub\n", This, target, scheme); + BackgroundCopyJobImpl *job = impl_from_IBackgroundCopyJob3(iface); + BG_AUTH_CREDENTIALS *new_cred; + int idx_target, idx_scheme; + + TRACE("(%p)->(%u %u)\n", job, target, scheme); + + if ((idx_target = index_from_target(target)) < 0) return BG_E_INVALID_AUTH_TARGET; + if ((idx_scheme = index_from_scheme(scheme)) < 0) return BG_E_INVALID_AUTH_SCHEME; + new_cred = &job->http_options.creds[idx_target][idx_scheme]; + + EnterCriticalSection(&job->cs); + + new_cred->Target = new_cred->Scheme = 0; + HeapFree(GetProcessHeap(), 0, new_cred->Credentials.Basic.UserName); + new_cred->Credentials.Basic.UserName = NULL; + HeapFree(GetProcessHeap(), 0, new_cred->Credentials.Basic.Password); + new_cred->Credentials.Basic.Password = NULL; + + LeaveCriticalSection(&job->cs); return S_OK; }
diff --git a/dlls/qmgr/qmgr.h b/dlls/qmgr/qmgr.h index 268fabc..611896d 100644 --- a/dlls/qmgr/qmgr.h +++ b/dlls/qmgr/qmgr.h @@ -56,7 +56,7 @@ typedef struct { WCHAR *headers; ULONG flags; - BG_AUTH_CREDENTIALS creds; + BG_AUTH_CREDENTIALS creds[BG_AUTH_TARGET_PROXY][BG_AUTH_SCHEME_PASSPORT]; } http_options; struct {