| Index: sync/engine/syncer_unittest.cc
|
| diff --git a/sync/engine/syncer_unittest.cc b/sync/engine/syncer_unittest.cc
|
| index 7372f68c1872c29d27e0ccfa820f90220d426cfe..d82197f7e454f6aa1e836feae6f852c706cc734c 100644
|
| --- a/sync/engine/syncer_unittest.cc
|
| +++ b/sync/engine/syncer_unittest.cc
|
| @@ -50,6 +50,7 @@
|
| #include "sync/test/engine/test_syncable_utils.h"
|
| #include "sync/test/fake_encryptor.h"
|
| #include "sync/test/fake_extensions_activity_monitor.h"
|
| +#include "sync/test/fake_sync_encryption_handler.h"
|
| #include "sync/util/cryptographer.h"
|
| #include "sync/util/time.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -255,6 +256,7 @@ class SyncerTest : public testing::Test,
|
| child_id_ = ids_.MakeServer("child id");
|
| directory()->set_store_birthday(mock_server_->store_birthday());
|
| mock_server_->SetKeystoreKey("encryption_key");
|
| + GetCryptographer(&trans)->SetNigoriHandler(&fake_encryption_handler_);
|
| }
|
|
|
| virtual void TearDown() {
|
| @@ -531,7 +533,7 @@ class SyncerTest : public testing::Test,
|
| return GetField(metahandle, field, false);
|
| }
|
|
|
| - Cryptographer* cryptographer(syncable::BaseTransaction* trans) {
|
| + Cryptographer* GetCryptographer(syncable::BaseTransaction* trans) {
|
| return directory()->GetCryptographer(trans);
|
| }
|
|
|
| @@ -566,6 +568,8 @@ class SyncerTest : public testing::Test,
|
| ModelTypeSet enabled_datatypes_;
|
| TrafficRecorder traffic_recorder_;
|
|
|
| + FakeSyncEncryptionHandler fake_encryption_handler_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(SyncerTest);
|
| };
|
|
|
| @@ -723,12 +727,12 @@ TEST_F(SyncerTest, GetCommitIdsFiltersUnreadyEntries) {
|
| sync_pb::EntitySpecifics specifics;
|
| sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
|
| other_cryptographer.GetKeys(nigori->mutable_encrypted());
|
| - nigori->set_encrypt_bookmarks(true);
|
| + fake_encryption_handler_.EnableEncryptEverything();
|
| // Set up with an old passphrase, but have pending keys
|
| - cryptographer(&wtrans)->AddKey(key_params);
|
| - cryptographer(&wtrans)->Encrypt(bookmark,
|
| + GetCryptographer(&wtrans)->AddKey(key_params);
|
| + GetCryptographer(&wtrans)->Encrypt(bookmark,
|
| encrypted_bookmark.mutable_encrypted());
|
| - cryptographer(&wtrans)->Update(*nigori);
|
| + GetCryptographer(&wtrans)->SetPendingKeys(nigori->encrypted());
|
|
|
| // In conflict but properly encrypted.
|
| MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
|
| @@ -766,7 +770,7 @@ TEST_F(SyncerTest, GetCommitIdsFiltersUnreadyEntries) {
|
| VERIFY_ENTRY(4, false, true, false, 0, 10, 10, ids_, &rtrans);
|
|
|
| // Resolve the pending keys.
|
| - cryptographer(&rtrans)->DecryptPendingKeys(other_params);
|
| + GetCryptographer(&rtrans)->DecryptPendingKeys(other_params);
|
| }
|
| SyncShareNudge();
|
| {
|
| @@ -836,10 +840,9 @@ TEST_F(SyncerTest, EncryptionAwareConflicts) {
|
| sync_pb::EntitySpecifics specifics;
|
| sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
|
| other_cryptographer.GetKeys(nigori->mutable_encrypted());
|
| - nigori->set_encrypt_bookmarks(true);
|
| - nigori->set_encrypt_preferences(true);
|
| - cryptographer(&wtrans)->Update(*nigori);
|
| - EXPECT_TRUE(cryptographer(&wtrans)->has_pending_keys());
|
| + fake_encryption_handler_.EnableEncryptEverything();
|
| + GetCryptographer(&wtrans)->SetPendingKeys(nigori->encrypted());
|
| + EXPECT_TRUE(GetCryptographer(&wtrans)->has_pending_keys());
|
| }
|
|
|
| mock_server_->AddUpdateSpecifics(1, 0, "A", 10, 10, true, 0, bookmark);
|
| @@ -953,7 +956,7 @@ TEST_F(SyncerTest, EncryptionAwareConflicts) {
|
| {
|
| syncable::ReadTransaction rtrans(FROM_HERE, directory());
|
| // Resolve the pending keys.
|
| - cryptographer(&rtrans)->DecryptPendingKeys(key_params);
|
| + GetCryptographer(&rtrans)->DecryptPendingKeys(key_params);
|
| }
|
| // First cycle resolves conflicts, second cycle commits changes.
|
| SyncShareNudge();
|
| @@ -978,89 +981,6 @@ TEST_F(SyncerTest, EncryptionAwareConflicts) {
|
|
|
| #undef VERIFY_ENTRY
|
|
|
| -// Receive an old nigori with old encryption keys and encrypted types. We should
|
| -// not revert our default key or encrypted types.
|
| -TEST_F(SyncerTest, ReceiveOldNigori) {
|
| - KeyParams old_key = {"localhost", "dummy", "old"};
|
| - KeyParams current_key = {"localhost", "dummy", "cur"};
|
| -
|
| - // Data for testing encryption/decryption.
|
| - Cryptographer other_cryptographer(&encryptor_);
|
| - other_cryptographer.AddKey(old_key);
|
| - sync_pb::EntitySpecifics other_encrypted_specifics;
|
| - other_encrypted_specifics.mutable_bookmark()->set_title("title");
|
| - other_cryptographer.Encrypt(
|
| - other_encrypted_specifics,
|
| - other_encrypted_specifics.mutable_encrypted());
|
| - sync_pb::EntitySpecifics our_encrypted_specifics;
|
| - our_encrypted_specifics.mutable_bookmark()->set_title("title2");
|
| - ModelTypeSet encrypted_types = ModelTypeSet::All();
|
| -
|
| -
|
| - // Receive the initial nigori node.
|
| - sync_pb::EntitySpecifics initial_nigori_specifics;
|
| - initial_nigori_specifics.mutable_nigori();
|
| - mock_server_->SetNigori(1, 10, 10, initial_nigori_specifics);
|
| - SyncShareNudge();
|
| -
|
| - {
|
| - // Set up the current nigori node (containing both keys and encrypt
|
| - // everything).
|
| - WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
|
| - sync_pb::EntitySpecifics specifics;
|
| - sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
|
| - cryptographer(&wtrans)->AddKey(old_key);
|
| - cryptographer(&wtrans)->AddKey(current_key);
|
| - cryptographer(&wtrans)->Encrypt(
|
| - our_encrypted_specifics,
|
| - our_encrypted_specifics.mutable_encrypted());
|
| - cryptographer(&wtrans)->GetKeys(
|
| - nigori->mutable_encrypted());
|
| - cryptographer(&wtrans)->set_encrypt_everything();
|
| - cryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori);
|
| - MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG,
|
| - ModelTypeToRootTag(NIGORI));
|
| - ASSERT_TRUE(nigori_entry.good());
|
| - nigori_entry.Put(SPECIFICS, specifics);
|
| - nigori_entry.Put(IS_UNSYNCED, true);
|
| - EXPECT_FALSE(cryptographer(&wtrans)->has_pending_keys());
|
| - EXPECT_TRUE(encrypted_types.Equals(
|
| - cryptographer(&wtrans)->GetEncryptedTypes()));
|
| - }
|
| -
|
| - SyncShareNudge(); // Commit it.
|
| -
|
| - // Now set up the old nigori node and add it as a server update.
|
| - sync_pb::EntitySpecifics old_nigori_specifics;
|
| - sync_pb::NigoriSpecifics *old_nigori = old_nigori_specifics.mutable_nigori();
|
| - other_cryptographer.GetKeys(old_nigori->mutable_encrypted());
|
| - other_cryptographer.UpdateNigoriFromEncryptedTypes(old_nigori);
|
| - mock_server_->SetNigori(1, 30, 30, old_nigori_specifics);
|
| -
|
| - SyncShareNudge(); // Download the old nigori and apply it.
|
| -
|
| - {
|
| - // Ensure everything is committed and stable now. The cryptographer
|
| - // should be able to decrypt both sets of keys and still be encrypting with
|
| - // the newest, and the encrypted types should be the most recent
|
| - syncable::ReadTransaction trans(FROM_HERE, directory());
|
| - Entry nigori_entry(&trans, GET_BY_SERVER_TAG,
|
| - ModelTypeToRootTag(NIGORI));
|
| - ASSERT_TRUE(nigori_entry.good());
|
| - EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE));
|
| - EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED));
|
| - const sync_pb::NigoriSpecifics& nigori =
|
| - nigori_entry.Get(SPECIFICS).nigori();
|
| - EXPECT_TRUE(cryptographer(&trans)->CanDecryptUsingDefaultKey(
|
| - our_encrypted_specifics.encrypted()));
|
| - EXPECT_TRUE(cryptographer(&trans)->CanDecrypt(
|
| - other_encrypted_specifics.encrypted()));
|
| - EXPECT_TRUE(cryptographer(&trans)->CanDecrypt(
|
| - nigori.encrypted()));
|
| - EXPECT_TRUE(cryptographer(&trans)->encrypt_everything());
|
| - }
|
| -}
|
| -
|
| // Resolve a confict between two nigori's with different encrypted types,
|
| // and encryption keys (remote is explicit). Afterwards, the encrypted types
|
| // should be unioned and the cryptographer should have both keys and be
|
| @@ -1092,22 +1012,25 @@ TEST_F(SyncerTest, NigoriConflicts) {
|
| WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
|
| sync_pb::EntitySpecifics specifics;
|
| sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
|
| - cryptographer(&wtrans)->AddKey(local_key_params);
|
| - cryptographer(&wtrans)->Encrypt(
|
| + GetCryptographer(&wtrans)->AddKey(local_key_params);
|
| + GetCryptographer(&wtrans)->Encrypt(
|
| our_encrypted_specifics,
|
| our_encrypted_specifics.mutable_encrypted());
|
| - cryptographer(&wtrans)->GetKeys(
|
| + GetCryptographer(&wtrans)->GetKeys(
|
| nigori->mutable_encrypted());
|
| - cryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori);
|
| - cryptographer(&wtrans)->set_encrypt_everything();
|
| + fake_encryption_handler_.EnableEncryptEverything();
|
| + GetCryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(
|
| + nigori,
|
| + &wtrans);
|
| MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG,
|
| ModelTypeToRootTag(NIGORI));
|
| ASSERT_TRUE(nigori_entry.good());
|
| nigori_entry.Put(SPECIFICS, specifics);
|
| nigori_entry.Put(IS_UNSYNCED, true);
|
| - EXPECT_FALSE(cryptographer(&wtrans)->has_pending_keys());
|
| + EXPECT_FALSE(GetCryptographer(&wtrans)->has_pending_keys());
|
| EXPECT_TRUE(encrypted_types.Equals(
|
| - cryptographer(&wtrans)->GetEncryptedTypes()));
|
| + GetCryptographer(&wtrans)->GetEncryptedTypes()));
|
| + fake_encryption_handler_.set_cryptographer(GetCryptographer(&wtrans));
|
| }
|
| {
|
| sync_pb::EntitySpecifics specifics;
|
| @@ -1136,19 +1059,20 @@ TEST_F(SyncerTest, NigoriConflicts) {
|
| EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE));
|
| EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED));
|
| sync_pb::EntitySpecifics specifics = nigori_entry.Get(SPECIFICS);
|
| - EXPECT_TRUE(cryptographer(&wtrans)->has_pending_keys());
|
| + ASSERT_TRUE(GetCryptographer(&wtrans)->has_pending_keys());
|
| EXPECT_TRUE(encrypted_types.Equals(
|
| - cryptographer(&wtrans)->GetEncryptedTypes()));
|
| - EXPECT_TRUE(cryptographer(&wtrans)->encrypt_everything());
|
| + GetCryptographer(&wtrans)->GetEncryptedTypes()));
|
| + EXPECT_TRUE(fake_encryption_handler_.EncryptEverythingEnabled());
|
| EXPECT_TRUE(specifics.nigori().using_explicit_passphrase());
|
| // Supply the pending keys. Afterwards, we should be able to decrypt both
|
| // our own encrypted data and data encrypted by the other cryptographer,
|
| // but the key provided by the other cryptographer should be the default.
|
| - EXPECT_TRUE(cryptographer(&wtrans)->DecryptPendingKeys(other_key_params));
|
| - EXPECT_FALSE(cryptographer(&wtrans)->has_pending_keys());
|
| + EXPECT_TRUE(
|
| + GetCryptographer(&wtrans)->DecryptPendingKeys(other_key_params));
|
| + EXPECT_FALSE(GetCryptographer(&wtrans)->has_pending_keys());
|
| sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
|
| - cryptographer(&wtrans)->GetKeys(nigori->mutable_encrypted());
|
| - cryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori);
|
| + GetCryptographer(&wtrans)->GetKeys(nigori->mutable_encrypted());
|
| + GetCryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori, &wtrans);
|
| // Normally this would be written as part of SetPassphrase, but we do it
|
| // manually for the test.
|
| nigori_entry.Put(SPECIFICS, specifics);
|
| @@ -1166,13 +1090,13 @@ TEST_F(SyncerTest, NigoriConflicts) {
|
| ASSERT_TRUE(nigori_entry.good());
|
| EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE));
|
| EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED));
|
| - EXPECT_TRUE(cryptographer(&wtrans)->CanDecrypt(
|
| + EXPECT_TRUE(GetCryptographer(&wtrans)->CanDecrypt(
|
| our_encrypted_specifics.encrypted()));
|
| - EXPECT_FALSE(cryptographer(&wtrans)->
|
| + EXPECT_FALSE(GetCryptographer(&wtrans)->
|
| CanDecryptUsingDefaultKey(our_encrypted_specifics.encrypted()));
|
| - EXPECT_TRUE(cryptographer(&wtrans)->CanDecrypt(
|
| + EXPECT_TRUE(GetCryptographer(&wtrans)->CanDecrypt(
|
| other_encrypted_specifics.encrypted()));
|
| - EXPECT_TRUE(cryptographer(&wtrans)->
|
| + EXPECT_TRUE(GetCryptographer(&wtrans)->
|
| CanDecryptUsingDefaultKey(other_encrypted_specifics.encrypted()));
|
| EXPECT_TRUE(nigori_entry.Get(SPECIFICS).nigori().
|
| using_explicit_passphrase());
|
| @@ -4172,7 +4096,7 @@ TEST_F(SyncerTest, ConfigureFailsDontApplyUpdates) {
|
| TEST_F(SyncerTest, GetKeySuccess) {
|
| {
|
| syncable::ReadTransaction rtrans(FROM_HERE, directory());
|
| - EXPECT_FALSE(cryptographer(&rtrans)->HasKeystoreKey());
|
| + EXPECT_FALSE(GetCryptographer(&rtrans)->HasKeystoreKey());
|
| }
|
|
|
| SyncShareConfigure();
|
| @@ -4180,14 +4104,14 @@ TEST_F(SyncerTest, GetKeySuccess) {
|
| EXPECT_EQ(session_->status_controller().last_get_key_result(), SYNCER_OK);
|
| {
|
| syncable::ReadTransaction rtrans(FROM_HERE, directory());
|
| - EXPECT_TRUE(cryptographer(&rtrans)->HasKeystoreKey());
|
| + EXPECT_TRUE(GetCryptographer(&rtrans)->HasKeystoreKey());
|
| }
|
| }
|
|
|
| TEST_F(SyncerTest, GetKeyEmpty) {
|
| {
|
| syncable::ReadTransaction rtrans(FROM_HERE, directory());
|
| - EXPECT_FALSE(cryptographer(&rtrans)->HasKeystoreKey());
|
| + EXPECT_FALSE(GetCryptographer(&rtrans)->HasKeystoreKey());
|
| }
|
|
|
| mock_server_->SetKeystoreKey("");
|
| @@ -4196,7 +4120,7 @@ TEST_F(SyncerTest, GetKeyEmpty) {
|
| EXPECT_NE(session_->status_controller().last_get_key_result(), SYNCER_OK);
|
| {
|
| syncable::ReadTransaction rtrans(FROM_HERE, directory());
|
| - EXPECT_FALSE(cryptographer(&rtrans)->HasKeystoreKey());
|
| + EXPECT_FALSE(GetCryptographer(&rtrans)->HasKeystoreKey());
|
| }
|
| }
|
|
|
|
|