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