| 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/safe_browsing/download_protection_service.h" | 5 #include "chrome/browser/safe_browsing/download_protection_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/memory/weak_ptr.h" | 11 #include "base/memory/weak_ptr.h" |
| 12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 13 #include "base/sequenced_task_runner_helpers.h" | 13 #include "base/sequenced_task_runner_helpers.h" |
| 14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
| 15 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
| 16 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
| 17 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
| 18 #include "base/threading/sequenced_worker_pool.h" | 18 #include "base/threading/sequenced_worker_pool.h" |
| 19 #include "base/time.h" | 19 #include "base/time.h" |
| 20 #include "chrome/browser/safe_browsing/download_feedback_service.h" |
| 20 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 21 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 21 #include "chrome/browser/safe_browsing/sandboxed_zip_analyzer.h" | 22 #include "chrome/browser/safe_browsing/sandboxed_zip_analyzer.h" |
| 22 #include "chrome/browser/safe_browsing/signature_util.h" | 23 #include "chrome/browser/safe_browsing/signature_util.h" |
| 23 #include "chrome/browser/ui/browser.h" | 24 #include "chrome/browser/ui/browser.h" |
| 24 #include "chrome/browser/ui/browser_list.h" | 25 #include "chrome/browser/ui/browser_list.h" |
| 25 #include "chrome/common/safe_browsing/csd.pb.h" | 26 #include "chrome/common/safe_browsing/csd.pb.h" |
| 26 #include "chrome/common/safe_browsing/download_protection_util.h" | 27 #include "chrome/common/safe_browsing/download_protection_util.h" |
| 27 #include "chrome/common/safe_browsing/zip_analyzer.h" | 28 #include "chrome/common/safe_browsing/zip_analyzer.h" |
| 28 #include "chrome/common/url_constants.h" | 29 #include "chrome/common/url_constants.h" |
| 29 #include "content/public/browser/browser_thread.h" | 30 #include "content/public/browser/browser_thread.h" |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 reason = REASON_DOWNLOAD_UNCOMMON; | 415 reason = REASON_DOWNLOAD_UNCOMMON; |
| 415 result = UNCOMMON; | 416 result = UNCOMMON; |
| 416 } else if (response.verdict() == ClientDownloadResponse::DANGEROUS_HOST) { | 417 } else if (response.verdict() == ClientDownloadResponse::DANGEROUS_HOST) { |
| 417 reason = REASON_DOWNLOAD_DANGEROUS_HOST; | 418 reason = REASON_DOWNLOAD_DANGEROUS_HOST; |
| 418 result = DANGEROUS_HOST; | 419 result = DANGEROUS_HOST; |
| 419 } else { | 420 } else { |
| 420 LOG(DFATAL) << "Unknown download response verdict: " | 421 LOG(DFATAL) << "Unknown download response verdict: " |
| 421 << response.verdict(); | 422 << response.verdict(); |
| 422 reason = REASON_INVALID_RESPONSE_VERDICT; | 423 reason = REASON_INVALID_RESPONSE_VERDICT; |
| 423 } | 424 } |
| 425 DownloadFeedbackService::MaybeStorePingsForDownload( |
| 426 result, item_, client_download_request_data_, data); |
| 424 } | 427 } |
| 425 // We don't need the fetcher anymore. | 428 // We don't need the fetcher anymore. |
| 426 fetcher_.reset(); | 429 fetcher_.reset(); |
| 427 UMA_HISTOGRAM_TIMES("SBClientDownload.DownloadRequestDuration", | 430 UMA_HISTOGRAM_TIMES("SBClientDownload.DownloadRequestDuration", |
| 428 base::TimeTicks::Now() - start_time_); | 431 base::TimeTicks::Now() - start_time_); |
| 429 FinishRequest(result, reason); | 432 FinishRequest(result, reason); |
| 430 } | 433 } |
| 431 | 434 |
| 432 static bool IsSupportedDownload(const content::DownloadItem& item, | 435 static bool IsSupportedDownload(const content::DownloadItem& item, |
| 433 const base::FilePath& target_path, | 436 const base::FilePath& target_path, |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 } else { | 632 } else { |
| 630 resource->set_type(ClientDownloadRequest::DOWNLOAD_REDIRECT); | 633 resource->set_type(ClientDownloadRequest::DOWNLOAD_REDIRECT); |
| 631 } | 634 } |
| 632 // TODO(noelutz): fill out the remote IP addresses. | 635 // TODO(noelutz): fill out the remote IP addresses. |
| 633 } | 636 } |
| 634 request.set_user_initiated(item_->HasUserGesture()); | 637 request.set_user_initiated(item_->HasUserGesture()); |
| 635 request.set_file_basename( | 638 request.set_file_basename( |
| 636 item_->GetTargetFilePath().BaseName().AsUTF8Unsafe()); | 639 item_->GetTargetFilePath().BaseName().AsUTF8Unsafe()); |
| 637 request.set_download_type(type_); | 640 request.set_download_type(type_); |
| 638 request.mutable_signature()->CopyFrom(signature_info_); | 641 request.mutable_signature()->CopyFrom(signature_info_); |
| 639 std::string request_data; | 642 if (!request.SerializeToString(&client_download_request_data_)) { |
| 640 if (!request.SerializeToString(&request_data)) { | |
| 641 FinishRequest(SAFE, REASON_INVALID_REQUEST_PROTO); | 643 FinishRequest(SAFE, REASON_INVALID_REQUEST_PROTO); |
| 642 return; | 644 return; |
| 643 } | 645 } |
| 644 | 646 |
| 645 VLOG(2) << "Sending a request for URL: " | 647 VLOG(2) << "Sending a request for URL: " |
| 646 << item_->GetUrlChain().back(); | 648 << item_->GetUrlChain().back(); |
| 647 fetcher_.reset(net::URLFetcher::Create(0 /* ID used for testing */, | 649 fetcher_.reset(net::URLFetcher::Create(0 /* ID used for testing */, |
| 648 GURL(GetDownloadRequestUrl()), | 650 GURL(GetDownloadRequestUrl()), |
| 649 net::URLFetcher::POST, | 651 net::URLFetcher::POST, |
| 650 this)); | 652 this)); |
| 651 fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE); | 653 fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE); |
| 652 fetcher_->SetAutomaticallyRetryOn5xx(false); // Don't retry on error. | 654 fetcher_->SetAutomaticallyRetryOn5xx(false); // Don't retry on error. |
| 653 fetcher_->SetRequestContext(service_->request_context_getter_.get()); | 655 fetcher_->SetRequestContext(service_->request_context_getter_.get()); |
| 654 fetcher_->SetUploadData("application/octet-stream", request_data); | 656 fetcher_->SetUploadData("application/octet-stream", |
| 657 client_download_request_data_); |
| 655 fetcher_->Start(); | 658 fetcher_->Start(); |
| 656 } | 659 } |
| 657 | 660 |
| 658 void PostFinishTask(DownloadCheckResult result, | 661 void PostFinishTask(DownloadCheckResult result, |
| 659 DownloadCheckResultReason reason) { | 662 DownloadCheckResultReason reason) { |
| 660 BrowserThread::PostTask( | 663 BrowserThread::PostTask( |
| 661 BrowserThread::UI, | 664 BrowserThread::UI, |
| 662 FROM_HERE, | 665 FROM_HERE, |
| 663 base::Bind(&CheckClientDownloadRequest::FinishRequest, this, result, | 666 base::Bind(&CheckClientDownloadRequest::FinishRequest, this, result, |
| 664 reason)); | 667 reason)); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 // Will be NULL if the request has been canceled. | 750 // Will be NULL if the request has been canceled. |
| 748 DownloadProtectionService* service_; | 751 DownloadProtectionService* service_; |
| 749 scoped_refptr<SignatureUtil> signature_util_; | 752 scoped_refptr<SignatureUtil> signature_util_; |
| 750 scoped_refptr<SafeBrowsingDatabaseManager> database_manager_; | 753 scoped_refptr<SafeBrowsingDatabaseManager> database_manager_; |
| 751 const bool pingback_enabled_; | 754 const bool pingback_enabled_; |
| 752 scoped_ptr<net::URLFetcher> fetcher_; | 755 scoped_ptr<net::URLFetcher> fetcher_; |
| 753 scoped_refptr<SandboxedZipAnalyzer> analyzer_; | 756 scoped_refptr<SandboxedZipAnalyzer> analyzer_; |
| 754 base::TimeTicks zip_analysis_start_time_; | 757 base::TimeTicks zip_analysis_start_time_; |
| 755 bool finished_; | 758 bool finished_; |
| 756 ClientDownloadRequest::DownloadType type_; | 759 ClientDownloadRequest::DownloadType type_; |
| 760 std::string client_download_request_data_; |
| 757 base::WeakPtrFactory<CheckClientDownloadRequest> weakptr_factory_; | 761 base::WeakPtrFactory<CheckClientDownloadRequest> weakptr_factory_; |
| 758 base::TimeTicks start_time_; // Used for stats. | 762 base::TimeTicks start_time_; // Used for stats. |
| 759 | 763 |
| 760 DISALLOW_COPY_AND_ASSIGN(CheckClientDownloadRequest); | 764 DISALLOW_COPY_AND_ASSIGN(CheckClientDownloadRequest); |
| 761 }; | 765 }; |
| 762 | 766 |
| 763 DownloadProtectionService::DownloadProtectionService( | 767 DownloadProtectionService::DownloadProtectionService( |
| 764 SafeBrowsingService* sb_service, | 768 SafeBrowsingService* sb_service, |
| 765 net::URLRequestContextGetter* request_context_getter) | 769 net::URLRequestContextGetter* request_context_getter) |
| 766 : request_context_getter_(request_context_getter), | 770 : request_context_getter_(request_context_getter), |
| 767 enabled_(false), | 771 enabled_(false), |
| 768 signature_util_(new SignatureUtil()), | 772 signature_util_(new SignatureUtil()), |
| 769 download_request_timeout_ms_(kDownloadRequestTimeoutMs) { | 773 download_request_timeout_ms_(kDownloadRequestTimeoutMs), |
| 774 feedback_service_(new DownloadFeedbackService( |
| 775 request_context_getter, BrowserThread::GetBlockingPool())) { |
| 770 | 776 |
| 771 if (sb_service) { | 777 if (sb_service) { |
| 772 ui_manager_ = sb_service->ui_manager(); | 778 ui_manager_ = sb_service->ui_manager(); |
| 773 database_manager_ = sb_service->database_manager(); | 779 database_manager_ = sb_service->database_manager(); |
| 774 } | 780 } |
| 775 } | 781 } |
| 776 | 782 |
| 777 DownloadProtectionService::~DownloadProtectionService() { | 783 DownloadProtectionService::~DownloadProtectionService() { |
| 778 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 784 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 779 CancelPendingRequests(); | 785 CancelPendingRequests(); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 std::string url = kDownloadRequestUrl; | 952 std::string url = kDownloadRequestUrl; |
| 947 std::string api_key = google_apis::GetAPIKey(); | 953 std::string api_key = google_apis::GetAPIKey(); |
| 948 if (!api_key.empty()) { | 954 if (!api_key.empty()) { |
| 949 base::StringAppendF(&url, "?key=%s", | 955 base::StringAppendF(&url, "?key=%s", |
| 950 net::EscapeQueryParamValue(api_key, true).c_str()); | 956 net::EscapeQueryParamValue(api_key, true).c_str()); |
| 951 } | 957 } |
| 952 return url; | 958 return url; |
| 953 } | 959 } |
| 954 | 960 |
| 955 } // namespace safe_browsing | 961 } // namespace safe_browsing |
| OLD | NEW |