| 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 // Implementation of the SafeBrowsingBlockingPage class. | 5 // Implementation of the SafeBrowsingBlockingPage class. |
| 6 | 6 |
| 7 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" | 7 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 const char kShowPrivacyCommand[] = "showPrivacy"; | 99 const char kShowPrivacyCommand[] = "showPrivacy"; |
| 100 const char kTakeMeBackCommand[] = "takeMeBack"; | 100 const char kTakeMeBackCommand[] = "takeMeBack"; |
| 101 | 101 |
| 102 // Other constants used to communicate with the JavaScript. | 102 // Other constants used to communicate with the JavaScript. |
| 103 const char kBoxChecked[] = "boxchecked"; | 103 const char kBoxChecked[] = "boxchecked"; |
| 104 const char kDisplayCheckBox[] = "displaycheckbox"; | 104 const char kDisplayCheckBox[] = "displaycheckbox"; |
| 105 | 105 |
| 106 // Constants for the Experience Sampling instrumentation. | 106 // Constants for the Experience Sampling instrumentation. |
| 107 #if defined(ENABLE_EXTENSIONS) | 107 #if defined(ENABLE_EXTENSIONS) |
| 108 const char kEventNameMalware[] = "safebrowsing_interstitial_"; | 108 const char kEventNameMalware[] = "safebrowsing_interstitial_"; |
| 109 const char kEventNameHarmful[] = "harmful_interstitial_"; |
| 109 const char kEventNamePhishing[] = "phishing_interstitial_"; | 110 const char kEventNamePhishing[] = "phishing_interstitial_"; |
| 110 const char kEventNameOther[] = "safebrowsing_other_interstitial_"; | 111 const char kEventNameOther[] = "safebrowsing_other_interstitial_"; |
| 111 #endif | 112 #endif |
| 112 | 113 |
| 113 base::LazyInstance<SafeBrowsingBlockingPage::UnsafeResourceMap> | 114 base::LazyInstance<SafeBrowsingBlockingPage::UnsafeResourceMap> |
| 114 g_unsafe_resource_map = LAZY_INSTANCE_INITIALIZER; | 115 g_unsafe_resource_map = LAZY_INSTANCE_INITIALIZER; |
| 115 | 116 |
| 116 } // namespace | 117 } // namespace |
| 117 | 118 |
| 118 // static | 119 // static |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 report_loop_(NULL), | 155 report_loop_(NULL), |
| 155 is_main_frame_load_blocked_(IsMainPageLoadBlocked(unsafe_resources)), | 156 is_main_frame_load_blocked_(IsMainPageLoadBlocked(unsafe_resources)), |
| 156 unsafe_resources_(unsafe_resources), | 157 unsafe_resources_(unsafe_resources), |
| 157 proceeded_(false), | 158 proceeded_(false), |
| 158 web_contents_(web_contents), | 159 web_contents_(web_contents), |
| 159 url_(unsafe_resources[0].url), | 160 url_(unsafe_resources[0].url), |
| 160 interstitial_page_(NULL), | 161 interstitial_page_(NULL), |
| 161 create_view_(true), | 162 create_view_(true), |
| 162 num_visits_(-1) { | 163 num_visits_(-1) { |
| 163 bool malware = false; | 164 bool malware = false; |
| 165 bool harmful = false; |
| 164 bool phishing = false; | 166 bool phishing = false; |
| 165 for (UnsafeResourceList::const_iterator iter = unsafe_resources_.begin(); | 167 for (UnsafeResourceList::const_iterator iter = unsafe_resources_.begin(); |
| 166 iter != unsafe_resources_.end(); ++iter) { | 168 iter != unsafe_resources_.end(); ++iter) { |
| 167 const UnsafeResource& resource = *iter; | 169 const UnsafeResource& resource = *iter; |
| 168 SBThreatType threat_type = resource.threat_type; | 170 SBThreatType threat_type = resource.threat_type; |
| 169 if (threat_type == SB_THREAT_TYPE_URL_MALWARE || | 171 if (threat_type == SB_THREAT_TYPE_URL_MALWARE || |
| 170 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { | 172 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { |
| 171 malware = true; | 173 malware = true; |
| 174 } else if (threat_type == SB_THREAT_TYPE_URL_HARMFUL) { |
| 175 harmful = true; |
| 172 } else { | 176 } else { |
| 173 DCHECK(threat_type == SB_THREAT_TYPE_URL_PHISHING || | 177 DCHECK(threat_type == SB_THREAT_TYPE_URL_PHISHING || |
| 174 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL); | 178 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL); |
| 175 phishing = true; | 179 phishing = true; |
| 176 } | 180 } |
| 177 } | 181 } |
| 178 DCHECK(phishing || malware); | 182 DCHECK(phishing || malware || harmful); |
| 179 if (malware) | 183 if (malware) |
| 180 interstitial_type_ = TYPE_MALWARE; | 184 interstitial_type_ = TYPE_MALWARE; |
| 185 else if (harmful) |
| 186 interstitial_type_ = TYPE_HARMFUL; |
| 181 else | 187 else |
| 182 interstitial_type_ = TYPE_PHISHING; | 188 interstitial_type_ = TYPE_PHISHING; |
| 183 | 189 |
| 184 RecordUserDecision(SHOW); | 190 RecordUserDecision(SHOW); |
| 185 RecordUserInteraction(TOTAL_VISITS); | 191 RecordUserInteraction(TOTAL_VISITS); |
| 186 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) | 192 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) |
| 187 RecordUserDecision(PROCEEDING_DISABLED); | 193 RecordUserDecision(PROCEEDING_DISABLED); |
| 188 | 194 |
| 189 HistoryService* history_service = HistoryServiceFactory::GetForProfile( | 195 HistoryService* history_service = HistoryServiceFactory::GetForProfile( |
| 190 Profile::FromBrowserContext(web_contents->GetBrowserContext()), | 196 Profile::FromBrowserContext(web_contents->GetBrowserContext()), |
| (...skipping 26 matching lines...) Expand all Loading... |
| 217 } | 223 } |
| 218 | 224 |
| 219 #if defined(ENABLE_EXTENSIONS) | 225 #if defined(ENABLE_EXTENSIONS) |
| 220 // ExperienceSampling: Set up new sampling event for this interstitial. | 226 // ExperienceSampling: Set up new sampling event for this interstitial. |
| 221 // This needs to handle all types of warnings this interstitial can show. | 227 // This needs to handle all types of warnings this interstitial can show. |
| 222 std::string event_name; | 228 std::string event_name; |
| 223 switch (interstitial_type_) { | 229 switch (interstitial_type_) { |
| 224 case TYPE_MALWARE: | 230 case TYPE_MALWARE: |
| 225 event_name = kEventNameMalware; | 231 event_name = kEventNameMalware; |
| 226 break; | 232 break; |
| 233 case TYPE_HARMFUL: |
| 234 event_name = kEventNameHarmful; |
| 235 break; |
| 227 case TYPE_PHISHING: | 236 case TYPE_PHISHING: |
| 228 event_name = kEventNamePhishing; | 237 event_name = kEventNamePhishing; |
| 229 break; | 238 break; |
| 230 default: | 239 default: |
| 231 event_name = kEventNameOther; | 240 event_name = kEventNameOther; |
| 232 break; | 241 break; |
| 233 } | 242 } |
| 234 sampling_event_.reset(new ExperienceSamplingEvent( | 243 sampling_event_.reset(new ExperienceSamplingEvent( |
| 235 event_name, | 244 event_name, |
| 236 url_, | 245 url_, |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 num_visits_ = num_visits; | 494 num_visits_ = num_visits; |
| 486 } | 495 } |
| 487 | 496 |
| 488 void SafeBrowsingBlockingPage::RecordUserDecision(Decision decision) { | 497 void SafeBrowsingBlockingPage::RecordUserDecision(Decision decision) { |
| 489 switch (interstitial_type_) { | 498 switch (interstitial_type_) { |
| 490 case TYPE_MALWARE: | 499 case TYPE_MALWARE: |
| 491 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.decision", | 500 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.decision", |
| 492 decision, | 501 decision, |
| 493 MAX_DECISION); | 502 MAX_DECISION); |
| 494 break; | 503 break; |
| 504 case TYPE_HARMFUL: |
| 505 UMA_HISTOGRAM_ENUMERATION("interstitial.harmful.decision", |
| 506 decision, |
| 507 MAX_DECISION); |
| 508 break; |
| 495 case TYPE_PHISHING: | 509 case TYPE_PHISHING: |
| 496 UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.decision", | 510 UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.decision", |
| 497 decision, | 511 decision, |
| 498 MAX_DECISION); | 512 MAX_DECISION); |
| 499 break; | 513 break; |
| 500 default: | |
| 501 NOTREACHED(); | |
| 502 } | 514 } |
| 503 | 515 |
| 504 #if defined(ENABLE_EXTENSIONS) | 516 #if defined(ENABLE_EXTENSIONS) |
| 505 if (sampling_event_.get()) { | 517 if (sampling_event_.get()) { |
| 506 switch (decision) { | 518 switch (decision) { |
| 507 case PROCEED: | 519 case PROCEED: |
| 508 sampling_event_->CreateUserDecisionEvent( | 520 sampling_event_->CreateUserDecisionEvent( |
| 509 ExperienceSamplingEvent::kProceed); | 521 ExperienceSamplingEvent::kProceed); |
| 510 break; | 522 break; |
| 511 case DONT_PROCEED: | 523 case DONT_PROCEED: |
| (...skipping 22 matching lines...) Expand all Loading... |
| 534 } | 546 } |
| 535 } | 547 } |
| 536 | 548 |
| 537 void SafeBrowsingBlockingPage::RecordUserInteraction(Interaction interaction) { | 549 void SafeBrowsingBlockingPage::RecordUserInteraction(Interaction interaction) { |
| 538 switch (interstitial_type_) { | 550 switch (interstitial_type_) { |
| 539 case TYPE_MALWARE: | 551 case TYPE_MALWARE: |
| 540 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.interaction", | 552 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.interaction", |
| 541 interaction, | 553 interaction, |
| 542 MAX_INTERACTION); | 554 MAX_INTERACTION); |
| 543 break; | 555 break; |
| 556 case TYPE_HARMFUL: |
| 557 UMA_HISTOGRAM_ENUMERATION("interstitial.harmful.interaction", |
| 558 interaction, |
| 559 MAX_INTERACTION); |
| 560 break; |
| 544 case TYPE_PHISHING: | 561 case TYPE_PHISHING: |
| 545 UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.interaction", | 562 UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.interaction", |
| 546 interaction, | 563 interaction, |
| 547 MAX_INTERACTION); | 564 MAX_INTERACTION); |
| 548 break; | 565 break; |
| 549 default: | |
| 550 NOTREACHED(); | |
| 551 } | 566 } |
| 552 | 567 |
| 553 #if defined(ENABLE_EXTENSIONS) | 568 #if defined(ENABLE_EXTENSIONS) |
| 554 if (!sampling_event_.get()) | 569 if (!sampling_event_.get()) |
| 555 return; | 570 return; |
| 556 switch (interaction) { | 571 switch (interaction) { |
| 557 case SHOW_LEARN_MORE: | 572 case SHOW_LEARN_MORE: |
| 558 sampling_event_->set_has_viewed_learn_more(true); | 573 sampling_event_->set_has_viewed_learn_more(true); |
| 559 break; | 574 break; |
| 560 case SHOW_ADVANCED: | 575 case SHOW_ADVANCED: |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 load_time_data.SetString( | 698 load_time_data.SetString( |
| 684 "closeDetails", | 699 "closeDetails", |
| 685 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON)); | 700 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON)); |
| 686 load_time_data.SetString( | 701 load_time_data.SetString( |
| 687 "primaryButtonText", | 702 "primaryButtonText", |
| 688 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON)); | 703 l10n_util::GetStringUTF16(IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON)); |
| 689 load_time_data.SetBoolean( | 704 load_time_data.SetBoolean( |
| 690 "overridable", | 705 "overridable", |
| 691 !IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)); | 706 !IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)); |
| 692 | 707 |
| 693 if (interstitial_type_ == TYPE_PHISHING) | 708 switch (interstitial_type_) { |
| 694 PopulatePhishingLoadTimeData(&load_time_data); | 709 case TYPE_MALWARE: |
| 695 else | 710 PopulateMalwareLoadTimeData(&load_time_data); |
| 696 PopulateMalwareLoadTimeData(&load_time_data); | 711 break; |
| 712 case TYPE_HARMFUL: |
| 713 PopulateHarmfulLoadTimeData(&load_time_data); |
| 714 break; |
| 715 case TYPE_PHISHING: |
| 716 PopulatePhishingLoadTimeData(&load_time_data); |
| 717 break; |
| 718 } |
| 697 | 719 |
| 698 base::StringPiece html( | 720 base::StringPiece html( |
| 699 ResourceBundle::GetSharedInstance().GetRawDataResource( | 721 ResourceBundle::GetSharedInstance().GetRawDataResource( |
| 700 IRD_SECURITY_INTERSTITIAL_HTML)); | 722 IRD_SECURITY_INTERSTITIAL_HTML)); |
| 701 webui::UseVersion2 version; | 723 webui::UseVersion2 version; |
| 702 return webui::GetI18nTemplateHtml(html, &load_time_data); | 724 return webui::GetI18nTemplateHtml(html, &load_time_data); |
| 703 } | 725 } |
| 704 | 726 |
| 705 void SafeBrowsingBlockingPage::PopulateMalwareLoadTimeData( | 727 void SafeBrowsingBlockingPage::PopulateMalwareLoadTimeData( |
| 706 base::DictionaryValue* load_time_data) { | 728 base::DictionaryValue* load_time_data) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 735 load_time_data->SetString( | 757 load_time_data->SetString( |
| 736 "optInLink", | 758 "optInLink", |
| 737 l10n_util::GetStringFUTF16(IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE, | 759 l10n_util::GetStringFUTF16(IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE, |
| 738 base::UTF8ToUTF16(privacy_link))); | 760 base::UTF8ToUTF16(privacy_link))); |
| 739 load_time_data->SetBoolean( | 761 load_time_data->SetBoolean( |
| 740 kBoxChecked, | 762 kBoxChecked, |
| 741 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled)); | 763 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled)); |
| 742 } | 764 } |
| 743 } | 765 } |
| 744 | 766 |
| 767 void SafeBrowsingBlockingPage::PopulateHarmfulLoadTimeData( |
| 768 base::DictionaryValue* load_time_data) { |
| 769 load_time_data->SetBoolean("phishing", false); |
| 770 load_time_data->SetString( |
| 771 "heading", l10n_util::GetStringUTF16(IDS_HARMFUL_V3_HEADING)); |
| 772 load_time_data->SetString( |
| 773 "primaryParagraph", |
| 774 l10n_util::GetStringFUTF16( |
| 775 IDS_HARMFUL_V3_PRIMARY_PARAGRAPH, |
| 776 base::UTF8ToUTF16(url_.host()))); |
| 777 load_time_data->SetString( |
| 778 "explanationParagraph", |
| 779 l10n_util::GetStringFUTF16( |
| 780 IDS_HARMFUL_V3_EXPLANATION_PARAGRAPH, |
| 781 base::UTF8ToUTF16(url_.host()))); |
| 782 load_time_data->SetString( |
| 783 "finalParagraph", |
| 784 l10n_util::GetStringUTF16(IDS_HARMFUL_V3_PROCEED_PARAGRAPH)); |
| 785 |
| 786 load_time_data->SetBoolean(kDisplayCheckBox, CanShowMalwareDetailsOption()); |
| 787 if (CanShowMalwareDetailsOption()) { |
| 788 std::string privacy_link = base::StringPrintf( |
| 789 kPrivacyLinkHtml, |
| 790 l10n_util::GetStringUTF8( |
| 791 IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE).c_str()); |
| 792 load_time_data->SetString( |
| 793 "optInLink", |
| 794 l10n_util::GetStringFUTF16(IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE, |
| 795 base::UTF8ToUTF16(privacy_link))); |
| 796 load_time_data->SetBoolean( |
| 797 kBoxChecked, |
| 798 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled)); |
| 799 } |
| 800 } |
| 801 |
| 745 void SafeBrowsingBlockingPage::PopulatePhishingLoadTimeData( | 802 void SafeBrowsingBlockingPage::PopulatePhishingLoadTimeData( |
| 746 base::DictionaryValue* load_time_data) { | 803 base::DictionaryValue* load_time_data) { |
| 747 load_time_data->SetBoolean("phishing", true); | 804 load_time_data->SetBoolean("phishing", true); |
| 748 load_time_data->SetString( | 805 load_time_data->SetString( |
| 749 "heading", | 806 "heading", |
| 750 l10n_util::GetStringUTF16(IDS_PHISHING_V3_HEADING)); | 807 l10n_util::GetStringUTF16(IDS_PHISHING_V3_HEADING)); |
| 751 load_time_data->SetString( | 808 load_time_data->SetString( |
| 752 "primaryParagraph", | 809 "primaryParagraph", |
| 753 l10n_util::GetStringFUTF16( | 810 l10n_util::GetStringFUTF16( |
| 754 IDS_PHISHING_V3_PRIMARY_PARAGRAPH, | 811 IDS_PHISHING_V3_PRIMARY_PARAGRAPH, |
| 755 base::UTF8ToUTF16(url_.host()))); | 812 base::UTF8ToUTF16(url_.host()))); |
| 756 load_time_data->SetString( | 813 load_time_data->SetString( |
| 757 "explanationParagraph", | 814 "explanationParagraph", |
| 758 l10n_util::GetStringFUTF16(IDS_PHISHING_V3_EXPLANATION_PARAGRAPH, | 815 l10n_util::GetStringFUTF16(IDS_PHISHING_V3_EXPLANATION_PARAGRAPH, |
| 759 base::UTF8ToUTF16(url_.host()))); | 816 base::UTF8ToUTF16(url_.host()))); |
| 760 load_time_data->SetString( | 817 load_time_data->SetString( |
| 761 "finalParagraph", | 818 "finalParagraph", |
| 762 l10n_util::GetStringUTF16(IDS_PHISHING_V3_PROCEED_PARAGRAPH)); | 819 l10n_util::GetStringUTF16(IDS_PHISHING_V3_PROCEED_PARAGRAPH)); |
| 763 } | 820 } |
| OLD | NEW |