summaryrefslogtreecommitdiffstats
path: root/sync/internal_api
diff options
context:
space:
mode:
authorhaitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-26 20:35:35 +0000
committerhaitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-26 20:35:35 +0000
commit839ef2d812c2596732bbf8ec90b767a7176c960e (patch)
tree23d8e3953ddcd8320dd5f9974763a00a980603c3 /sync/internal_api
parent5d3dcf83e06a7fdd9417add32a01b20540fe0cea (diff)
downloadchromium_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.cc32
-rw-r--r--sync/internal_api/sync_backup_manager.h6
-rw-r--r--sync/internal_api/sync_backup_manager_unittest.cc10
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());
}