• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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