OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync/internal_api/write_node.h" | 5 #include "chrome/browser/sync/internal_api/write_node.h" |
6 | 6 |
7 #include "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "chrome/browser/sync/engine/nigori_util.h" | 10 #include "chrome/browser/sync/engine/nigori_util.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 syncable::AddDefaultExtensionValue(type, &generated_specifics); | 70 syncable::AddDefaultExtensionValue(type, &generated_specifics); |
71 if (!cryptographer->Encrypt(new_specifics, | 71 if (!cryptographer->Encrypt(new_specifics, |
72 generated_specifics.mutable_encrypted())) { | 72 generated_specifics.mutable_encrypted())) { |
73 NOTREACHED() << "Could not encrypt data for node of type " | 73 NOTREACHED() << "Could not encrypt data for node of type " |
74 << syncable::ModelTypeToString(type); | 74 << syncable::ModelTypeToString(type); |
75 return false; | 75 return false; |
76 } | 76 } |
77 } | 77 } |
78 | 78 |
79 const sync_pb::EntitySpecifics& old_specifics = entry->Get(SPECIFICS); | 79 const sync_pb::EntitySpecifics& old_specifics = entry->Get(SPECIFICS); |
80 if (AreSpecificsEqual(cryptographer, old_specifics, generated_specifics)) { | 80 if (AreSpecificsEqual(cryptographer, old_specifics, generated_specifics) && |
| 81 (entry->Get(syncable::NON_UNIQUE_NAME) == kEncryptedString || |
| 82 !generated_specifics.has_encrypted())) { |
81 // Even if the data is the same but the old specifics are encrypted with an | 83 // Even if the data is the same but the old specifics are encrypted with an |
82 // old key, we should go ahead and re-encrypt with the new key. | 84 // old key, we should go ahead and re-encrypt with the new key. |
83 if ((!old_specifics.has_encrypted() && | 85 if ((!old_specifics.has_encrypted() && |
84 !generated_specifics.has_encrypted()) || | 86 !generated_specifics.has_encrypted()) || |
85 cryptographer->CanDecryptUsingDefaultKey(old_specifics.encrypted())) { | 87 cryptographer->CanDecryptUsingDefaultKey(old_specifics.encrypted())) { |
86 VLOG(2) << "Specifics of type " << syncable::ModelTypeToString(type) | 88 VLOG(2) << "Specifics of type " << syncable::ModelTypeToString(type) |
87 << " already match, dropping change."; | 89 << " already match, dropping change."; |
88 return true; | 90 return true; |
89 } | 91 } |
90 // TODO(zea): Add some way to keep track of how often we're reencrypting | 92 // TODO(zea): Add some way to keep track of how often we're reencrypting |
(...skipping 30 matching lines...) Expand all Loading... |
121 sync_pb::EntitySpecifics specifics = GetEntitySpecifics(); | 123 sync_pb::EntitySpecifics specifics = GetEntitySpecifics(); |
122 std::string server_legal_name; | 124 std::string server_legal_name; |
123 SyncAPINameToServerName(title, &server_legal_name); | 125 SyncAPINameToServerName(title, &server_legal_name); |
124 | 126 |
125 string old_name = entry_->Get(syncable::NON_UNIQUE_NAME); | 127 string old_name = entry_->Get(syncable::NON_UNIQUE_NAME); |
126 | 128 |
127 if (server_legal_name == old_name) | 129 if (server_legal_name == old_name) |
128 return; // Skip redundant changes. | 130 return; // Skip redundant changes. |
129 | 131 |
130 // Only set NON_UNIQUE_NAME to the title if we're not encrypted. | 132 // Only set NON_UNIQUE_NAME to the title if we're not encrypted. |
131 if (specifics.has_encrypted()) { | 133 Cryptographer* cryptographer = GetTransaction()->GetCryptographer(); |
| 134 if (cryptographer->GetEncryptedTypes().count(GetModelType()) > 0) { |
132 if (old_name != kEncryptedString) | 135 if (old_name != kEncryptedString) |
133 entry_->Put(syncable::NON_UNIQUE_NAME, kEncryptedString); | 136 entry_->Put(syncable::NON_UNIQUE_NAME, kEncryptedString); |
134 } else { | 137 } else { |
135 entry_->Put(syncable::NON_UNIQUE_NAME, server_legal_name); | 138 entry_->Put(syncable::NON_UNIQUE_NAME, server_legal_name); |
136 } | 139 } |
137 | 140 |
138 // For bookmarks, we also set the title field in the specifics. | 141 // For bookmarks, we also set the title field in the specifics. |
139 // TODO(zea): refactor bookmarks to not need this functionality. | 142 // TODO(zea): refactor bookmarks to not need this functionality. |
140 if (GetModelType() == syncable::BOOKMARKS) { | 143 if (GetModelType() == syncable::BOOKMARKS) { |
141 specifics.MutableExtension(sync_pb::bookmark)->set_title(server_legal_name); | 144 specifics.MutableExtension(sync_pb::bookmark)->set_title(server_legal_name); |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 sync_pb::BookmarkSpecifics new_value = GetBookmarkSpecifics(); | 529 sync_pb::BookmarkSpecifics new_value = GetBookmarkSpecifics(); |
527 new_value.set_favicon(bytes.empty() ? NULL : &bytes[0], bytes.size()); | 530 new_value.set_favicon(bytes.empty() ? NULL : &bytes[0], bytes.size()); |
528 SetBookmarkSpecifics(new_value); | 531 SetBookmarkSpecifics(new_value); |
529 } | 532 } |
530 | 533 |
531 void WriteNode::MarkForSyncing() { | 534 void WriteNode::MarkForSyncing() { |
532 syncable::MarkForSyncing(entry_); | 535 syncable::MarkForSyncing(entry_); |
533 } | 536 } |
534 | 537 |
535 } // namespace sync_api | 538 } // namespace sync_api |
OLD | NEW |