Home | History | Annotate | Download | only in cf
      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 "AuthenticationCF.h"
     28 
     29 #include "AuthenticationChallenge.h"
     30 #include "AuthenticationClient.h"
     31 #include "Credential.h"
     32 #include "ProtectionSpace.h"
     33 
     34 #include <CFNetwork/CFURLAuthChallengePriv.h>
     35 #include <CFNetwork/CFURLCredentialPriv.h>
     36 #include <CFNetwork/CFURLProtectionSpacePriv.h>
     37 
     38 namespace WebCore {
     39 
     40 AuthenticationChallenge::AuthenticationChallenge(const ProtectionSpace& protectionSpace,
     41                                                  const Credential& proposedCredential,
     42                                                  unsigned previousFailureCount,
     43                                                  const ResourceResponse& response,
     44                                                  const ResourceError& error)
     45     : AuthenticationChallengeBase(protectionSpace,
     46                                   proposedCredential,
     47                                   previousFailureCount,
     48                                   response,
     49                                   error)
     50 {
     51 }
     52 
     53 AuthenticationChallenge::AuthenticationChallenge(CFURLAuthChallengeRef cfChallenge,
     54                                                  AuthenticationClient* authenticationClient)
     55     : AuthenticationChallengeBase(core(CFURLAuthChallengeGetProtectionSpace(cfChallenge)),
     56                                   core(CFURLAuthChallengeGetProposedCredential(cfChallenge)),
     57                                   CFURLAuthChallengeGetPreviousFailureCount(cfChallenge),
     58                                   (CFURLResponseRef)CFURLAuthChallengeGetFailureResponse(cfChallenge),
     59                                   CFURLAuthChallengeGetError(cfChallenge))
     60     , m_authenticationClient(authenticationClient)
     61     , m_cfChallenge(cfChallenge)
     62 {
     63 }
     64 
     65 bool AuthenticationChallenge::platformCompare(const AuthenticationChallenge& a, const AuthenticationChallenge& b)
     66 {
     67     if (a.authenticationClient() != b.authenticationClient())
     68         return false;
     69 
     70     if (a.cfURLAuthChallengeRef() != b.cfURLAuthChallengeRef())
     71         return false;
     72 
     73     return true;
     74 }
     75 
     76 CFURLAuthChallengeRef createCF(const AuthenticationChallenge& coreChallenge)
     77 {
     78     CFURLProtectionSpaceRef protectionSpace = createCF(coreChallenge.protectionSpace());
     79     CFURLCredentialRef credential = createCF(coreChallenge.proposedCredential());
     80 
     81     CFURLAuthChallengeRef result = CFURLAuthChallengeCreate(0, protectionSpace, credential,
     82                                         coreChallenge.previousFailureCount(),
     83                                         coreChallenge.failureResponse().cfURLResponse(),
     84                                         coreChallenge.error());
     85     CFRelease(protectionSpace);
     86     CFRelease(credential);
     87     return result;
     88 }
     89 
     90 CFURLCredentialRef createCF(const Credential& coreCredential)
     91 {
     92     CFURLCredentialPersistence persistence = kCFURLCredentialPersistenceNone;
     93     switch (coreCredential.persistence()) {
     94     case CredentialPersistenceNone:
     95         break;
     96     case CredentialPersistenceForSession:
     97         persistence = kCFURLCredentialPersistenceForSession;
     98         break;
     99     case CredentialPersistencePermanent:
    100         persistence = kCFURLCredentialPersistencePermanent;
    101         break;
    102     default:
    103         ASSERT_NOT_REACHED();
    104     }
    105 
    106     CFStringRef user = coreCredential.user().createCFString();
    107     CFStringRef password = coreCredential.password().createCFString();
    108     CFURLCredentialRef result = CFURLCredentialCreate(0, user, password, 0, persistence);
    109     CFRelease(user);
    110     CFRelease(password);
    111 
    112     return result;
    113 }
    114 
    115 CFURLProtectionSpaceRef createCF(const ProtectionSpace& coreSpace)
    116 {
    117     CFURLProtectionSpaceServerType serverType = kCFURLProtectionSpaceServerHTTP;
    118     switch (coreSpace.serverType()) {
    119     case ProtectionSpaceServerHTTP:
    120         serverType = kCFURLProtectionSpaceServerHTTP;
    121         break;
    122     case ProtectionSpaceServerHTTPS:
    123         serverType = kCFURLProtectionSpaceServerHTTPS;
    124         break;
    125     case ProtectionSpaceServerFTP:
    126         serverType = kCFURLProtectionSpaceServerFTP;
    127         break;
    128     case ProtectionSpaceServerFTPS:
    129         serverType = kCFURLProtectionSpaceServerFTPS;
    130         break;
    131     case ProtectionSpaceProxyHTTP:
    132         serverType = kCFURLProtectionSpaceProxyHTTP;
    133         break;
    134     case ProtectionSpaceProxyHTTPS:
    135         serverType = kCFURLProtectionSpaceProxyHTTPS;
    136         break;
    137     case ProtectionSpaceProxyFTP:
    138         serverType = kCFURLProtectionSpaceProxyFTP;
    139         break;
    140     case ProtectionSpaceProxySOCKS:
    141         serverType = kCFURLProtectionSpaceProxySOCKS;
    142         break;
    143     default:
    144         ASSERT_NOT_REACHED();
    145     }
    146 
    147     CFURLProtectionSpaceAuthenticationScheme scheme = kCFURLProtectionSpaceAuthenticationSchemeDefault;
    148     switch (coreSpace.authenticationScheme()) {
    149     case ProtectionSpaceAuthenticationSchemeDefault:
    150         scheme = kCFURLProtectionSpaceAuthenticationSchemeDefault;
    151         break;
    152     case ProtectionSpaceAuthenticationSchemeHTTPBasic:
    153         scheme = kCFURLProtectionSpaceAuthenticationSchemeHTTPBasic;
    154         break;
    155     case ProtectionSpaceAuthenticationSchemeHTTPDigest:
    156         scheme = kCFURLProtectionSpaceAuthenticationSchemeHTTPDigest;
    157         break;
    158     case ProtectionSpaceAuthenticationSchemeHTMLForm:
    159         scheme = kCFURLProtectionSpaceAuthenticationSchemeHTMLForm;
    160         break;
    161     case ProtectionSpaceAuthenticationSchemeNTLM:
    162         scheme = kCFURLProtectionSpaceAuthenticationSchemeNTLM;
    163         break;
    164     case ProtectionSpaceAuthenticationSchemeNegotiate:
    165         scheme = kCFURLProtectionSpaceAuthenticationSchemeNegotiate;
    166         break;
    167     default:
    168         ASSERT_NOT_REACHED();
    169     }
    170 
    171     CFStringRef host = coreSpace.host().createCFString();
    172     CFStringRef realm = coreSpace.realm().createCFString();
    173     CFURLProtectionSpaceRef result = CFURLProtectionSpaceCreate(0, host, coreSpace.port(), serverType, realm, scheme);
    174     CFRelease(host);
    175     CFRelease(realm);
    176 
    177     return result;
    178 }
    179 
    180 Credential core(CFURLCredentialRef cfCredential)
    181 {
    182     if (!cfCredential)
    183         return Credential();
    184 
    185     CredentialPersistence persistence = CredentialPersistenceNone;
    186     switch (CFURLCredentialGetPersistence(cfCredential)) {
    187     case kCFURLCredentialPersistenceNone:
    188         break;
    189     case kCFURLCredentialPersistenceForSession:
    190         persistence = CredentialPersistenceForSession;
    191         break;
    192     case kCFURLCredentialPersistencePermanent:
    193         persistence = CredentialPersistencePermanent;
    194         break;
    195     default:
    196         ASSERT_NOT_REACHED();
    197     }
    198 
    199     return Credential(CFURLCredentialGetUsername(cfCredential), CFURLCredentialCopyPassword(cfCredential), persistence);
    200 }
    201 
    202 ProtectionSpace core(CFURLProtectionSpaceRef cfSpace)
    203 {
    204     ProtectionSpaceServerType serverType = ProtectionSpaceServerHTTP;
    205 
    206     switch (CFURLProtectionSpaceGetServerType(cfSpace)) {
    207     case kCFURLProtectionSpaceServerHTTP:
    208         break;
    209     case kCFURLProtectionSpaceServerHTTPS:
    210         serverType = ProtectionSpaceServerHTTPS;
    211         break;
    212     case kCFURLProtectionSpaceServerFTP:
    213         serverType = ProtectionSpaceServerFTP;
    214         break;
    215     case kCFURLProtectionSpaceServerFTPS:
    216         serverType = ProtectionSpaceServerFTPS;
    217         break;
    218     case kCFURLProtectionSpaceProxyHTTP:
    219         serverType = ProtectionSpaceProxyHTTP;
    220         break;
    221     case kCFURLProtectionSpaceProxyHTTPS:
    222         serverType = ProtectionSpaceProxyHTTPS;
    223         break;
    224     case kCFURLProtectionSpaceProxyFTP:
    225         serverType = ProtectionSpaceProxyFTP;
    226         break;
    227     case kCFURLProtectionSpaceProxySOCKS:
    228         serverType = ProtectionSpaceProxySOCKS;
    229         break;
    230     default:
    231         ASSERT_NOT_REACHED();
    232     }
    233 
    234     ProtectionSpaceAuthenticationScheme scheme = ProtectionSpaceAuthenticationSchemeDefault;
    235 
    236     switch (CFURLProtectionSpaceGetAuthenticationScheme(cfSpace)) {
    237     case kCFURLProtectionSpaceAuthenticationSchemeDefault:
    238         scheme = ProtectionSpaceAuthenticationSchemeDefault;
    239         break;
    240     case kCFURLProtectionSpaceAuthenticationSchemeHTTPBasic:
    241         scheme = ProtectionSpaceAuthenticationSchemeHTTPBasic;
    242         break;
    243     case kCFURLProtectionSpaceAuthenticationSchemeHTTPDigest:
    244         scheme = ProtectionSpaceAuthenticationSchemeHTTPDigest;
    245         break;
    246     case kCFURLProtectionSpaceAuthenticationSchemeHTMLForm:
    247         scheme = ProtectionSpaceAuthenticationSchemeHTMLForm;
    248         break;
    249     case kCFURLProtectionSpaceAuthenticationSchemeNTLM:
    250         scheme = ProtectionSpaceAuthenticationSchemeNTLM;
    251         break;
    252     case kCFURLProtectionSpaceAuthenticationSchemeNegotiate:
    253         scheme = ProtectionSpaceAuthenticationSchemeNegotiate;
    254         break;
    255     default:
    256         ASSERT_NOT_REACHED();
    257     }
    258 
    259     return ProtectionSpace(CFURLProtectionSpaceGetHost(cfSpace),
    260                            CFURLProtectionSpaceGetPort(cfSpace),
    261                            serverType,
    262                            CFURLProtectionSpaceGetRealm(cfSpace),
    263                            scheme);
    264 }
    265 
    266 };
    267