1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/webdata/logins_table.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <limits>
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string>
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/statement.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/password_manager/encryptor.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "webkit/glue/password_form.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing webkit_glue::PasswordForm;
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid InitPasswordFormFromStatement(PasswordForm* form, sql::Statement* s) {
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string tmp;
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 decrypted_password;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tmp = s->ColumnString(0);
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->origin = GURL(tmp);
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tmp = s->ColumnString(1);
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->action = GURL(tmp);
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->username_element = s->ColumnString16(2);
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->username_value = s->ColumnString16(3);
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->password_element = s->ColumnString16(4);
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int encrypted_password_len = s->ColumnByteLength(5);
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string encrypted_password;
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (encrypted_password_len) {
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    encrypted_password.resize(encrypted_password_len);
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    memcpy(&encrypted_password[0], s->ColumnBlob(5), encrypted_password_len);
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Encryptor::DecryptString16(encrypted_password, &decrypted_password);
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->password_value = decrypted_password;
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->submit_element = s->ColumnString16(6);
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tmp = s->ColumnString(7);
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->signon_realm = tmp;
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->ssl_valid = (s->ColumnInt(8) > 0);
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->preferred = (s->ColumnInt(9) > 0);
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->date_created = base::Time::FromTimeT(s->ColumnInt64(10));
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->blacklisted_by_user = (s->ColumnInt(11) > 0);
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int scheme_int = s->ColumnInt(12);
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER));
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  form->scheme = static_cast<PasswordForm::Scheme>(scheme_int);
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // anonymous namespace
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::Init() {
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->DoesTableExist("logins")) {
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!db_->Execute("CREATE TABLE logins ("
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "origin_url VARCHAR NOT NULL, "
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "action_url VARCHAR, "
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "username_element VARCHAR, "
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "username_value VARCHAR, "
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "password_element VARCHAR, "
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "password_value BLOB, "
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "submit_element VARCHAR, "
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "signon_realm VARCHAR NOT NULL,"
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "ssl_valid INTEGER NOT NULL,"
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "preferred INTEGER NOT NULL,"
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "date_created INTEGER NOT NULL,"
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "blacklisted_by_user INTEGER NOT NULL,"
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "scheme INTEGER NOT NULL,"
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "UNIQUE "
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "(origin_url, username_element, "
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "username_value, password_element, "
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "submit_element, signon_realm))")) {
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!db_->Execute("CREATE INDEX logins_signon ON logins (signon_realm)")) {
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_WIN)
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!db_->DoesTableExist("ie7_logins")) {
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!db_->Execute("CREATE TABLE ie7_logins ("
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "url_hash VARCHAR NOT NULL, "
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "password_value BLOB, "
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "date_created INTEGER NOT NULL,"
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "UNIQUE "
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "(url_hash))")) {
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!db_->Execute("CREATE INDEX ie7_logins_hash ON "
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "ie7_logins (url_hash)")) {
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::IsSyncable() {
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::AddLogin(const PasswordForm& form) {
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetUniqueStatement(
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "INSERT OR REPLACE INTO logins "
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "(origin_url, action_url, username_element, username_value, "
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      " password_element, password_value, submit_element, "
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      " signon_realm, ssl_valid, preferred, date_created, "
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      " blacklisted_by_user, scheme) "
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "VALUES "
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "(?,?,?,?,?,?,?,?,?,?,?,?,?)"));
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string encrypted_password;
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(0, form.origin.spec());
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(1, form.action.spec());
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(2, form.username_element);
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(3, form.username_value);
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(4, form.password_element);
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Encryptor::EncryptString16(form.password_value, &encrypted_password);
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindBlob(5, encrypted_password.data(),
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen             static_cast<int>(encrypted_password.length()));
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(6, form.submit_element);
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(7, form.signon_realm);
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt(8, form.ssl_valid);
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt(9, form.preferred);
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt64(10, form.date_created.ToTimeT());
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt(11, form.blacklisted_by_user);
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt(12, form.scheme);
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s.Run()) {
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::UpdateLogin(const PasswordForm& form) {
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetUniqueStatement(
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "UPDATE logins SET "
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "action_url = ?, "
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "password_value = ?, "
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "ssl_valid = ?, "
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "preferred = ? "
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "WHERE origin_url = ? AND "
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "username_element = ? AND "
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "username_value = ? AND "
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "password_element = ? AND "
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "signon_realm = ?"));
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(0, form.action.spec());
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string encrypted_password;
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Encryptor::EncryptString16(form.password_value, &encrypted_password);
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindBlob(1, encrypted_password.data(),
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen             static_cast<int>(encrypted_password.length()));
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt(2, form.ssl_valid);
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindInt(3, form.preferred);
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(4, form.origin.spec());
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(5, form.username_element);
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(6, form.username_value);
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(7, form.password_element);
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(8, form.signon_realm);
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s.Run()) {
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::RemoveLogin(const PasswordForm& form) {
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Remove a login by UNIQUE-constrained fields.
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetUniqueStatement(
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "DELETE FROM logins WHERE "
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "origin_url = ? AND "
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "username_element = ? AND "
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "username_value = ? AND "
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "password_element = ? AND "
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "submit_element = ? AND "
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "signon_realm = ?"));
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(0, form.origin.spec());
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(1, form.username_element);
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(2, form.username_value);
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(3, form.password_element);
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString16(4, form.submit_element);
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(5, form.signon_realm);
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s.Run()) {
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::RemoveLoginsCreatedBetween(base::Time delete_begin,
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             base::Time delete_end) {
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s1(db_->GetUniqueStatement(
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "DELETE FROM logins WHERE "
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "date_created >= ? AND date_created < ?"));
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s1) {
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement 1 prepare failed";
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s1.BindInt64(0, delete_begin.ToTimeT());
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s1.BindInt64(1,
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               delete_end.is_null() ?
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   std::numeric_limits<int64>::max() :
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   delete_end.ToTimeT());
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool success = s1.Run();
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_WIN)
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s2(db_->GetUniqueStatement(
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "DELETE FROM ie7_logins WHERE date_created >= ? AND date_created < ?"));
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s2) {
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement 2 prepare failed";
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s2.BindInt64(0, delete_begin.ToTimeT());
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s2.BindInt64(1,
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               delete_end.is_null() ?
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   std::numeric_limits<int64>::max() :
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   delete_end.ToTimeT());
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  success = success && s2.Run();
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return success;
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::GetLogins(const PasswordForm& form,
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            std::vector<PasswordForm*>* forms) {
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(forms);
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetUniqueStatement(
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                "SELECT origin_url, action_url, "
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                "username_element, username_value, "
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                "password_element, password_value, "
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                "submit_element, signon_realm, "
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                "ssl_valid, preferred, "
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                "date_created, blacklisted_by_user, scheme FROM logins "
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                "WHERE signon_realm == ?"));
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  s.BindString(0, form.signon_realm);
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  while (s.Step()) {
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PasswordForm* new_form = new PasswordForm();
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    InitPasswordFormFromStatement(new_form, &s);
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    forms->push_back(new_form);
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return s.Succeeded();
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LoginsTable::GetAllLogins(std::vector<PasswordForm*>* forms,
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               bool include_blacklisted) {
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(forms);
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string stmt = "SELECT origin_url, action_url, "
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     "username_element, username_value, "
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     "password_element, password_value, "
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     "submit_element, signon_realm, ssl_valid, preferred, "
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     "date_created, blacklisted_by_user, scheme FROM logins ";
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!include_blacklisted)
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    stmt.append("WHERE blacklisted_by_user == 0 ");
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  stmt.append("ORDER BY origin_url");
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Statement s(db_->GetUniqueStatement(stmt.c_str()));
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!s) {
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED() << "Statement prepare failed";
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  while (s.Step()) {
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PasswordForm* new_form = new PasswordForm();
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    InitPasswordFormFromStatement(new_form, &s);
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    forms->push_back(new_form);
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return s.Succeeded();
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
297