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