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..3ebadb6050d2bb7911961f8f4084f5861ad3e679 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_zero_click); |
} |
void AddCallback(int err, sql::Statement* /*stmt*/) { |
@@ -150,6 +150,43 @@ 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, const char* table_name) { |
+ std::string query = base::StringPrintf( |
+ "CREATE TABLE %s (" |
+ "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_zero_click INTEGER," |
+ "UNIQUE (origin_url, username_element, username_value, " |
+ "password_element, signon_realm))", table_name); |
+ return db->Execute(query.c_str()); |
+} |
+ |
+bool CreateIndexOnSignonRealm(sql::Connection* db, const char* table_name) { |
+ std::string query = base::StringPrintf( |
+ "CREATE INDEX logins_signon ON %s (signon_realm)", table_name); |
+ return db->Execute(query.c_str()); |
+} |
+ |
} // namespace |
LoginDatabase::LoginDatabase(const base::FilePath& db_path) |
@@ -300,11 +337,30 @@ bool LoginDatabase::MigrateOldVersionsAsNeeded() { |
("CREATE TABLE logins(" + fields_to_copy + ")").c_str()) || |
!db_.Execute(copy_data_query("logins_data", "logins").c_str()) || |
!db_.Execute("DROP TABLE logins_data") || |
- !db_.Execute("CREATE INDEX logins_signon ON logins (signon_realm)")) |
+ !CreateIndexOnSignonRealm(&db_, "logins")) |
return false; |
meta_table_.SetVersionNumber(10); |
} |
+ case 10: { |
+ // rename is_zero_click -> skip_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 +372,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 +502,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_zero_click) VALUES " |
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
BindAddStatement(form, encrypted_password, &s); |
db_.set_error_callback(base::Bind(&AddCallback)); |
@@ -493,7 +521,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_zero_click) VALUES " |
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
BindAddStatement(form, encrypted_password, &s); |
if (s.Run()) { |
@@ -528,7 +556,7 @@ PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) { |
"display_name = ?, " |
"avatar_url = ?, " |
"federation_url = ?, " |
- "is_zero_click = ? " |
+ "skip_zero_click = ? " |
"WHERE origin_url = ? AND " |
"username_element = ? AND " |
"username_value = ? AND " |
@@ -551,7 +579,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_zero_click); |
// WHERE starts here. |
s.BindString(16, form.origin.spec()); |
@@ -672,7 +700,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_zero_click = (s.ColumnInt(COLUMN_SKIP_ZERO_CLICK) > 0); |
return ENCRYPTION_RESULT_SUCCESS; |
} |
@@ -688,7 +716,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_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 +814,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_zero_click FROM logins " |
"WHERE date_created >= ? AND date_created < ?" |
"ORDER BY origin_url")); |
s.BindInt64(0, begin.ToInternalValue()); |
@@ -817,7 +846,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_zero_click FROM logins " |
"WHERE date_synced >= ? AND date_synced < ?" |
"ORDER BY origin_url")); |
s.BindInt64(0, begin.ToInternalValue()); |
@@ -861,7 +890,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_zero_click FROM logins " |
"WHERE blacklisted_by_user == ? ORDER BY origin_url")); |
s.BindInt(0, blacklisted ? 1 : 0); |