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

Side by Side Diff: chrome/browser/extensions/updater/extension_updater.cc

Issue 829583002: Validate hash_sha256 checksum on .crx update. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix histogram value. Created 5 years, 10 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 (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/extensions/updater/extension_updater.h" 5 #include "chrome/browser/extensions/updater/extension_updater.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 } // namespace 182 } // namespace
183 183
184 namespace extensions { 184 namespace extensions {
185 185
186 ExtensionUpdater::CheckParams::CheckParams() 186 ExtensionUpdater::CheckParams::CheckParams()
187 : install_immediately(false) {} 187 : install_immediately(false) {}
188 188
189 ExtensionUpdater::CheckParams::~CheckParams() {} 189 ExtensionUpdater::CheckParams::~CheckParams() {}
190 190
191 ExtensionUpdater::FetchedCRXFile::FetchedCRXFile( 191 ExtensionUpdater::FetchedCRXFile::FetchedCRXFile(
192 const std::string& i, 192 const CRXFileInfo& file,
193 const base::FilePath& p,
194 bool file_ownership_passed, 193 bool file_ownership_passed,
195 const std::set<int>& request_ids) 194 const std::set<int>& request_ids)
196 : extension_id(i), 195 : info(file),
197 path(p),
198 file_ownership_passed(file_ownership_passed), 196 file_ownership_passed(file_ownership_passed),
199 request_ids(request_ids) {} 197 request_ids(request_ids) {
198 }
200 199
201 ExtensionUpdater::FetchedCRXFile::FetchedCRXFile() 200 ExtensionUpdater::FetchedCRXFile::FetchedCRXFile()
202 : path(), file_ownership_passed(true) {} 201 : info(), file_ownership_passed(true) {
asargent_no_longer_on_chrome 2015/02/03 19:26:33 do you need to explicitly call the default constru
202 }
203 203
204 ExtensionUpdater::FetchedCRXFile::~FetchedCRXFile() {} 204 ExtensionUpdater::FetchedCRXFile::~FetchedCRXFile() {}
205 205
206 ExtensionUpdater::InProgressCheck::InProgressCheck() 206 ExtensionUpdater::InProgressCheck::InProgressCheck()
207 : install_immediately(false) {} 207 : install_immediately(false) {}
208 208
209 ExtensionUpdater::InProgressCheck::~InProgressCheck() {} 209 ExtensionUpdater::InProgressCheck::~InProgressCheck() {}
210 210
211 struct ExtensionUpdater::ThrottleInfo { 211 struct ExtensionUpdater::ThrottleInfo {
212 ThrottleInfo() 212 ThrottleInfo()
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 584
585 // This method is called if no updates were found. However a previous update 585 // This method is called if no updates were found. However a previous update
586 // check might have queued an update for this extension already. If a 586 // check might have queued an update for this extension already. If a
587 // current update check has |install_immediately| set the previously 587 // current update check has |install_immediately| set the previously
588 // queued update should be installed now. 588 // queued update should be installed now.
589 if (install_immediately && service_->GetPendingExtensionUpdate(id)) 589 if (install_immediately && service_->GetPendingExtensionUpdate(id))
590 service_->FinishDelayedInstallation(id); 590 service_->FinishDelayedInstallation(id);
591 } 591 }
592 592
593 void ExtensionUpdater::OnExtensionDownloadFinished( 593 void ExtensionUpdater::OnExtensionDownloadFinished(
594 const std::string& id, 594 const CRXFileInfo& file,
595 const base::FilePath& path,
596 bool file_ownership_passed, 595 bool file_ownership_passed,
597 const GURL& download_url, 596 const GURL& download_url,
598 const std::string& version, 597 const std::string& version,
599 const PingResult& ping, 598 const PingResult& ping,
600 const std::set<int>& request_ids) { 599 const std::set<int>& request_ids) {
601 DCHECK(alive_); 600 DCHECK(alive_);
602 UpdatePingData(id, ping); 601 UpdatePingData(file.extension_id, ping);
603 602
604 VLOG(2) << download_url << " written to " << path.value(); 603 VLOG(2) << download_url << " written to " << file.path.value();
605 604
606 FetchedCRXFile fetched(id, path, file_ownership_passed, request_ids); 605 FetchedCRXFile fetched(file, file_ownership_passed, request_ids);
607 fetched_crx_files_.push(fetched); 606 fetched_crx_files_.push(fetched);
608 607
609 // MaybeInstallCRXFile() removes extensions from |in_progress_ids_| after 608 // MaybeInstallCRXFile() removes extensions from |in_progress_ids_| after
610 // starting the crx installer. 609 // starting the crx installer.
611 MaybeInstallCRXFile(); 610 MaybeInstallCRXFile();
612 } 611 }
613 612
614 bool ExtensionUpdater::GetPingDataForExtension( 613 bool ExtensionUpdater::GetPingDataForExtension(
615 const std::string& id, 614 const std::string& id,
616 ManifestFetchData::PingData* ping_data) { 615 ManifestFetchData::PingData* ping_data) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 674
676 void ExtensionUpdater::MaybeInstallCRXFile() { 675 void ExtensionUpdater::MaybeInstallCRXFile() {
677 if (crx_install_is_running_ || fetched_crx_files_.empty()) 676 if (crx_install_is_running_ || fetched_crx_files_.empty())
678 return; 677 return;
679 678
680 std::set<int> request_ids; 679 std::set<int> request_ids;
681 680
682 while (!fetched_crx_files_.empty() && !crx_install_is_running_) { 681 while (!fetched_crx_files_.empty() && !crx_install_is_running_) {
683 const FetchedCRXFile& crx_file = fetched_crx_files_.top(); 682 const FetchedCRXFile& crx_file = fetched_crx_files_.top();
684 683
685 VLOG(2) << "updating " << crx_file.extension_id 684 VLOG(2) << "updating " << crx_file.info.extension_id
686 << " with " << crx_file.path.value(); 685 << " with " << crx_file.info.path.value();
687 686
688 // The ExtensionService is now responsible for cleaning up the temp file 687 // The ExtensionService is now responsible for cleaning up the temp file
689 // at |crx_file.path|. 688 // at |crx_file.info.path|.
690 CrxInstaller* installer = NULL; 689 CrxInstaller* installer = NULL;
691 if (service_->UpdateExtension(crx_file.extension_id, 690 if (service_->UpdateExtension(crx_file.info,
692 crx_file.path,
693 crx_file.file_ownership_passed, 691 crx_file.file_ownership_passed,
694 &installer)) { 692 &installer)) {
695 crx_install_is_running_ = true; 693 crx_install_is_running_ = true;
696 current_crx_file_ = crx_file; 694 current_crx_file_ = crx_file;
697 695
698 for (std::set<int>::const_iterator it = crx_file.request_ids.begin(); 696 for (std::set<int>::const_iterator it = crx_file.request_ids.begin();
699 it != crx_file.request_ids.end(); ++it) { 697 it != crx_file.request_ids.end(); ++it) {
700 InProgressCheck& request = requests_in_progress_[*it]; 698 InProgressCheck& request = requests_in_progress_[*it];
701 if (request.install_immediately) { 699 if (request.install_immediately) {
702 installer->set_install_immediately(true); 700 installer->set_install_immediately(true);
703 break; 701 break;
704 } 702 }
705 } 703 }
706 704
707 // Source parameter ensures that we only see the completion event for the 705 // Source parameter ensures that we only see the completion event for the
708 // the installer we started. 706 // the installer we started.
709 registrar_.Add(this, 707 registrar_.Add(this,
710 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 708 extensions::NOTIFICATION_CRX_INSTALLER_DONE,
711 content::Source<CrxInstaller>(installer)); 709 content::Source<CrxInstaller>(installer));
712 } else { 710 } else {
713 for (std::set<int>::const_iterator it = crx_file.request_ids.begin(); 711 for (std::set<int>::const_iterator it = crx_file.request_ids.begin();
714 it != crx_file.request_ids.end(); ++it) { 712 it != crx_file.request_ids.end(); ++it) {
715 InProgressCheck& request = requests_in_progress_[*it]; 713 InProgressCheck& request = requests_in_progress_[*it];
716 request.in_progress_ids_.remove(crx_file.extension_id); 714 request.in_progress_ids_.remove(crx_file.info.extension_id);
717 } 715 }
718 request_ids.insert(crx_file.request_ids.begin(), 716 request_ids.insert(crx_file.request_ids.begin(),
719 crx_file.request_ids.end()); 717 crx_file.request_ids.end());
720 } 718 }
721 fetched_crx_files_.pop(); 719 fetched_crx_files_.pop();
722 } 720 }
723 721
724 for (std::set<int>::const_iterator it = request_ids.begin(); 722 for (std::set<int>::const_iterator it = request_ids.begin();
725 it != request_ids.end(); ++it) { 723 it != request_ids.end(); ++it) {
726 NotifyIfFinished(*it); 724 NotifyIfFinished(*it);
727 } 725 }
728 } 726 }
729 727
730 void ExtensionUpdater::Observe(int type, 728 void ExtensionUpdater::Observe(int type,
731 const content::NotificationSource& source, 729 const content::NotificationSource& source,
732 const content::NotificationDetails& details) { 730 const content::NotificationDetails& details) {
733 DCHECK_EQ(type, extensions::NOTIFICATION_CRX_INSTALLER_DONE); 731 DCHECK_EQ(type, extensions::NOTIFICATION_CRX_INSTALLER_DONE);
734 732
735 registrar_.Remove(this, extensions::NOTIFICATION_CRX_INSTALLER_DONE, source); 733 registrar_.Remove(this, extensions::NOTIFICATION_CRX_INSTALLER_DONE, source);
736 crx_install_is_running_ = false; 734 crx_install_is_running_ = false;
737 735
738 const FetchedCRXFile& crx_file = current_crx_file_; 736 const FetchedCRXFile& crx_file = current_crx_file_;
739 for (std::set<int>::const_iterator it = crx_file.request_ids.begin(); 737 for (std::set<int>::const_iterator it = crx_file.request_ids.begin();
740 it != crx_file.request_ids.end(); ++it) { 738 it != crx_file.request_ids.end(); ++it) {
741 InProgressCheck& request = requests_in_progress_[*it]; 739 InProgressCheck& request = requests_in_progress_[*it];
742 request.in_progress_ids_.remove(crx_file.extension_id); 740 request.in_progress_ids_.remove(crx_file.info.extension_id);
743 NotifyIfFinished(*it); 741 NotifyIfFinished(*it);
744 } 742 }
745 743
746 // If any files are available to update, start one. 744 // If any files are available to update, start one.
747 MaybeInstallCRXFile(); 745 MaybeInstallCRXFile();
748 } 746 }
749 747
750 void ExtensionUpdater::OnExtensionWillBeInstalled( 748 void ExtensionUpdater::OnExtensionWillBeInstalled(
751 content::BrowserContext* browser_context, 749 content::BrowserContext* browser_context,
752 const Extension* extension, 750 const Extension* extension,
(...skipping 15 matching lines...) Expand all
768 const InProgressCheck& request = requests_in_progress_[request_id]; 766 const InProgressCheck& request = requests_in_progress_[request_id];
769 if (request.in_progress_ids_.empty()) { 767 if (request.in_progress_ids_.empty()) {
770 VLOG(2) << "Finished update check " << request_id; 768 VLOG(2) << "Finished update check " << request_id;
771 if (!request.callback.is_null()) 769 if (!request.callback.is_null())
772 request.callback.Run(); 770 request.callback.Run();
773 requests_in_progress_.erase(request_id); 771 requests_in_progress_.erase(request_id);
774 } 772 }
775 } 773 }
776 774
777 } // namespace extensions 775 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698