password_store_win.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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/password_manager/password_manager.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/webdata/encryptor/ie7_password_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; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handles requests to WebDataService. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreWin::DBHandler : public WebDataServiceConsumer { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBHandler(WebDataService* web_data_service, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PasswordStoreWin* password_store) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : web_data_service_(web_data_service), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password_store_(password_store) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~DBHandler(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Requests the IE7 login for |form|. This is async. |callback_runner| will be 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // run when complete. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetIE7Login( 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PasswordForm& form, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PasswordStoreWin::ConsumerCallbackRunner& callback_runner); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct RequestInfo { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInfo() {} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInfo(PasswordForm* request_form, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PasswordStoreWin::ConsumerCallbackRunner& runner) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : form(request_form), 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_runner(runner) {} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordForm* form; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordStoreWin::ConsumerCallbackRunner callback_runner; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Holds info associated with in-flight GetIE7Login requests. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<WebDataService::Handle, RequestInfo> PendingRequestMap; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets logins from IE7 if no others are found. Also copies them into 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Chrome's WebDatabase so we don't need to look next time. 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<autofill::PasswordForm*> GetIE7Results( 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const WDTypedResult* result, 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const PasswordForm& form); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebDataServiceConsumer implementation. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWebDataServiceRequestDone( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataService::Handle handle, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WDTypedResult* result) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WebDataService> web_data_service_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a cycle between us and PasswordStore. The cycle is broken 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from PasswordStoreWin::Shutdown, which deletes us. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PasswordStoreWin> password_store_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingRequestMap pending_requests_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DBHandler); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordStoreWin::DBHandler::~DBHandler() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingRequestMap::const_iterator i = pending_requests_.begin(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i != pending_requests_.end(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++i) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_data_service_->CancelRequest(i->first); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete i->second.form; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::DBHandler::GetIE7Login( 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PasswordForm& form, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PasswordStoreWin::ConsumerCallbackRunner& callback_runner) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IE7PasswordInfo info; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.url_hash = 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ie7_password::GetUrlHash(base::UTF8ToWide(form.origin.spec())); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataService::Handle handle = web_data_service_->GetIE7Login(info, this); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_requests_[handle] = 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInfo(new PasswordForm(form), callback_runner); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::vector<PasswordForm*> PasswordStoreWin::DBHandler::GetIE7Results( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WDTypedResult *result, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PasswordForm& form) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<PasswordForm*> matching_forms; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WDResult<IE7PasswordInfo>* r = 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WDResult<IE7PasswordInfo>*>(result); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IE7PasswordInfo info = r->GetValue(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info.encrypted_data.empty()) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We got a result. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the entry. If it's good we will add it to the real saved password 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // table. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_data_service_->RemoveIE7Login(info); 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<ie7_password::DecryptedCredentials> credentials; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::wstring url = base::ASCIIToWide(form.origin.spec()); 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (ie7_password::DecryptPasswords(url, 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) info.encrypted_data, 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &credentials)) { 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < credentials.size(); ++i) { 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PasswordForm* autofill = new PasswordForm(); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autofill->username_value = credentials[i].username; 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autofill->password_value = credentials[i].password; 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) autofill->signon_realm = form.signon_realm; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) autofill->origin = form.origin; 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autofill->preferred = true; 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autofill->ssl_valid = form.origin.SchemeIsSecure(); 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autofill->date_created = info.date_created; 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) matching_forms.push_back(autofill); 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Add this PasswordForm to the saved password table. We're on the DB 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // thread already, so we use AddLoginImpl. 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) password_store_->AddLoginImpl(*autofill); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return matching_forms; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PasswordStoreWin::DBHandler::OnWebDataServiceRequestDone( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataService::Handle handle, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WDTypedResult* result) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingRequestMap::iterator i = pending_requests_.find(handle); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(i != pending_requests_.end()); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PasswordForm> form(i->second.form); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PasswordStoreWin::ConsumerCallbackRunner callback_runner( 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i->second.callback_runner); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_requests_.erase(i); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!result) { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The WDS returns NULL if it is shutting down. Run callback with empty 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // result. 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) callback_runner.Run(std::vector<autofill::PasswordForm*>()); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(PASSWORD_IE7_RESULT, result->GetType()); 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<autofill::PasswordForm*> matched_forms = 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetIE7Results(result, *form); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_runner.Run(matched_forms); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PasswordStoreWin::PasswordStoreWin( 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner, 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner, 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoginDatabase* login_database, 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebDataService* web_data_service) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : PasswordStoreDefault(main_thread_runner, 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) db_thread_runner, 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) login_database) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_handler_.reset(new DBHandler(web_data_service, this)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordStoreWin::~PasswordStoreWin() { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PasswordStoreWin::ShutdownOnDBThread() { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_handler_.reset(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordStoreWin::Shutdown() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::DB, FROM_HERE, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PasswordStoreWin::ShutdownOnDBThread, this)); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PasswordStoreDefault::Shutdown(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::GetIE7LoginIfNecessary( 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PasswordForm& form, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ConsumerCallbackRunner& callback_runner, 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::vector<autofill::PasswordForm*>& matched_forms) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (matched_forms.empty() && db_handler_.get()) { 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) db_handler_->GetIE7Login(form, callback_runner); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to get IE7 login. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_runner.Run(matched_forms); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PasswordStoreWin::GetLoginsImpl( 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PasswordForm& form, 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AuthorizationPromptPolicy prompt_policy, 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ConsumerCallbackRunner& callback_runner) { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConsumerCallbackRunner get_ie7_login = 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&PasswordStoreWin::GetIE7LoginIfNecessary, 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, form, callback_runner); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PasswordStoreDefault::GetLoginsImpl(form, prompt_policy, get_ie7_login); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 214