blob: 3077a6183ef6f5ceb2607c9d54478ca894fd3e8e [file] [log] [blame]
[email protected]33ca232f2012-04-10 00:08:451// 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
3// found in the LICENSE file.
4
5#include "chrome/browser/download/download_danger_prompt.h"
6
avie4d7b6f2015-12-26 00:59:187#include "base/macros.h"
Ilya Sherman982457e62017-12-13 02:19:368#include "base/metrics/histogram_functions.h"
jialiul70cd6f2c2016-02-02 23:24:579#include "base/strings/stringprintf.h"
jialiul7f11b742015-11-26 04:54:4910#include "chrome/browser/browser_process.h"
Micah Morton5675f902017-08-16 22:35:1911#include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
jialiul7f11b742015-11-26 04:54:4912#include "chrome/browser/safe_browsing/safe_browsing_service.h"
Min Qin0ca8e1ee2018-01-31 00:49:3513#include "components/download/public/common/download_danger_type.h"
Min Qina9f487872018-02-09 20:43:2314#include "components/download/public/common/download_item.h"
Daniel Ruberyaf17ad32020-03-02 20:06:4915#include "components/safe_browsing/core/file_type_policies.h"
[email protected]33ca232f2012-04-10 00:08:4516
jialiulee910ec12016-01-11 19:42:4617using safe_browsing::ClientDownloadResponse;
jialiul7f11b742015-11-26 04:54:4918using safe_browsing::ClientSafeBrowsingReportRequest;
[email protected]f85a34b2014-08-16 01:10:1619
[email protected]33ca232f2012-04-10 00:08:4520namespace {
21
jialiul70cd6f2c2016-02-02 23:24:5722const char kDownloadDangerPromptPrefix[] = "Download.DownloadDangerPrompt";
23
jialiul70cd6f2c2016-02-02 23:24:5724// Converts DownloadDangerType into their corresponding string.
25const char* GetDangerTypeString(
Min Qin0ca8e1ee2018-01-31 00:49:3526 const download::DownloadDangerType& danger_type) {
jialiul70cd6f2c2016-02-02 23:24:5727 switch (danger_type) {
Min Qin0ca8e1ee2018-01-31 00:49:3528 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE:
jialiul70cd6f2c2016-02-02 23:24:5729 return "DangerousFile";
Min Qin0ca8e1ee2018-01-31 00:49:3530 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
jialiul70cd6f2c2016-02-02 23:24:5731 return "DangerousURL";
Min Qin0ca8e1ee2018-01-31 00:49:3532 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
jialiul70cd6f2c2016-02-02 23:24:5733 return "DangerousContent";
Min Qin0ca8e1ee2018-01-31 00:49:3534 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
jialiul70cd6f2c2016-02-02 23:24:5735 return "DangerousHost";
Min Qin0ca8e1ee2018-01-31 00:49:3536 case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT:
jialiul70cd6f2c2016-02-02 23:24:5737 return "UncommonContent";
Min Qin0ca8e1ee2018-01-31 00:49:3538 case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
jialiul70cd6f2c2016-02-02 23:24:5739 return "PotentiallyUnwanted";
Daniel Ruberye357cb41a2019-07-08 20:22:2040 case download::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING:
41 return "AsyncScanning";
Daniel Rubery7746d122019-07-17 01:28:5942 case download::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED:
43 return "BlockedPasswordProtected";
Daniel Rubery0b556b92019-10-15 20:35:0944 case download::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE:
45 return "BlockedTooLarge";
46 case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING:
47 return "SensitiveContentWarning";
48 case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK:
49 return "SensitiveContentBlock";
50 case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_SAFE:
51 return "DeepScannedSafe";
52 case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_OPENED_DANGEROUS:
53 return "DeepScannedOpenedDangerous";
Daniel Ruberye6247df2019-12-16 19:51:5354 case download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING:
55 return "PromptForScanning";
Min Qin0ca8e1ee2018-01-31 00:49:3556 case download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS:
57 case download::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT:
58 case download::DOWNLOAD_DANGER_TYPE_USER_VALIDATED:
Jialiu Lin93850e02018-05-16 16:32:0559 case download::DOWNLOAD_DANGER_TYPE_WHITELISTED_BY_POLICY:
Min Qin0ca8e1ee2018-01-31 00:49:3560 case download::DOWNLOAD_DANGER_TYPE_MAX:
jialiul70cd6f2c2016-02-02 23:24:5761 break;
62 }
63 NOTREACHED();
64 return nullptr;
65}
66
[email protected]cce1bad62013-01-04 02:26:3867} // namespace
[email protected]33ca232f2012-04-10 00:08:4568
jialiul2c2638582016-06-08 22:18:0869void DownloadDangerPrompt::SendSafeBrowsingDownloadReport(
70 ClientSafeBrowsingReportRequest::ReportType report_type,
jialiul7f11b742015-11-26 04:54:4971 bool did_proceed,
Min Qina9f487872018-02-09 20:43:2372 const download::DownloadItem& download) {
jialiul7f11b742015-11-26 04:54:4973 safe_browsing::SafeBrowsingService* sb_service =
74 g_browser_process->safe_browsing_service();
75 ClientSafeBrowsingReportRequest report;
jialiul2c2638582016-06-08 22:18:0876 report.set_type(report_type);
jialiulee910ec12016-01-11 19:42:4677 switch (download.GetDangerType()) {
Min Qin0ca8e1ee2018-01-31 00:49:3578 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
79 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
jialiulee910ec12016-01-11 19:42:4680 report.set_download_verdict(ClientDownloadResponse::DANGEROUS);
81 break;
Min Qin0ca8e1ee2018-01-31 00:49:3582 case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT:
jialiulee910ec12016-01-11 19:42:4683 report.set_download_verdict(ClientDownloadResponse::UNCOMMON);
84 break;
Min Qin0ca8e1ee2018-01-31 00:49:3585 case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
jialiulee910ec12016-01-11 19:42:4686 report.set_download_verdict(ClientDownloadResponse::POTENTIALLY_UNWANTED);
87 break;
Min Qin0ca8e1ee2018-01-31 00:49:3588 case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
jialiulee910ec12016-01-11 19:42:4689 report.set_download_verdict(ClientDownloadResponse::DANGEROUS_HOST);
90 break;
jialiul7526f822016-05-20 22:22:2791 default: // Don't send report for any other danger types.
92 return;
jialiulee910ec12016-01-11 19:42:4693 }
94 report.set_url(download.GetURL().spec());
jialiul7f11b742015-11-26 04:54:4995 report.set_did_proceed(did_proceed);
jialiul2c2638582016-06-08 22:18:0896 std::string token =
97 safe_browsing::DownloadProtectionService::GetDownloadPingToken(
98 &download);
99 if (!token.empty())
100 report.set_token(token);
jialiul7f11b742015-11-26 04:54:49101 std::string serialized_report;
102 if (report.SerializeToString(&serialized_report))
jialiulbd9ba652016-03-18 20:23:46103 sb_service->SendSerializedDownloadReport(serialized_report);
jialiul7f11b742015-11-26 04:54:49104 else
105 DLOG(ERROR) << "Unable to serialize the threat report.";
106}
jialiul70cd6f2c2016-02-02 23:24:57107
108void DownloadDangerPrompt::RecordDownloadDangerPrompt(
109 bool did_proceed,
Min Qina9f487872018-02-09 20:43:23110 const download::DownloadItem& download) {
nparkerac9da062016-05-19 21:47:23111 int64_t file_type_uma_value =
112 safe_browsing::FileTypePolicies::GetInstance()->UmaValueForFile(
113 download.GetTargetFilePath());
Min Qin0ca8e1ee2018-01-31 00:49:35114 download::DownloadDangerType danger_type = download.GetDangerType();
jialiul70cd6f2c2016-02-02 23:24:57115
Ilya Sherman982457e62017-12-13 02:19:36116 base::UmaHistogramSparse(
jialiul70cd6f2c2016-02-02 23:24:57117 base::StringPrintf("%s.%s.Shown", kDownloadDangerPromptPrefix,
118 GetDangerTypeString(danger_type)),
nparkerac9da062016-05-19 21:47:23119 file_type_uma_value);
jialiul70cd6f2c2016-02-02 23:24:57120 if (did_proceed) {
Ilya Sherman982457e62017-12-13 02:19:36121 base::UmaHistogramSparse(
jialiul70cd6f2c2016-02-02 23:24:57122 base::StringPrintf("%s.%s.Proceed", kDownloadDangerPromptPrefix,
123 GetDangerTypeString(danger_type)),
nparkerac9da062016-05-19 21:47:23124 file_type_uma_value);
jialiul70cd6f2c2016-02-02 23:24:57125 }
126}