1 /*
2 * Copyright (C) 2007 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26 #include "config.h"
27 #include "WebKitDLL.h"
28 #include "WebURLAuthenticationChallenge.h"
29
30 #include "COMPtr.h"
31 #include "WebError.h"
32 #include "WebKit.h"
33 #include "WebURLAuthenticationChallengeSender.h"
34 #include "WebURLCredential.h"
35 #include "WebURLProtectionSpace.h"
36 #include "WebURLResponse.h"
37 #include "WebKit.h"
38
39 #pragma warning(push, 0)
40 #include <WebCore/BString.h>
41 #include <WebCore/ResourceHandle.h>
42 #pragma warning(pop)
43
44 using namespace WebCore;
45
46 // WebURLAuthenticationChallenge ----------------------------------------------------------------
47
WebURLAuthenticationChallenge(const AuthenticationChallenge & authenticationChallenge,IWebURLAuthenticationChallengeSender * sender)48 WebURLAuthenticationChallenge::WebURLAuthenticationChallenge(const AuthenticationChallenge& authenticationChallenge,
49 IWebURLAuthenticationChallengeSender* sender)
50 : m_refCount(0)
51 , m_authenticationChallenge(authenticationChallenge)
52 , m_sender(sender)
53 {
54 gClassCount++;
55 gClassNameCount.add("WebURLAuthenticationChallenge");
56 }
57
~WebURLAuthenticationChallenge()58 WebURLAuthenticationChallenge::~WebURLAuthenticationChallenge()
59 {
60 gClassCount--;
61 gClassNameCount.remove("WebURLAuthenticationChallenge");
62 }
63
createInstance(const AuthenticationChallenge & authenticationChallenge)64 WebURLAuthenticationChallenge* WebURLAuthenticationChallenge::createInstance(const AuthenticationChallenge& authenticationChallenge)
65 {
66 WebURLAuthenticationChallenge* instance = new WebURLAuthenticationChallenge(authenticationChallenge, 0);
67 instance->AddRef();
68 return instance;
69 }
70
createInstance(const AuthenticationChallenge & authenticationChallenge,IWebURLAuthenticationChallengeSender * sender)71 WebURLAuthenticationChallenge* WebURLAuthenticationChallenge::createInstance(const AuthenticationChallenge& authenticationChallenge,
72 IWebURLAuthenticationChallengeSender* sender)
73 {
74 WebURLAuthenticationChallenge* instance = new WebURLAuthenticationChallenge(authenticationChallenge, sender);
75 instance->AddRef();
76 return instance;
77 }
78
79 // IUnknown -------------------------------------------------------------------
80
QueryInterface(REFIID riid,void ** ppvObject)81 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::QueryInterface(REFIID riid, void** ppvObject)
82 {
83 *ppvObject = 0;
84 if (IsEqualGUID(riid, IID_IUnknown))
85 *ppvObject = static_cast<IUnknown*>(this);
86 else if (IsEqualGUID(riid, __uuidof(this)))
87 *ppvObject = static_cast<WebURLAuthenticationChallenge*>(this);
88 else if (IsEqualGUID(riid, IID_IWebURLAuthenticationChallenge))
89 *ppvObject = static_cast<IWebURLAuthenticationChallenge*>(this);
90 else
91 return E_NOINTERFACE;
92
93 AddRef();
94 return S_OK;
95 }
96
AddRef(void)97 ULONG STDMETHODCALLTYPE WebURLAuthenticationChallenge::AddRef(void)
98 {
99 return ++m_refCount;
100 }
101
Release(void)102 ULONG STDMETHODCALLTYPE WebURLAuthenticationChallenge::Release(void)
103 {
104 ULONG newRef = --m_refCount;
105 if (!newRef)
106 delete(this);
107
108 return newRef;
109 }
110
111 // IWebURLAuthenticationChallenge -------------------------------------------------------------------
112
initWithProtectionSpace(IWebURLProtectionSpace * space,IWebURLCredential * proposedCredential,int previousFailureCount,IWebURLResponse * failureResponse,IWebError * error,IWebURLAuthenticationChallengeSender * sender)113 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::initWithProtectionSpace(
114 /* [in] */ IWebURLProtectionSpace* space,
115 /* [in] */ IWebURLCredential* proposedCredential,
116 /* [in] */ int previousFailureCount,
117 /* [in] */ IWebURLResponse* failureResponse,
118 /* [in] */ IWebError* error,
119 /* [in] */ IWebURLAuthenticationChallengeSender* sender)
120 {
121 LOG_ERROR("Calling the ala carte init for WebURLAuthenticationChallenge - is this really what you want to do?");
122
123 if (!space || !proposedCredential || !failureResponse || !sender)
124 return E_POINTER;
125
126 HRESULT hr = S_OK;
127 COMPtr<WebURLProtectionSpace> webSpace;
128 hr = space->QueryInterface(&webSpace);
129 if (FAILED(hr))
130 return hr;
131
132 COMPtr<WebURLCredential> webCredential(Query, proposedCredential);
133 if (!webCredential)
134 return E_NOINTERFACE;
135
136 COMPtr<WebURLResponse> webResponse;
137 hr = failureResponse->QueryInterface(&webResponse);
138 if (FAILED(hr))
139 return hr;
140
141 COMPtr<WebError> webError;
142 hr = error->QueryInterface(CLSID_WebError, (void**)&webError);
143 if (FAILED(hr))
144 return hr;
145
146 COMPtr<WebURLAuthenticationChallengeSender> webSender(Query, sender);
147 if (!webSender)
148 return E_NOINTERFACE;
149
150 // FIXME: After we change AuthenticationChallenge to use "ResourceHandle" as the abstract "Sender" or "Source of this Auth Challenge", then we'll
151 // construct the AuthenticationChallenge with that as obtained from the webSender
152 #if USE(CFNETWORK)
153 m_authenticationChallenge = AuthenticationChallenge(webSpace->protectionSpace(), webCredential->credential(),
154 previousFailureCount, webResponse->resourceResponse(), webError->resourceError());
155 #endif
156 return S_OK;
157 }
158
initWithAuthenticationChallenge(IWebURLAuthenticationChallenge * challenge,IWebURLAuthenticationChallengeSender * sender)159 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::initWithAuthenticationChallenge(
160 /* [in] */ IWebURLAuthenticationChallenge* challenge,
161 /* [in] */ IWebURLAuthenticationChallengeSender* sender)
162 {
163 if (!challenge || !sender)
164 return E_POINTER;
165
166 COMPtr<WebURLAuthenticationChallenge> webChallenge(Query, challenge);
167 if (!webChallenge)
168 return E_NOINTERFACE;
169
170 COMPtr<WebURLAuthenticationChallengeSender> webSender(Query, sender);
171 if (!webSender)
172 return E_NOINTERFACE;
173
174 #if USE(CFNETWORK)
175 m_authenticationChallenge = AuthenticationChallenge(webChallenge->authenticationChallenge().cfURLAuthChallengeRef(), webSender->authenticationClient());
176
177 return S_OK;
178 #else
179
180 return E_FAIL;
181 #endif
182 }
183
error(IWebError ** result)184 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::error(
185 /* [out, retval] */ IWebError** result)
186 {
187 *result = WebError::createInstance(m_authenticationChallenge.error());
188 return S_OK;
189 }
190
failureResponse(IWebURLResponse ** result)191 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::failureResponse(
192 /* [out, retval] */ IWebURLResponse** result)
193 {
194 *result = WebURLResponse::createInstance(m_authenticationChallenge.failureResponse());
195 return S_OK;
196 }
197
previousFailureCount(UINT * result)198 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::previousFailureCount(
199 /* [out, retval] */ UINT* result)
200 {
201 *result = m_authenticationChallenge.previousFailureCount();
202 return S_OK;
203 }
204
proposedCredential(IWebURLCredential ** result)205 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::proposedCredential(
206 /* [out, retval] */ IWebURLCredential** result)
207 {
208 *result = WebURLCredential::createInstance(m_authenticationChallenge.proposedCredential());
209 return S_OK;
210 }
211
protectionSpace(IWebURLProtectionSpace ** result)212 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::protectionSpace(
213 /* [out, retval] */ IWebURLProtectionSpace** result)
214 {
215 *result = WebURLProtectionSpace::createInstance(m_authenticationChallenge.protectionSpace());
216 return S_OK;
217 }
218
sender(IWebURLAuthenticationChallengeSender ** sender)219 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::sender(
220 /* [out, retval] */ IWebURLAuthenticationChallengeSender** sender)
221 {
222 if (!m_sender) {
223 AuthenticationClient* client = m_authenticationChallenge.authenticationClient();
224 m_sender.adoptRef(WebURLAuthenticationChallengeSender::createInstance(client));
225 }
226
227 return m_sender.copyRefTo(sender);
228 }
229
230 // WebURLAuthenticationChallenge -------------------------------------------------------------------
authenticationChallenge() const231 const AuthenticationChallenge& WebURLAuthenticationChallenge::authenticationChallenge() const
232 {
233 return m_authenticationChallenge;
234 }
235