Home | History | Annotate | Download | only in win
      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 "WebKit.h"
     28 #include "WebKitDLL.h"
     29 #include "WebURLProtectionSpace.h"
     30 
     31 #include <WebCore/BString.h>
     32 
     33 using namespace WebCore;
     34 
     35 // WebURLProtectionSpace ----------------------------------------------------------------
     36 
     37 WebURLProtectionSpace::WebURLProtectionSpace(const ProtectionSpace& protectionSpace)
     38     : m_refCount(0)
     39     , m_protectionSpace(protectionSpace)
     40 {
     41     gClassCount++;
     42     gClassNameCount.add("WebURLProtectionSpace");
     43 }
     44 
     45 WebURLProtectionSpace::~WebURLProtectionSpace()
     46 {
     47     gClassCount--;
     48     gClassNameCount.remove("WebURLProtectionSpace");
     49 }
     50 
     51 WebURLProtectionSpace* WebURLProtectionSpace::createInstance()
     52 {
     53     WebURLProtectionSpace* instance = new WebURLProtectionSpace(ProtectionSpace());
     54     instance->AddRef();
     55     return instance;
     56 }
     57 
     58 WebURLProtectionSpace* WebURLProtectionSpace::createInstance(const ProtectionSpace& protectionSpace)
     59 {
     60     WebURLProtectionSpace* instance = new WebURLProtectionSpace(protectionSpace);
     61     instance->AddRef();
     62     return instance;
     63 }
     64 
     65 // IUnknown -------------------------------------------------------------------
     66 
     67 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::QueryInterface(REFIID riid, void** ppvObject)
     68 {
     69     *ppvObject = 0;
     70     if (IsEqualGUID(riid, IID_IUnknown))
     71         *ppvObject = static_cast<IUnknown*>(this);
     72     else if (IsEqualGUID(riid, CLSID_WebURLProtectionSpace))
     73         *ppvObject = static_cast<WebURLProtectionSpace*>(this);
     74     else if (IsEqualGUID(riid, IID_IWebURLProtectionSpace))
     75         *ppvObject = static_cast<IWebURLProtectionSpace*>(this);
     76     else
     77         return E_NOINTERFACE;
     78 
     79     AddRef();
     80     return S_OK;
     81 }
     82 
     83 ULONG STDMETHODCALLTYPE WebURLProtectionSpace::AddRef(void)
     84 {
     85     return ++m_refCount;
     86 }
     87 
     88 ULONG STDMETHODCALLTYPE WebURLProtectionSpace::Release(void)
     89 {
     90     ULONG newRef = --m_refCount;
     91     if (!newRef)
     92         delete(this);
     93 
     94     return newRef;
     95 }
     96 
     97 // IWebURLProtectionSpace -------------------------------------------------------------------
     98 
     99 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::authenticationMethod(
    100     /* [out, retval] */ BSTR* result)
    101 {
    102     switch (m_protectionSpace.authenticationScheme()) {
    103     case ProtectionSpaceAuthenticationSchemeDefault:
    104         *result = SysAllocString(WebURLAuthenticationMethodDefault);
    105         break;
    106     case ProtectionSpaceAuthenticationSchemeHTTPBasic:
    107         *result = SysAllocString(WebURLAuthenticationMethodHTTPBasic);
    108         break;
    109     case ProtectionSpaceAuthenticationSchemeHTTPDigest:
    110         *result = SysAllocString(WebURLAuthenticationMethodHTTPDigest);
    111         break;
    112     case ProtectionSpaceAuthenticationSchemeHTMLForm:
    113         *result = SysAllocString(WebURLAuthenticationMethodHTMLForm);
    114         break;
    115     default:
    116         ASSERT_NOT_REACHED();
    117         return E_FAIL;
    118     }
    119     return S_OK;
    120 }
    121 
    122 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::host(
    123     /* [out, retval] */ BSTR* result)
    124 {
    125     BString str = m_protectionSpace.host();
    126     *result = str.release();
    127     return S_OK;
    128 }
    129 
    130 static ProtectionSpaceAuthenticationScheme coreScheme(BSTR authenticationMethod)
    131 {
    132     ProtectionSpaceAuthenticationScheme scheme = ProtectionSpaceAuthenticationSchemeDefault;
    133     if (BString(authenticationMethod) == BString(WebURLAuthenticationMethodDefault))
    134         scheme = ProtectionSpaceAuthenticationSchemeDefault;
    135     else if (BString(authenticationMethod) == BString(WebURLAuthenticationMethodHTTPBasic))
    136         scheme = ProtectionSpaceAuthenticationSchemeHTTPBasic;
    137     else if (BString(authenticationMethod) == BString(WebURLAuthenticationMethodHTTPDigest))
    138         scheme = ProtectionSpaceAuthenticationSchemeHTTPDigest;
    139     else if (BString(authenticationMethod) == BString(WebURLAuthenticationMethodHTMLForm))
    140         scheme = ProtectionSpaceAuthenticationSchemeHTMLForm;
    141     else
    142         ASSERT_NOT_REACHED();
    143     return scheme;
    144 }
    145 
    146 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::initWithHost(
    147     /* [in] */ BSTR host,
    148     /* [in] */ int port,
    149     /* [in] */ BSTR protocol,
    150     /* [in] */ BSTR realm,
    151     /* [in] */ BSTR authenticationMethod)
    152 {
    153     static BString& webURLProtectionSpaceHTTPBString = *new BString(WebURLProtectionSpaceHTTP);
    154     static BString& webURLProtectionSpaceHTTPSBString = *new BString(WebURLProtectionSpaceHTTPS);
    155     static BString& webURLProtectionSpaceFTPBString = *new BString(WebURLProtectionSpaceFTP);
    156     static BString& webURLProtectionSpaceFTPSBString = *new BString(WebURLProtectionSpaceFTPS);
    157 
    158     ProtectionSpaceServerType serverType = ProtectionSpaceServerHTTP;
    159     if (BString(protocol) == webURLProtectionSpaceHTTPBString)
    160         serverType = ProtectionSpaceServerHTTP;
    161     else if (BString(protocol) == webURLProtectionSpaceHTTPSBString)
    162         serverType = ProtectionSpaceServerHTTPS;
    163     else if (BString(protocol) == webURLProtectionSpaceFTPBString)
    164         serverType = ProtectionSpaceServerFTP;
    165     else if (BString(protocol) == webURLProtectionSpaceFTPSBString)
    166         serverType = ProtectionSpaceServerFTPS;
    167 
    168     m_protectionSpace = ProtectionSpace(String(host, SysStringLen(host)), port, serverType,
    169         String(realm, SysStringLen(realm)), coreScheme(authenticationMethod));
    170 
    171     return S_OK;
    172 }
    173 
    174 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::initWithProxyHost(
    175     /* [in] */ BSTR host,
    176     /* [in] */ int port,
    177     /* [in] */ BSTR proxyType,
    178     /* [in] */ BSTR realm,
    179     /* [in] */ BSTR authenticationMethod)
    180 {
    181     static BString& webURLProtectionSpaceHTTPProxyBString = *new BString(WebURLProtectionSpaceHTTPProxy);
    182     static BString& webURLProtectionSpaceHTTPSProxyBString = *new BString(WebURLProtectionSpaceHTTPSProxy);
    183     static BString& webURLProtectionSpaceFTPProxyBString = *new BString(WebURLProtectionSpaceFTPProxy);
    184     static BString& webURLProtectionSpaceSOCKSProxyBString = *new BString(WebURLProtectionSpaceSOCKSProxy);
    185 
    186     ProtectionSpaceServerType serverType = ProtectionSpaceProxyHTTP;
    187     if (BString(proxyType) == webURLProtectionSpaceHTTPProxyBString)
    188         serverType = ProtectionSpaceProxyHTTP;
    189     else if (BString(proxyType) == webURLProtectionSpaceHTTPSProxyBString)
    190         serverType = ProtectionSpaceProxyHTTPS;
    191     else if (BString(proxyType) == webURLProtectionSpaceFTPProxyBString)
    192         serverType = ProtectionSpaceProxyFTP;
    193     else if (BString(proxyType) == webURLProtectionSpaceSOCKSProxyBString)
    194         serverType = ProtectionSpaceProxySOCKS;
    195     else
    196         ASSERT_NOT_REACHED();
    197 
    198     m_protectionSpace = ProtectionSpace(String(host, SysStringLen(host)), port, serverType,
    199         String(realm, SysStringLen(realm)), coreScheme(authenticationMethod));
    200 
    201     return S_OK;
    202 }
    203 
    204 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::isProxy(
    205     /* [out, retval] */ BOOL* result)
    206 {
    207     *result = m_protectionSpace.isProxy();
    208     return S_OK;
    209 }
    210 
    211 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::port(
    212     /* [out, retval] */ int* result)
    213 {
    214     *result = m_protectionSpace.port();
    215     return S_OK;
    216 }
    217 
    218 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::protocol(
    219     /* [out, retval] */ BSTR* result)
    220 {
    221     switch (m_protectionSpace.serverType()) {
    222     case ProtectionSpaceServerHTTP:
    223         *result = SysAllocString(WebURLProtectionSpaceHTTP);
    224         break;
    225     case ProtectionSpaceServerHTTPS:
    226         *result = SysAllocString(WebURLProtectionSpaceHTTPS);
    227         break;
    228     case ProtectionSpaceServerFTP:
    229         *result = SysAllocString(WebURLProtectionSpaceFTP);
    230         break;
    231     case ProtectionSpaceServerFTPS:
    232         *result = SysAllocString(WebURLProtectionSpaceFTPS);
    233         break;
    234     default:
    235         ASSERT_NOT_REACHED();
    236         return E_FAIL;
    237     }
    238     return S_OK;
    239 }
    240 
    241 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::proxyType(
    242     /* [out, retval] */ BSTR* result)
    243 {
    244     switch (m_protectionSpace.serverType()) {
    245     case ProtectionSpaceProxyHTTP:
    246         *result = SysAllocString(WebURLProtectionSpaceHTTPProxy);
    247         break;
    248     case ProtectionSpaceProxyHTTPS:
    249         *result = SysAllocString(WebURLProtectionSpaceHTTPSProxy);
    250         break;
    251     case ProtectionSpaceProxyFTP:
    252         *result = SysAllocString(WebURLProtectionSpaceFTPProxy);
    253         break;
    254     case ProtectionSpaceProxySOCKS:
    255         *result = SysAllocString(WebURLProtectionSpaceSOCKSProxy);
    256         break;
    257     default:
    258         ASSERT_NOT_REACHED();
    259         return E_FAIL;
    260     }
    261     return S_OK;
    262 }
    263 
    264 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::realm(
    265     /* [out, retval] */ BSTR* result)
    266 {
    267     BString bstring = m_protectionSpace.realm();
    268     *result = bstring.release();
    269     return S_OK;
    270 }
    271 
    272 HRESULT STDMETHODCALLTYPE WebURLProtectionSpace::receivesCredentialSecurely(
    273     /* [out, retval] */ BOOL* result)
    274 {
    275     *result = m_protectionSpace.receivesCredentialSecurely();
    276     return S_OK;
    277 }
    278 
    279 // WebURLProtectionSpace -------------------------------------------------------------------
    280 const ProtectionSpace& WebURLProtectionSpace::protectionSpace() const
    281 {
    282     return m_protectionSpace;
    283 }
    284