165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "AuthenticationManager.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "Download.h"
302bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DownloadProxyMessages.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "MessageID.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCoreArgumentCoders.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFrame.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPage.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageProxyMessages.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcess.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/AuthenticationChallenge.h>
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/AuthenticationClient.h>
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
402bde8e466a4451c7319e3a072d118917957d6554Steve Blockusing namespace WebCore;
412bde8e466a4451c7319e3a072d118917957d6554Steve Block
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic uint64_t generateAuthenticationChallengeID()
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static uint64_t uniqueAuthenticationChallengeID = 1;
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return uniqueAuthenticationChallengeID++;
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochAuthenticationManager& AuthenticationManager::shared()
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static AuthenticationManager& manager = *new AuthenticationManager;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return manager;
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochAuthenticationManager::AuthenticationManager()
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid AuthenticationManager::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    didReceiveAuthenticationManagerMessage(connection, messageID, arguments);
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
652bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid AuthenticationManager::didReceiveAuthenticationChallenge(WebFrame* frame, const AuthenticationChallenge& authenticationChallenge)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(frame);
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(frame->page());
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
702bde8e466a4451c7319e3a072d118917957d6554Steve Block    uint64_t challengeID = generateAuthenticationChallengeID();
712bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_challenges.set(challengeID, authenticationChallenge);
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebProcess::shared().connection()->send(Messages::WebPageProxy::DidReceiveAuthenticationChallenge(frame->frameID(), authenticationChallenge, challengeID), frame->page()->pageID());
742bde8e466a4451c7319e3a072d118917957d6554Steve Block}
752bde8e466a4451c7319e3a072d118917957d6554Steve Block
762bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid AuthenticationManager::didReceiveAuthenticationChallenge(Download* download, const AuthenticationChallenge& authenticationChallenge)
772bde8e466a4451c7319e3a072d118917957d6554Steve Block{
782bde8e466a4451c7319e3a072d118917957d6554Steve Block    uint64_t challengeID = generateAuthenticationChallengeID();
792bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_challenges.set(challengeID, authenticationChallenge);
802bde8e466a4451c7319e3a072d118917957d6554Steve Block
812bde8e466a4451c7319e3a072d118917957d6554Steve Block    download->send(Messages::DownloadProxy::DidReceiveAuthenticationChallenge(authenticationChallenge, challengeID));
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
842bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid AuthenticationManager::useCredentialForChallenge(uint64_t challengeID, const Credential& credential)
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    AuthenticationChallenge challenge = m_challenges.take(challengeID);
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!challenge.isNull());
882bde8e466a4451c7319e3a072d118917957d6554Steve Block    AuthenticationClient* coreClient = challenge.authenticationClient();
892bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!coreClient) {
902bde8e466a4451c7319e3a072d118917957d6554Steve Block        // This authentication challenge comes from a download.
912bde8e466a4451c7319e3a072d118917957d6554Steve Block        Download::receivedCredential(challenge, credential);
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
932bde8e466a4451c7319e3a072d118917957d6554Steve Block
942bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    coreClient->receivedCredential(challenge, credential);
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid AuthenticationManager::continueWithoutCredentialForChallenge(uint64_t challengeID)
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block    AuthenticationChallenge challenge = m_challenges.take(challengeID);
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!challenge.isNull());
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block    AuthenticationClient* coreClient = challenge.authenticationClient();
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!coreClient) {
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block        // This authentication challenge comes from a download.
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block        Download::receivedRequestToContinueWithoutCredential(challenge);
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    coreClient->receivedRequestToContinueWithoutCredential(challenge);
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid AuthenticationManager::cancelChallenge(uint64_t challengeID)
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block    AuthenticationChallenge challenge = m_challenges.take(challengeID);
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!challenge.isNull());
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block    AuthenticationClient* coreClient = challenge.authenticationClient();
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!coreClient) {
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block        // This authentication challenge comes from a download.
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block        Download::receivedCancellation(challenge);
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    coreClient->receivedCancellation(challenge);
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
128