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

Side by Side Diff: chrome/browser/download/download_target_determiner.cc

Issue 1982723002: Use FileTypePolicies for download danger classifications. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@use_policies
Patch Set: Fix bad rebase Created 4 years, 7 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/download/download_target_determiner.h" 5 #include "chrome/browser/download/download_target_determiner.h"
6 6
7 #include "base/location.h" 7 #include "base/location.h"
8 #include "base/rand_util.h" 8 #include "base/rand_util.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
11 #include "base/threading/thread_task_runner_handle.h" 11 #include "base/threading/thread_task_runner_handle.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "build/build_config.h" 13 #include "build/build_config.h"
14 #include "chrome/browser/download/chrome_download_manager_delegate.h" 14 #include "chrome/browser/download/chrome_download_manager_delegate.h"
15 #include "chrome/browser/download/download_crx_util.h" 15 #include "chrome/browser/download/download_crx_util.h"
16 #include "chrome/browser/download/download_extensions.h"
17 #include "chrome/browser/download/download_prefs.h" 16 #include "chrome/browser/download/download_prefs.h"
18 #include "chrome/browser/history/history_service_factory.h" 17 #include "chrome/browser/history/history_service_factory.h"
19 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
20 #include "chrome/common/safe_browsing/file_type_policies.h"
21 #include "chrome/grit/generated_resources.h" 21 #include "chrome/grit/generated_resources.h"
22 #include "components/history/core/browser/history_service.h" 22 #include "components/history/core/browser/history_service.h"
23 #include "components/mime_util/mime_util.h" 23 #include "components/mime_util/mime_util.h"
24 #include "components/prefs/pref_service.h" 24 #include "components/prefs/pref_service.h"
25 #include "content/public/browser/browser_context.h" 25 #include "content/public/browser/browser_context.h"
26 #include "content/public/browser/browser_thread.h" 26 #include "content/public/browser/browser_thread.h"
27 #include "content/public/browser/download_interrupt_reasons.h" 27 #include "content/public/browser/download_interrupt_reasons.h"
28 #include "extensions/common/constants.h" 28 #include "extensions/common/constants.h"
29 #include "net/base/filename_util.h" 29 #include "net/base/filename_util.h"
30 #include "ui/base/l10n/l10n_util.h" 30 #include "ui/base/l10n/l10n_util.h"
31 31
32 #if defined(ENABLE_EXTENSIONS) 32 #if defined(ENABLE_EXTENSIONS)
33 #include "chrome/browser/extensions/webstore_installer.h" 33 #include "chrome/browser/extensions/webstore_installer.h"
34 #include "extensions/common/feature_switch.h" 34 #include "extensions/common/feature_switch.h"
35 #endif 35 #endif
36 36
37 #if defined(ENABLE_PLUGINS) 37 #if defined(ENABLE_PLUGINS)
38 #include "chrome/browser/plugins/plugin_prefs.h" 38 #include "chrome/browser/plugins/plugin_prefs.h"
39 #include "content/public/browser/plugin_service.h" 39 #include "content/public/browser/plugin_service.h"
40 #include "content/public/common/webplugininfo.h" 40 #include "content/public/common/webplugininfo.h"
41 #endif 41 #endif
42 42
43 #if defined(OS_WIN) 43 #if defined(OS_WIN)
44 #include "chrome/browser/ui/pdf/adobe_reader_info_win.h" 44 #include "chrome/browser/ui/pdf/adobe_reader_info_win.h"
45 #endif 45 #endif
46 46
47 using content::BrowserThread; 47 using content::BrowserThread;
48 using content::DownloadItem; 48 using content::DownloadItem;
49 using safe_browsing::DownloadFileType;
49 50
50 namespace { 51 namespace {
51 52
52 const base::FilePath::CharType kCrdownloadSuffix[] = 53 const base::FilePath::CharType kCrdownloadSuffix[] =
53 FILE_PATH_LITERAL(".crdownload"); 54 FILE_PATH_LITERAL(".crdownload");
54 55
55 // Condenses the results from HistoryService::GetVisibleVisitCountToHost() to a 56 // Condenses the results from HistoryService::GetVisibleVisitCountToHost() to a
56 // single bool. A host is considered visited before if prior visible visits were 57 // single bool. A host is considered visited before if prior visible visits were
57 // found in history and the first such visit was earlier than the most recent 58 // found in history and the first such visit was earlier than the most recent
58 // midnight. 59 // midnight.
(...skipping 10 matching lines...) Expand all
69 #if defined(OS_WIN) 70 #if defined(OS_WIN)
70 // Keeps track of whether Adobe Reader is up to date. 71 // Keeps track of whether Adobe Reader is up to date.
71 bool g_is_adobe_reader_up_to_date_ = false; 72 bool g_is_adobe_reader_up_to_date_ = false;
72 #endif 73 #endif
73 74
74 } // namespace 75 } // namespace
75 76
76 DownloadTargetInfo::DownloadTargetInfo() 77 DownloadTargetInfo::DownloadTargetInfo()
77 : target_disposition(DownloadItem::TARGET_DISPOSITION_OVERWRITE), 78 : target_disposition(DownloadItem::TARGET_DISPOSITION_OVERWRITE),
78 danger_type(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS), 79 danger_type(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS),
79 danger_level(download_util::NOT_DANGEROUS), 80 danger_level(DownloadFileType::NOT_DANGEROUS),
80 is_filetype_handled_safely(false) {} 81 is_filetype_handled_safely(false) {}
81 82
82 DownloadTargetInfo::~DownloadTargetInfo() {} 83 DownloadTargetInfo::~DownloadTargetInfo() {}
83 84
84 DownloadTargetDeterminerDelegate::~DownloadTargetDeterminerDelegate() { 85 DownloadTargetDeterminerDelegate::~DownloadTargetDeterminerDelegate() {
85 } 86 }
86 87
87 DownloadTargetDeterminer::DownloadTargetDeterminer( 88 DownloadTargetDeterminer::DownloadTargetDeterminer(
88 DownloadItem* download, 89 DownloadItem* download,
89 const base::FilePath& initial_virtual_path, 90 const base::FilePath& initial_virtual_path,
90 DownloadPrefs* download_prefs, 91 DownloadPrefs* download_prefs,
91 DownloadTargetDeterminerDelegate* delegate, 92 DownloadTargetDeterminerDelegate* delegate,
92 const CompletionCallback& callback) 93 const CompletionCallback& callback)
93 : next_state_(STATE_GENERATE_TARGET_PATH), 94 : next_state_(STATE_GENERATE_TARGET_PATH),
94 should_prompt_(false), 95 should_prompt_(false),
95 should_notify_extensions_(false), 96 should_notify_extensions_(false),
96 create_target_directory_(false), 97 create_target_directory_(false),
97 conflict_action_(DownloadPathReservationTracker::OVERWRITE), 98 conflict_action_(DownloadPathReservationTracker::OVERWRITE),
98 danger_type_(download->GetDangerType()), 99 danger_type_(download->GetDangerType()),
99 danger_level_(download_util::NOT_DANGEROUS), 100 danger_level_(DownloadFileType::NOT_DANGEROUS),
100 virtual_path_(initial_virtual_path), 101 virtual_path_(initial_virtual_path),
101 is_filetype_handled_safely_(false), 102 is_filetype_handled_safely_(false),
102 download_(download), 103 download_(download),
103 is_resumption_(download_->GetLastReason() != 104 is_resumption_(download_->GetLastReason() !=
104 content::DOWNLOAD_INTERRUPT_REASON_NONE && 105 content::DOWNLOAD_INTERRUPT_REASON_NONE &&
105 !initial_virtual_path.empty()), 106 !initial_virtual_path.empty()),
106 download_prefs_(download_prefs), 107 download_prefs_(download_prefs),
107 delegate_(delegate), 108 delegate_(delegate),
108 completion_callback_(callback), 109 completion_callback_(callback),
109 weak_ptr_factory_(this) { 110 weak_ptr_factory_(this) {
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 // Checking if there are prior visits to the referrer is only necessary if the 605 // Checking if there are prior visits to the referrer is only necessary if the
605 // danger level of the download depends on the file type. 606 // danger level of the download depends on the file type.
606 if (danger_type_ != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS && 607 if (danger_type_ != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS &&
607 danger_type_ != content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT) 608 danger_type_ != content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT)
608 return CONTINUE; 609 return CONTINUE;
609 610
610 // First determine the danger level assuming that the user doesn't have any 611 // First determine the danger level assuming that the user doesn't have any
611 // prior visits to the referrer recoreded in history. The resulting danger 612 // prior visits to the referrer recoreded in history. The resulting danger
612 // level would be ALLOW_ON_USER_GESTURE if the level depends on the visit 613 // level would be ALLOW_ON_USER_GESTURE if the level depends on the visit
613 // history. In the latter case, we can query the history DB to determine if 614 // history. In the latter case, we can query the history DB to determine if
614 // there were prior reqeusts and determine the danger level again once the 615 // there were prior requests and determine the danger level again once the
615 // result is available. 616 // result is available.
616 danger_level_ = GetDangerLevel(NO_VISITS_TO_REFERRER); 617 danger_level_ = GetDangerLevel(NO_VISITS_TO_REFERRER);
617 618
618 if (danger_level_ == download_util::NOT_DANGEROUS) 619 if (danger_level_ == DownloadFileType::NOT_DANGEROUS)
619 return CONTINUE; 620 return CONTINUE;
620 621
621 if (danger_level_ == download_util::ALLOW_ON_USER_GESTURE) { 622 if (danger_level_ == DownloadFileType::ALLOW_ON_USER_GESTURE) {
622 // HistoryServiceFactory redirects incognito profiles to on-record profiles. 623 // HistoryServiceFactory redirects incognito profiles to on-record profiles.
623 // There's no history for on-record profiles in unit_tests. 624 // There's no history for on-record profiles in unit_tests.
624 history::HistoryService* history_service = 625 history::HistoryService* history_service =
625 HistoryServiceFactory::GetForProfile( 626 HistoryServiceFactory::GetForProfile(
626 GetProfile(), ServiceAccessType::EXPLICIT_ACCESS); 627 GetProfile(), ServiceAccessType::EXPLICIT_ACCESS);
627 628
628 if (history_service && download_->GetReferrerUrl().is_valid()) { 629 if (history_service && download_->GetReferrerUrl().is_valid()) {
629 history_service->GetVisibleVisitCountToHost( 630 history_service->GetVisibleVisitCountToHost(
630 download_->GetReferrerUrl(), 631 download_->GetReferrerUrl(),
631 base::Bind( 632 base::Bind(
(...skipping 13 matching lines...) Expand all
645 danger_type_ = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE; 646 danger_type_ = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE;
646 return CONTINUE; 647 return CONTINUE;
647 } 648 }
648 649
649 void DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone( 650 void DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone(
650 bool visited_referrer_before) { 651 bool visited_referrer_before) {
651 DCHECK_CURRENTLY_ON(BrowserThread::UI); 652 DCHECK_CURRENTLY_ON(BrowserThread::UI);
652 DCHECK_EQ(STATE_DETERMINE_INTERMEDIATE_PATH, next_state_); 653 DCHECK_EQ(STATE_DETERMINE_INTERMEDIATE_PATH, next_state_);
653 danger_level_ = GetDangerLevel( 654 danger_level_ = GetDangerLevel(
654 visited_referrer_before ? VISITED_REFERRER : NO_VISITS_TO_REFERRER); 655 visited_referrer_before ? VISITED_REFERRER : NO_VISITS_TO_REFERRER);
655 if (danger_level_ != download_util::NOT_DANGEROUS && 656 if (danger_level_ != DownloadFileType::NOT_DANGEROUS &&
656 danger_type_ == content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) 657 danger_type_ == content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)
657 danger_type_ = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE; 658 danger_type_ = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE;
658 DoLoop(); 659 DoLoop();
659 } 660 }
660 661
661 DownloadTargetDeterminer::Result 662 DownloadTargetDeterminer::Result
662 DownloadTargetDeterminer::DoDetermineIntermediatePath() { 663 DownloadTargetDeterminer::DoDetermineIntermediatePath() {
663 DCHECK_CURRENTLY_ON(BrowserThread::UI); 664 DCHECK_CURRENTLY_ON(BrowserThread::UI);
664 DCHECK(!virtual_path_.empty()); 665 DCHECK(!virtual_path_.empty());
665 DCHECK(!local_path_.empty()); 666 DCHECK(!local_path_.empty());
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 // files), or if an extension signals that the user be prompted on a filename 834 // files), or if an extension signals that the user be prompted on a filename
834 // conflict. 835 // conflict.
835 return false; 836 return false;
836 } 837 }
837 838
838 bool DownloadTargetDeterminer::HasPromptedForPath() const { 839 bool DownloadTargetDeterminer::HasPromptedForPath() const {
839 return (is_resumption_ && download_->GetTargetDisposition() == 840 return (is_resumption_ && download_->GetTargetDisposition() ==
840 DownloadItem::TARGET_DISPOSITION_PROMPT); 841 DownloadItem::TARGET_DISPOSITION_PROMPT);
841 } 842 }
842 843
843 download_util::DownloadDangerLevel DownloadTargetDeterminer::GetDangerLevel( 844 DownloadFileType::DangerLevel DownloadTargetDeterminer::GetDangerLevel(
844 PriorVisitsToReferrer visits) const { 845 PriorVisitsToReferrer visits) const {
845 DCHECK_CURRENTLY_ON(BrowserThread::UI); 846 DCHECK_CURRENTLY_ON(BrowserThread::UI);
846 847
847 // If the user has has been prompted or will be, assume that the user has 848 // If the user has has been prompted or will be, assume that the user has
848 // approved the download. A programmatic download is considered safe unless it 849 // approved the download. A programmatic download is considered safe unless it
849 // contains malware. 850 // contains malware.
850 if (HasPromptedForPath() || should_prompt_ || 851 if (HasPromptedForPath() || should_prompt_ ||
851 !download_->GetForcedFilePath().empty()) 852 !download_->GetForcedFilePath().empty())
852 return download_util::NOT_DANGEROUS; 853 return DownloadFileType::NOT_DANGEROUS;
853 854
854 const bool is_extension_download = 855 const bool is_extension_download =
855 download_crx_util::IsExtensionDownload(*download_); 856 download_crx_util::IsExtensionDownload(*download_);
856 857
857 // User-initiated extension downloads from pref-whitelisted sources are not 858 // User-initiated extension downloads from pref-whitelisted sources are not
858 // considered dangerous. 859 // considered dangerous.
859 if (download_->HasUserGesture() && 860 if (download_->HasUserGesture() &&
860 is_extension_download && 861 is_extension_download &&
861 download_crx_util::OffStoreInstallAllowedByPrefs( 862 download_crx_util::OffStoreInstallAllowedByPrefs(
862 GetProfile(), *download_)) { 863 GetProfile(), *download_)) {
863 return download_util::NOT_DANGEROUS; 864 return DownloadFileType::NOT_DANGEROUS;
864 } 865 }
865 866
866 #if defined(ENABLE_EXTENSIONS) 867 #if defined(ENABLE_EXTENSIONS)
867 // Extensions that are not from the gallery are considered dangerous. 868 // Extensions that are not from the gallery are considered dangerous.
868 // When off-store install is disabled we skip this, since in this case, we 869 // When off-store install is disabled we skip this, since in this case, we
869 // will not offer to install the extension. 870 // will not offer to install the extension.
870 if (extensions::FeatureSwitch::easy_off_store_install()->IsEnabled() && 871 if (extensions::FeatureSwitch::easy_off_store_install()->IsEnabled() &&
871 is_extension_download && 872 is_extension_download &&
872 !extensions::WebstoreInstaller::GetAssociatedApproval(*download_)) { 873 !extensions::WebstoreInstaller::GetAssociatedApproval(*download_)) {
873 return download_util::ALLOW_ON_USER_GESTURE; 874 return DownloadFileType::ALLOW_ON_USER_GESTURE;
874 } 875 }
875 #endif 876 #endif
876 877
877 // Anything the user has marked auto-open is OK if it's user-initiated. 878 // Anything the user has marked auto-open is OK if it's user-initiated.
878 if (download_prefs_->IsAutoOpenEnabledBasedOnExtension(virtual_path_) && 879 if (download_prefs_->IsAutoOpenEnabledBasedOnExtension(virtual_path_) &&
879 download_->HasUserGesture()) 880 download_->HasUserGesture())
880 return download_util::NOT_DANGEROUS; 881 return DownloadFileType::NOT_DANGEROUS;
881 882
882 download_util::DownloadDangerLevel danger_level = 883 DownloadFileType::DangerLevel danger_level =
883 download_util::GetFileDangerLevel(virtual_path_.BaseName()); 884 safe_browsing::FileTypePolicies::GetInstance()->GetFileDangerLevel(
885 virtual_path_.BaseName());
884 886
885 // If the danger level is ALLOW_ON_USER_GESTURE and we have a user gesture AND 887 // If the danger level is ALLOW_ON_USER_GESTURE and we have a user gesture AND
886 // there was a recorded visit to the referrer prior to today, then we are 888 // there was a recorded visit to the referrer prior to today, then we are
887 // going to downgrade the danger_level to NOT_DANGEROUS. This prevents 889 // going to downgrade the danger_level to NOT_DANGEROUS. This prevents
888 // spurious prompting for moderately dangerous files that are downloaded from 890 // spurious prompting for moderately dangerous files that are downloaded from
889 // familiar sites. 891 // familiar sites.
890 if (danger_level == download_util::ALLOW_ON_USER_GESTURE && 892 if (danger_level == DownloadFileType::ALLOW_ON_USER_GESTURE &&
891 (download_->GetTransitionType() == ui::PAGE_TRANSITION_FROM_ADDRESS_BAR || 893 (download_->GetTransitionType() == ui::PAGE_TRANSITION_FROM_ADDRESS_BAR ||
892 (download_->HasUserGesture() && visits == VISITED_REFERRER))) 894 (download_->HasUserGesture() && visits == VISITED_REFERRER)))
893 return download_util::NOT_DANGEROUS; 895 return DownloadFileType::NOT_DANGEROUS;
894 return danger_level; 896 return danger_level;
895 } 897 }
896 898
897 void DownloadTargetDeterminer::OnDownloadDestroyed( 899 void DownloadTargetDeterminer::OnDownloadDestroyed(
898 DownloadItem* download) { 900 DownloadItem* download) {
899 DCHECK_CURRENTLY_ON(BrowserThread::UI); 901 DCHECK_CURRENTLY_ON(BrowserThread::UI);
900 DCHECK_EQ(download_, download); 902 DCHECK_EQ(download_, download);
901 CancelOnFailureAndDeleteSelf(); 903 CancelOnFailureAndDeleteSelf();
902 } 904 }
903 905
(...skipping 15 matching lines...) Expand all
919 const base::FilePath& suggested_path) { 921 const base::FilePath& suggested_path) {
920 return base::FilePath(suggested_path.value() + kCrdownloadSuffix); 922 return base::FilePath(suggested_path.value() + kCrdownloadSuffix);
921 } 923 }
922 924
923 #if defined(OS_WIN) 925 #if defined(OS_WIN)
924 // static 926 // static
925 bool DownloadTargetDeterminer::IsAdobeReaderUpToDate() { 927 bool DownloadTargetDeterminer::IsAdobeReaderUpToDate() {
926 return g_is_adobe_reader_up_to_date_; 928 return g_is_adobe_reader_up_to_date_;
927 } 929 }
928 #endif 930 #endif
OLDNEW
« no previous file with comments | « chrome/browser/download/download_target_determiner.h ('k') | chrome/browser/download/download_target_determiner_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698