password_store_win.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_win.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/ie7_password_win.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/browser/password_manager.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing password_manager::PasswordStoreDefault;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handles requests to WebDataService.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreWin::DBHandler : public WebDataServiceConsumer {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DBHandler(WebDataService* web_data_service,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PasswordStoreWin* password_store)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : web_data_service_(web_data_service),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        password_store_(password_store) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DBHandler();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Requests the IE7 login for |form|. This is async. |callback_runner| will be
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // run when complete.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetIE7Login(
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PasswordForm& form,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PasswordStoreWin::ConsumerCallbackRunner& callback_runner);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct RequestInfo {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RequestInfo() {}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RequestInfo(PasswordForm* request_form,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                const PasswordStoreWin::ConsumerCallbackRunner& runner)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : form(request_form),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          callback_runner(runner) {}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PasswordForm* form;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PasswordStoreWin::ConsumerCallbackRunner callback_runner;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Holds info associated with in-flight GetIE7Login requests.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<WebDataService::Handle, RequestInfo> PendingRequestMap;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets logins from IE7 if no others are found. Also copies them into
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome's WebDatabase so we don't need to look next time.
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<autofill::PasswordForm*> GetIE7Results(
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const WDTypedResult* result,
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const PasswordForm& form);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebDataServiceConsumer implementation.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWebDataServiceRequestDone(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebDataService::Handle handle,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WDTypedResult* result) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<WebDataService> web_data_service_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This creates a cycle between us and PasswordStore. The cycle is broken
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from PasswordStoreWin::Shutdown, which deletes us.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PasswordStoreWin> password_store_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingRequestMap pending_requests_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DBHandler);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordStoreWin::DBHandler::~DBHandler() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PendingRequestMap::const_iterator i = pending_requests_.begin();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       i != pending_requests_.end();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++i) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->CancelRequest(i->first);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete i->second.form;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::DBHandler::GetIE7Login(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordForm& form,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordStoreWin::ConsumerCallbackRunner& callback_runner) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo info;
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  info.url_hash =
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ie7_password::GetUrlHash(base::UTF8ToWide(form.origin.spec()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDataService::Handle handle = web_data_service_->GetIE7Login(info, this);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_requests_[handle] =
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RequestInfo(new PasswordForm(form), callback_runner);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::vector<PasswordForm*> PasswordStoreWin::DBHandler::GetIE7Results(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WDTypedResult *result,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PasswordForm& form) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<PasswordForm*> matching_forms;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const WDResult<IE7PasswordInfo>* r =
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const WDResult<IE7PasswordInfo>*>(result);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo info = r->GetValue();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!info.encrypted_data.empty()) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We got a result.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete the entry. If it's good we will add it to the real saved password
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // table.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->RemoveIE7Login(info);
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::vector<ie7_password::DecryptedCredentials> credentials;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::wstring url = base::ASCIIToWide(form.origin.spec());
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (ie7_password::DecryptPasswords(url,
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       info.encrypted_data,
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       &credentials)) {
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      for (size_t i = 0; i < credentials.size(); ++i) {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PasswordForm* autofill = new PasswordForm();
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->username_value = credentials[i].username;
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->password_value = credentials[i].password;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        autofill->signon_realm = form.signon_realm;
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        autofill->origin = form.origin;
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->preferred = true;
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->ssl_valid = form.origin.SchemeIsSecure();
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->date_created = info.date_created;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        matching_forms.push_back(autofill);
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add this PasswordForm to the saved password table. We're on the DB
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // thread already, so we use AddLoginImpl.
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        password_store_->AddLoginImpl(*autofill);
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return matching_forms;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PasswordStoreWin::DBHandler::OnWebDataServiceRequestDone(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDataService::Handle handle,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WDTypedResult* result) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PendingRequestMap::iterator i = pending_requests_.find(handle);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(i != pending_requests_.end());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PasswordForm> form(i->second.form);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PasswordStoreWin::ConsumerCallbackRunner callback_runner(
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      i->second.callback_runner);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_requests_.erase(i);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!result) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The WDS returns NULL if it is shutting down. Run callback with empty
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // result.
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    callback_runner.Run(std::vector<autofill::PasswordForm*>());
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(PASSWORD_IE7_RESULT, result->GetType());
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<autofill::PasswordForm*> matched_forms =
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      GetIE7Results(result, *form);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback_runner.Run(matched_forms);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PasswordStoreWin::PasswordStoreWin(
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner,
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner,
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    password_manager::LoginDatabase* login_database,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebDataService* web_data_service)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : PasswordStoreDefault(main_thread_runner,
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           db_thread_runner,
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           login_database) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_handler_.reset(new DBHandler(web_data_service, this));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordStoreWin::~PasswordStoreWin() {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PasswordStoreWin::ShutdownOnDBThread() {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_handler_.reset();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordStoreWin::Shutdown() {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PasswordStoreWin::ShutdownOnDBThread, this));
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordStoreDefault::Shutdown();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::GetIE7LoginIfNecessary(
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordForm& form,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ConsumerCallbackRunner& callback_runner,
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<autofill::PasswordForm*>& matched_forms) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (matched_forms.empty() && db_handler_.get()) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db_handler_->GetIE7Login(form, callback_runner);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No need to get IE7 login.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback_runner.Run(matched_forms);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::GetLoginsImpl(
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordForm& form,
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AuthorizationPromptPolicy prompt_policy,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ConsumerCallbackRunner& callback_runner) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ConsumerCallbackRunner get_ie7_login =
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PasswordStoreWin::GetIE7LoginIfNecessary,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 this, form, callback_runner);
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordStoreDefault::GetLoginsImpl(form, prompt_policy, get_ie7_login);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215