| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/password_manager/login_database.h" | 5 #include "chrome/browser/password_manager/login_database.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "app/sql/statement.h" |
| 11 #include "app/sql/transaction.h" |
| 10 #include "base/file_path.h" | 12 #include "base/file_path.h" |
| 11 #include "base/logging.h" | 13 #include "base/logging.h" |
| 12 #include "base/time.h" | 14 #include "base/time.h" |
| 13 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
| 14 #include "chrome/common/sqlite_utils.h" | 16 #include "chrome/common/sqlite_utils.h" |
| 15 | 17 |
| 16 using webkit_glue::PasswordForm; | 18 using webkit_glue::PasswordForm; |
| 17 | 19 |
| 18 static const int kCurrentVersionNumber = 1; | 20 static const int kCurrentVersionNumber = 1; |
| 19 static const int kCompatibleVersionNumber = 1; | 21 static const int kCompatibleVersionNumber = 1; |
| 20 | 22 |
| 21 // Convenience enum for interacting with SQL queries that use all the columns. | 23 // Convenience enum for interacting with SQL queries that use all the columns. |
| 22 typedef enum { | 24 typedef enum { |
| 23 COLUMN_ORIGIN_URL = 0, | 25 COLUMN_ORIGIN_URL = 0, |
| 24 COLUMN_ACTION_URL, | 26 COLUMN_ACTION_URL, |
| 25 COLUMN_USERNAME_ELEMENT, | 27 COLUMN_USERNAME_ELEMENT, |
| 26 COLUMN_USERNAME_VALUE, | 28 COLUMN_USERNAME_VALUE, |
| 27 COLUMN_PASSWORD_ELEMENT, | 29 COLUMN_PASSWORD_ELEMENT, |
| 28 COLUMN_PASSWORD_VALUE, | 30 COLUMN_PASSWORD_VALUE, |
| 29 COLUMN_SUBMIT_ELEMENT, | 31 COLUMN_SUBMIT_ELEMENT, |
| 30 COLUMN_SIGNON_REALM, | 32 COLUMN_SIGNON_REALM, |
| 31 COLUMN_SSL_VALID, | 33 COLUMN_SSL_VALID, |
| 32 COLUMN_PREFERRED, | 34 COLUMN_PREFERRED, |
| 33 COLUMN_DATE_CREATED, | 35 COLUMN_DATE_CREATED, |
| 34 COLUMN_BLACKLISTED_BY_USER, | 36 COLUMN_BLACKLISTED_BY_USER, |
| 35 COLUMN_SCHEME | 37 COLUMN_SCHEME |
| 36 } LoginTableColumns; | 38 } LoginTableColumns; |
| 37 | 39 |
| 38 LoginDatabase::LoginDatabase() : db_(NULL) { | 40 LoginDatabase::LoginDatabase() { |
| 39 } | 41 } |
| 40 | 42 |
| 41 LoginDatabase::~LoginDatabase() { | 43 LoginDatabase::~LoginDatabase() { |
| 42 if (db_) { | |
| 43 sqlite3_close(db_); | |
| 44 db_ = NULL; | |
| 45 } | |
| 46 } | 44 } |
| 47 | 45 |
| 48 bool LoginDatabase::Init(const FilePath& db_path) { | 46 bool LoginDatabase::Init(const FilePath& db_path) { |
| 49 if (OpenSqliteDb(db_path, &db_) != SQLITE_OK) { | 47 // Set pragmas for a small, private database (based on WebDatabase). |
| 48 db_.set_page_size(2048); |
| 49 db_.set_cache_size(32); |
| 50 db_.set_exclusive_locking(); |
| 51 |
| 52 if (!db_.Open(db_path)) { |
| 50 LOG(WARNING) << "Unable to open the password store database."; | 53 LOG(WARNING) << "Unable to open the password store database."; |
| 51 return false; | 54 return false; |
| 52 } | 55 } |
| 53 | 56 |
| 54 // Set pragmas for a small, private database (based on WebDatabase). | 57 sql::Transaction transaction(&db_); |
| 55 sqlite3_exec(db_, "PRAGMA page_size=2048", NULL, NULL, NULL); | |
| 56 sqlite3_exec(db_, "PRAGMA cache_size=32", NULL, NULL, NULL); | |
| 57 sqlite3_exec(db_, "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, NULL); | |
| 58 | |
| 59 SQLTransaction transaction(db_); | |
| 60 transaction.Begin(); | 58 transaction.Begin(); |
| 61 | 59 |
| 62 // Check the database version. | 60 // Check the database version. |
| 63 if (!meta_table_.Init(std::string(), kCurrentVersionNumber, | 61 if (!meta_table_.Init(&db_, kCurrentVersionNumber, |
| 64 kCompatibleVersionNumber, db_)) { | 62 kCompatibleVersionNumber)) { |
| 63 db_.Close(); |
| 65 return false; | 64 return false; |
| 66 } | 65 } |
| 67 if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { | 66 if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { |
| 68 LOG(WARNING) << "Password store database is too new."; | 67 LOG(WARNING) << "Password store database is too new."; |
| 68 db_.Close(); |
| 69 return false; | 69 return false; |
| 70 } | 70 } |
| 71 | 71 |
| 72 // Initialize the tables. | 72 // Initialize the tables. |
| 73 if (!InitLoginsTable()) { | 73 if (!InitLoginsTable()) { |
| 74 LOG(WARNING) << "Unable to initialize the password store database."; | 74 LOG(WARNING) << "Unable to initialize the password store database."; |
| 75 db_.Close(); |
| 75 return false; | 76 return false; |
| 76 } | 77 } |
| 77 | 78 |
| 78 // If the file on disk is an older database version, bring it up to date. | 79 // If the file on disk is an older database version, bring it up to date. |
| 79 MigrateOldVersionsAsNeeded(); | 80 MigrateOldVersionsAsNeeded(); |
| 80 | 81 |
| 81 return (transaction.Commit() == SQLITE_OK); | 82 if (!transaction.Commit()) { |
| 83 db_.Close(); |
| 84 return false; |
| 85 } |
| 86 return true; |
| 82 } | 87 } |
| 83 | 88 |
| 84 void LoginDatabase::MigrateOldVersionsAsNeeded() { | 89 void LoginDatabase::MigrateOldVersionsAsNeeded() { |
| 85 switch (meta_table_.GetVersionNumber()) { | 90 switch (meta_table_.GetVersionNumber()) { |
| 86 case kCurrentVersionNumber: | 91 case kCurrentVersionNumber: |
| 87 // No migration needed. | 92 // No migration needed. |
| 88 return; | 93 return; |
| 89 } | 94 } |
| 90 } | 95 } |
| 91 | 96 |
| 92 bool LoginDatabase::InitLoginsTable() { | 97 bool LoginDatabase::InitLoginsTable() { |
| 93 if (!DoesSqliteTableExist(db_, "logins")) { | 98 if (!db_.DoesTableExist("logins")) { |
| 94 if (sqlite3_exec(db_, "CREATE TABLE logins (" | 99 if (!db_.Execute("CREATE TABLE logins (" |
| 95 "origin_url VARCHAR NOT NULL, " | 100 "origin_url VARCHAR NOT NULL, " |
| 96 "action_url VARCHAR, " | 101 "action_url VARCHAR, " |
| 97 "username_element VARCHAR, " | 102 "username_element VARCHAR, " |
| 98 "username_value VARCHAR, " | 103 "username_value VARCHAR, " |
| 99 "password_element VARCHAR, " | 104 "password_element VARCHAR, " |
| 100 "password_value BLOB, " | 105 "password_value BLOB, " |
| 101 "submit_element VARCHAR, " | 106 "submit_element VARCHAR, " |
| 102 "signon_realm VARCHAR NOT NULL," | 107 "signon_realm VARCHAR NOT NULL," |
| 103 "ssl_valid INTEGER NOT NULL," | 108 "ssl_valid INTEGER NOT NULL," |
| 104 "preferred INTEGER NOT NULL," | 109 "preferred INTEGER NOT NULL," |
| 105 "date_created INTEGER NOT NULL," | 110 "date_created INTEGER NOT NULL," |
| 106 "blacklisted_by_user INTEGER NOT NULL," | 111 "blacklisted_by_user INTEGER NOT NULL," |
| 107 "scheme INTEGER NOT NULL," | 112 "scheme INTEGER NOT NULL," |
| 108 "UNIQUE " | 113 "UNIQUE " |
| 109 "(origin_url, username_element, " | 114 "(origin_url, username_element, " |
| 110 "username_value, password_element, " | 115 "username_value, password_element, " |
| 111 "submit_element, signon_realm))", | 116 "submit_element, signon_realm))")) { |
| 112 NULL, NULL, NULL) != SQLITE_OK) { | |
| 113 NOTREACHED(); | 117 NOTREACHED(); |
| 114 return false; | 118 return false; |
| 115 } | 119 } |
| 116 if (sqlite3_exec(db_, "CREATE INDEX logins_signon ON " | 120 if (!db_.Execute("CREATE INDEX logins_signon ON " |
| 117 "logins (signon_realm)", | 121 "logins (signon_realm)")) { |
| 118 NULL, NULL, NULL) != SQLITE_OK) { | |
| 119 NOTREACHED(); | 122 NOTREACHED(); |
| 120 return false; | 123 return false; |
| 121 } | 124 } |
| 122 } | 125 } |
| 123 return true; | 126 return true; |
| 124 } | 127 } |
| 125 | 128 |
| 126 | 129 |
| 127 bool LoginDatabase::AddLogin(const PasswordForm& form) { | 130 bool LoginDatabase::AddLogin(const PasswordForm& form) { |
| 128 SQLStatement s; | |
| 129 // You *must* change LoginTableColumns if this query changes. | 131 // You *must* change LoginTableColumns if this query changes. |
| 130 if (s.prepare(db_, | 132 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 131 "INSERT OR REPLACE INTO logins " | 133 "INSERT OR REPLACE INTO logins " |
| 132 "(origin_url, action_url, username_element, username_value, " | 134 "(origin_url, action_url, username_element, username_value, " |
| 133 " password_element, password_value, submit_element, " | 135 " password_element, password_value, submit_element, " |
| 134 " signon_realm, ssl_valid, preferred, date_created, " | 136 " signon_realm, ssl_valid, preferred, date_created, " |
| 135 " blacklisted_by_user, scheme) " | 137 " blacklisted_by_user, scheme) " |
| 136 "VALUES " | 138 "VALUES " |
| 137 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") != SQLITE_OK) { | 139 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
| 140 if (!s) { |
| 138 NOTREACHED() << "Statement prepare failed"; | 141 NOTREACHED() << "Statement prepare failed"; |
| 139 return false; | 142 return false; |
| 140 } | 143 } |
| 141 | 144 |
| 142 s.bind_string(COLUMN_ORIGIN_URL, form.origin.spec()); | 145 s.BindString(COLUMN_ORIGIN_URL, form.origin.spec()); |
| 143 s.bind_string(COLUMN_ACTION_URL, form.action.spec()); | 146 s.BindString(COLUMN_ACTION_URL, form.action.spec()); |
| 144 s.bind_string16(COLUMN_USERNAME_ELEMENT, form.username_element); | 147 s.BindString16(COLUMN_USERNAME_ELEMENT, form.username_element); |
| 145 s.bind_string16(COLUMN_USERNAME_VALUE, form.username_value); | 148 s.BindString16(COLUMN_USERNAME_VALUE, form.username_value); |
| 146 s.bind_string16(COLUMN_PASSWORD_ELEMENT, form.password_element); | 149 s.BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element); |
| 147 std::string encrypted_password = EncryptedString(form.password_value); | 150 std::string encrypted_password = EncryptedString(form.password_value); |
| 148 s.bind_blob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), | 151 s.BindBlob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), |
| 149 static_cast<int>(encrypted_password.length())); | 152 static_cast<int>(encrypted_password.length())); |
| 150 s.bind_string16(COLUMN_SUBMIT_ELEMENT, form.submit_element); | 153 s.BindString16(COLUMN_SUBMIT_ELEMENT, form.submit_element); |
| 151 s.bind_string(COLUMN_SIGNON_REALM, form.signon_realm); | 154 s.BindString(COLUMN_SIGNON_REALM, form.signon_realm); |
| 152 s.bind_int(COLUMN_SSL_VALID, form.ssl_valid); | 155 s.BindInt(COLUMN_SSL_VALID, form.ssl_valid); |
| 153 s.bind_int(COLUMN_PREFERRED, form.preferred); | 156 s.BindInt(COLUMN_PREFERRED, form.preferred); |
| 154 s.bind_int64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); | 157 s.BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); |
| 155 s.bind_int(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); | 158 s.BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); |
| 156 s.bind_int(COLUMN_SCHEME, form.scheme); | 159 s.BindInt(COLUMN_SCHEME, form.scheme); |
| 157 if (s.step() != SQLITE_DONE) { | 160 if (!s.Run()) { |
| 158 NOTREACHED(); | 161 NOTREACHED(); |
| 159 return false; | 162 return false; |
| 160 } | 163 } |
| 161 return true; | 164 return true; |
| 162 } | 165 } |
| 163 | 166 |
| 164 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) { | 167 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) { |
| 165 SQLStatement s; | 168 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 166 if (s.prepare(db_, "UPDATE logins SET " | 169 "UPDATE logins SET " |
| 167 "action_url = ?, " | 170 "action_url = ?, " |
| 168 "password_value = ?, " | 171 "password_value = ?, " |
| 169 "ssl_valid = ?, " | 172 "ssl_valid = ?, " |
| 170 "preferred = ? " | 173 "preferred = ? " |
| 171 "WHERE origin_url = ? AND " | 174 "WHERE origin_url = ? AND " |
| 172 "username_element = ? AND " | 175 "username_element = ? AND " |
| 173 "username_value = ? AND " | 176 "username_value = ? AND " |
| 174 "password_element = ? AND " | 177 "password_element = ? AND " |
| 175 "signon_realm = ?") != SQLITE_OK) { | 178 "signon_realm = ?")); |
| 179 if (!s) { |
| 176 NOTREACHED() << "Statement prepare failed"; | 180 NOTREACHED() << "Statement prepare failed"; |
| 177 return false; | 181 return false; |
| 178 } | 182 } |
| 179 | 183 |
| 180 s.bind_string(0, form.action.spec()); | 184 s.BindString(0, form.action.spec()); |
| 181 std::string encrypted_password = EncryptedString(form.password_value); | 185 std::string encrypted_password = EncryptedString(form.password_value); |
| 182 s.bind_blob(1, encrypted_password.data(), | 186 s.BindBlob(1, encrypted_password.data(), |
| 183 static_cast<int>(encrypted_password.length())); | 187 static_cast<int>(encrypted_password.length())); |
| 184 s.bind_int(2, form.ssl_valid); | 188 s.BindInt(2, form.ssl_valid); |
| 185 s.bind_int(3, form.preferred); | 189 s.BindInt(3, form.preferred); |
| 186 s.bind_string(4, form.origin.spec()); | 190 s.BindString(4, form.origin.spec()); |
| 187 s.bind_string16(5, form.username_element); | 191 s.BindString16(5, form.username_element); |
| 188 s.bind_string16(6, form.username_value); | 192 s.BindString16(6, form.username_value); |
| 189 s.bind_string16(7, form.password_element); | 193 s.BindString16(7, form.password_element); |
| 190 s.bind_string(8, form.signon_realm); | 194 s.BindString(8, form.signon_realm); |
| 191 | 195 |
| 192 if (s.step() != SQLITE_DONE) { | 196 if (!s.Run()) { |
| 193 NOTREACHED(); | 197 NOTREACHED(); |
| 194 return false; | 198 return false; |
| 195 } | 199 } |
| 196 if (items_changed) { | 200 if (items_changed) { |
| 197 *items_changed = s.changes(); | 201 *items_changed = db_.GetLastChangeCount(); |
| 198 } | 202 } |
| 199 return true; | 203 return true; |
| 200 } | 204 } |
| 201 | 205 |
| 202 bool LoginDatabase::RemoveLogin(const PasswordForm& form) { | 206 bool LoginDatabase::RemoveLogin(const PasswordForm& form) { |
| 203 SQLStatement s; | |
| 204 // Remove a login by UNIQUE-constrained fields. | 207 // Remove a login by UNIQUE-constrained fields. |
| 205 if (s.prepare(db_, | 208 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 206 "DELETE FROM logins WHERE " | 209 "DELETE FROM logins WHERE " |
| 207 "origin_url = ? AND " | 210 "origin_url = ? AND " |
| 208 "username_element = ? AND " | 211 "username_element = ? AND " |
| 209 "username_value = ? AND " | 212 "username_value = ? AND " |
| 210 "password_element = ? AND " | 213 "password_element = ? AND " |
| 211 "submit_element = ? AND " | 214 "submit_element = ? AND " |
| 212 "signon_realm = ? ") != SQLITE_OK) { | 215 "signon_realm = ? ")); |
| 216 if (!s) { |
| 213 NOTREACHED() << "Statement prepare failed"; | 217 NOTREACHED() << "Statement prepare failed"; |
| 214 return false; | 218 return false; |
| 215 } | 219 } |
| 216 | 220 |
| 217 s.bind_string(0, form.origin.spec()); | 221 s.BindString(0, form.origin.spec()); |
| 218 s.bind_string16(1, form.username_element); | 222 s.BindString16(1, form.username_element); |
| 219 s.bind_string16(2, form.username_value); | 223 s.BindString16(2, form.username_value); |
| 220 s.bind_string16(3, form.password_element); | 224 s.BindString16(3, form.password_element); |
| 221 s.bind_string16(4, form.submit_element); | 225 s.BindString16(4, form.submit_element); |
| 222 s.bind_string(5, form.signon_realm); | 226 s.BindString(5, form.signon_realm); |
| 223 | 227 |
| 224 if (s.step() != SQLITE_DONE) { | 228 if (!s.Run()) { |
| 225 NOTREACHED(); | 229 NOTREACHED(); |
| 226 return false; | 230 return false; |
| 227 } | 231 } |
| 228 return true; | 232 return true; |
| 229 } | 233 } |
| 230 | 234 |
| 231 bool LoginDatabase::RemoveLoginsCreatedBetween(const base::Time delete_begin, | 235 bool LoginDatabase::RemoveLoginsCreatedBetween(const base::Time delete_begin, |
| 232 const base::Time delete_end) { | 236 const base::Time delete_end) { |
| 233 SQLStatement s; | 237 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 234 if (s.prepare(db_, | 238 "DELETE FROM logins WHERE " |
| 235 "DELETE FROM logins WHERE " | 239 "date_created >= ? AND date_created < ?")); |
| 236 "date_created >= ? AND date_created < ?") != SQLITE_OK) { | 240 if (!s) { |
| 237 NOTREACHED() << "Statement prepare failed"; | 241 NOTREACHED() << "Statement prepare failed"; |
| 238 return false; | 242 return false; |
| 239 } | 243 } |
| 240 s.bind_int64(0, delete_begin.ToTimeT()); | 244 s.BindInt64(0, delete_begin.ToTimeT()); |
| 241 s.bind_int64(1, delete_end.is_null() ? std::numeric_limits<int64>::max() | 245 s.BindInt64(1, delete_end.is_null() ? std::numeric_limits<int64>::max() |
| 242 : delete_end.ToTimeT()); | 246 : delete_end.ToTimeT()); |
| 243 | 247 |
| 244 return s.step() == SQLITE_DONE; | 248 return s.Run(); |
| 245 } | 249 } |
| 246 | 250 |
| 247 void LoginDatabase::InitPasswordFormFromStatement(PasswordForm* form, | 251 void LoginDatabase::InitPasswordFormFromStatement(PasswordForm* form, |
| 248 SQLStatement* s) const { | 252 sql::Statement& s) const { |
| 249 std::string tmp; | 253 std::string tmp = s.ColumnString(COLUMN_ORIGIN_URL); |
| 250 s->column_string(COLUMN_ORIGIN_URL, &tmp); | |
| 251 form->origin = GURL(tmp); | 254 form->origin = GURL(tmp); |
| 252 s->column_string(COLUMN_ACTION_URL, &tmp); | 255 tmp = s.ColumnString(COLUMN_ACTION_URL); |
| 253 form->action = GURL(tmp); | 256 form->action = GURL(tmp); |
| 254 s->column_string16(COLUMN_USERNAME_ELEMENT, &form->username_element); | 257 form->username_element = s.ColumnString16(COLUMN_USERNAME_ELEMENT); |
| 255 s->column_string16(COLUMN_USERNAME_VALUE, &form->username_value); | 258 form->username_value = s.ColumnString16(COLUMN_USERNAME_VALUE); |
| 256 s->column_string16(COLUMN_PASSWORD_ELEMENT, &form->password_element); | 259 form->password_element = s.ColumnString16(COLUMN_PASSWORD_ELEMENT); |
| 257 std::string encrypted_password; | 260 std::string encrypted_password; |
| 258 s->column_blob_as_string(COLUMN_PASSWORD_VALUE, &encrypted_password); | 261 s.ColumnBlobAsString(COLUMN_PASSWORD_VALUE, &encrypted_password); |
| 259 form->password_value = DecryptedString(encrypted_password); | 262 form->password_value = DecryptedString(encrypted_password); |
| 260 s->column_string16(COLUMN_SUBMIT_ELEMENT, &form->submit_element); | 263 form->submit_element = s.ColumnString16(COLUMN_SUBMIT_ELEMENT); |
| 261 s->column_string(COLUMN_SIGNON_REALM, &tmp); | 264 tmp = s.ColumnString(COLUMN_SIGNON_REALM); |
| 262 form->signon_realm = tmp; | 265 form->signon_realm = tmp; |
| 263 form->ssl_valid = (s->column_int(COLUMN_SSL_VALID) > 0); | 266 form->ssl_valid = (s.ColumnInt(COLUMN_SSL_VALID) > 0); |
| 264 form->preferred = (s->column_int(COLUMN_PREFERRED) > 0); | 267 form->preferred = (s.ColumnInt(COLUMN_PREFERRED) > 0); |
| 265 form->date_created = base::Time::FromTimeT( | 268 form->date_created = base::Time::FromTimeT( |
| 266 s->column_int64(COLUMN_DATE_CREATED)); | 269 s.ColumnInt64(COLUMN_DATE_CREATED)); |
| 267 form->blacklisted_by_user = (s->column_int(COLUMN_BLACKLISTED_BY_USER) > 0); | 270 form->blacklisted_by_user = (s.ColumnInt(COLUMN_BLACKLISTED_BY_USER) > 0); |
| 268 int scheme_int = s->column_int(COLUMN_SCHEME); | 271 int scheme_int = s.ColumnInt(COLUMN_SCHEME); |
| 269 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER)); | 272 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER)); |
| 270 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int); | 273 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int); |
| 271 } | 274 } |
| 272 | 275 |
| 273 bool LoginDatabase::GetLogins(const PasswordForm& form, | 276 bool LoginDatabase::GetLogins(const PasswordForm& form, |
| 274 std::vector<PasswordForm*>* forms) const { | 277 std::vector<PasswordForm*>* forms) const { |
| 275 DCHECK(forms); | 278 DCHECK(forms); |
| 276 SQLStatement s; | |
| 277 // You *must* change LoginTableColumns if this query changes. | 279 // You *must* change LoginTableColumns if this query changes. |
| 278 if (s.prepare(db_, | 280 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 279 "SELECT origin_url, action_url, " | 281 "SELECT origin_url, action_url, " |
| 280 "username_element, username_value, " | 282 "username_element, username_value, " |
| 281 "password_element, password_value, " | 283 "password_element, password_value, " |
| 282 "submit_element, signon_realm, ssl_valid, preferred, " | 284 "submit_element, signon_realm, ssl_valid, preferred, " |
| 283 "date_created, blacklisted_by_user, scheme FROM logins " | 285 "date_created, blacklisted_by_user, scheme FROM logins " |
| 284 "WHERE signon_realm == ? ") != SQLITE_OK) { | 286 "WHERE signon_realm == ? ")); |
| 287 if (!s) { |
| 285 NOTREACHED() << "Statement prepare failed"; | 288 NOTREACHED() << "Statement prepare failed"; |
| 286 return false; | 289 return false; |
| 287 } | 290 } |
| 288 | 291 |
| 289 s.bind_string(0, form.signon_realm); | 292 s.BindString(0, form.signon_realm); |
| 290 | 293 |
| 291 int result; | 294 while (s.Step()) { |
| 292 while ((result = s.step()) == SQLITE_ROW) { | |
| 293 PasswordForm* new_form = new PasswordForm(); | 295 PasswordForm* new_form = new PasswordForm(); |
| 294 InitPasswordFormFromStatement(new_form, &s); | 296 InitPasswordFormFromStatement(new_form, s); |
| 295 | 297 |
| 296 forms->push_back(new_form); | 298 forms->push_back(new_form); |
| 297 } | 299 } |
| 298 return result == SQLITE_DONE; | 300 return s.Succeeded(); |
| 299 } | 301 } |
| 300 | 302 |
| 301 bool LoginDatabase::GetLoginsCreatedBetween( | 303 bool LoginDatabase::GetLoginsCreatedBetween( |
| 302 const base::Time begin, | 304 const base::Time begin, |
| 303 const base::Time end, | 305 const base::Time end, |
| 304 std::vector<webkit_glue::PasswordForm*>* forms) const { | 306 std::vector<webkit_glue::PasswordForm*>* forms) const { |
| 305 DCHECK(forms); | 307 DCHECK(forms); |
| 306 SQLStatement s; | 308 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 307 std::string stmt = "SELECT origin_url, action_url, " | 309 "SELECT origin_url, action_url, " |
| 308 "username_element, username_value, " | 310 "username_element, username_value, " |
| 309 "password_element, password_value, " | 311 "password_element, password_value, " |
| 310 "submit_element, signon_realm, ssl_valid, preferred, " | 312 "submit_element, signon_realm, ssl_valid, preferred, " |
| 311 "date_created, blacklisted_by_user, scheme FROM logins " | 313 "date_created, blacklisted_by_user, scheme FROM logins " |
| 312 "WHERE date_created >= ? AND date_created < ?" | 314 "WHERE date_created >= ? AND date_created < ?" |
| 313 "ORDER BY origin_url"; | 315 "ORDER BY origin_url")); |
| 314 | 316 |
| 315 if (s.prepare(db_, stmt.c_str()) != SQLITE_OK) { | 317 if (!s) { |
| 316 NOTREACHED() << "Statement prepare failed"; | 318 NOTREACHED() << "Statement prepare failed"; |
| 317 return false; | 319 return false; |
| 318 } | 320 } |
| 319 s.bind_int64(0, begin.ToTimeT()); | 321 s.BindInt64(0, begin.ToTimeT()); |
| 320 s.bind_int64(1, end.is_null() ? std::numeric_limits<int64>::max() | 322 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max() |
| 321 : end.ToTimeT()); | 323 : end.ToTimeT()); |
| 322 | 324 |
| 323 int result; | 325 while (s.Step()) { |
| 324 while ((result = s.step()) == SQLITE_ROW) { | |
| 325 PasswordForm* new_form = new PasswordForm(); | 326 PasswordForm* new_form = new PasswordForm(); |
| 326 InitPasswordFormFromStatement(new_form, &s); | 327 InitPasswordFormFromStatement(new_form, s); |
| 327 | 328 |
| 328 forms->push_back(new_form); | 329 forms->push_back(new_form); |
| 329 } | 330 } |
| 330 return result == SQLITE_DONE; | 331 return s.Succeeded(); |
| 331 } | 332 } |
| 332 | 333 |
| 333 bool LoginDatabase::GetAutofillableLogins( | 334 bool LoginDatabase::GetAutofillableLogins( |
| 334 std::vector<PasswordForm*>* forms) const { | 335 std::vector<PasswordForm*>* forms) const { |
| 335 return GetAllLoginsWithBlacklistSetting(false, forms); | 336 return GetAllLoginsWithBlacklistSetting(false, forms); |
| 336 } | 337 } |
| 337 | 338 |
| 338 bool LoginDatabase::GetBlacklistLogins( | 339 bool LoginDatabase::GetBlacklistLogins( |
| 339 std::vector<PasswordForm*>* forms) const { | 340 std::vector<PasswordForm*>* forms) const { |
| 340 return GetAllLoginsWithBlacklistSetting(true, forms); | 341 return GetAllLoginsWithBlacklistSetting(true, forms); |
| 341 } | 342 } |
| 342 | 343 |
| 343 bool LoginDatabase::GetAllLoginsWithBlacklistSetting( | 344 bool LoginDatabase::GetAllLoginsWithBlacklistSetting( |
| 344 bool blacklisted, std::vector<PasswordForm*>* forms) const { | 345 bool blacklisted, std::vector<PasswordForm*>* forms) const { |
| 345 DCHECK(forms); | 346 DCHECK(forms); |
| 346 SQLStatement s; | |
| 347 // You *must* change LoginTableColumns if this query changes. | 347 // You *must* change LoginTableColumns if this query changes. |
| 348 std::string stmt = "SELECT origin_url, action_url, " | 348 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 349 "username_element, username_value, " | 349 "SELECT origin_url, action_url, " |
| 350 "password_element, password_value, " | 350 "username_element, username_value, " |
| 351 "submit_element, signon_realm, ssl_valid, preferred, " | 351 "password_element, password_value, " |
| 352 "date_created, blacklisted_by_user, scheme FROM logins " | 352 "submit_element, signon_realm, ssl_valid, preferred, " |
| 353 "WHERE blacklisted_by_user == ? " | 353 "date_created, blacklisted_by_user, scheme FROM logins " |
| 354 "ORDER BY origin_url"; | 354 "WHERE blacklisted_by_user == ? " |
| 355 "ORDER BY origin_url")); |
| 355 | 356 |
| 356 if (s.prepare(db_, stmt.c_str()) != SQLITE_OK) { | 357 if (!s) { |
| 357 NOTREACHED() << "Statement prepare failed"; | 358 NOTREACHED() << "Statement prepare failed"; |
| 358 return false; | 359 return false; |
| 359 } | 360 } |
| 360 s.bind_int(0, blacklisted ? 1 : 0); | 361 s.BindInt(0, blacklisted ? 1 : 0); |
| 361 | 362 |
| 362 int result; | 363 while (s.Step()) { |
| 363 while ((result = s.step()) == SQLITE_ROW) { | |
| 364 PasswordForm* new_form = new PasswordForm(); | 364 PasswordForm* new_form = new PasswordForm(); |
| 365 InitPasswordFormFromStatement(new_form, &s); | 365 InitPasswordFormFromStatement(new_form, s); |
| 366 | 366 |
| 367 forms->push_back(new_form); | 367 forms->push_back(new_form); |
| 368 } | 368 } |
| 369 return result == SQLITE_DONE; | 369 return s.Succeeded(); |
| 370 } | 370 } |
| OLD | NEW |