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