| Index: components/sync/core_impl/sync_manager_impl_unittest.cc
|
| diff --git a/components/sync/core_impl/sync_manager_impl_unittest.cc b/components/sync/core_impl/sync_manager_impl_unittest.cc
|
| index 3c0f595bfdfc1ae8b52905ef0f3ea2978250d215..d731e43164933753ec96c977a4dff341fa654e46 100644
|
| --- a/components/sync/core_impl/sync_manager_impl_unittest.cc
|
| +++ b/components/sync/core_impl/sync_manager_impl_unittest.cc
|
| @@ -222,6 +222,10 @@ int GetTotalNodeCount(UserShare* share, int64_t root) {
|
| return node.GetTotalNodeCount();
|
| }
|
|
|
| +const char kUrl[] = "example.com";
|
| +const char kPasswordValue[] = "secret";
|
| +const char kClientTag[] = "tag";
|
| +
|
| } // namespace
|
|
|
| class SyncApiTest : public testing::Test {
|
| @@ -518,21 +522,65 @@ TEST_F(SyncApiTest, WriteAndReadPassword) {
|
|
|
| WriteNode password_node(&trans);
|
| WriteNode::InitUniqueByCreationResult result =
|
| - password_node.InitUniqueByCreation(PASSWORDS, root_node, "foo");
|
| + password_node.InitUniqueByCreation(PASSWORDS, root_node, kClientTag);
|
| EXPECT_EQ(WriteNode::INIT_SUCCESS, result);
|
| sync_pb::PasswordSpecificsData data;
|
| - data.set_password_value("secret");
|
| - password_node.SetPasswordSpecifics(data);
|
| + data.set_password_value(kPasswordValue);
|
| + password_node.SetPasswordSpecifics(data, GetPassphraseType(&trans));
|
| }
|
| {
|
| ReadTransaction trans(FROM_HERE, user_share());
|
|
|
| ReadNode password_node(&trans);
|
| EXPECT_EQ(BaseNode::INIT_OK,
|
| - password_node.InitByClientTagLookup(PASSWORDS, "foo"));
|
| + password_node.InitByClientTagLookup(PASSWORDS, kClientTag));
|
| const sync_pb::PasswordSpecificsData& data =
|
| password_node.GetPasswordSpecifics();
|
| - EXPECT_EQ("secret", data.password_value());
|
| + EXPECT_EQ(kPasswordValue, data.password_value());
|
| + // Check that nothing has appeared in the unencrypted field.
|
| + EXPECT_FALSE(password_node.GetEntitySpecifics()
|
| + .password()
|
| + .has_unencrypted_metadata());
|
| + }
|
| +}
|
| +
|
| +TEST_F(SyncApiTest, WriteDoesntChangeUnencryptedPasswordMetadata) {
|
| + KeyParams params = {"localhost", "username", "passphrase"};
|
| + {
|
| + ReadTransaction trans(FROM_HERE, user_share());
|
| + trans.GetCryptographer()->AddKey(params);
|
| + }
|
| + {
|
| + WriteTransaction trans(FROM_HERE, user_share());
|
| + ReadNode root_node(&trans);
|
| + root_node.InitByRootLookup();
|
| +
|
| + WriteNode password_node(&trans);
|
| + WriteNode::InitUniqueByCreationResult result =
|
| + password_node.InitUniqueByCreation(PASSWORDS, root_node, kClientTag);
|
| + EXPECT_EQ(WriteNode::INIT_SUCCESS, result);
|
| + sync_pb::EntitySpecifics entity_specifics;
|
| + sync_pb::PasswordSpecifics* password_specifics =
|
| + entity_specifics.mutable_password();
|
| + password_specifics->mutable_unencrypted_metadata()->set_url(kUrl);
|
| + password_node.SetEntitySpecifics(entity_specifics);
|
| + sync_pb::PasswordSpecificsData data;
|
| + data.set_password_value(kPasswordValue);
|
| + password_node.SetPasswordSpecifics(data, GetPassphraseType(&trans));
|
| + }
|
| + {
|
| + ReadTransaction trans(FROM_HERE, user_share());
|
| +
|
| + ReadNode password_node(&trans);
|
| + EXPECT_EQ(BaseNode::INIT_OK,
|
| + password_node.InitByClientTagLookup(PASSWORDS, kClientTag));
|
| + const sync_pb::PasswordSpecificsData& data =
|
| + password_node.GetPasswordSpecifics();
|
| + EXPECT_EQ(kUrl, password_node.GetEntitySpecifics()
|
| + .password()
|
| + .unencrypted_metadata()
|
| + .url());
|
| + EXPECT_EQ(kPasswordValue, data.password_value());
|
| }
|
| }
|
|
|
| @@ -842,7 +890,8 @@ TEST_F(SyncApiTest, WriteNode_PasswordUniqueByCreationAfterDelete) {
|
| ASSERT_EQ(WriteNode::INIT_SUCCESS, result);
|
| sync_pb::PasswordSpecificsData password_specifics;
|
| password_specifics.set_password_value("secret");
|
| - password_node.SetPasswordSpecifics(password_specifics);
|
| + password_node.SetPasswordSpecifics(password_specifics,
|
| + GetPassphraseType(&trans));
|
| }
|
| // Delete password.
|
| {
|
| @@ -1457,7 +1506,8 @@ TEST_F(SyncManagerTest, SetPassphraseWithPassword) {
|
| EXPECT_EQ(WriteNode::INIT_SUCCESS, result);
|
| sync_pb::PasswordSpecificsData data;
|
| data.set_password_value("secret");
|
| - password_node.SetPasswordSpecifics(data);
|
| + password_node.SetPasswordSpecifics(data,
|
| + GetPassphraseTypeWithTrans(&trans));
|
| }
|
| EXPECT_CALL(encryption_observer_,
|
| OnBootstrapTokenUpdated(_, PASSPHRASE_BOOTSTRAP_TOKEN));
|
| @@ -2040,7 +2090,8 @@ TEST_F(SyncManagerTest, UpdatePasswordSetPasswordSpecifics) {
|
| WriteNode node(&trans);
|
| EXPECT_EQ(BaseNode::INIT_OK,
|
| node.InitByClientTagLookup(PASSWORDS, client_tag));
|
| - node.SetPasswordSpecifics(node.GetPasswordSpecifics());
|
| + node.SetPasswordSpecifics(node.GetPasswordSpecifics(),
|
| + GetPassphraseTypeWithTrans(&trans));
|
| }
|
| EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag));
|
|
|
| @@ -2055,7 +2106,7 @@ TEST_F(SyncManagerTest, UpdatePasswordSetPasswordSpecifics) {
|
| data.set_password_value("secret2");
|
| cryptographer->Encrypt(
|
| data, entity_specifics.mutable_password()->mutable_encrypted());
|
| - node.SetPasswordSpecifics(data);
|
| + node.SetPasswordSpecifics(data, GetPassphraseTypeWithTrans(&trans));
|
| const syncable::Entry* node_entry = node.GetEntry();
|
| EXPECT_TRUE(node_entry->GetIsUnsynced());
|
| }
|
| @@ -2064,51 +2115,70 @@ TEST_F(SyncManagerTest, UpdatePasswordSetPasswordSpecifics) {
|
| // Passwords have their own handling for encryption. Verify setting a new
|
| // passphrase updates the data.
|
| TEST_F(SyncManagerTest, UpdatePasswordNewPassphrase) {
|
| - std::string client_tag = "title";
|
| EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION));
|
| sync_pb::EntitySpecifics entity_specifics;
|
| {
|
| ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare());
|
| Cryptographer* cryptographer = trans.GetCryptographer();
|
| sync_pb::PasswordSpecificsData data;
|
| - data.set_password_value("secret");
|
| + data.set_password_value(kPasswordValue);
|
| + entity_specifics.mutable_password()
|
| + ->mutable_unencrypted_metadata()
|
| + ->set_url(kUrl);
|
| cryptographer->Encrypt(
|
| data, entity_specifics.mutable_password()->mutable_encrypted());
|
| }
|
| - MakeServerNode(sync_manager_.GetUserShare(), PASSWORDS, client_tag,
|
| - syncable::GenerateSyncableHash(PASSWORDS, client_tag),
|
| + EXPECT_TRUE(entity_specifics.password().has_unencrypted_metadata());
|
| + MakeServerNode(sync_manager_.GetUserShare(), PASSWORDS, kClientTag,
|
| + syncable::GenerateSyncableHash(PASSWORDS, kClientTag),
|
| entity_specifics);
|
| // New node shouldn't start off unsynced.
|
| - EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag));
|
| + EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, kClientTag));
|
|
|
| // Set a new passphrase. Should set is_unsynced.
|
| testing::Mock::VerifyAndClearExpectations(&encryption_observer_);
|
| +
|
| EXPECT_CALL(encryption_observer_,
|
| OnBootstrapTokenUpdated(_, PASSPHRASE_BOOTSTRAP_TOKEN));
|
| ExpectPassphraseAcceptance();
|
| SetCustomPassphraseAndCheck("new_passphrase");
|
| - EXPECT_TRUE(ResetUnsyncedEntry(PASSWORDS, client_tag));
|
| + {
|
| + ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare());
|
| + Cryptographer* cryptographer = trans.GetCryptographer();
|
| + EXPECT_TRUE(cryptographer->is_ready());
|
| + ReadNode password_node(&trans);
|
| + EXPECT_EQ(BaseNode::INIT_OK,
|
| + password_node.InitByClientTagLookup(PASSWORDS, kClientTag));
|
| + const sync_pb::PasswordSpecificsData& data =
|
| + password_node.GetPasswordSpecifics();
|
| + EXPECT_EQ(kPasswordValue, data.password_value());
|
| + EXPECT_FALSE(password_node.GetEntitySpecifics()
|
| + .password()
|
| + .has_unencrypted_metadata());
|
| + }
|
| + EXPECT_TRUE(ResetUnsyncedEntry(PASSWORDS, kClientTag));
|
| }
|
|
|
| // Passwords have their own handling for encryption. Verify it does not result
|
| // in unnecessary writes via ReencryptEverything.
|
| TEST_F(SyncManagerTest, UpdatePasswordReencryptEverything) {
|
| - std::string client_tag = "title";
|
| EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION));
|
| sync_pb::EntitySpecifics entity_specifics;
|
| {
|
| ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare());
|
| Cryptographer* cryptographer = trans.GetCryptographer();
|
| sync_pb::PasswordSpecificsData data;
|
| - data.set_password_value("secret");
|
| + data.set_password_value(kPasswordValue);
|
| cryptographer->Encrypt(
|
| data, entity_specifics.mutable_password()->mutable_encrypted());
|
| }
|
| - MakeServerNode(sync_manager_.GetUserShare(), PASSWORDS, client_tag,
|
| - syncable::GenerateSyncableHash(PASSWORDS, client_tag),
|
| + entity_specifics.mutable_password()->mutable_unencrypted_metadata()->set_url(
|
| + kUrl);
|
| + MakeServerNode(sync_manager_.GetUserShare(), PASSWORDS, kClientTag,
|
| + syncable::GenerateSyncableHash(PASSWORDS, kClientTag),
|
| entity_specifics);
|
| // New node shouldn't start off unsynced.
|
| - EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag));
|
| + EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, kClientTag));
|
|
|
| // Force a re-encrypt everything. Should not set is_unsynced.
|
| testing::Mock::VerifyAndClearExpectations(&encryption_observer_);
|
| @@ -2117,7 +2187,7 @@ TEST_F(SyncManagerTest, UpdatePasswordReencryptEverything) {
|
| EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false));
|
| sync_manager_.GetEncryptionHandler()->Init();
|
| PumpLoop();
|
| - EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag));
|
| + EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, kClientTag));
|
| }
|
|
|
| // Test that attempting to start up with corrupted password data triggers
|
|
|