blob: 355931dfb39db5b3a7ed1b62a21a970d14063d0a [file] [log] [blame]
/*
* Copyright (C) 2007 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "config.h"
#import "AuthenticationMac.h"
#import "AuthenticationChallenge.h"
#import "Credential.h"
#import "ProtectionSpace.h"
#import <Foundation/NSURLAuthenticationChallenge.h>
#import <Foundation/NSURLCredential.h>
#import <Foundation/NSURLProtectionSpace.h>
namespace WebCore {
AuthenticationChallenge::AuthenticationChallenge(const ProtectionSpace& protectionSpace,
const Credential& proposedCredential,
unsigned previousFailureCount,
const ResourceResponse& response,
const ResourceError& error)
: AuthenticationChallengeBase(protectionSpace,
proposedCredential,
previousFailureCount,
response,
error)
{
}
AuthenticationChallenge::AuthenticationChallenge(NSURLAuthenticationChallenge *macChallenge)
: AuthenticationChallengeBase(core([macChallenge protectionSpace]),
core([macChallenge proposedCredential]),
[macChallenge previousFailureCount],
[macChallenge failureResponse],
[macChallenge error])
, m_sender([macChallenge sender])
, m_macChallenge(macChallenge)
{
}
bool AuthenticationChallenge::platformCompare(const AuthenticationChallenge& a, const AuthenticationChallenge& b)
{
if (a.sender() != b.sender())
return false;
if (a.nsURLAuthenticationChallenge() != b.nsURLAuthenticationChallenge())
return false;
return true;
}
NSURLAuthenticationChallenge *mac(const AuthenticationChallenge& coreChallenge)
{
if (coreChallenge.nsURLAuthenticationChallenge())
return coreChallenge.nsURLAuthenticationChallenge();
return [[[NSURLAuthenticationChallenge alloc] initWithProtectionSpace:mac(coreChallenge.protectionSpace())
proposedCredential:mac(coreChallenge.proposedCredential())
previousFailureCount:coreChallenge.previousFailureCount()
failureResponse:coreChallenge.failureResponse().nsURLResponse()
error:coreChallenge.error()
sender:coreChallenge.sender()] autorelease];
}
NSURLProtectionSpace *mac(const ProtectionSpace& coreSpace)
{
NSString *proxyType = nil;
NSString *protocol = nil;
switch (coreSpace.serverType()) {
case ProtectionSpaceServerHTTP:
protocol = @"http";
break;
case ProtectionSpaceServerHTTPS:
protocol = @"https";
break;
case ProtectionSpaceServerFTP:
protocol = @"ftp";
break;
case ProtectionSpaceServerFTPS:
protocol = @"ftps";
break;
case ProtectionSpaceProxyHTTP:
proxyType = NSURLProtectionSpaceHTTPProxy;
break;
case ProtectionSpaceProxyHTTPS:
proxyType = NSURLProtectionSpaceHTTPSProxy;
break;
case ProtectionSpaceProxyFTP:
proxyType = NSURLProtectionSpaceFTPProxy;
break;
case ProtectionSpaceProxySOCKS:
proxyType = NSURLProtectionSpaceSOCKSProxy;
break;
default:
ASSERT_NOT_REACHED();
}
NSString *method = nil;
switch (coreSpace.authenticationScheme()) {
case ProtectionSpaceAuthenticationSchemeDefault:
method = NSURLAuthenticationMethodDefault;
break;
case ProtectionSpaceAuthenticationSchemeHTTPBasic:
method = NSURLAuthenticationMethodHTTPBasic;
break;
case ProtectionSpaceAuthenticationSchemeHTTPDigest:
method = NSURLAuthenticationMethodHTTPDigest;
break;
case ProtectionSpaceAuthenticationSchemeHTMLForm:
method = NSURLAuthenticationMethodHTMLForm;
break;
default:
ASSERT_NOT_REACHED();
}
if (proxyType)
return [[[NSURLProtectionSpace alloc] initWithProxyHost:coreSpace.host()
port:coreSpace.port()
type:proxyType
realm:coreSpace.realm()
authenticationMethod:method] autorelease];
return [[[NSURLProtectionSpace alloc] initWithHost:coreSpace.host()
port:coreSpace.port()
protocol:protocol
realm:coreSpace.realm()
authenticationMethod:method] autorelease];
}
NSURLCredential *mac(const Credential& coreCredential)
{
NSURLCredentialPersistence persistence = NSURLCredentialPersistenceNone;
switch (coreCredential.persistence()) {
case CredentialPersistenceNone:
break;
case CredentialPersistenceForSession:
persistence = NSURLCredentialPersistenceForSession;
break;
case CredentialPersistencePermanent:
persistence = NSURLCredentialPersistencePermanent;
break;
default:
ASSERT_NOT_REACHED();
}
return [[[NSURLCredential alloc] initWithUser:coreCredential.user()
password:coreCredential.password()
persistence:persistence]
autorelease];
}
AuthenticationChallenge core(NSURLAuthenticationChallenge *macChallenge)
{
return AuthenticationChallenge(macChallenge);
}
ProtectionSpace core(NSURLProtectionSpace *macSpace)
{
ProtectionSpaceServerType serverType = ProtectionSpaceProxyHTTP;
if ([macSpace isProxy]) {
NSString *proxyType = [macSpace proxyType];
if ([proxyType isEqualToString:NSURLProtectionSpaceHTTPProxy])
serverType = ProtectionSpaceProxyHTTP;
else if ([proxyType isEqualToString:NSURLProtectionSpaceHTTPSProxy])
serverType = ProtectionSpaceProxyHTTPS;
else if ([proxyType isEqualToString:NSURLProtectionSpaceFTPProxy])
serverType = ProtectionSpaceProxyFTP;
else if ([proxyType isEqualToString:NSURLProtectionSpaceSOCKSProxy])
serverType = ProtectionSpaceProxySOCKS;
else
ASSERT_NOT_REACHED();
} else {
NSString *protocol = [macSpace protocol];
if ([protocol caseInsensitiveCompare:@"http"] == NSOrderedSame)
serverType = ProtectionSpaceServerHTTP;
else if ([protocol caseInsensitiveCompare:@"https"] == NSOrderedSame)
serverType = ProtectionSpaceServerHTTPS;
else if ([protocol caseInsensitiveCompare:@"ftp"] == NSOrderedSame)
serverType = ProtectionSpaceServerFTP;
else if ([protocol caseInsensitiveCompare:@"ftps"] == NSOrderedSame)
serverType = ProtectionSpaceServerFTPS;
else
ASSERT_NOT_REACHED();
}
ProtectionSpaceAuthenticationScheme scheme = ProtectionSpaceAuthenticationSchemeDefault;
NSString *method = [macSpace authenticationMethod];
if ([method isEqualToString:NSURLAuthenticationMethodDefault])
scheme = ProtectionSpaceAuthenticationSchemeDefault;
else if ([method isEqualToString:NSURLAuthenticationMethodHTTPBasic])
scheme = ProtectionSpaceAuthenticationSchemeHTTPBasic;
else if ([method isEqualToString:NSURLAuthenticationMethodHTTPDigest])
scheme = ProtectionSpaceAuthenticationSchemeHTTPDigest;
else if ([method isEqualToString:NSURLAuthenticationMethodHTMLForm])
scheme = ProtectionSpaceAuthenticationSchemeHTMLForm;
else
ASSERT_NOT_REACHED();
return ProtectionSpace([macSpace host], [macSpace port], serverType, [macSpace realm], scheme);
}
Credential core(NSURLCredential *macCredential)
{
CredentialPersistence persistence = CredentialPersistenceNone;
switch ([macCredential persistence]) {
case NSURLCredentialPersistenceNone:
break;
case NSURLCredentialPersistenceForSession:
persistence = CredentialPersistenceForSession;
break;
case NSURLCredentialPersistencePermanent:
persistence = CredentialPersistencePermanent;
break;
default:
ASSERT_NOT_REACHED();
}
return Credential([macCredential user], [macCredential password], persistence);
}
};