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"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/ie7_password_win.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/browser/password_manager.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/password_manager/core/browser/webdata/password_web_data_service_win.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)
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Handles requests to PasswordWebDataService.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreWin::DBHandler : public WebDataServiceConsumer {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DBHandler(PasswordWebDataService* 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.
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef std::map<PasswordWebDataService::Handle, RequestInfo>
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      PendingRequestMap;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets logins from IE7 if no others are found. Also copies them into
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome's WebDatabase so we don't need to look next time.
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<autofill::PasswordForm*> GetIE7Results(
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const WDTypedResult* result,
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const PasswordForm& form);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebDataServiceConsumer implementation.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWebDataServiceRequestDone(
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      PasswordWebDataService::Handle handle,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WDTypedResult* result) OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<PasswordWebDataService> web_data_service_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This creates a cycle between us and PasswordStore. The cycle is broken
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from PasswordStoreWin::Shutdown, which deletes us.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PasswordStoreWin> password_store_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PendingRequestMap pending_requests_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DBHandler);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordStoreWin::DBHandler::~DBHandler() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PendingRequestMap::const_iterator i = pending_requests_.begin();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       i != pending_requests_.end();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++i) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->CancelRequest(i->first);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete i->second.form;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::DBHandler::GetIE7Login(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordForm& form,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordStoreWin::ConsumerCallbackRunner& callback_runner) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo info;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  info.url_hash =
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ie7_password::GetUrlHash(base::UTF8ToWide(form.origin.spec()));
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PasswordWebDataService::Handle handle =
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_data_service_->GetIE7Login(info, this);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_requests_[handle] =
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RequestInfo(new PasswordForm(form), callback_runner);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::vector<PasswordForm*> PasswordStoreWin::DBHandler::GetIE7Results(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WDTypedResult *result,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PasswordForm& form) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<PasswordForm*> matching_forms;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const WDResult<IE7PasswordInfo>* r =
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const WDResult<IE7PasswordInfo>*>(result);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IE7PasswordInfo info = r->GetValue();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!info.encrypted_data.empty()) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We got a result.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete the entry. If it's good we will add it to the real saved password
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // table.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->RemoveIE7Login(info);
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::vector<ie7_password::DecryptedCredentials> credentials;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::wstring url = base::ASCIIToWide(form.origin.spec());
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (ie7_password::DecryptPasswords(url,
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       info.encrypted_data,
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       &credentials)) {
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      for (size_t i = 0; i < credentials.size(); ++i) {
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PasswordForm* autofill = new PasswordForm();
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->username_value = credentials[i].username;
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->password_value = credentials[i].password;
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        autofill->signon_realm = form.signon_realm;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        autofill->origin = form.origin;
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->preferred = true;
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->ssl_valid = form.origin.SchemeIsSecure();
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        autofill->date_created = info.date_created;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        matching_forms.push_back(autofill);
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add this PasswordForm to the saved password table. We're on the DB
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // thread already, so we use AddLoginImpl.
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        password_store_->AddLoginImpl(*autofill);
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return matching_forms;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PasswordStoreWin::DBHandler::OnWebDataServiceRequestDone(
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PasswordWebDataService::Handle handle,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WDTypedResult* result) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PendingRequestMap::iterator i = pending_requests_.find(handle);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(i != pending_requests_.end());
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PasswordForm> form(i->second.form);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PasswordStoreWin::ConsumerCallbackRunner callback_runner(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      i->second.callback_runner);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_requests_.erase(i);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!result) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The WDS returns NULL if it is shutting down. Run callback with empty
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // result.
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    callback_runner.Run(std::vector<autofill::PasswordForm*>());
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(PASSWORD_IE7_RESULT, result->GetType());
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<autofill::PasswordForm*> matched_forms =
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      GetIE7Results(result, *form);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback_runner.Run(matched_forms);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PasswordStoreWin::PasswordStoreWin(
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner,
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    password_manager::LoginDatabase* login_database,
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PasswordWebDataService* web_data_service)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : PasswordStoreDefault(main_thread_runner,
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           db_thread_runner,
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           login_database) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_handler_.reset(new DBHandler(web_data_service, this));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordStoreWin::~PasswordStoreWin() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PasswordStoreWin::ShutdownOnDBThread() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_handler_.reset();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordStoreWin::Shutdown() {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PasswordStoreWin::ShutdownOnDBThread, this));
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordStoreDefault::Shutdown();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::GetIE7LoginIfNecessary(
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordForm& form,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ConsumerCallbackRunner& callback_runner,
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<autofill::PasswordForm*>& matched_forms) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (matched_forms.empty() && db_handler_.get()) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db_handler_->GetIE7Login(form, callback_runner);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No need to get IE7 login.
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback_runner.Run(matched_forms);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::GetLoginsImpl(
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PasswordForm& form,
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AuthorizationPromptPolicy prompt_policy,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ConsumerCallbackRunner& callback_runner) {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ConsumerCallbackRunner get_ie7_login =
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PasswordStoreWin::GetIE7LoginIfNecessary,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 this, form, callback_runner);
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordStoreDefault::GetLoginsImpl(form, prompt_policy, get_ie7_login);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
217