Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Side by Side Diff: components/sync_driver/generic_change_processor.cc

Issue 1915983003: [Sync] Fix crash in GCP when adding encrypted entry that already exists. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/sync_driver/generic_change_processor.h" 5 #include "components/sync_driver/generic_change_processor.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 return error; 530 return error;
531 } 531 }
532 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { 532 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: {
533 syncer::SyncError error; 533 syncer::SyncError error;
534 error.Reset( 534 error.Reset(
535 FROM_HERE, error_prefix + "failed to set predecessor", type_); 535 FROM_HERE, error_prefix + "failed to set predecessor", type_);
536 error_handler()->OnSingleDataTypeUnrecoverableError(error); 536 error_handler()->OnSingleDataTypeUnrecoverableError(error);
537 LOG(ERROR) << "Create: Bad predecessor."; 537 LOG(ERROR) << "Create: Bad predecessor.";
538 return error; 538 return error;
539 } 539 }
540 case syncer::WriteNode::INIT_FAILED_DECRYPT_EXISTING_ENTRY: {
Nicolas Zea 2016/04/25 21:40:10 nit: no need for curly braces around return
541 return HandleDecryptionError(type_str, trans, sync_node);
542 }
540 default: { 543 default: {
541 syncer::SyncError error; 544 syncer::SyncError error;
542 error.Reset(FROM_HERE, error_prefix + "unknown error", type_); 545 error.Reset(FROM_HERE, error_prefix + "unknown error", type_);
543 error_handler()->OnSingleDataTypeUnrecoverableError(error); 546 error_handler()->OnSingleDataTypeUnrecoverableError(error);
544 LOG(ERROR) << "Create: Unknown error."; 547 LOG(ERROR) << "Create: Unknown error.";
545 return error; 548 return error;
546 } 549 }
547 } 550 }
548 } 551 }
549 sync_node->SetTitle(change.sync_data().GetTitle()); 552 sync_node->SetTitle(change.sync_data().GetTitle());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 error_handler()->OnSingleDataTypeUnrecoverableError(error); 591 error_handler()->OnSingleDataTypeUnrecoverableError(error);
589 LOG(ERROR) << "Update: bad entry."; 592 LOG(ERROR) << "Update: bad entry.";
590 return error; 593 return error;
591 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { 594 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) {
592 syncer::SyncError error; 595 syncer::SyncError error;
593 error.Reset(FROM_HERE, error_prefix + "deleted entry", type_); 596 error.Reset(FROM_HERE, error_prefix + "deleted entry", type_);
594 error_handler()->OnSingleDataTypeUnrecoverableError(error); 597 error_handler()->OnSingleDataTypeUnrecoverableError(error);
595 LOG(ERROR) << "Update: deleted entry."; 598 LOG(ERROR) << "Update: deleted entry.";
596 return error; 599 return error;
597 } else { 600 } else {
598 syncer::Cryptographer* crypto = trans.GetCryptographer(); 601 return HandleDecryptionError(type_str, trans, sync_node);
599 syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes());
600 const sync_pb::EntitySpecifics& specifics =
601 sync_node->GetEntitySpecifics();
602 CHECK(specifics.has_encrypted());
603 const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted());
604 const bool agreement = encrypted_types.Has(type_);
605 if (!agreement && !can_decrypt) {
606 syncer::SyncError error;
607 error.Reset(FROM_HERE,
608 "Failed to load encrypted entry, missing key and "
609 "nigori mismatch for " +
610 type_str + ".",
611 type_);
612 error_handler()->OnSingleDataTypeUnrecoverableError(error);
613 LOG(ERROR) << "Update: encr case 1.";
614 return error;
615 } else if (agreement && can_decrypt) {
616 syncer::SyncError error;
617 error.Reset(FROM_HERE,
618 "Failed to load encrypted entry, we have the key "
619 "and the nigori matches (?!) for " +
620 type_str + ".",
621 type_);
622 error_handler()->OnSingleDataTypeUnrecoverableError(error);
623 LOG(ERROR) << "Update: encr case 2.";
624 return error;
625 } else if (agreement) {
626 syncer::SyncError error;
627 error.Reset(FROM_HERE,
628 "Failed to load encrypted entry, missing key and "
629 "the nigori matches for " +
630 type_str + ".",
631 type_);
632 error_handler()->OnSingleDataTypeUnrecoverableError(error);
633 LOG(ERROR) << "Update: encr case 3.";
634 return error;
635 } else {
636 syncer::SyncError error;
637 error.Reset(FROM_HERE,
638 "Failed to load encrypted entry, we have the key"
639 "(?!) and nigori mismatch for " +
640 type_str + ".",
641 type_);
642 error_handler()->OnSingleDataTypeUnrecoverableError(error);
643 LOG(ERROR) << "Update: encr case 4.";
644 return error;
645 }
646 } 602 }
647 } 603 }
648 604
649 sync_node->SetTitle(change.sync_data().GetTitle()); 605 sync_node->SetTitle(change.sync_data().GetTitle());
650 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); 606 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node);
651 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); 607 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds();
652 SetAttachmentMetadata(attachment_ids, sync_node); 608 SetAttachmentMetadata(attachment_ids, sync_node);
653 609
654 // Return any newly added attachments. 610 // Return any newly added attachments.
655 new_attachments->insert(attachment_ids.begin(), attachment_ids.end()); 611 new_attachments->insert(attachment_ids.begin(), attachment_ids.end());
656 612
657 if (merge_result_.get()) { 613 if (merge_result_.get()) {
658 merge_result_->set_num_items_modified(merge_result_->num_items_modified() + 614 merge_result_->set_num_items_modified(merge_result_->num_items_modified() +
659 1); 615 1);
660 } 616 }
661 // TODO(sync): Support updating other parts of the sync node (title, 617 // TODO(sync): Support updating other parts of the sync node (title,
662 // successor, parent, etc.). 618 // successor, parent, etc.).
663 return syncer::SyncError(); 619 return syncer::SyncError();
664 } 620 }
665 621
622 syncer::SyncError GenericChangeProcessor::HandleDecryptionError(
623 const std::string& type_str,
624 const syncer::WriteTransaction& trans,
625 syncer::WriteNode* sync_node) {
626 syncer::Cryptographer* crypto = trans.GetCryptographer();
627 syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes());
628 const sync_pb::EntitySpecifics& specifics = sync_node->GetEntitySpecifics();
629 CHECK(specifics.has_encrypted());
630 const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted());
631 const bool agreement = encrypted_types.Has(type_);
632 if (!agreement && !can_decrypt) {
Nicolas Zea 2016/04/25 21:40:10 Honestly, I think we don't need this level of verb
pavely 2016/04/26 00:33:25 I removed this function and added simpler fragment
633 syncer::SyncError error;
634 error.Reset(FROM_HERE,
635 "Failed to load encrypted entry, missing key and "
636 "nigori mismatch for " +
637 type_str + ".",
638 type_);
639 error_handler()->OnSingleDataTypeUnrecoverableError(error);
640 LOG(ERROR) << "Update: encr case 1.";
641 return error;
642 } else if (agreement && can_decrypt) {
643 syncer::SyncError error;
644 error.Reset(FROM_HERE,
645 "Failed to load encrypted entry, we have the key "
646 "and the nigori matches (?!) for " +
647 type_str + ".",
648 type_);
649 error_handler()->OnSingleDataTypeUnrecoverableError(error);
650 LOG(ERROR) << "Update: encr case 2.";
651 return error;
652 } else if (agreement) {
653 syncer::SyncError error;
654 error.Reset(FROM_HERE,
655 "Failed to load encrypted entry, missing key and "
656 "the nigori matches for " +
657 type_str + ".",
658 type_);
659 error_handler()->OnSingleDataTypeUnrecoverableError(error);
660 LOG(ERROR) << "Update: encr case 3.";
661 return error;
662 } else {
663 syncer::SyncError error;
664 error.Reset(FROM_HERE,
665 "Failed to load encrypted entry, we have the key"
666 "(?!) and nigori mismatch for " +
667 type_str + ".",
668 type_);
669 error_handler()->OnSingleDataTypeUnrecoverableError(error);
670 LOG(ERROR) << "Update: encr case 4.";
671 return error;
672 }
673 }
674
666 bool GenericChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) { 675 bool GenericChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) {
667 DCHECK(CalledOnValidThread()); 676 DCHECK(CalledOnValidThread());
668 DCHECK(has_nodes); 677 DCHECK(has_nodes);
669 std::string type_name = syncer::ModelTypeToString(type_); 678 std::string type_name = syncer::ModelTypeToString(type_);
670 std::string err_str = "Server did not create the top-level " + type_name + 679 std::string err_str = "Server did not create the top-level " + type_name +
671 " node. We might be running against an out-of-date server."; 680 " node. We might be running against an out-of-date server.";
672 *has_nodes = false; 681 *has_nodes = false;
673 syncer::ReadTransaction trans(FROM_HERE, share_handle()); 682 syncer::ReadTransaction trans(FROM_HERE, share_handle());
674 syncer::ReadNode type_root_node(&trans); 683 syncer::ReadNode type_root_node(&trans);
675 if (type_root_node.InitTypeRoot(type_) != syncer::BaseNode::INIT_OK) { 684 if (type_root_node.InitTypeRoot(type_) != syncer::BaseNode::INIT_OK) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 } 721 }
713 } 722 }
714 723
715 scoped_ptr<syncer::AttachmentService> 724 scoped_ptr<syncer::AttachmentService>
716 GenericChangeProcessor::GetAttachmentService() const { 725 GenericChangeProcessor::GetAttachmentService() const {
717 return scoped_ptr<syncer::AttachmentService>( 726 return scoped_ptr<syncer::AttachmentService>(
718 new syncer::AttachmentServiceProxy(attachment_service_proxy_)); 727 new syncer::AttachmentServiceProxy(attachment_service_proxy_));
719 } 728 }
720 729
721 } // namespace sync_driver 730 } // namespace sync_driver
OLDNEW
« no previous file with comments | « components/sync_driver/generic_change_processor.h ('k') | sync/internal_api/public/write_node.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698