OLD | NEW |
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/prefs/pref_service.h" | 7 #include "base/prefs/pref_service.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 const base::FilePath& initial_virtual_path, | 82 const base::FilePath& initial_virtual_path, |
83 DownloadPrefs* download_prefs, | 83 DownloadPrefs* download_prefs, |
84 DownloadTargetDeterminerDelegate* delegate, | 84 DownloadTargetDeterminerDelegate* delegate, |
85 const CompletionCallback& callback) | 85 const CompletionCallback& callback) |
86 : next_state_(STATE_GENERATE_TARGET_PATH), | 86 : next_state_(STATE_GENERATE_TARGET_PATH), |
87 should_prompt_(false), | 87 should_prompt_(false), |
88 should_notify_extensions_(false), | 88 should_notify_extensions_(false), |
89 create_target_directory_(false), | 89 create_target_directory_(false), |
90 conflict_action_(DownloadPathReservationTracker::OVERWRITE), | 90 conflict_action_(DownloadPathReservationTracker::OVERWRITE), |
91 danger_type_(download->GetDangerType()), | 91 danger_type_(download->GetDangerType()), |
| 92 is_dangerous_file_(false), |
92 virtual_path_(initial_virtual_path), | 93 virtual_path_(initial_virtual_path), |
93 is_filetype_handled_safely_(false), | 94 is_filetype_handled_safely_(false), |
94 download_(download), | 95 download_(download), |
95 is_resumption_(download_->GetLastReason() != | 96 is_resumption_(download_->GetLastReason() != |
96 content::DOWNLOAD_INTERRUPT_REASON_NONE && | 97 content::DOWNLOAD_INTERRUPT_REASON_NONE && |
97 !initial_virtual_path.empty()), | 98 !initial_virtual_path.empty()), |
98 download_prefs_(download_prefs), | 99 download_prefs_(download_prefs), |
99 delegate_(delegate), | 100 delegate_(delegate), |
100 completion_callback_(callback), | 101 completion_callback_(callback), |
101 weak_ptr_factory_(this) { | 102 weak_ptr_factory_(this) { |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 DoLoop(); | 570 DoLoop(); |
570 } | 571 } |
571 | 572 |
572 DownloadTargetDeterminer::Result | 573 DownloadTargetDeterminer::Result |
573 DownloadTargetDeterminer::DoCheckVisitedReferrerBefore() { | 574 DownloadTargetDeterminer::DoCheckVisitedReferrerBefore() { |
574 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 575 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
575 | 576 |
576 next_state_ = STATE_DETERMINE_INTERMEDIATE_PATH; | 577 next_state_ = STATE_DETERMINE_INTERMEDIATE_PATH; |
577 | 578 |
578 // Checking if there are prior visits to the referrer is only necessary if the | 579 // Checking if there are prior visits to the referrer is only necessary if the |
579 // danger level of the download depends on the file type. This excludes cases | 580 // danger level of the download depends on the file type. |
580 // where the download has already been deemed dangerous, or where the user is | 581 if (danger_type_ != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS && |
581 // going to be prompted or where this is a programmatic download. | 582 danger_type_ != content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT) |
582 if (danger_type_ != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) | |
583 return CONTINUE; | 583 return CONTINUE; |
584 | 584 |
585 // Assume that: | 585 // Assume that: |
586 // IsDangerousFile(VISITED_REFERRER) => IsDangerousFile(NO_VISITS_...) | 586 // IsDangerousFile(VISITED_REFERRER) => IsDangerousFile(NO_VISITS_...) |
587 // I.e. having visited a referrer only lowers a file's danger level. | 587 // I.e. having visited a referrer only lowers a file's danger level. |
588 if (IsDangerousFile(NO_VISITS_TO_REFERRER)) { | 588 if (IsDangerousFile(NO_VISITS_TO_REFERRER)) { |
589 // Only need to ping the history DB if the download would be considered safe | 589 // Only need to ping the history DB if the download would be considered safe |
590 // if there are prior visits and is considered dangerous otherwise. | 590 // if there are prior visits and is considered dangerous otherwise. |
591 if (!IsDangerousFile(VISITED_REFERRER)) { | 591 if (!IsDangerousFile(VISITED_REFERRER)) { |
592 // HistoryServiceFactory redirects incognito profiles to on-record | 592 // HistoryServiceFactory redirects incognito profiles to on-record |
(...skipping 10 matching lines...) Expand all Loading... |
603 &DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone, | 603 &DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone, |
604 weak_ptr_factory_.GetWeakPtr())), | 604 weak_ptr_factory_.GetWeakPtr())), |
605 &history_tracker_); | 605 &history_tracker_); |
606 return QUIT_DOLOOP; | 606 return QUIT_DOLOOP; |
607 } | 607 } |
608 } | 608 } |
609 | 609 |
610 // If the danger level doesn't depend on having visited the refererrer URL | 610 // If the danger level doesn't depend on having visited the refererrer URL |
611 // or if original profile doesn't have a HistoryService or the referrer url | 611 // or if original profile doesn't have a HistoryService or the referrer url |
612 // is invalid, then assume the referrer has not been visited before. | 612 // is invalid, then assume the referrer has not been visited before. |
613 danger_type_ = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE; | 613 is_dangerous_file_ = true; |
614 } | 614 } |
615 return CONTINUE; | 615 return CONTINUE; |
616 } | 616 } |
617 | 617 |
618 void DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone( | 618 void DownloadTargetDeterminer::CheckVisitedReferrerBeforeDone( |
619 bool visited_referrer_before) { | 619 bool visited_referrer_before) { |
620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
621 DCHECK_EQ(STATE_DETERMINE_INTERMEDIATE_PATH, next_state_); | 621 DCHECK_EQ(STATE_DETERMINE_INTERMEDIATE_PATH, next_state_); |
622 if (IsDangerousFile( | 622 if (IsDangerousFile( |
623 visited_referrer_before ? VISITED_REFERRER : NO_VISITS_TO_REFERRER)) | 623 visited_referrer_before ? VISITED_REFERRER : NO_VISITS_TO_REFERRER)) |
624 danger_type_ = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE; | 624 is_dangerous_file_ = true; |
625 DoLoop(); | 625 DoLoop(); |
626 } | 626 } |
627 | 627 |
628 DownloadTargetDeterminer::Result | 628 DownloadTargetDeterminer::Result |
629 DownloadTargetDeterminer::DoDetermineIntermediatePath() { | 629 DownloadTargetDeterminer::DoDetermineIntermediatePath() { |
630 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 630 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
631 DCHECK(!virtual_path_.empty()); | 631 DCHECK(!virtual_path_.empty()); |
632 DCHECK(!local_path_.empty()); | 632 DCHECK(!local_path_.empty()); |
633 DCHECK(intermediate_path_.empty()); | 633 DCHECK(intermediate_path_.empty()); |
634 DCHECK(!virtual_path_.MatchesExtension(kCrdownloadSuffix)); | 634 DCHECK(!virtual_path_.MatchesExtension(kCrdownloadSuffix)); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 << " Intermediate:" << intermediate_path_.AsUTF8Unsafe() | 708 << " Intermediate:" << intermediate_path_.AsUTF8Unsafe() |
709 << " Should prompt:" << should_prompt_ | 709 << " Should prompt:" << should_prompt_ |
710 << " Danger type:" << danger_type_; | 710 << " Danger type:" << danger_type_; |
711 scoped_ptr<DownloadTargetInfo> target_info(new DownloadTargetInfo); | 711 scoped_ptr<DownloadTargetInfo> target_info(new DownloadTargetInfo); |
712 | 712 |
713 target_info->target_path = local_path_; | 713 target_info->target_path = local_path_; |
714 target_info->target_disposition = | 714 target_info->target_disposition = |
715 (HasPromptedForPath() || should_prompt_ | 715 (HasPromptedForPath() || should_prompt_ |
716 ? DownloadItem::TARGET_DISPOSITION_PROMPT | 716 ? DownloadItem::TARGET_DISPOSITION_PROMPT |
717 : DownloadItem::TARGET_DISPOSITION_OVERWRITE); | 717 : DownloadItem::TARGET_DISPOSITION_OVERWRITE); |
718 target_info->danger_type = danger_type_; | 718 target_info->danger_type = |
| 719 (is_dangerous_file_ && |
| 720 danger_type_ == content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) |
| 721 ? content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE |
| 722 : danger_type_; |
| 723 target_info->is_dangerous_file = is_dangerous_file_; |
719 target_info->intermediate_path = intermediate_path_; | 724 target_info->intermediate_path = intermediate_path_; |
720 target_info->mime_type = mime_type_; | 725 target_info->mime_type = mime_type_; |
721 target_info->is_filetype_handled_safely = is_filetype_handled_safely_; | 726 target_info->is_filetype_handled_safely = is_filetype_handled_safely_; |
722 | 727 |
723 base::MessageLoop::current()->PostTask( | 728 base::MessageLoop::current()->PostTask( |
724 FROM_HERE, base::Bind(completion_callback_, base::Passed(&target_info))); | 729 FROM_HERE, base::Bind(completion_callback_, base::Passed(&target_info))); |
725 completion_callback_.Reset(); | 730 completion_callback_.Reset(); |
726 delete this; | 731 delete this; |
727 } | 732 } |
728 | 733 |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 const base::FilePath& suggested_path) { | 884 const base::FilePath& suggested_path) { |
880 return base::FilePath(suggested_path.value() + kCrdownloadSuffix); | 885 return base::FilePath(suggested_path.value() + kCrdownloadSuffix); |
881 } | 886 } |
882 | 887 |
883 #if defined(OS_WIN) | 888 #if defined(OS_WIN) |
884 // static | 889 // static |
885 bool DownloadTargetDeterminer::IsAdobeReaderUpToDate() { | 890 bool DownloadTargetDeterminer::IsAdobeReaderUpToDate() { |
886 return g_is_adobe_reader_up_to_date_; | 891 return g_is_adobe_reader_up_to_date_; |
887 } | 892 } |
888 #endif | 893 #endif |
OLD | NEW |