| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/chrome_cleaner/chrome_cleaner_fetcher_win
.h" | 5 #include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_fetcher_win
.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 13 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 14 #include "base/files/scoped_temp_dir.h" | 14 #include "base/files/scoped_temp_dir.h" |
| 15 #include "base/guid.h" | 15 #include "base/guid.h" |
| 16 #include "base/location.h" | 16 #include "base/location.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/macros.h" | 18 #include "base/macros.h" |
| 19 #include "base/memory/ptr_util.h" | 19 #include "base/memory/ptr_util.h" |
| 20 #include "base/memory/ref_counted.h" | 20 #include "base/memory/ref_counted.h" |
| 21 #include "base/metrics/histogram_macros.h" |
| 21 #include "base/sequenced_task_runner.h" | 22 #include "base/sequenced_task_runner.h" |
| 22 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
| 23 #include "base/strings/utf_string_conversions.h" | 24 #include "base/strings/utf_string_conversions.h" |
| 24 #include "base/task_runner_util.h" | 25 #include "base/task_runner_util.h" |
| 25 #include "base/task_scheduler/post_task.h" | 26 #include "base/task_scheduler/post_task.h" |
| 26 #include "chrome/browser/browser_process.h" | 27 #include "chrome/browser/browser_process.h" |
| 27 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h" | 28 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h" |
| 28 #include "chrome/install_static/install_details.h" | 29 #include "chrome/install_static/install_details.h" |
| 29 #include "chrome/install_static/install_modes.h" | 30 #include "chrome/install_static/install_modes.h" |
| 30 #include "components/data_use_measurement/core/data_use_user_data.h" | 31 #include "components/data_use_measurement/core/data_use_user_data.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 45 // Create a temporary directory name prefix like "ChromeCleaner_4_", where | 46 // Create a temporary directory name prefix like "ChromeCleaner_4_", where |
| 46 // "Chrome" is the product name and the 4 refers to the install mode of the | 47 // "Chrome" is the product name and the 4 refers to the install mode of the |
| 47 // browser. | 48 // browser. |
| 48 int install_mode = install_static::InstallDetails::Get().install_mode_index(); | 49 int install_mode = install_static::InstallDetails::Get().install_mode_index(); |
| 49 return base::StringPrintf( | 50 return base::StringPrintf( |
| 50 FILE_PATH_LITERAL("%" PRFilePath "%" PRFilePath "_%d_"), | 51 FILE_PATH_LITERAL("%" PRFilePath "%" PRFilePath "_%d_"), |
| 51 install_static::kProductPathName, FILE_PATH_LITERAL("Cleaner"), | 52 install_static::kProductPathName, FILE_PATH_LITERAL("Cleaner"), |
| 52 install_mode); | 53 install_mode); |
| 53 } | 54 } |
| 54 | 55 |
| 56 // These values are used to send UMA information and are replicated in the |
| 57 // histograms.xml file, so the order MUST NOT CHANGE. |
| 58 enum CleanerDownloadStatusHistogramValue { |
| 59 CLEANER_DOWNLOAD_STATUS_SUCCEEDED = 0, |
| 60 CLEANER_DOWNLOAD_STATUS_OTHER_FAILURE = 1, |
| 61 CLEANER_DOWNLOAD_STATUS_NOT_FOUND_ON_SERVER = 2, |
| 62 CLEANER_DOWNLOAD_STATUS_FAILED_TO_CREATE_TEMP_DIR = 3, |
| 63 |
| 64 CLEANER_DOWNLOAD_STATUS_MAX, |
| 65 }; |
| 66 |
| 67 void RecordCleanerDownloadStatusHistogram( |
| 68 CleanerDownloadStatusHistogramValue value) { |
| 69 UMA_HISTOGRAM_ENUMERATION("SoftwareReporter.Cleaner.DownloadStatus", value, |
| 70 CLEANER_DOWNLOAD_STATUS_MAX); |
| 71 } |
| 72 |
| 55 // Class that will attempt to download the Chrome Cleaner executable and call a | 73 // Class that will attempt to download the Chrome Cleaner executable and call a |
| 56 // given callback when done. Instances of ChromeCleanerFetcher own themselves | 74 // given callback when done. Instances of ChromeCleanerFetcher own themselves |
| 57 // and will self-delete if they encounter an error or when the network request | 75 // and will self-delete if they encounter an error or when the network request |
| 58 // has completed. | 76 // has completed. |
| 59 class ChromeCleanerFetcher : public net::URLFetcherDelegate { | 77 class ChromeCleanerFetcher : public net::URLFetcherDelegate { |
| 60 public: | 78 public: |
| 61 explicit ChromeCleanerFetcher(ChromeCleanerFetchedCallback fetched_callback); | 79 explicit ChromeCleanerFetcher(ChromeCleanerFetchedCallback fetched_callback); |
| 62 | 80 |
| 63 protected: | 81 protected: |
| 64 ~ChromeCleanerFetcher() override; | 82 ~ChromeCleanerFetcher() override; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 134 |
| 117 bool ChromeCleanerFetcher::CreateTemporaryDirectory() { | 135 bool ChromeCleanerFetcher::CreateTemporaryDirectory() { |
| 118 base::FilePath temp_dir; | 136 base::FilePath temp_dir; |
| 119 return base::CreateNewTempDirectory(CleanerTempDirectoryPrefix(), | 137 return base::CreateNewTempDirectory(CleanerTempDirectoryPrefix(), |
| 120 &temp_dir) && | 138 &temp_dir) && |
| 121 scoped_temp_dir_->Set(temp_dir); | 139 scoped_temp_dir_->Set(temp_dir); |
| 122 } | 140 } |
| 123 | 141 |
| 124 void ChromeCleanerFetcher::OnTemporaryDirectoryCreated(bool success) { | 142 void ChromeCleanerFetcher::OnTemporaryDirectoryCreated(bool success) { |
| 125 if (!success) { | 143 if (!success) { |
| 144 RecordCleanerDownloadStatusHistogram( |
| 145 CLEANER_DOWNLOAD_STATUS_FAILED_TO_CREATE_TEMP_DIR); |
| 126 PostCallbackAndDeleteSelf( | 146 PostCallbackAndDeleteSelf( |
| 127 base::FilePath(), | 147 base::FilePath(), |
| 128 ChromeCleanerFetchStatus::kFailedToCreateTemporaryDirectory); | 148 ChromeCleanerFetchStatus::kFailedToCreateTemporaryDirectory); |
| 129 return; | 149 return; |
| 130 } | 150 } |
| 131 | 151 |
| 132 DCHECK(!scoped_temp_dir_->GetPath().empty()); | 152 DCHECK(!scoped_temp_dir_->GetPath().empty()); |
| 133 | 153 |
| 134 temp_file_ = scoped_temp_dir_->GetPath().Append( | 154 temp_file_ = scoped_temp_dir_->GetPath().Append( |
| 135 base::ASCIIToUTF16(base::GenerateGUID()) + L".tmp"); | 155 base::ASCIIToUTF16(base::GenerateGUID()) + L".tmp"); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 159 delete this; | 179 delete this; |
| 160 } | 180 } |
| 161 | 181 |
| 162 void ChromeCleanerFetcher::OnURLFetchComplete(const net::URLFetcher* source) { | 182 void ChromeCleanerFetcher::OnURLFetchComplete(const net::URLFetcher* source) { |
| 163 // Take ownership of the fetcher in this scope (source == url_fetcher_). | 183 // Take ownership of the fetcher in this scope (source == url_fetcher_). |
| 164 DCHECK_EQ(url_fetcher_.get(), source); | 184 DCHECK_EQ(url_fetcher_.get(), source); |
| 165 DCHECK(!source->GetStatus().is_io_pending()); | 185 DCHECK(!source->GetStatus().is_io_pending()); |
| 166 DCHECK(fetched_callback_); | 186 DCHECK(fetched_callback_); |
| 167 | 187 |
| 168 if (source->GetResponseCode() == net::HTTP_NOT_FOUND) { | 188 if (source->GetResponseCode() == net::HTTP_NOT_FOUND) { |
| 189 RecordCleanerDownloadStatusHistogram( |
| 190 CLEANER_DOWNLOAD_STATUS_NOT_FOUND_ON_SERVER); |
| 169 PostCallbackAndDeleteSelf(base::FilePath(), | 191 PostCallbackAndDeleteSelf(base::FilePath(), |
| 170 ChromeCleanerFetchStatus::kNotFoundOnServer); | 192 ChromeCleanerFetchStatus::kNotFoundOnServer); |
| 171 return; | 193 return; |
| 172 } | 194 } |
| 173 | 195 |
| 174 base::FilePath download_path; | 196 base::FilePath download_path; |
| 175 if (!source->GetStatus().is_success() || | 197 if (!source->GetStatus().is_success() || |
| 176 source->GetResponseCode() != net::HTTP_OK || | 198 source->GetResponseCode() != net::HTTP_OK || |
| 177 !source->GetResponseAsFilePath(/*take_ownership=*/true, &download_path)) { | 199 !source->GetResponseAsFilePath(/*take_ownership=*/true, &download_path)) { |
| 200 RecordCleanerDownloadStatusHistogram(CLEANER_DOWNLOAD_STATUS_OTHER_FAILURE); |
| 178 PostCallbackAndDeleteSelf(base::FilePath(), | 201 PostCallbackAndDeleteSelf(base::FilePath(), |
| 179 ChromeCleanerFetchStatus::kOtherFailure); | 202 ChromeCleanerFetchStatus::kOtherFailure); |
| 180 return; | 203 return; |
| 181 } | 204 } |
| 182 | 205 |
| 183 DCHECK(!download_path.empty()); | 206 DCHECK(!download_path.empty()); |
| 184 DCHECK_EQ(temp_file_.value(), download_path.value()); | 207 DCHECK_EQ(temp_file_.value(), download_path.value()); |
| 185 | 208 |
| 186 // Take ownership of the scoped temp directory so it is not deleted. | 209 // Take ownership of the scoped temp directory so it is not deleted. |
| 187 scoped_temp_dir_->Take(); | 210 scoped_temp_dir_->Take(); |
| 188 | 211 |
| 212 RecordCleanerDownloadStatusHistogram(CLEANER_DOWNLOAD_STATUS_SUCCEEDED); |
| 189 PostCallbackAndDeleteSelf(std::move(download_path), | 213 PostCallbackAndDeleteSelf(std::move(download_path), |
| 190 ChromeCleanerFetchStatus::kSuccess); | 214 ChromeCleanerFetchStatus::kSuccess); |
| 191 } | 215 } |
| 192 | 216 |
| 193 } // namespace | 217 } // namespace |
| 194 | 218 |
| 195 void FetchChromeCleaner(ChromeCleanerFetchedCallback fetched_callback) { | 219 void FetchChromeCleaner(ChromeCleanerFetchedCallback fetched_callback) { |
| 196 new ChromeCleanerFetcher(std::move(fetched_callback)); | 220 new ChromeCleanerFetcher(std::move(fetched_callback)); |
| 197 } | 221 } |
| 198 | 222 |
| 199 } // namespace safe_browsing | 223 } // namespace safe_browsing |
| OLD | NEW |