Chromium Code Reviews| Index: components/password_manager/core/browser/login_database.cc |
| diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc |
| index 4c65080b080dab0fcbc0947e8b477e872fcd4349..12a2e804b8a610c94f3d126add26661d8d755713 100644 |
| --- a/components/password_manager/core/browser/login_database.cc |
| +++ b/components/password_manager/core/browser/login_database.cc |
| @@ -27,7 +27,7 @@ using autofill::PasswordForm; |
| namespace password_manager { |
| -const int kCurrentVersionNumber = 10; |
| +const int kCurrentVersionNumber = 11; |
| static const int kCompatibleVersionNumber = 1; |
| Pickle SerializeVector(const std::vector<base::string16>& vec) { |
| @@ -74,7 +74,7 @@ enum LoginTableColumns { |
| COLUMN_DISPLAY_NAME, |
| COLUMN_AVATAR_URL, |
| COLUMN_FEDERATION_URL, |
| - COLUMN_IS_ZERO_CLICK, |
| + COLUMN_SKIP_ZERO_CLICK, |
| }; |
| void BindAddStatement(const PasswordForm& form, |
| @@ -109,7 +109,7 @@ void BindAddStatement(const PasswordForm& form, |
| s->BindString16(COLUMN_DISPLAY_NAME, form.display_name); |
| s->BindString(COLUMN_AVATAR_URL, form.avatar_url.spec()); |
| s->BindString(COLUMN_FEDERATION_URL, form.federation_url.spec()); |
| - s->BindInt(COLUMN_IS_ZERO_CLICK, form.is_zero_click); |
| + s->BindInt(COLUMN_SKIP_ZERO_CLICK, form.skip_next_zero_click); |
| } |
| void AddCallback(int err, sql::Statement* /*stmt*/) { |
| @@ -150,6 +150,45 @@ void LogTimesUsedStat(const std::string& name, int sample) { |
| LogDynamicUMAStat(name, sample, 0, 100, 10); |
| } |
| +// Creates a table named |table_name| using our current schema. |
| +bool CreateNewTable(sql::Connection* db, base::StringPiece table_name) { |
| + std::ostringstream query; |
|
Garrett Casto
2015/02/04 06:58:40
The style guide discourages streams other than for
vasilii
2015/02/04 12:44:02
Done.
|
| + query << "CREATE TABLE " << table_name << |
| + " (origin_url VARCHAR NOT NULL, " |
| + "action_url VARCHAR, " |
| + "username_element VARCHAR, " |
| + "username_value VARCHAR, " |
| + "password_element VARCHAR, " |
| + "password_value BLOB, " |
| + "submit_element VARCHAR, " |
| + "signon_realm VARCHAR NOT NULL," |
| + "ssl_valid INTEGER NOT NULL," |
| + "preferred INTEGER NOT NULL," |
| + "date_created INTEGER NOT NULL," |
| + "blacklisted_by_user INTEGER NOT NULL," |
| + "scheme INTEGER NOT NULL," |
| + "password_type INTEGER," |
| + "possible_usernames BLOB," |
| + "times_used INTEGER," |
| + "form_data BLOB," |
| + "date_synced INTEGER," |
| + "display_name VARCHAR," |
| + "avatar_url VARCHAR," |
| + "federation_url VARCHAR," |
| + "skip_next_zero_click INTEGER," |
| + "UNIQUE " |
| + "(origin_url, username_element, " |
| + "username_value, password_element, signon_realm))"; |
| + return db->Execute(query.str().c_str()); |
| +} |
| + |
| +bool CreateIndexOnSignonRealm(sql::Connection* db, |
| + base::StringPiece table_name) { |
| + std::ostringstream query; |
|
Garrett Casto
2015/02/04 06:58:40
Same here.
vasilii
2015/02/04 12:44:02
Done.
|
| + query << "CREATE INDEX logins_signon ON " << table_name << " (signon_realm)"; |
| + return db->Execute(query.str().c_str()); |
| +} |
| + |
| } // namespace |
| LoginDatabase::LoginDatabase(const base::FilePath& db_path) |
| @@ -305,6 +344,25 @@ bool LoginDatabase::MigrateOldVersionsAsNeeded() { |
| meta_table_.SetVersionNumber(10); |
| } |
| + case 10: { |
| + // rename is_zero_click -> skip_next_zero_click and restore the unique key |
| + // (origin_url, username_element, username_value, password_element, |
| + // signon_realm). |
| + const char copy_query[] = "INSERT OR REPLACE INTO logins_new SELECT " |
| + "origin_url, action_url, username_element, username_value, " |
| + "password_element, password_value, submit_element, signon_realm, " |
| + "ssl_valid, preferred, date_created, blacklisted_by_user, scheme, " |
| + "password_type, possible_usernames, times_used, form_data, " |
| + "date_synced, display_name, avatar_url, federation_url, is_zero_click" |
| + " FROM logins"; |
| + if (!CreateNewTable(&db_, "logins_new") || |
| + !db_.Execute(copy_query) || |
| + !db_.Execute("DROP TABLE logins") || |
| + !db_.Execute("ALTER TABLE logins_new RENAME TO logins") || |
| + !CreateIndexOnSignonRealm(&db_, "logins")) |
| + return false; |
| + meta_table_.SetVersionNumber(11); |
| + } |
| case kCurrentVersionNumber: |
| // Already up to date |
| return true; |
| @@ -316,39 +374,11 @@ bool LoginDatabase::MigrateOldVersionsAsNeeded() { |
| bool LoginDatabase::InitLoginsTable() { |
| if (!db_.DoesTableExist("logins")) { |
| - if (!db_.Execute( |
| - "CREATE TABLE logins (" |
| - "origin_url VARCHAR NOT NULL, " |
| - "action_url VARCHAR, " |
| - "username_element VARCHAR, " |
| - "username_value VARCHAR, " |
| - "password_element VARCHAR, " |
| - "password_value BLOB, " |
| - "submit_element VARCHAR, " |
| - "signon_realm VARCHAR NOT NULL," |
| - "ssl_valid INTEGER NOT NULL," |
| - "preferred INTEGER NOT NULL," |
| - "date_created INTEGER NOT NULL," |
| - "blacklisted_by_user INTEGER NOT NULL," |
| - "scheme INTEGER NOT NULL," |
| - "password_type INTEGER," |
| - "possible_usernames BLOB," |
| - "times_used INTEGER," |
| - "form_data BLOB," |
| - "date_synced INTEGER," |
| - "display_name VARCHAR," |
| - "avatar_url VARCHAR," |
| - "federation_url VARCHAR," |
| - "is_zero_click INTEGER," |
| - "UNIQUE " |
| - "(origin_url, username_element, " |
| - "username_value, password_element, " |
| - "submit_element, signon_realm))")) { |
| + if (!CreateNewTable(&db_, "logins")) { |
| NOTREACHED(); |
| return false; |
| } |
| - if (!db_.Execute("CREATE INDEX logins_signon ON " |
| - "logins (signon_realm)")) { |
| + if (!CreateIndexOnSignonRealm(&db_, "logins")) { |
| NOTREACHED(); |
| return false; |
| } |
| @@ -474,7 +504,7 @@ PasswordStoreChangeList LoginDatabase::AddLogin(const PasswordForm& form) { |
| " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| " scheme, password_type, possible_usernames, times_used, form_data, " |
| " date_synced, display_name, avatar_url," |
| - " federation_url, is_zero_click) VALUES " |
| + " federation_url, skip_next_zero_click) VALUES " |
| "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
| BindAddStatement(form, encrypted_password, &s); |
| db_.set_error_callback(base::Bind(&AddCallback)); |
| @@ -493,7 +523,7 @@ PasswordStoreChangeList LoginDatabase::AddLogin(const PasswordForm& form) { |
| " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| " scheme, password_type, possible_usernames, times_used, form_data, " |
| " date_synced, display_name, avatar_url," |
| - " federation_url, is_zero_click) VALUES " |
| + " federation_url, skip_next_zero_click) VALUES " |
| "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
| BindAddStatement(form, encrypted_password, &s); |
| if (s.Run()) { |
| @@ -528,7 +558,7 @@ PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) { |
| "display_name = ?, " |
| "avatar_url = ?, " |
| "federation_url = ?, " |
| - "is_zero_click = ? " |
| + "skip_next_zero_click = ? " |
| "WHERE origin_url = ? AND " |
| "username_element = ? AND " |
| "username_value = ? AND " |
| @@ -551,7 +581,7 @@ PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) { |
| s.BindString16(12, form.display_name); |
| s.BindString(13, form.avatar_url.spec()); |
| s.BindString(14, form.federation_url.spec()); |
| - s.BindInt(15, form.is_zero_click); |
| + s.BindInt(15, form.skip_next_zero_click); |
| // WHERE starts here. |
| s.BindString(16, form.origin.spec()); |
| @@ -672,7 +702,7 @@ LoginDatabase::EncryptionResult LoginDatabase::InitPasswordFormFromStatement( |
| form->display_name = s.ColumnString16(COLUMN_DISPLAY_NAME); |
| form->avatar_url = GURL(s.ColumnString(COLUMN_AVATAR_URL)); |
| form->federation_url = GURL(s.ColumnString(COLUMN_FEDERATION_URL)); |
| - form->is_zero_click = (s.ColumnInt(COLUMN_IS_ZERO_CLICK) > 0); |
| + form->skip_next_zero_click = (s.ColumnInt(COLUMN_SKIP_ZERO_CLICK) > 0); |
| return ENCRYPTION_RESULT_SUCCESS; |
| } |
| @@ -688,7 +718,8 @@ bool LoginDatabase::GetLogins( |
| "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| "scheme, password_type, possible_usernames, times_used, form_data, " |
| "date_synced, display_name, avatar_url, " |
| - "federation_url, is_zero_click FROM logins WHERE signon_realm == ? "; |
| + "federation_url, skip_next_zero_click " |
| + "FROM logins WHERE signon_realm == ? "; |
| sql::Statement s; |
| const GURL signon_realm(form.signon_realm); |
| std::string registered_domain = GetRegistryControlledDomain(signon_realm); |
| @@ -785,7 +816,7 @@ bool LoginDatabase::GetLoginsCreatedBetween( |
| "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| "scheme, password_type, possible_usernames, times_used, form_data, " |
| "date_synced, display_name, avatar_url, " |
| - "federation_url, is_zero_click FROM logins " |
| + "federation_url, skip_next_zero_click FROM logins " |
| "WHERE date_created >= ? AND date_created < ?" |
| "ORDER BY origin_url")); |
| s.BindInt64(0, begin.ToInternalValue()); |
| @@ -817,7 +848,7 @@ bool LoginDatabase::GetLoginsSyncedBetween( |
| "ssl_valid, preferred, date_created, blacklisted_by_user, " |
| "scheme, password_type, possible_usernames, times_used, form_data, " |
| "date_synced, display_name, avatar_url, " |
| - "federation_url, is_zero_click FROM logins " |
| + "federation_url, skip_next_zero_click FROM logins " |
| "WHERE date_synced >= ? AND date_synced < ?" |
| "ORDER BY origin_url")); |
| s.BindInt64(0, begin.ToInternalValue()); |
| @@ -861,7 +892,7 @@ bool LoginDatabase::GetAllLoginsWithBlacklistSetting( |
| "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| "scheme, password_type, possible_usernames, times_used, form_data, " |
| "date_synced, display_name, avatar_url, " |
| - "federation_url, is_zero_click FROM logins " |
| + "federation_url, skip_next_zero_click FROM logins " |
| "WHERE blacklisted_by_user == ? ORDER BY origin_url")); |
| s.BindInt(0, blacklisted ? 1 : 0); |