| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/file_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/pickle.h" | 14 #include "base/pickle.h" |
| 15 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
| 16 #include "base/time.h" | 16 #include "base/time.h" |
| 17 #include "base/utf_string_conversions.h" | 17 #include "base/utf_string_conversions.h" |
| 18 #include "sql/statement.h" | 18 #include "sql/statement.h" |
| 19 #include "sql/transaction.h" | 19 #include "sql/transaction.h" |
| 20 | 20 |
| 21 using content::PasswordForm; | 21 using content::PasswordForm; |
| 22 | 22 |
| 23 static const int kCurrentVersionNumber = 2; | 23 static const int kCurrentVersionNumber = 3; |
| 24 static const int kCompatibleVersionNumber = 1; | 24 static const int kCompatibleVersionNumber = 1; |
| 25 | 25 |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 // Convenience enum for interacting with SQL queries that use all the columns. | 28 // Convenience enum for interacting with SQL queries that use all the columns. |
| 29 enum LoginTableColumns { | 29 enum LoginTableColumns { |
| 30 COLUMN_ORIGIN_URL = 0, | 30 COLUMN_ORIGIN_URL = 0, |
| 31 COLUMN_ACTION_URL, | 31 COLUMN_ACTION_URL, |
| 32 COLUMN_USERNAME_ELEMENT, | 32 COLUMN_USERNAME_ELEMENT, |
| 33 COLUMN_USERNAME_VALUE, | 33 COLUMN_USERNAME_VALUE, |
| 34 COLUMN_PASSWORD_ELEMENT, | 34 COLUMN_PASSWORD_ELEMENT, |
| 35 COLUMN_PASSWORD_VALUE, | 35 COLUMN_PASSWORD_VALUE, |
| 36 COLUMN_SUBMIT_ELEMENT, | 36 COLUMN_SUBMIT_ELEMENT, |
| 37 COLUMN_SIGNON_REALM, | 37 COLUMN_SIGNON_REALM, |
| 38 COLUMN_SSL_VALID, | 38 COLUMN_SSL_VALID, |
| 39 COLUMN_PREFERRED, | 39 COLUMN_PREFERRED, |
| 40 COLUMN_DATE_CREATED, | 40 COLUMN_DATE_CREATED, |
| 41 COLUMN_BLACKLISTED_BY_USER, | 41 COLUMN_BLACKLISTED_BY_USER, |
| 42 COLUMN_SCHEME, | 42 COLUMN_SCHEME, |
| 43 COLUMN_PASSWORD_TYPE, | 43 COLUMN_PASSWORD_TYPE, |
| 44 COLUMN_POSSIBLE_USERNAMES | 44 COLUMN_POSSIBLE_USERNAMES, |
| 45 COLUMN_TIMES_USED |
| 45 }; | 46 }; |
| 46 | 47 |
| 47 } // namespace | 48 } // namespace |
| 48 | 49 |
| 49 LoginDatabase::LoginDatabase() { | 50 LoginDatabase::LoginDatabase() { |
| 50 } | 51 } |
| 51 | 52 |
| 52 LoginDatabase::~LoginDatabase() { | 53 LoginDatabase::~LoginDatabase() { |
| 53 } | 54 } |
| 54 | 55 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 } | 97 } |
| 97 | 98 |
| 98 if (!transaction.Commit()) { | 99 if (!transaction.Commit()) { |
| 99 db_.Close(); | 100 db_.Close(); |
| 100 return false; | 101 return false; |
| 101 } | 102 } |
| 102 return true; | 103 return true; |
| 103 } | 104 } |
| 104 | 105 |
| 105 bool LoginDatabase::MigrateOldVersionsAsNeeded() { | 106 bool LoginDatabase::MigrateOldVersionsAsNeeded() { |
| 106 switch (meta_table_.GetVersionNumber()) { | 107 int current_version = meta_table_.GetVersionNumber(); |
| 107 case kCompatibleVersionNumber: | 108 while (current_version != kCurrentVersionNumber) { |
| 108 if (!db_.Execute("ALTER TABLE logins " | 109 switch (current_version) { |
| 109 "ADD COLUMN password_type INTEGER") || | 110 case 1: |
| 110 !db_.Execute("ALTER TABLE logins " | 111 if (!db_.Execute("ALTER TABLE logins " |
| 111 "ADD COLUMN possible_usernames BLOB")) { | 112 "ADD COLUMN password_type INTEGER") || |
| 113 !db_.Execute("ALTER TABLE logins " |
| 114 "ADD COLUMN possible_usernames BLOB")) { |
| 115 return false; |
| 116 } else { |
| 117 current_version = 2; |
| 118 } |
| 119 break; |
| 120 case 2: |
| 121 if (!db_.Execute("ALTER TABLE logins " |
| 122 "ADD COLUMN times_used INTEGER")) { |
| 123 return false; |
| 124 } else { |
| 125 current_version = 3; |
| 126 } |
| 127 default: |
| 128 NOTREACHED(); |
| 112 return false; | 129 return false; |
| 113 } else { | 130 } |
| 114 meta_table_.SetVersionNumber(kCurrentVersionNumber); | |
| 115 } | |
| 116 } | 131 } |
| 132 meta_table_.SetVersionNumber(kCurrentVersionNumber); |
| 117 return true; | 133 return true; |
| 118 } | 134 } |
| 119 | 135 |
| 120 bool LoginDatabase::InitLoginsTable() { | 136 bool LoginDatabase::InitLoginsTable() { |
| 121 if (!db_.DoesTableExist("logins")) { | 137 if (!db_.DoesTableExist("logins")) { |
| 122 if (!db_.Execute("CREATE TABLE logins (" | 138 if (!db_.Execute("CREATE TABLE logins (" |
| 123 "origin_url VARCHAR NOT NULL, " | 139 "origin_url VARCHAR NOT NULL, " |
| 124 "action_url VARCHAR, " | 140 "action_url VARCHAR, " |
| 125 "username_element VARCHAR, " | 141 "username_element VARCHAR, " |
| 126 "username_value VARCHAR, " | 142 "username_value VARCHAR, " |
| 127 "password_element VARCHAR, " | 143 "password_element VARCHAR, " |
| 128 "password_value BLOB, " | 144 "password_value BLOB, " |
| 129 "submit_element VARCHAR, " | 145 "submit_element VARCHAR, " |
| 130 "signon_realm VARCHAR NOT NULL," | 146 "signon_realm VARCHAR NOT NULL," |
| 131 "ssl_valid INTEGER NOT NULL," | 147 "ssl_valid INTEGER NOT NULL," |
| 132 "preferred INTEGER NOT NULL," | 148 "preferred INTEGER NOT NULL," |
| 133 "date_created INTEGER NOT NULL," | 149 "date_created INTEGER NOT NULL," |
| 134 "blacklisted_by_user INTEGER NOT NULL," | 150 "blacklisted_by_user INTEGER NOT NULL," |
| 135 "scheme INTEGER NOT NULL," | 151 "scheme INTEGER NOT NULL," |
| 136 "password_type INTEGER," | 152 "password_type INTEGER," |
| 137 "possible_usernames BLOB," | 153 "possible_usernames BLOB," |
| 154 "times_used INTEGER," |
| 138 "UNIQUE " | 155 "UNIQUE " |
| 139 "(origin_url, username_element, " | 156 "(origin_url, username_element, " |
| 140 "username_value, password_element, " | 157 "username_value, password_element, " |
| 141 "submit_element, signon_realm))")) { | 158 "submit_element, signon_realm))")) { |
| 142 NOTREACHED(); | 159 NOTREACHED(); |
| 143 return false; | 160 return false; |
| 144 } | 161 } |
| 145 if (!db_.Execute("CREATE INDEX logins_signon ON " | 162 if (!db_.Execute("CREATE INDEX logins_signon ON " |
| 146 "logins (signon_realm)")) { | 163 "logins (signon_realm)")) { |
| 147 NOTREACHED(); | 164 NOTREACHED(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 161 | 178 |
| 162 int total_accounts = 0; | 179 int total_accounts = 0; |
| 163 while (s.Step()) { | 180 while (s.Step()) { |
| 164 int accounts_per_site = s.ColumnInt(1); | 181 int accounts_per_site = s.ColumnInt(1); |
| 165 total_accounts += accounts_per_site; | 182 total_accounts += accounts_per_site; |
| 166 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.AccountsPerSite", | 183 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.AccountsPerSite", |
| 167 accounts_per_site, 0, 32, 6); | 184 accounts_per_site, 0, 32, 6); |
| 168 } | 185 } |
| 169 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.TotalAccounts", | 186 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.TotalAccounts", |
| 170 total_accounts, 0, 32, 6); | 187 total_accounts, 0, 32, 6); |
| 188 |
| 189 sql::Statement usage_statement(db_.GetCachedStatement( |
| 190 SQL_FROM_HERE, |
| 191 "SELECT times_used FROM logins")); |
| 192 |
| 193 if (!usage_statement.is_valid()) |
| 194 return; |
| 195 |
| 196 while (usage_statement.Step()) { |
| 197 UMA_HISTOGRAM_CUSTOM_COUNTS("PasswordManager.TimesPasswordUsed", |
| 198 usage_statement.ColumnInt(0), 0, 100, 10); |
| 199 } |
| 171 } | 200 } |
| 172 | 201 |
| 173 bool LoginDatabase::AddLogin(const PasswordForm& form) { | 202 bool LoginDatabase::AddLogin(const PasswordForm& form) { |
| 174 std::string encrypted_password; | 203 std::string encrypted_password; |
| 175 if (!EncryptedString(form.password_value, &encrypted_password)) | 204 if (!EncryptedString(form.password_value, &encrypted_password)) |
| 176 return false; | 205 return false; |
| 177 | 206 |
| 178 // You *must* change LoginTableColumns if this query changes. | 207 // You *must* change LoginTableColumns if this query changes. |
| 179 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, | 208 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 180 "INSERT OR REPLACE INTO logins " | 209 "INSERT OR REPLACE INTO logins " |
| 181 "(origin_url, action_url, username_element, username_value, " | 210 "(origin_url, action_url, username_element, username_value, " |
| 182 " password_element, password_value, submit_element, " | 211 " password_element, password_value, submit_element, " |
| 183 " signon_realm, ssl_valid, preferred, date_created, " | 212 " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 184 " blacklisted_by_user, scheme, password_type, possible_usernames) " | 213 " scheme, password_type, possible_usernames, times_used) " |
| 185 "VALUES " | 214 "VALUES " |
| 186 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); | 215 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
| 187 s.BindString(COLUMN_ORIGIN_URL, form.origin.spec()); | 216 s.BindString(COLUMN_ORIGIN_URL, form.origin.spec()); |
| 188 s.BindString(COLUMN_ACTION_URL, form.action.spec()); | 217 s.BindString(COLUMN_ACTION_URL, form.action.spec()); |
| 189 s.BindString16(COLUMN_USERNAME_ELEMENT, form.username_element); | 218 s.BindString16(COLUMN_USERNAME_ELEMENT, form.username_element); |
| 190 s.BindString16(COLUMN_USERNAME_VALUE, form.username_value); | 219 s.BindString16(COLUMN_USERNAME_VALUE, form.username_value); |
| 191 s.BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element); | 220 s.BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element); |
| 192 s.BindBlob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), | 221 s.BindBlob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), |
| 193 static_cast<int>(encrypted_password.length())); | 222 static_cast<int>(encrypted_password.length())); |
| 194 s.BindString16(COLUMN_SUBMIT_ELEMENT, form.submit_element); | 223 s.BindString16(COLUMN_SUBMIT_ELEMENT, form.submit_element); |
| 195 s.BindString(COLUMN_SIGNON_REALM, form.signon_realm); | 224 s.BindString(COLUMN_SIGNON_REALM, form.signon_realm); |
| 196 s.BindInt(COLUMN_SSL_VALID, form.ssl_valid); | 225 s.BindInt(COLUMN_SSL_VALID, form.ssl_valid); |
| 197 s.BindInt(COLUMN_PREFERRED, form.preferred); | 226 s.BindInt(COLUMN_PREFERRED, form.preferred); |
| 198 s.BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); | 227 s.BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); |
| 199 s.BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); | 228 s.BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); |
| 200 s.BindInt(COLUMN_SCHEME, form.scheme); | 229 s.BindInt(COLUMN_SCHEME, form.scheme); |
| 201 s.BindInt(COLUMN_PASSWORD_TYPE, form.type); | 230 s.BindInt(COLUMN_PASSWORD_TYPE, form.type); |
| 202 Pickle pickle = SerializeVector(form.possible_usernames); | 231 Pickle pickle = SerializeVector(form.possible_usernames); |
| 203 s.BindBlob(COLUMN_POSSIBLE_USERNAMES, pickle.data(), pickle.size()); | 232 s.BindBlob(COLUMN_POSSIBLE_USERNAMES, pickle.data(), pickle.size()); |
| 233 s.BindInt(COLUMN_TIMES_USED, form.times_used); |
| 204 | 234 |
| 205 return s.Run(); | 235 return s.Run(); |
| 206 } | 236 } |
| 207 | 237 |
| 208 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) { | 238 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) { |
| 209 std::string encrypted_password; | 239 std::string encrypted_password; |
| 210 if (!EncryptedString(form.password_value, &encrypted_password)) | 240 if (!EncryptedString(form.password_value, &encrypted_password)) |
| 211 return false; | 241 return false; |
| 212 | 242 |
| 213 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, | 243 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 214 "UPDATE logins SET " | 244 "UPDATE logins SET " |
| 215 "action_url = ?, " | 245 "action_url = ?, " |
| 216 "password_value = ?, " | 246 "password_value = ?, " |
| 217 "ssl_valid = ?, " | 247 "ssl_valid = ?, " |
| 218 "preferred = ?, " | 248 "preferred = ?, " |
| 219 "possible_usernames = ? " | 249 "possible_usernames = ?, " |
| 250 "times_used = ? " |
| 220 "WHERE origin_url = ? AND " | 251 "WHERE origin_url = ? AND " |
| 221 "username_element = ? AND " | 252 "username_element = ? AND " |
| 222 "username_value = ? AND " | 253 "username_value = ? AND " |
| 223 "password_element = ? AND " | 254 "password_element = ? AND " |
| 224 "signon_realm = ?")); | 255 "signon_realm = ?")); |
| 225 s.BindString(0, form.action.spec()); | 256 s.BindString(0, form.action.spec()); |
| 226 s.BindBlob(1, encrypted_password.data(), | 257 s.BindBlob(1, encrypted_password.data(), |
| 227 static_cast<int>(encrypted_password.length())); | 258 static_cast<int>(encrypted_password.length())); |
| 228 s.BindInt(2, form.ssl_valid); | 259 s.BindInt(2, form.ssl_valid); |
| 229 s.BindInt(3, form.preferred); | 260 s.BindInt(3, form.preferred); |
| 230 Pickle pickle = SerializeVector(form.possible_usernames); | 261 Pickle pickle = SerializeVector(form.possible_usernames); |
| 231 s.BindBlob(4, pickle.data(), pickle.size()); | 262 s.BindBlob(4, pickle.data(), pickle.size()); |
| 232 s.BindString(5, form.origin.spec()); | 263 s.BindInt(5, form.times_used); |
| 233 s.BindString16(6, form.username_element); | 264 s.BindString(6, form.origin.spec()); |
| 234 s.BindString16(7, form.username_value); | 265 s.BindString16(7, form.username_element); |
| 235 s.BindString16(8, form.password_element); | 266 s.BindString16(8, form.username_value); |
| 236 s.BindString(9, form.signon_realm); | 267 s.BindString16(9, form.password_element); |
| 268 s.BindString(10, form.signon_realm); |
| 237 | 269 |
| 238 if (!s.Run()) | 270 if (!s.Run()) |
| 239 return false; | 271 return false; |
| 240 | 272 |
| 241 if (items_changed) | 273 if (items_changed) |
| 242 *items_changed = db_.GetLastChangeCount(); | 274 *items_changed = db_.GetLastChangeCount(); |
| 243 | 275 |
| 244 return true; | 276 return true; |
| 245 } | 277 } |
| 246 | 278 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 int scheme_int = s.ColumnInt(COLUMN_SCHEME); | 335 int scheme_int = s.ColumnInt(COLUMN_SCHEME); |
| 304 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER)); | 336 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER)); |
| 305 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int); | 337 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int); |
| 306 int type_int = s.ColumnInt(COLUMN_PASSWORD_TYPE); | 338 int type_int = s.ColumnInt(COLUMN_PASSWORD_TYPE); |
| 307 DCHECK(type_int >= 0 && type_int <= PasswordForm::TYPE_GENERATED); | 339 DCHECK(type_int >= 0 && type_int <= PasswordForm::TYPE_GENERATED); |
| 308 form->type = static_cast<PasswordForm::Type>(type_int); | 340 form->type = static_cast<PasswordForm::Type>(type_int); |
| 309 Pickle pickle( | 341 Pickle pickle( |
| 310 static_cast<const char*>(s.ColumnBlob(COLUMN_POSSIBLE_USERNAMES)), | 342 static_cast<const char*>(s.ColumnBlob(COLUMN_POSSIBLE_USERNAMES)), |
| 311 s.ColumnByteLength(COLUMN_POSSIBLE_USERNAMES)); | 343 s.ColumnByteLength(COLUMN_POSSIBLE_USERNAMES)); |
| 312 form->possible_usernames = DeserializeVector(pickle); | 344 form->possible_usernames = DeserializeVector(pickle); |
| 345 form->times_used = s.ColumnInt(COLUMN_TIMES_USED); |
| 313 return true; | 346 return true; |
| 314 } | 347 } |
| 315 | 348 |
| 316 bool LoginDatabase::GetLogins(const PasswordForm& form, | 349 bool LoginDatabase::GetLogins(const PasswordForm& form, |
| 317 std::vector<PasswordForm*>* forms) const { | 350 std::vector<PasswordForm*>* forms) const { |
| 318 DCHECK(forms); | 351 DCHECK(forms); |
| 319 // You *must* change LoginTableColumns if this query changes. | 352 // You *must* change LoginTableColumns if this query changes. |
| 320 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, | 353 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 321 "SELECT origin_url, action_url, " | 354 "SELECT origin_url, action_url, " |
| 322 "username_element, username_value, " | 355 "username_element, username_value, " |
| 323 "password_element, password_value, " | 356 "password_element, password_value, submit_element, " |
| 324 "submit_element, signon_realm, ssl_valid, preferred, date_created, " | 357 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 325 "blacklisted_by_user, scheme, password_type, possible_usernames " | 358 "scheme, password_type, possible_usernames, times_used " |
| 326 "FROM logins WHERE signon_realm == ? ")); | 359 "FROM logins WHERE signon_realm == ? ")); |
| 327 s.BindString(0, form.signon_realm); | 360 s.BindString(0, form.signon_realm); |
| 328 | 361 |
| 329 while (s.Step()) { | 362 while (s.Step()) { |
| 330 scoped_ptr<PasswordForm> new_form(new PasswordForm()); | 363 scoped_ptr<PasswordForm> new_form(new PasswordForm()); |
| 331 if (!InitPasswordFormFromStatement(new_form.get(), s)) | 364 if (!InitPasswordFormFromStatement(new_form.get(), s)) |
| 332 return false; | 365 return false; |
| 333 forms->push_back(new_form.release()); | 366 forms->push_back(new_form.release()); |
| 334 } | 367 } |
| 335 return s.Succeeded(); | 368 return s.Succeeded(); |
| 336 } | 369 } |
| 337 | 370 |
| 338 bool LoginDatabase::GetLoginsCreatedBetween( | 371 bool LoginDatabase::GetLoginsCreatedBetween( |
| 339 const base::Time begin, | 372 const base::Time begin, |
| 340 const base::Time end, | 373 const base::Time end, |
| 341 std::vector<content::PasswordForm*>* forms) const { | 374 std::vector<content::PasswordForm*>* forms) const { |
| 342 DCHECK(forms); | 375 DCHECK(forms); |
| 343 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, | 376 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 344 "SELECT origin_url, action_url, " | 377 "SELECT origin_url, action_url, " |
| 345 "username_element, username_value, " | 378 "username_element, username_value, " |
| 346 "password_element, password_value, " | 379 "password_element, password_value, submit_element, " |
| 347 "submit_element, signon_realm, ssl_valid, preferred, date_created, " | 380 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 348 "blacklisted_by_user, scheme, password_type, possible_usernames " | 381 "scheme, password_type, possible_usernames, times_used " |
| 349 "FROM logins WHERE date_created >= ? AND date_created < ?" | 382 "FROM logins WHERE date_created >= ? AND date_created < ?" |
| 350 "ORDER BY origin_url")); | 383 "ORDER BY origin_url")); |
| 351 s.BindInt64(0, begin.ToTimeT()); | 384 s.BindInt64(0, begin.ToTimeT()); |
| 352 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max() | 385 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max() |
| 353 : end.ToTimeT()); | 386 : end.ToTimeT()); |
| 354 | 387 |
| 355 while (s.Step()) { | 388 while (s.Step()) { |
| 356 scoped_ptr<PasswordForm> new_form(new PasswordForm()); | 389 scoped_ptr<PasswordForm> new_form(new PasswordForm()); |
| 357 if (!InitPasswordFormFromStatement(new_form.get(), s)) | 390 if (!InitPasswordFormFromStatement(new_form.get(), s)) |
| 358 return false; | 391 return false; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 371 return GetAllLoginsWithBlacklistSetting(true, forms); | 404 return GetAllLoginsWithBlacklistSetting(true, forms); |
| 372 } | 405 } |
| 373 | 406 |
| 374 bool LoginDatabase::GetAllLoginsWithBlacklistSetting( | 407 bool LoginDatabase::GetAllLoginsWithBlacklistSetting( |
| 375 bool blacklisted, std::vector<PasswordForm*>* forms) const { | 408 bool blacklisted, std::vector<PasswordForm*>* forms) const { |
| 376 DCHECK(forms); | 409 DCHECK(forms); |
| 377 // You *must* change LoginTableColumns if this query changes. | 410 // You *must* change LoginTableColumns if this query changes. |
| 378 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, | 411 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, |
| 379 "SELECT origin_url, action_url, " | 412 "SELECT origin_url, action_url, " |
| 380 "username_element, username_value, " | 413 "username_element, username_value, " |
| 381 "password_element, password_value, " | 414 "password_element, password_value, submit_element, " |
| 382 "submit_element, signon_realm, ssl_valid, preferred, date_created, " | 415 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 383 "blacklisted_by_user, scheme, password_type, possible_usernames " | 416 "scheme, password_type, possible_usernames, times_used " |
| 384 "FROM logins WHERE blacklisted_by_user == ? " | 417 "FROM logins WHERE blacklisted_by_user == ? " |
| 385 "ORDER BY origin_url")); | 418 "ORDER BY origin_url")); |
| 386 s.BindInt(0, blacklisted ? 1 : 0); | 419 s.BindInt(0, blacklisted ? 1 : 0); |
| 387 | 420 |
| 388 while (s.Step()) { | 421 while (s.Step()) { |
| 389 scoped_ptr<PasswordForm> new_form(new PasswordForm()); | 422 scoped_ptr<PasswordForm> new_form(new PasswordForm()); |
| 390 if (!InitPasswordFormFromStatement(new_form.get(), s)) | 423 if (!InitPasswordFormFromStatement(new_form.get(), s)) |
| 391 return false; | 424 return false; |
| 392 forms->push_back(new_form.release()); | 425 forms->push_back(new_form.release()); |
| 393 } | 426 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 413 std::vector<string16> LoginDatabase::DeserializeVector(const Pickle& p) const { | 446 std::vector<string16> LoginDatabase::DeserializeVector(const Pickle& p) const { |
| 414 std::vector<string16> ret; | 447 std::vector<string16> ret; |
| 415 string16 str; | 448 string16 str; |
| 416 | 449 |
| 417 PickleIterator iterator(p); | 450 PickleIterator iterator(p); |
| 418 while (iterator.ReadString16(&str)) { | 451 while (iterator.ReadString16(&str)) { |
| 419 ret.push_back(str); | 452 ret.push_back(str); |
| 420 } | 453 } |
| 421 return ret; | 454 return ret; |
| 422 } | 455 } |
| OLD | NEW |