initial import
[vuplus_webkit] / Source / WebKit / win / WebURLAuthenticationChallenge.cpp
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 "WebError.h"
31 #include "WebKit.h"
32 #include "WebURLAuthenticationChallengeSender.h"
33 #include "WebURLCredential.h"
34 #include "WebURLProtectionSpace.h"
35 #include "WebURLResponse.h"
36 #include "WebKit.h"
37 #include <WebCore/BString.h>
38 #include <WebCore/COMPtr.h>
39 #include <WebCore/ResourceHandle.h>
40
41 using namespace WebCore;
42
43 // WebURLAuthenticationChallenge ----------------------------------------------------------------
44
45 WebURLAuthenticationChallenge::WebURLAuthenticationChallenge(const AuthenticationChallenge& authenticationChallenge,
46                                                              IWebURLAuthenticationChallengeSender* sender)
47     : m_refCount(0)
48     , m_authenticationChallenge(authenticationChallenge)
49     , m_sender(sender)
50 {
51     gClassCount++;
52     gClassNameCount.add("WebURLAuthenticationChallenge");
53 }
54
55 WebURLAuthenticationChallenge::~WebURLAuthenticationChallenge()
56 {
57     gClassCount--;
58     gClassNameCount.remove("WebURLAuthenticationChallenge");
59 }
60
61 WebURLAuthenticationChallenge* WebURLAuthenticationChallenge::createInstance(const AuthenticationChallenge& authenticationChallenge)
62 {
63     WebURLAuthenticationChallenge* instance = new WebURLAuthenticationChallenge(authenticationChallenge, 0);
64     instance->AddRef();
65     return instance;
66 }
67
68 WebURLAuthenticationChallenge* WebURLAuthenticationChallenge::createInstance(const AuthenticationChallenge& authenticationChallenge,
69                                                                              IWebURLAuthenticationChallengeSender* sender)
70 {
71     WebURLAuthenticationChallenge* instance = new WebURLAuthenticationChallenge(authenticationChallenge, sender);
72     instance->AddRef();
73     return instance;
74 }
75
76 // IUnknown -------------------------------------------------------------------
77
78 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::QueryInterface(REFIID riid, void** ppvObject)
79 {
80     *ppvObject = 0;
81     if (IsEqualGUID(riid, IID_IUnknown))
82         *ppvObject = static_cast<IUnknown*>(this);
83     else if (IsEqualGUID(riid, __uuidof(this)))
84         *ppvObject = static_cast<WebURLAuthenticationChallenge*>(this);
85     else if (IsEqualGUID(riid, IID_IWebURLAuthenticationChallenge))
86         *ppvObject = static_cast<IWebURLAuthenticationChallenge*>(this);
87     else
88         return E_NOINTERFACE;
89
90     AddRef();
91     return S_OK;
92 }
93
94 ULONG STDMETHODCALLTYPE WebURLAuthenticationChallenge::AddRef(void)
95 {
96     return ++m_refCount;
97 }
98
99 ULONG STDMETHODCALLTYPE WebURLAuthenticationChallenge::Release(void)
100 {
101     ULONG newRef = --m_refCount;
102     if (!newRef)
103         delete(this);
104
105     return newRef;
106 }
107
108 // IWebURLAuthenticationChallenge -------------------------------------------------------------------
109
110 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::initWithProtectionSpace(
111     /* [in] */ IWebURLProtectionSpace* space, 
112     /* [in] */ IWebURLCredential* proposedCredential, 
113     /* [in] */ int previousFailureCount, 
114     /* [in] */ IWebURLResponse* failureResponse, 
115     /* [in] */ IWebError* error, 
116     /* [in] */ IWebURLAuthenticationChallengeSender* sender)
117 {
118     LOG_ERROR("Calling the ala carte init for WebURLAuthenticationChallenge - is this really what you want to do?");
119
120     if (!space || !proposedCredential || !failureResponse || !sender)
121         return E_POINTER;
122
123     HRESULT hr = S_OK;
124     COMPtr<WebURLProtectionSpace> webSpace;
125     hr = space->QueryInterface(&webSpace);
126     if (FAILED(hr))
127         return hr;
128
129     COMPtr<WebURLCredential> webCredential(Query, proposedCredential);
130     if (!webCredential)
131         return E_NOINTERFACE;
132
133     COMPtr<WebURLResponse> webResponse;
134     hr = failureResponse->QueryInterface(&webResponse);
135     if (FAILED(hr))
136         return hr;
137
138     COMPtr<WebError> webError;
139     hr = error->QueryInterface(CLSID_WebError, (void**)&webError);
140     if (FAILED(hr))
141         return hr;
142     
143     COMPtr<WebURLAuthenticationChallengeSender> webSender(Query, sender);
144     if (!webSender)
145         return E_NOINTERFACE;
146
147     // FIXME: After we change AuthenticationChallenge to use "ResourceHandle" as the abstract "Sender" or "Source of this Auth Challenge", then we'll
148     // construct the AuthenticationChallenge with that as obtained from the webSender
149 #if USE(CFNETWORK)
150     m_authenticationChallenge = AuthenticationChallenge(webSpace->protectionSpace(), webCredential->credential(),
151                                     previousFailureCount, webResponse->resourceResponse(), webError->resourceError());
152 #endif
153     return S_OK;
154 }
155
156 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::initWithAuthenticationChallenge(
157     /* [in] */ IWebURLAuthenticationChallenge* challenge, 
158     /* [in] */ IWebURLAuthenticationChallengeSender* sender)
159 {
160     if (!challenge || !sender)
161         return E_POINTER;
162
163     COMPtr<WebURLAuthenticationChallenge> webChallenge(Query, challenge);
164     if (!webChallenge)
165         return E_NOINTERFACE;
166
167     COMPtr<WebURLAuthenticationChallengeSender> webSender(Query, sender);
168     if (!webSender)
169         return E_NOINTERFACE;
170
171 #if USE(CFNETWORK)
172     m_authenticationChallenge = AuthenticationChallenge(webChallenge->authenticationChallenge().cfURLAuthChallengeRef(), webSender->authenticationClient());
173
174     return S_OK;
175 #else
176
177     return E_FAIL;
178 #endif
179 }
180
181 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::error(
182     /* [out, retval] */ IWebError** result)
183 {
184     *result = WebError::createInstance(m_authenticationChallenge.error());
185     return S_OK;
186 }
187
188 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::failureResponse(
189     /* [out, retval] */ IWebURLResponse** result)
190 {
191     *result = WebURLResponse::createInstance(m_authenticationChallenge.failureResponse());
192     return S_OK;
193 }
194
195 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::previousFailureCount(
196     /* [out, retval] */ UINT* result)
197 {
198     *result = m_authenticationChallenge.previousFailureCount();
199     return S_OK;
200 }
201
202 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::proposedCredential(
203     /* [out, retval] */ IWebURLCredential** result)
204 {
205     *result = WebURLCredential::createInstance(m_authenticationChallenge.proposedCredential());
206     return S_OK;
207 }
208
209 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::protectionSpace(
210     /* [out, retval] */ IWebURLProtectionSpace** result)
211 {
212     *result = WebURLProtectionSpace::createInstance(m_authenticationChallenge.protectionSpace());
213     return S_OK;
214 }
215
216 HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::sender(
217     /* [out, retval] */ IWebURLAuthenticationChallengeSender** sender)
218 {
219     if (!m_sender) {
220         AuthenticationClient* client = m_authenticationChallenge.authenticationClient();
221         m_sender.adoptRef(WebURLAuthenticationChallengeSender::createInstance(client));
222     }
223
224     return m_sender.copyRefTo(sender);
225 }
226
227 // WebURLAuthenticationChallenge -------------------------------------------------------------------
228 const AuthenticationChallenge& WebURLAuthenticationChallenge::authenticationChallenge() const
229 {
230     return m_authenticationChallenge;
231 }