18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AuthenticationCF.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29cad810f21b803229eb11403f9209855525a25d57Steve Block#if USE(CFNETWORK)
30cad810f21b803229eb11403f9209855525a25d57Steve Block
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AuthenticationChallenge.h"
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "AuthenticationClient.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Credential.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProtectionSpace.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// This header must come before all other CFNetwork headers to work around a CFNetwork bug. It can
3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// be removed entirely once <rdar://problem/9042114> is fixed.
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <CFNetwork/CFURLConnectionPriv.h>
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CFNetwork/CFURLAuthChallengePriv.h>
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CFNetwork/CFURLCredentialPriv.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CFNetwork/CFURLProtectionSpacePriv.h>
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAuthenticationChallenge::AuthenticationChallenge(const ProtectionSpace& protectionSpace,
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                 const Credential& proposedCredential,
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                 unsigned previousFailureCount,
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                 const ResourceResponse& response,
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                 const ResourceError& error)
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : AuthenticationChallengeBase(protectionSpace,
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  proposedCredential,
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  previousFailureCount,
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  response,
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  error)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAuthenticationChallenge::AuthenticationChallenge(CFURLAuthChallengeRef cfChallenge,
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                                 AuthenticationClient* authenticationClient)
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : AuthenticationChallengeBase(core(CFURLAuthChallengeGetProtectionSpace(cfChallenge)),
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  core(CFURLAuthChallengeGetProposedCredential(cfChallenge)),
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  CFURLAuthChallengeGetPreviousFailureCount(cfChallenge),
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  (CFURLResponseRef)CFURLAuthChallengeGetFailureResponse(cfChallenge),
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                  CFURLAuthChallengeGetError(cfChallenge))
66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_authenticationClient(authenticationClient)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cfChallenge(cfChallenge)
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool AuthenticationChallenge::platformCompare(const AuthenticationChallenge& a, const AuthenticationChallenge& b)
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (a.authenticationClient() != b.authenticationClient())
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (a.cfURLAuthChallengeRef() != b.cfURLAuthChallengeRef())
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFURLAuthChallengeRef createCF(const AuthenticationChallenge& coreChallenge)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLProtectionSpaceRef protectionSpace = createCF(coreChallenge.protectionSpace());
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLCredentialRef credential = createCF(coreChallenge.proposedCredential());
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLAuthChallengeRef result = CFURLAuthChallengeCreate(0, protectionSpace, credential,
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        coreChallenge.previousFailureCount(),
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        coreChallenge.failureResponse().cfURLResponse(),
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        coreChallenge.error());
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease(protectionSpace);
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease(credential);
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFURLCredentialRef createCF(const Credential& coreCredential)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLCredentialPersistence persistence = kCFURLCredentialPersistenceNone;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (coreCredential.persistence()) {
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CredentialPersistenceNone:
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CredentialPersistenceForSession:
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        persistence = kCFURLCredentialPersistenceForSession;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CredentialPersistencePermanent:
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        persistence = kCFURLCredentialPersistencePermanent;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT_NOT_REACHED();
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFStringRef user = coreCredential.user().createCFString();
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFStringRef password = coreCredential.password().createCFString();
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLCredentialRef result = CFURLCredentialCreate(0, user, password, 0, persistence);
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease(user);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease(password);
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFURLProtectionSpaceRef createCF(const ProtectionSpace& coreSpace)
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLProtectionSpaceServerType serverType = kCFURLProtectionSpaceServerHTTP;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (coreSpace.serverType()) {
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceServerHTTP:
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceServerHTTP;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceServerHTTPS:
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceServerHTTPS;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceServerFTP:
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceServerFTP;
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceServerFTPS:
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceServerFTPS;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceProxyHTTP:
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceProxyHTTP;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceProxyHTTPS:
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceProxyHTTPS;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceProxyFTP:
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceProxyFTP;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceProxySOCKS:
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = kCFURLProtectionSpaceProxySOCKS;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT_NOT_REACHED();
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLProtectionSpaceAuthenticationScheme scheme = kCFURLProtectionSpaceAuthenticationSchemeDefault;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (coreSpace.authenticationScheme()) {
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceAuthenticationSchemeDefault:
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = kCFURLProtectionSpaceAuthenticationSchemeDefault;
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceAuthenticationSchemeHTTPBasic:
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = kCFURLProtectionSpaceAuthenticationSchemeHTTPBasic;
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceAuthenticationSchemeHTTPDigest:
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = kCFURLProtectionSpaceAuthenticationSchemeHTTPDigest;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceAuthenticationSchemeHTMLForm:
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = kCFURLProtectionSpaceAuthenticationSchemeHTMLForm;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceAuthenticationSchemeNTLM:
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = kCFURLProtectionSpaceAuthenticationSchemeNTLM;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ProtectionSpaceAuthenticationSchemeNegotiate:
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = kCFURLProtectionSpaceAuthenticationSchemeNegotiate;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT_NOT_REACHED();
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFStringRef host = coreSpace.host().createCFString();
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFStringRef realm = coreSpace.realm().createCFString();
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLProtectionSpaceRef result = CFURLProtectionSpaceCreate(0, host, coreSpace.port(), serverType, realm, scheme);
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease(host);
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFRelease(realm);
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCredential core(CFURLCredentialRef cfCredential)
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!cfCredential)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return Credential();
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CredentialPersistence persistence = CredentialPersistenceNone;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (CFURLCredentialGetPersistence(cfCredential)) {
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLCredentialPersistenceNone:
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLCredentialPersistenceForSession:
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        persistence = CredentialPersistenceForSession;
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLCredentialPersistencePermanent:
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        persistence = CredentialPersistencePermanent;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT_NOT_REACHED();
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Credential(CFURLCredentialGetUsername(cfCredential), CFURLCredentialCopyPassword(cfCredential), persistence);
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectProtectionSpace core(CFURLProtectionSpaceRef cfSpace)
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ProtectionSpaceServerType serverType = ProtectionSpaceServerHTTP;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (CFURLProtectionSpaceGetServerType(cfSpace)) {
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceServerHTTP:
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceServerHTTPS:
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = ProtectionSpaceServerHTTPS;
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceServerFTP:
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = ProtectionSpaceServerFTP;
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceServerFTPS:
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = ProtectionSpaceServerFTPS;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceProxyHTTP:
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = ProtectionSpaceProxyHTTP;
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceProxyHTTPS:
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = ProtectionSpaceProxyHTTPS;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceProxyFTP:
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = ProtectionSpaceProxyFTP;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceProxySOCKS:
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        serverType = ProtectionSpaceProxySOCKS;
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT_NOT_REACHED();
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ProtectionSpaceAuthenticationScheme scheme = ProtectionSpaceAuthenticationSchemeDefault;
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (CFURLProtectionSpaceGetAuthenticationScheme(cfSpace)) {
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceAuthenticationSchemeDefault:
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = ProtectionSpaceAuthenticationSchemeDefault;
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceAuthenticationSchemeHTTPBasic:
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = ProtectionSpaceAuthenticationSchemeHTTPBasic;
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceAuthenticationSchemeHTTPDigest:
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = ProtectionSpaceAuthenticationSchemeHTTPDigest;
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceAuthenticationSchemeHTMLForm:
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = ProtectionSpaceAuthenticationSchemeHTMLForm;
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceAuthenticationSchemeNTLM:
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = ProtectionSpaceAuthenticationSchemeNTLM;
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case kCFURLProtectionSpaceAuthenticationSchemeNegotiate:
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        scheme = ProtectionSpaceAuthenticationSchemeNegotiate;
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        scheme = ProtectionSpaceAuthenticationSchemeUnknown;
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT_NOT_REACHED();
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ProtectionSpace(CFURLProtectionSpaceGetHost(cfSpace),
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           CFURLProtectionSpaceGetPort(cfSpace),
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           serverType,
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           CFURLProtectionSpaceGetRealm(cfSpace),
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           scheme);
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
274cad810f21b803229eb11403f9209855525a25d57Steve Block
275cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // USE(CFNETWORK)
276