1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/password_store.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/stl_util-inl.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/password_manager/password_store_consumer.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "webkit/glue/password_form.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::vector; 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::PasswordForm; 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPasswordStore::GetLoginsRequest::GetLoginsRequest(GetLoginsCallback* callback) 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : CancelableRequest1<GetLoginsCallback, 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<webkit_glue::PasswordForm*> >(callback) { 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPasswordStore::GetLoginsRequest::~GetLoginsRequest() { 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (canceled()) { 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen STLDeleteElements(&value); 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPasswordStore::PasswordStore() { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool PasswordStore::Init() { 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ReportMetrics(); 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 373dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenvoid PasswordStore::Shutdown() { 383dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen} 393dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStore::AddLogin(const PasswordForm& form) { 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Task* task = NewRunnableMethod(this, &PasswordStore::AddLoginImpl, form); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask( 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod(this, &PasswordStore::WrapModificationTask, task)); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStore::UpdateLogin(const PasswordForm& form) { 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Task* task = NewRunnableMethod(this, &PasswordStore::UpdateLoginImpl, form); 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask( 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod(this, &PasswordStore::WrapModificationTask, task)); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStore::RemoveLogin(const PasswordForm& form) { 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Task* task = NewRunnableMethod(this, &PasswordStore::RemoveLoginImpl, form); 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask( 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod(this, &PasswordStore::WrapModificationTask, task)); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PasswordStore::RemoveLoginsCreatedBetween(const base::Time& delete_begin, 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const base::Time& delete_end) { 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Task* task = NewRunnableMethod(this, 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &PasswordStore::RemoveLoginsCreatedBetweenImpl, 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete_begin, delete_end); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask( 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod(this, &PasswordStore::WrapModificationTask, task)); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCancelableRequestProvider::Handle PasswordStore::GetLogins( 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const PasswordForm& form, PasswordStoreConsumer* consumer) { 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return Schedule(&PasswordStore::GetLoginsImpl, consumer, form); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCancelableRequestProvider::Handle PasswordStore::GetAutofillableLogins( 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PasswordStoreConsumer* consumer) { 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return Schedule(&PasswordStore::GetAutofillableLoginsImpl, consumer); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCancelableRequestProvider::Handle PasswordStore::GetBlacklistLogins( 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PasswordStoreConsumer* consumer) { 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return Schedule(&PasswordStore::GetBlacklistLoginsImpl, consumer); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::ReportMetrics() { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask(NewRunnableMethod(this, &PasswordStore::ReportMetricsImpl)); 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::AddObserver(Observer* observer) { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observers_.AddObserver(observer); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::RemoveObserver(Observer* observer) { 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observers_.RemoveObserver(observer); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPasswordStore::~PasswordStore() {} 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenPasswordStore::GetLoginsRequest* PasswordStore::NewGetLoginsRequest( 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetLoginsCallback* callback) { 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return new GetLoginsRequest(callback); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::ScheduleTask(Task* task) { 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, task); 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1043dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::ForwardLoginsResult(GetLoginsRequest* request) { 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->ForwardResult(GetLoginsRequest::TupleType(request->handle(), 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->value)); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentemplate<typename BackendFunc> 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCancelableRequestProvider::Handle PasswordStore::Schedule( 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BackendFunc func, PasswordStoreConsumer* consumer) { 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<GetLoginsRequest> request(NewGetLoginsRequest( 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(consumer, 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &PasswordStoreConsumer::OnPasswordStoreRequestDone))); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddRequest(request, consumer->cancelable_consumer()); 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask(NewRunnableMethod(this, func, request)); 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return request->handle(); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentemplate<typename BackendFunc, typename ArgA> 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCancelableRequestProvider::Handle PasswordStore::Schedule( 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BackendFunc func, PasswordStoreConsumer* consumer, const ArgA& a) { 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<GetLoginsRequest> request(NewGetLoginsRequest( 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(consumer, 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &PasswordStoreConsumer::OnPasswordStoreRequestDone))); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddRequest(request, consumer->cancelable_consumer()); 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask(NewRunnableMethod(this, func, request, a)); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return request->handle(); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::WrapModificationTask(Task* task) { 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if !defined(OS_MACOSX) 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // !defined(OS_MACOSX) 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(task); 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen task->Run(); 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete task; 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PostNotifyLoginsChanged(); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::PostNotifyLoginsChanged() { 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if !defined(OS_MACOSX) 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // !defined(OS_MACOSX) 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::PostTask( 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::UI, FROM_HERE, 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod(this, &PasswordStore::NotifyLoginsChanged)); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PasswordStore::NotifyLoginsChanged() { 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FOR_EACH_OBSERVER(Observer, observers_, OnLoginsChanged()); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 158