Hans Leidekker : qmgr: Implement IBackgroundCopyJob:: SetCredentials and IBackgroundCopyJob::RemoveCredentials.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jun 15 08:49:07 CDT 2015
Module: wine
Branch: master
Commit: 63aa94573f0dd0e595d9430da4ede38218b3098d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=63aa94573f0dd0e595d9430da4ede38218b3098d
Author: Hans Leidekker <hans at 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
{
More information about the wine-cvs
mailing list