profile_auth_data.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/profile_auth_data.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/cookies/cookie_monster.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/cookies/cookie_store.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_auth_cache.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_network_session.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_transaction_factory.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/server_bound_cert_service.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/server_bound_cert_store.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProfileAuthDataTransferer {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileAuthDataTransferer(
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile* from_profile,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile* to_profile,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool transfer_cookies,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Closure& completion_callback);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void BeginTransfer();
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void BeginTransferOnIOThread();
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MaybeDoCookieAndCertTransfer();
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Finish();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnTransferCookiesIfEmptyJar(const net::CookieList& cookies_in_jar);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnGetCookiesToTransfer(const net::CookieList& cookies_to_transfer);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RetrieveDefaultCookies();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnGetServerBoundCertsToTransfer(
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const net::ServerBoundCertStore::ServerBoundCertList& certs);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RetrieveDefaultServerBoundCerts();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TransferDefaultAuthCache();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> from_context_;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> to_context_;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool transfer_cookies_;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure completion_callback_;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::CookieList cookies_to_transfer_;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::ServerBoundCertStore::ServerBoundCertList certs_to_transfer_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool got_cookies_;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool got_server_bound_certs_;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ProfileAuthDataTransferer::ProfileAuthDataTransferer(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* from_profile,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* to_profile,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool transfer_cookies,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& completion_callback)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : from_context_(from_profile->GetRequestContext()),
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      to_context_(to_profile->GetRequestContext()),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      transfer_cookies_(transfer_cookies),
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      completion_callback_(completion_callback),
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      got_cookies_(false),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      got_server_bound_certs_(false) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::BeginTransfer() {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we aren't transferring cookies, post the completion callback
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately.  Otherwise, it will be called when both cookies and channel
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ids are finished transferring.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!transfer_cookies_) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion_callback_);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Null the callback so that when Finish is called the callback won't be
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // called again.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    completion_callback_.Reset();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserThread::PostTask(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ProfileAuthDataTransferer::BeginTransferOnIOThread,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::BeginTransferOnIOThread() {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TransferDefaultAuthCache();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (transfer_cookies_) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RetrieveDefaultCookies();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RetrieveDefaultServerBoundCerts();
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Finish();
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If both cookies and server bound certs have been retrieved, see if we need to
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// do the actual transfer.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::MaybeDoCookieAndCertTransfer() {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!(got_cookies_ && got_server_bound_certs_))
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Nothing to transfer over?
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!cookies_to_transfer_.size()) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Finish();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now let's see if the target cookie monster's jar is even empty.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::CookieStore* to_store =
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      to_context_->GetURLRequestContext()->cookie_store();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::CookieMonster* to_monster = to_store->GetCookieMonster();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  to_monster->GetAllCookiesAsync(
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ProfileAuthDataTransferer::OnTransferCookiesIfEmptyJar,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Post the |completion_callback_| and delete ourself.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::Finish() {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!completion_callback_.is_null())
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion_callback_);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete this;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Callback for transferring |cookies_to_transfer_| into |to_context_|'s
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CookieMonster if its jar is completely empty.  If authentication was
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// performed by an extension, then the set of cookies that was acquired through
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// such that process will be automatically transfered into the profile.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::OnTransferCookiesIfEmptyJar(
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const net::CookieList& cookies_in_jar) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transfer only if the existing cookie jar is empty.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!cookies_in_jar.size()) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::CookieStore* to_store =
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        to_context_->GetURLRequestContext()->cookie_store();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::CookieMonster* to_monster = to_store->GetCookieMonster();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    to_monster->InitializeFrom(cookies_to_transfer_);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::ServerBoundCertService* to_cert_service =
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        to_context_->GetURLRequestContext()->server_bound_cert_service();
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    to_cert_service->GetCertStore()->InitializeFrom(certs_to_transfer_);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Finish();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Callback for receiving |cookies_to_transfer| from the authentication profile
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cookie jar.
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::OnGetCookiesToTransfer(
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const net::CookieList& cookies_to_transfer) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  got_cookies_ = true;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cookies_to_transfer_ = cookies_to_transfer;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MaybeDoCookieAndCertTransfer();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Retrieves initial set of Profile cookies from the |from_context_|.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::RetrieveDefaultCookies() {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::CookieStore* from_store =
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      from_context_->GetURLRequestContext()->cookie_store();
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::CookieMonster* from_monster = from_store->GetCookieMonster();
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  from_monster->SetKeepExpiredCookies();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  from_monster->GetAllCookiesAsync(
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ProfileAuthDataTransferer::OnGetCookiesToTransfer,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Callback for receiving |cookies_to_transfer| from the authentication profile
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cookie jar.
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::OnGetServerBoundCertsToTransfer(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const net::ServerBoundCertStore::ServerBoundCertList& certs) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  certs_to_transfer_ = certs;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  got_server_bound_certs_ = true;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MaybeDoCookieAndCertTransfer();
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Retrieves server bound certs of |from_context_|.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::RetrieveDefaultServerBoundCerts() {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::ServerBoundCertService* from_service =
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      from_context_->GetURLRequestContext()->server_bound_cert_service();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  from_service->GetCertStore()->GetAllServerBoundCerts(
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ProfileAuthDataTransferer::OnGetServerBoundCertsToTransfer,
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Transfers HTTP authentication cache from the |from_context_|
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// into the |to_context_|. If user was required to authenticate with a proxy
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// during the login, this authentication information will be transferred
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// into the new session.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthDataTransferer::TransferDefaultAuthCache() {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::HttpAuthCache* new_cache = to_context_->GetURLRequestContext()->
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      http_transaction_factory()->GetSession()->http_auth_cache();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_cache->UpdateAllFrom(*from_context_->GetURLRequestContext()->
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      http_transaction_factory()->GetSession()->http_auth_cache());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ProfileAuthData::Transfer(
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* from_profile,
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* to_profile,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool transfer_cookies,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Closure& completion_callback) {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (new ProfileAuthDataTransferer(from_profile, to_profile, transfer_cookies,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 completion_callback))->BeginTransfer();
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
224