diff options
author | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-26 20:35:35 +0000 |
---|---|---|
committer | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-26 20:35:35 +0000 |
commit | 839ef2d812c2596732bbf8ec90b767a7176c960e (patch) | |
tree | 23d8e3953ddcd8320dd5f9974763a00a980603c3 /sync/internal_api | |
parent | 5d3dcf83e06a7fdd9417add32a01b20540fe0cea (diff) | |
download | chromium_src-839ef2d812c2596732bbf8ec90b767a7176c960e.zip chromium_src-839ef2d812c2596732bbf8ec90b767a7176c960e.tar.gz chromium_src-839ef2d812c2596732bbf8ec90b767a7176c960e.tar.bz2 |
Special handling of preference backup to not change local values in backup mode.
This is to avoid restoring hijacked preferences due to backup in case they get
into backup DB.
BUG=387997
Review URL: https://codereview.chromium.org/354453003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@280093 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/internal_api')
-rw-r--r-- | sync/internal_api/sync_backup_manager.cc | 32 | ||||
-rw-r--r-- | sync/internal_api/sync_backup_manager.h | 6 | ||||
-rw-r--r-- | sync/internal_api/sync_backup_manager_unittest.cc | 10 |
3 files changed, 43 insertions, 5 deletions
diff --git a/sync/internal_api/sync_backup_manager.cc b/sync/internal_api/sync_backup_manager.cc index 295f79a..d421dfd 100644 --- a/sync/internal_api/sync_backup_manager.cc +++ b/sync/internal_api/sync_backup_manager.cc @@ -4,6 +4,7 @@ #include "sync/internal_api/sync_backup_manager.h" +#include "sync/internal_api/public/read_node.h" #include "sync/internal_api/public/write_transaction.h" #include "sync/syncable/directory.h" #include "sync/syncable/mutable_entry.h" @@ -52,6 +53,9 @@ void SyncBackupManager::Init( GetUserShare()->directory->CollectMetaHandleCounts( &status_.num_entries_by_type, &status_.num_to_delete_entries_by_type); + + HideSyncPreference(PRIORITY_PREFERENCES); + HideSyncPreference(PREFERENCES); } void SyncBackupManager::SaveChanges() { @@ -113,6 +117,34 @@ void SyncBackupManager::NormalizeEntries() { unsynced_.clear(); } +void SyncBackupManager::HideSyncPreference(ModelType type) { + WriteTransaction trans(FROM_HERE, GetUserShare()); + ReadNode pref_root(&trans); + if (BaseNode::INIT_OK != pref_root.InitTypeRoot(type)) + return; + + std::vector<int64> pref_ids; + pref_root.GetChildIds(&pref_ids); + for (uint32 i = 0; i < pref_ids.size(); ++i) { + syncable::MutableEntry entry(trans.GetWrappedWriteTrans(), + syncable::GET_BY_HANDLE, pref_ids[i]); + if (entry.good()) { + // HACKY: Set IS_DEL to true to remove entry from parent-children + // index so that it's not returned when syncable service asks + // for sync data. Syncable service then creates entry for local + // model. Then the existing entry is undeleted and set to local value + // because it has the same unique client tag. + entry.PutIsDel(true); + entry.PutIsUnsynced(false); + + // Don't persist on disk so that if backup is aborted before receiving + // local preference values, values in sync DB are saved. + GetUserShare()->directory->UnmarkDirtyEntry( + trans.GetWrappedWriteTrans(), &entry); + } + } +} + void SyncBackupManager::RegisterDirectoryTypeDebugInfoObserver( syncer::TypeDebugInfoObserver* observer) {} diff --git a/sync/internal_api/sync_backup_manager.h b/sync/internal_api/sync_backup_manager.h index e6b9ca4..aba58e2 100644 --- a/sync/internal_api/sync_backup_manager.h +++ b/sync/internal_api/sync_backup_manager.h @@ -61,6 +61,12 @@ class SYNC_EXPORT_PRIVATE SyncBackupManager : public SyncRollbackManagerBase { // entries. void NormalizeEntries(); + // Manipulate preference nodes so that they'll be overwritten by local + // preference values during model association, i.e. local wins instead of + // server wins. This is for preventing backup from changing preferences in + // case backup DB has hijacked preferences. + void HideSyncPreference(ModelType pref_type); + // Handles of unsynced entries caused by local model changes. std::set<int64> unsynced_; diff --git a/sync/internal_api/sync_backup_manager_unittest.cc b/sync/internal_api/sync_backup_manager_unittest.cc index 5472c02..a130a63 100644 --- a/sync/internal_api/sync_backup_manager_unittest.cc +++ b/sync/internal_api/sync_backup_manager_unittest.cc @@ -41,7 +41,7 @@ class SyncBackupManagerTest : public testing::Test { NULL, NULL); manager->ConfigureSyncer( CONFIGURE_REASON_NEW_CLIENT, - ModelTypeSet(PREFERENCES), + ModelTypeSet(SEARCH_ENGINES), ModelTypeSet(), ModelTypeSet(), ModelTypeSet(), ModelSafeRoutingInfo(), base::Bind(&OnConfigDone, true), @@ -67,14 +67,14 @@ TEST_F(SyncBackupManagerTest, NormalizeAndPersist) { scoped_ptr<SyncBackupManager> manager(new SyncBackupManager); InitManager(manager.get()); - CreateEntry(manager->GetUserShare(), PREFERENCES, "test"); + CreateEntry(manager->GetUserShare(), SEARCH_ENGINES, "test"); { // New entry is local and unsynced at first. ReadTransaction trans(FROM_HERE, manager->GetUserShare()); ReadNode pref(&trans); EXPECT_EQ(BaseNode::INIT_OK, - pref.InitByClientTagLookup(PREFERENCES, "test")); + pref.InitByClientTagLookup(SEARCH_ENGINES, "test")); EXPECT_FALSE(pref.GetEntry()->GetId().ServerKnows()); EXPECT_TRUE(pref.GetEntry()->GetIsUnsynced()); } @@ -86,7 +86,7 @@ TEST_F(SyncBackupManagerTest, NormalizeAndPersist) { ReadTransaction trans(FROM_HERE, manager->GetUserShare()); ReadNode pref(&trans); EXPECT_EQ(BaseNode::INIT_OK, - pref.InitByClientTagLookup(PREFERENCES, "test")); + pref.InitByClientTagLookup(SEARCH_ENGINES, "test")); EXPECT_TRUE(pref.GetEntry()->GetId().ServerKnows()); EXPECT_FALSE(pref.GetEntry()->GetIsUnsynced()); } @@ -99,7 +99,7 @@ TEST_F(SyncBackupManagerTest, NormalizeAndPersist) { ReadTransaction trans(FROM_HERE, manager->GetUserShare()); ReadNode pref(&trans); EXPECT_EQ(BaseNode::INIT_OK, - pref.InitByClientTagLookup(PREFERENCES, "test")); + pref.InitByClientTagLookup(SEARCH_ENGINES, "test")); EXPECT_TRUE(pref.GetEntry()->GetId().ServerKnows()); EXPECT_FALSE(pref.GetEntry()->GetIsUnsynced()); } |