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 27cbcf71b8a28e8fe9a863fb6c989e88b0802bcb..99a138f871bea463ecdd17e7819a9a00fc53034f 100644 |
--- a/components/password_manager/core/browser/login_database.cc |
+++ b/components/password_manager/core/browser/login_database.cc |
@@ -28,7 +28,7 @@ using autofill::PasswordForm; |
namespace password_manager { |
-const int kCurrentVersionNumber = 11; |
+const int kCurrentVersionNumber = 12; |
static const int kCompatibleVersionNumber = 1; |
Pickle SerializeVector(const std::vector<base::string16>& vec) { |
@@ -76,6 +76,7 @@ enum LoginTableColumns { |
COLUMN_AVATAR_URL, |
COLUMN_FEDERATION_URL, |
COLUMN_SKIP_ZERO_CLICK, |
+ COLUMN_GENERATION_UPLOAD_STATUS, |
}; |
void BindAddStatement(const PasswordForm& form, |
@@ -111,6 +112,7 @@ void BindAddStatement(const PasswordForm& form, |
s->BindString(COLUMN_AVATAR_URL, form.avatar_url.spec()); |
s->BindString(COLUMN_FEDERATION_URL, form.federation_url.spec()); |
s->BindInt(COLUMN_SKIP_ZERO_CLICK, form.skip_zero_click); |
+ s->BindInt(COLUMN_GENERATION_UPLOAD_STATUS, form.generation_upload_status); |
} |
void AddCallback(int err, sql::Statement* /*stmt*/) { |
@@ -152,7 +154,9 @@ void LogTimesUsedStat(const std::string& name, int sample) { |
} |
// Creates a table named |table_name| using our current schema. |
-bool CreateNewTable(sql::Connection* db, const char* table_name) { |
+bool CreateNewTable(sql::Connection* db, |
+ const char* table_name, |
+ const char* extra_columns) { |
std::string query = base::StringPrintf( |
"CREATE TABLE %s (" |
"origin_url VARCHAR NOT NULL, " |
@@ -177,8 +181,10 @@ bool CreateNewTable(sql::Connection* db, const char* table_name) { |
"avatar_url VARCHAR," |
"federation_url VARCHAR," |
"skip_zero_click INTEGER," |
+ "%s" |
"UNIQUE (origin_url, username_element, username_value, " |
- "password_element, signon_realm))", table_name); |
+ "password_element, signon_realm))", |
+ table_name, extra_columns); |
return db->Execute(query.c_str()); |
} |
@@ -354,14 +360,19 @@ bool LoginDatabase::MigrateOldVersionsAsNeeded() { |
"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) || |
+ 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 11: |
+ if (!db_.Execute( |
+ "ALTER TABLE logins ADD COLUMN " |
+ "generation_upload_status INTEGER")) |
+ return false; |
+ meta_table_.SetVersionNumber(12); |
case kCurrentVersionNumber: |
// Already up to date |
return true; |
@@ -373,7 +384,7 @@ bool LoginDatabase::MigrateOldVersionsAsNeeded() { |
bool LoginDatabase::InitLoginsTable() { |
if (!db_.DoesTableExist("logins")) { |
- if (!CreateNewTable(&db_, "logins")) { |
+ if (!CreateNewTable(&db_, "logins", "generation_upload_status INTEGER,")) { |
NOTREACHED(); |
return false; |
} |
@@ -512,8 +523,8 @@ 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, skip_zero_click) VALUES " |
- "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
+ " federation_url, skip_zero_click, generation_upload_status) VALUES " |
+ "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
BindAddStatement(form, encrypted_password, &s); |
db_.set_error_callback(base::Bind(&AddCallback)); |
const bool success = s.Run(); |
@@ -531,8 +542,8 @@ 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, skip_zero_click) VALUES " |
- "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
+ " federation_url, skip_zero_click, generation_upload_status) VALUES " |
+ "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
BindAddStatement(form, encrypted_password, &s); |
if (s.Run()) { |
list.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form)); |
@@ -566,7 +577,8 @@ PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) { |
"display_name = ?, " |
"avatar_url = ?, " |
"federation_url = ?, " |
- "skip_zero_click = ? " |
+ "skip_zero_click = ?, " |
+ "generation_upload_status = ? " |
"WHERE origin_url = ? AND " |
"username_element = ? AND " |
"username_value = ? AND " |
@@ -590,13 +602,14 @@ PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) { |
s.BindString(13, form.avatar_url.spec()); |
s.BindString(14, form.federation_url.spec()); |
s.BindInt(15, form.skip_zero_click); |
+ s.BindInt(16, form.generation_upload_status); |
// WHERE starts here. |
- s.BindString(16, form.origin.spec()); |
- s.BindString16(17, form.username_element); |
- s.BindString16(18, form.username_value); |
- s.BindString16(19, form.password_element); |
- s.BindString(20, form.signon_realm); |
+ s.BindString(17, form.origin.spec()); |
+ s.BindString16(18, form.username_element); |
+ s.BindString16(19, form.username_value); |
+ s.BindString16(20, form.password_element); |
+ s.BindString(21, form.signon_realm); |
if (!s.Run()) |
return PasswordStoreChangeList(); |
@@ -711,6 +724,13 @@ LoginDatabase::EncryptionResult LoginDatabase::InitPasswordFormFromStatement( |
form->avatar_url = GURL(s.ColumnString(COLUMN_AVATAR_URL)); |
form->federation_url = GURL(s.ColumnString(COLUMN_FEDERATION_URL)); |
form->skip_zero_click = (s.ColumnInt(COLUMN_SKIP_ZERO_CLICK) > 0); |
+ int generation_upload_status_int = |
+ s.ColumnInt(COLUMN_GENERATION_UPLOAD_STATUS); |
+ DCHECK(generation_upload_status_int >= 0 && |
+ generation_upload_status_int <= PasswordForm::UNKNOWN_STATUS); |
+ form->generation_upload_status = |
+ static_cast<PasswordForm::GenerationUploadStatus>( |
+ generation_upload_status_int); |
return ENCRYPTION_RESULT_SUCCESS; |
} |
@@ -726,7 +746,7 @@ 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, skip_zero_click " |
+ "federation_url, skip_zero_click, generation_upload_status " |
"FROM logins WHERE signon_realm == ? "; |
sql::Statement s; |
const GURL signon_realm(form.signon_realm); |
@@ -824,7 +844,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, skip_zero_click FROM logins " |
+ "federation_url, skip_zero_click, generation_upload_status FROM logins " |
"WHERE date_created >= ? AND date_created < ?" |
"ORDER BY origin_url")); |
s.BindInt64(0, begin.ToInternalValue()); |
@@ -856,7 +876,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, skip_zero_click FROM logins " |
+ "federation_url, skip_zero_click, generation_upload_status FROM logins " |
"WHERE date_synced >= ? AND date_synced < ?" |
"ORDER BY origin_url")); |
s.BindInt64(0, begin.ToInternalValue()); |
@@ -900,7 +920,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, skip_zero_click FROM logins " |
+ "federation_url, skip_zero_click, generation_upload_status FROM logins " |
"WHERE blacklisted_by_user == ? ORDER BY origin_url")); |
s.BindInt(0, blacklisted ? 1 : 0); |