OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 return true; | 96 return true; |
97 } | 97 } |
98 | 98 |
99 if (generated_specifics.has_encrypted()) { | 99 if (generated_specifics.has_encrypted()) { |
100 // Overwrite the possibly sensitive non-specifics data. | 100 // Overwrite the possibly sensitive non-specifics data. |
101 entry->Put(syncable::NON_UNIQUE_NAME, kEncryptedString); | 101 entry->Put(syncable::NON_UNIQUE_NAME, kEncryptedString); |
102 // For bookmarks we actually put bogus data into the unencrypted specifics, | 102 // For bookmarks we actually put bogus data into the unencrypted specifics, |
103 // else the server will try to do it for us. | 103 // else the server will try to do it for us. |
104 if (type == syncable::BOOKMARKS) { | 104 if (type == syncable::BOOKMARKS) { |
105 sync_pb::BookmarkSpecifics* bookmark_specifics = | 105 sync_pb::BookmarkSpecifics* bookmark_specifics = |
106 generated_specifics.MutableExtension(sync_pb::bookmark); | 106 generated_specifics.mutable_bookmark(); |
107 if (!entry->Get(syncable::IS_DIR)) | 107 if (!entry->Get(syncable::IS_DIR)) |
108 bookmark_specifics->set_url(kEncryptedString); | 108 bookmark_specifics->set_url(kEncryptedString); |
109 bookmark_specifics->set_title(kEncryptedString); | 109 bookmark_specifics->set_title(kEncryptedString); |
110 } | 110 } |
111 } | 111 } |
112 entry->Put(syncable::SPECIFICS, generated_specifics); | 112 entry->Put(syncable::SPECIFICS, generated_specifics); |
113 DVLOG(1) << "Overwriting specifics of type " | 113 DVLOG(1) << "Overwriting specifics of type " |
114 << syncable::ModelTypeToString(type) | 114 << syncable::ModelTypeToString(type) |
115 << " and marking for syncing."; | 115 << " and marking for syncing."; |
116 syncable::MarkForSyncing(entry); | 116 syncable::MarkForSyncing(entry); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 // necessary, nothing needs to change. | 165 // necessary, nothing needs to change. |
166 if (title_matches && !encrypted_without_overwriting_name) { | 166 if (title_matches && !encrypted_without_overwriting_name) { |
167 DVLOG(2) << "Title matches, dropping change."; | 167 DVLOG(2) << "Title matches, dropping change."; |
168 return; | 168 return; |
169 } | 169 } |
170 | 170 |
171 // For bookmarks, we also set the title field in the specifics. | 171 // For bookmarks, we also set the title field in the specifics. |
172 // TODO(zea): refactor bookmarks to not need this functionality. | 172 // TODO(zea): refactor bookmarks to not need this functionality. |
173 if (GetModelType() == syncable::BOOKMARKS) { | 173 if (GetModelType() == syncable::BOOKMARKS) { |
174 sync_pb::EntitySpecifics specifics = GetEntitySpecifics(); | 174 sync_pb::EntitySpecifics specifics = GetEntitySpecifics(); |
175 specifics.MutableExtension(sync_pb::bookmark)->set_title(new_legal_title); | 175 specifics.mutable_bookmark()->set_title(new_legal_title); |
176 SetEntitySpecifics(specifics); // Does it's own encryption checking. | 176 SetEntitySpecifics(specifics); // Does it's own encryption checking. |
177 } | 177 } |
178 | 178 |
179 // For bookmarks, this has to happen after we set the title in the specifics, | 179 // For bookmarks, this has to happen after we set the title in the specifics, |
180 // because the presence of a title in the NON_UNIQUE_NAME is what controls | 180 // because the presence of a title in the NON_UNIQUE_NAME is what controls |
181 // the logic deciding whether this is an empty node or a legacy bookmark. | 181 // the logic deciding whether this is an empty node or a legacy bookmark. |
182 // See BaseNode::GetUnencryptedSpecific(..). | 182 // See BaseNode::GetUnencryptedSpecific(..). |
183 if (needs_encryption) | 183 if (needs_encryption) |
184 entry_->Put(syncable::NON_UNIQUE_NAME, kEncryptedString); | 184 entry_->Put(syncable::NON_UNIQUE_NAME, kEncryptedString); |
185 else | 185 else |
186 entry_->Put(syncable::NON_UNIQUE_NAME, new_legal_title); | 186 entry_->Put(syncable::NON_UNIQUE_NAME, new_legal_title); |
187 | 187 |
188 DVLOG(1) << "Overwriting title of type " | 188 DVLOG(1) << "Overwriting title of type " |
189 << syncable::ModelTypeToString(type) | 189 << syncable::ModelTypeToString(type) |
190 << " and marking for syncing."; | 190 << " and marking for syncing."; |
191 MarkForSyncing(); | 191 MarkForSyncing(); |
192 } | 192 } |
193 | 193 |
194 void WriteNode::SetURL(const GURL& url) { | 194 void WriteNode::SetURL(const GURL& url) { |
195 sync_pb::BookmarkSpecifics new_value = GetBookmarkSpecifics(); | 195 sync_pb::BookmarkSpecifics new_value = GetBookmarkSpecifics(); |
196 new_value.set_url(url.spec()); | 196 new_value.set_url(url.spec()); |
197 SetBookmarkSpecifics(new_value); | 197 SetBookmarkSpecifics(new_value); |
198 } | 198 } |
199 | 199 |
200 void WriteNode::SetAppSpecifics( | 200 void WriteNode::SetAppSpecifics( |
201 const sync_pb::AppSpecifics& new_value) { | 201 const sync_pb::AppSpecifics& new_value) { |
202 sync_pb::EntitySpecifics entity_specifics; | 202 sync_pb::EntitySpecifics entity_specifics; |
203 entity_specifics.MutableExtension(sync_pb::app)->CopyFrom(new_value); | 203 entity_specifics.mutable_app()->CopyFrom(new_value); |
204 SetEntitySpecifics(entity_specifics); | 204 SetEntitySpecifics(entity_specifics); |
205 } | 205 } |
206 | 206 |
207 void WriteNode::SetAutofillSpecifics( | 207 void WriteNode::SetAutofillSpecifics( |
208 const sync_pb::AutofillSpecifics& new_value) { | 208 const sync_pb::AutofillSpecifics& new_value) { |
209 sync_pb::EntitySpecifics entity_specifics; | 209 sync_pb::EntitySpecifics entity_specifics; |
210 entity_specifics.MutableExtension(sync_pb::autofill)->CopyFrom(new_value); | 210 entity_specifics.mutable_autofill()->CopyFrom(new_value); |
211 SetEntitySpecifics(entity_specifics); | 211 SetEntitySpecifics(entity_specifics); |
212 } | 212 } |
213 | 213 |
214 void WriteNode::SetAutofillProfileSpecifics( | 214 void WriteNode::SetAutofillProfileSpecifics( |
215 const sync_pb::AutofillProfileSpecifics& new_value) { | 215 const sync_pb::AutofillProfileSpecifics& new_value) { |
216 sync_pb::EntitySpecifics entity_specifics; | 216 sync_pb::EntitySpecifics entity_specifics; |
217 entity_specifics.MutableExtension(sync_pb::autofill_profile)-> | 217 entity_specifics.mutable_autofill_profile()-> |
218 CopyFrom(new_value); | 218 CopyFrom(new_value); |
219 SetEntitySpecifics(entity_specifics); | 219 SetEntitySpecifics(entity_specifics); |
220 } | 220 } |
221 | 221 |
222 void WriteNode::SetBookmarkSpecifics( | 222 void WriteNode::SetBookmarkSpecifics( |
223 const sync_pb::BookmarkSpecifics& new_value) { | 223 const sync_pb::BookmarkSpecifics& new_value) { |
224 sync_pb::EntitySpecifics entity_specifics; | 224 sync_pb::EntitySpecifics entity_specifics; |
225 entity_specifics.MutableExtension(sync_pb::bookmark)->CopyFrom(new_value); | 225 entity_specifics.mutable_bookmark()->CopyFrom(new_value); |
226 SetEntitySpecifics(entity_specifics); | 226 SetEntitySpecifics(entity_specifics); |
227 } | 227 } |
228 | 228 |
229 void WriteNode::SetNigoriSpecifics( | 229 void WriteNode::SetNigoriSpecifics( |
230 const sync_pb::NigoriSpecifics& new_value) { | 230 const sync_pb::NigoriSpecifics& new_value) { |
231 sync_pb::EntitySpecifics entity_specifics; | 231 sync_pb::EntitySpecifics entity_specifics; |
232 entity_specifics.MutableExtension(sync_pb::nigori)->CopyFrom(new_value); | 232 entity_specifics.mutable_nigori()->CopyFrom(new_value); |
233 SetEntitySpecifics(entity_specifics); | 233 SetEntitySpecifics(entity_specifics); |
234 } | 234 } |
235 | 235 |
236 void WriteNode::SetPasswordSpecifics( | 236 void WriteNode::SetPasswordSpecifics( |
237 const sync_pb::PasswordSpecificsData& data) { | 237 const sync_pb::PasswordSpecificsData& data) { |
238 DCHECK_EQ(syncable::PASSWORDS, GetModelType()); | 238 DCHECK_EQ(syncable::PASSWORDS, GetModelType()); |
239 | 239 |
240 Cryptographer* cryptographer = GetTransaction()->GetCryptographer(); | 240 Cryptographer* cryptographer = GetTransaction()->GetCryptographer(); |
241 | 241 |
242 // We have to do the idempotency check here (vs in UpdateEntryWithEncryption) | 242 // We have to do the idempotency check here (vs in UpdateEntryWithEncryption) |
243 // because Passwords have their encrypted data within the PasswordSpecifics, | 243 // because Passwords have their encrypted data within the PasswordSpecifics, |
244 // vs within the EntitySpecifics like all the other types. | 244 // vs within the EntitySpecifics like all the other types. |
245 const sync_pb::EntitySpecifics& old_specifics = GetEntry()->Get(SPECIFICS); | 245 const sync_pb::EntitySpecifics& old_specifics = GetEntry()->Get(SPECIFICS); |
246 sync_pb::EntitySpecifics entity_specifics; | 246 sync_pb::EntitySpecifics entity_specifics; |
247 // Copy over the old specifics if they exist. | 247 // Copy over the old specifics if they exist. |
248 if (syncable::GetModelTypeFromSpecifics(old_specifics) == | 248 if (syncable::GetModelTypeFromSpecifics(old_specifics) == |
249 syncable::PASSWORDS) { | 249 syncable::PASSWORDS) { |
250 entity_specifics.CopyFrom(old_specifics); | 250 entity_specifics.CopyFrom(old_specifics); |
251 } else { | 251 } else { |
252 syncable::AddDefaultExtensionValue(syncable::PASSWORDS, | 252 syncable::AddDefaultExtensionValue(syncable::PASSWORDS, |
253 &entity_specifics); | 253 &entity_specifics); |
254 } | 254 } |
255 sync_pb::PasswordSpecifics* password_specifics = | 255 sync_pb::PasswordSpecifics* password_specifics = |
256 entity_specifics.MutableExtension(sync_pb::password); | 256 entity_specifics.mutable_password(); |
257 // This will only update password_specifics if the underlying unencrypted blob | 257 // This will only update password_specifics if the underlying unencrypted blob |
258 // was different from |data| or was not encrypted with the proper passphrase. | 258 // was different from |data| or was not encrypted with the proper passphrase. |
259 if (!cryptographer->Encrypt(data, password_specifics->mutable_encrypted())) { | 259 if (!cryptographer->Encrypt(data, password_specifics->mutable_encrypted())) { |
260 NOTREACHED() << "Failed to encrypt password, possibly due to sync node " | 260 NOTREACHED() << "Failed to encrypt password, possibly due to sync node " |
261 << "corruption"; | 261 << "corruption"; |
262 return; | 262 return; |
263 } | 263 } |
264 SetEntitySpecifics(entity_specifics); | 264 SetEntitySpecifics(entity_specifics); |
265 } | 265 } |
266 | 266 |
267 void WriteNode::SetThemeSpecifics( | 267 void WriteNode::SetThemeSpecifics( |
268 const sync_pb::ThemeSpecifics& new_value) { | 268 const sync_pb::ThemeSpecifics& new_value) { |
269 sync_pb::EntitySpecifics entity_specifics; | 269 sync_pb::EntitySpecifics entity_specifics; |
270 entity_specifics.MutableExtension(sync_pb::theme)->CopyFrom(new_value); | 270 entity_specifics.mutable_theme()->CopyFrom(new_value); |
271 SetEntitySpecifics(entity_specifics); | 271 SetEntitySpecifics(entity_specifics); |
272 } | 272 } |
273 | 273 |
274 void WriteNode::SetSessionSpecifics( | 274 void WriteNode::SetSessionSpecifics( |
275 const sync_pb::SessionSpecifics& new_value) { | 275 const sync_pb::SessionSpecifics& new_value) { |
276 sync_pb::EntitySpecifics entity_specifics; | 276 sync_pb::EntitySpecifics entity_specifics; |
277 entity_specifics.MutableExtension(sync_pb::session)->CopyFrom(new_value); | 277 entity_specifics.mutable_session()->CopyFrom(new_value); |
278 SetEntitySpecifics(entity_specifics); | 278 SetEntitySpecifics(entity_specifics); |
279 } | 279 } |
280 | 280 |
281 void WriteNode::SetEntitySpecifics( | 281 void WriteNode::SetEntitySpecifics( |
282 const sync_pb::EntitySpecifics& new_value) { | 282 const sync_pb::EntitySpecifics& new_value) { |
283 syncable::ModelType new_specifics_type = | 283 syncable::ModelType new_specifics_type = |
284 syncable::GetModelTypeFromSpecifics(new_value); | 284 syncable::GetModelTypeFromSpecifics(new_value); |
285 DCHECK_NE(new_specifics_type, syncable::UNSPECIFIED); | 285 DCHECK_NE(new_specifics_type, syncable::UNSPECIFIED); |
286 DVLOG(1) << "Writing entity specifics of type " | 286 DVLOG(1) << "Writing entity specifics of type " |
287 << syncable::ModelTypeToString(new_specifics_type); | 287 << syncable::ModelTypeToString(new_specifics_type); |
(...skipping 29 matching lines...) Expand all Loading... |
317 DCHECK_EQ(new_specifics_type, GetModelType()); | 317 DCHECK_EQ(new_specifics_type, GetModelType()); |
318 } | 318 } |
319 | 319 |
320 void WriteNode::ResetFromSpecifics() { | 320 void WriteNode::ResetFromSpecifics() { |
321 SetEntitySpecifics(GetEntitySpecifics()); | 321 SetEntitySpecifics(GetEntitySpecifics()); |
322 } | 322 } |
323 | 323 |
324 void WriteNode::SetTypedUrlSpecifics( | 324 void WriteNode::SetTypedUrlSpecifics( |
325 const sync_pb::TypedUrlSpecifics& new_value) { | 325 const sync_pb::TypedUrlSpecifics& new_value) { |
326 sync_pb::EntitySpecifics entity_specifics; | 326 sync_pb::EntitySpecifics entity_specifics; |
327 entity_specifics.MutableExtension(sync_pb::typed_url)->CopyFrom(new_value); | 327 entity_specifics.mutable_typed_url()->CopyFrom(new_value); |
328 SetEntitySpecifics(entity_specifics); | 328 SetEntitySpecifics(entity_specifics); |
329 } | 329 } |
330 | 330 |
331 void WriteNode::SetExtensionSpecifics( | 331 void WriteNode::SetExtensionSpecifics( |
332 const sync_pb::ExtensionSpecifics& new_value) { | 332 const sync_pb::ExtensionSpecifics& new_value) { |
333 sync_pb::EntitySpecifics entity_specifics; | 333 sync_pb::EntitySpecifics entity_specifics; |
334 entity_specifics.MutableExtension(sync_pb::extension)->CopyFrom(new_value); | 334 entity_specifics.mutable_extension()->CopyFrom(new_value); |
335 SetEntitySpecifics(entity_specifics); | 335 SetEntitySpecifics(entity_specifics); |
336 } | 336 } |
337 | 337 |
338 void WriteNode::SetExternalId(int64 id) { | 338 void WriteNode::SetExternalId(int64 id) { |
339 if (GetExternalId() != id) | 339 if (GetExternalId() != id) |
340 entry_->Put(syncable::LOCAL_EXTERNAL_ID, id); | 340 entry_->Put(syncable::LOCAL_EXTERNAL_ID, id); |
341 } | 341 } |
342 | 342 |
343 WriteNode::WriteNode(WriteTransaction* transaction) | 343 WriteNode::WriteNode(WriteTransaction* transaction) |
344 : entry_(NULL), transaction_(transaction) { | 344 : entry_(NULL), transaction_(transaction) { |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 sync_pb::BookmarkSpecifics new_value = GetBookmarkSpecifics(); | 572 sync_pb::BookmarkSpecifics new_value = GetBookmarkSpecifics(); |
573 new_value.set_favicon(bytes.empty() ? NULL : &bytes[0], bytes.size()); | 573 new_value.set_favicon(bytes.empty() ? NULL : &bytes[0], bytes.size()); |
574 SetBookmarkSpecifics(new_value); | 574 SetBookmarkSpecifics(new_value); |
575 } | 575 } |
576 | 576 |
577 void WriteNode::MarkForSyncing() { | 577 void WriteNode::MarkForSyncing() { |
578 syncable::MarkForSyncing(entry_); | 578 syncable::MarkForSyncing(entry_); |
579 } | 579 } |
580 | 580 |
581 } // namespace sync_api | 581 } // namespace sync_api |
OLD | NEW |