| 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 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 using content::BrowserThread; | 52 using content::BrowserThread; |
| 53 using content::NavigationEntry; | 53 using content::NavigationEntry; |
| 54 using content::WebContents; | 54 using content::WebContents; |
| 55 | 55 |
| 56 namespace { | 56 namespace { |
| 57 | 57 |
| 58 // Filename suffix for the cookie database. | 58 // Filename suffix for the cookie database. |
| 59 const FilePath::CharType kCookiesFile[] = FILE_PATH_LITERAL(" Cookies"); | 59 const FilePath::CharType kCookiesFile[] = FILE_PATH_LITERAL(" Cookies"); |
| 60 | 60 |
| 61 // The default URL prefix where browser fetches chunk updates, hashes, | 61 // The default URL prefix where browser fetches chunk updates, hashes, |
| 62 // and reports safe browsing hits. | 62 // and reports safe browsing hits and malware details. |
| 63 const char* const kSbDefaultInfoURLPrefix = | 63 const char* const kSbDefaultURLPrefix = |
| 64 "http://safebrowsing.clients.google.com/safebrowsing"; | 64 "https://safebrowsing.google.com/safebrowsing"; |
| 65 | |
| 66 // The default URL prefix where browser fetches MAC client key and reports | |
| 67 // malware details. | |
| 68 const char* const kSbDefaultMacKeyURLPrefix = | |
| 69 "https://sb-ssl.google.com/safebrowsing"; | |
| 70 | 65 |
| 71 // When download url check takes this long, client's callback will be called | 66 // When download url check takes this long, client's callback will be called |
| 72 // without waiting for the result. | 67 // without waiting for the result. |
| 73 const int64 kDownloadUrlCheckTimeoutMs = 10000; | 68 const int64 kDownloadUrlCheckTimeoutMs = 10000; |
| 74 | 69 |
| 75 // Similar to kDownloadUrlCheckTimeoutMs, but for download hash checks. | 70 // Similar to kDownloadUrlCheckTimeoutMs, but for download hash checks. |
| 76 const int64 kDownloadHashCheckTimeoutMs = 10000; | 71 const int64 kDownloadHashCheckTimeoutMs = 10000; |
| 77 | 72 |
| 78 // Records disposition information about the check. |hit| should be | 73 // Records disposition information about the check. |hit| should be |
| 79 // |true| if there were any prefix hits in |full_hashes|. | 74 // |true| if there were any prefix hits in |full_hashes|. |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 | 574 |
| 580 if (proceed) { | 575 if (proceed) { |
| 581 BrowserThread::PostTask( | 576 BrowserThread::PostTask( |
| 582 BrowserThread::UI, | 577 BrowserThread::UI, |
| 583 FROM_HERE, | 578 FROM_HERE, |
| 584 base::Bind(&SafeBrowsingService::UpdateWhitelist, this, resource)); | 579 base::Bind(&SafeBrowsingService::UpdateWhitelist, this, resource)); |
| 585 } | 580 } |
| 586 } | 581 } |
| 587 } | 582 } |
| 588 | 583 |
| 589 void SafeBrowsingService::OnNewMacKeys(const std::string& client_key, | |
| 590 const std::string& wrapped_key) { | |
| 591 PrefService* prefs = g_browser_process->local_state(); | |
| 592 if (prefs) { | |
| 593 prefs->SetString(prefs::kSafeBrowsingClientKey, client_key); | |
| 594 prefs->SetString(prefs::kSafeBrowsingWrappedKey, wrapped_key); | |
| 595 } | |
| 596 } | |
| 597 | |
| 598 net::URLRequestContextGetter* SafeBrowsingService::url_request_context() { | 584 net::URLRequestContextGetter* SafeBrowsingService::url_request_context() { |
| 599 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 585 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 600 return url_request_context_getter_.get(); | 586 return url_request_context_getter_.get(); |
| 601 } | 587 } |
| 602 | 588 |
| 603 // static | |
| 604 void SafeBrowsingService::RegisterPrefs(PrefService* prefs) { | |
| 605 prefs->RegisterStringPref(prefs::kSafeBrowsingClientKey, ""); | |
| 606 prefs->RegisterStringPref(prefs::kSafeBrowsingWrappedKey, ""); | |
| 607 } | |
| 608 | |
| 609 void SafeBrowsingService::ResetDatabase() { | 589 void SafeBrowsingService::ResetDatabase() { |
| 610 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 590 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 611 DCHECK(enabled_); | 591 DCHECK(enabled_); |
| 612 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( | 592 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( |
| 613 &SafeBrowsingService::OnResetDatabase, this)); | 593 &SafeBrowsingService::OnResetDatabase, this)); |
| 614 } | 594 } |
| 615 | 595 |
| 616 void SafeBrowsingService::PurgeMemory() { | 596 void SafeBrowsingService::PurgeMemory() { |
| 617 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 597 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 618 CloseDatabase(); | 598 CloseDatabase(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 646 // Need to do the CheckForLeaks on IOThread instead of in ShutDown where | 626 // Need to do the CheckForLeaks on IOThread instead of in ShutDown where |
| 647 // url_request_context_getter_ is cleared, since the URLRequestContextGetter | 627 // url_request_context_getter_ is cleared, since the URLRequestContextGetter |
| 648 // will PostTask to IOTread to delete itself. | 628 // will PostTask to IOTread to delete itself. |
| 649 using base::debug::LeakTracker; | 629 using base::debug::LeakTracker; |
| 650 LeakTracker<SafeBrowsingURLRequestContextGetter>::CheckForLeaks(); | 630 LeakTracker<SafeBrowsingURLRequestContextGetter>::CheckForLeaks(); |
| 651 | 631 |
| 652 DCHECK(url_request_context_.get()); | 632 DCHECK(url_request_context_.get()); |
| 653 url_request_context_ = NULL; | 633 url_request_context_ = NULL; |
| 654 } | 634 } |
| 655 | 635 |
| 656 void SafeBrowsingService::StartOnIOThread( | 636 void SafeBrowsingService::StartOnIOThread() { |
| 657 const std::string& client_key, | |
| 658 const std::string& wrapped_key) { | |
| 659 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 637 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 660 if (enabled_) | 638 if (enabled_) |
| 661 return; | 639 return; |
| 662 DCHECK(!safe_browsing_thread_.get()); | 640 DCHECK(!safe_browsing_thread_.get()); |
| 663 safe_browsing_thread_.reset(new base::Thread("Chrome_SafeBrowsingThread")); | 641 safe_browsing_thread_.reset(new base::Thread("Chrome_SafeBrowsingThread")); |
| 664 if (!safe_browsing_thread_->Start()) | 642 if (!safe_browsing_thread_->Start()) |
| 665 return; | 643 return; |
| 666 enabled_ = true; | 644 enabled_ = true; |
| 667 | 645 |
| 668 registrar_.reset(new content::NotificationRegistrar); | 646 registrar_.reset(new content::NotificationRegistrar); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 679 #if defined(GOOGLE_CHROME_BUILD) | 657 #if defined(GOOGLE_CHROME_BUILD) |
| 680 std::string client_name("googlechrome"); | 658 std::string client_name("googlechrome"); |
| 681 #else | 659 #else |
| 682 std::string client_name("chromium"); | 660 std::string client_name("chromium"); |
| 683 #endif | 661 #endif |
| 684 #endif | 662 #endif |
| 685 CommandLine* cmdline = CommandLine::ForCurrentProcess(); | 663 CommandLine* cmdline = CommandLine::ForCurrentProcess(); |
| 686 bool disable_auto_update = | 664 bool disable_auto_update = |
| 687 cmdline->HasSwitch(switches::kSbDisableAutoUpdate) || | 665 cmdline->HasSwitch(switches::kSbDisableAutoUpdate) || |
| 688 cmdline->HasSwitch(switches::kDisableBackgroundNetworking); | 666 cmdline->HasSwitch(switches::kDisableBackgroundNetworking); |
| 689 std::string info_url_prefix = | 667 std::string url_prefix = |
| 690 cmdline->HasSwitch(switches::kSbInfoURLPrefix) ? | 668 cmdline->HasSwitch(switches::kSbURLPrefix) ? |
| 691 cmdline->GetSwitchValueASCII(switches::kSbInfoURLPrefix) : | 669 cmdline->GetSwitchValueASCII(switches::kSbURLPrefix) : |
| 692 kSbDefaultInfoURLPrefix; | 670 kSbDefaultURLPrefix; |
| 693 std::string mackey_url_prefix = | |
| 694 cmdline->HasSwitch(switches::kSbMacKeyURLPrefix) ? | |
| 695 cmdline->GetSwitchValueASCII(switches::kSbMacKeyURLPrefix) : | |
| 696 kSbDefaultMacKeyURLPrefix; | |
| 697 | 671 |
| 698 DCHECK(!protocol_manager_); | 672 DCHECK(!protocol_manager_); |
| 699 protocol_manager_ = | 673 protocol_manager_ = |
| 700 SafeBrowsingProtocolManager::Create(this, | 674 SafeBrowsingProtocolManager::Create(this, |
| 701 client_name, | 675 client_name, |
| 702 client_key, | |
| 703 wrapped_key, | |
| 704 url_request_context_getter_, | 676 url_request_context_getter_, |
| 705 info_url_prefix, | 677 url_prefix, |
| 706 mackey_url_prefix, | |
| 707 disable_auto_update); | 678 disable_auto_update); |
| 708 | 679 |
| 709 protocol_manager_->Initialize(); | 680 protocol_manager_->Initialize(); |
| 710 } | 681 } |
| 711 | 682 |
| 712 void SafeBrowsingService::StopOnIOThread() { | 683 void SafeBrowsingService::StopOnIOThread() { |
| 713 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 684 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 714 if (!enabled_) | 685 if (!enabled_) |
| 715 return; | 686 return; |
| 716 | 687 |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 void SafeBrowsingService::DatabaseUpdateFinished(bool update_succeeded) { | 969 void SafeBrowsingService::DatabaseUpdateFinished(bool update_succeeded) { |
| 999 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 970 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| 1000 GetDatabase()->UpdateFinished(update_succeeded); | 971 GetDatabase()->UpdateFinished(update_succeeded); |
| 1001 DCHECK(database_update_in_progress_); | 972 DCHECK(database_update_in_progress_); |
| 1002 database_update_in_progress_ = false; | 973 database_update_in_progress_ = false; |
| 1003 } | 974 } |
| 1004 | 975 |
| 1005 void SafeBrowsingService::Start() { | 976 void SafeBrowsingService::Start() { |
| 1006 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 977 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1007 | 978 |
| 1008 // Retrieve client MAC keys. | |
| 1009 PrefService* local_state = g_browser_process->local_state(); | |
| 1010 DCHECK(local_state); | |
| 1011 std::string client_key, wrapped_key; | |
| 1012 if (local_state) { | |
| 1013 client_key = | |
| 1014 local_state->GetString(prefs::kSafeBrowsingClientKey); | |
| 1015 wrapped_key = | |
| 1016 local_state->GetString(prefs::kSafeBrowsingWrappedKey); | |
| 1017 } | |
| 1018 | |
| 1019 CommandLine* cmdline = CommandLine::ForCurrentProcess(); | 979 CommandLine* cmdline = CommandLine::ForCurrentProcess(); |
| 1020 enable_download_protection_ = | 980 enable_download_protection_ = |
| 1021 !cmdline->HasSwitch(switches::kSbDisableDownloadProtection); | 981 !cmdline->HasSwitch(switches::kSbDisableDownloadProtection); |
| 1022 | 982 |
| 1023 // We only download the csd-whitelist if client-side phishing detection is | 983 // We only download the csd-whitelist if client-side phishing detection is |
| 1024 // enabled. | 984 // enabled. |
| 1025 #ifdef OS_CHROMEOS | 985 #ifdef OS_CHROMEOS |
| 1026 // Client-side detection is disabled on ChromeOS for now, so don't bother | 986 // Client-side detection is disabled on ChromeOS for now, so don't bother |
| 1027 // downloading the whitelist. | 987 // downloading the whitelist. |
| 1028 enable_csd_whitelist_ = false; | 988 enable_csd_whitelist_ = false; |
| 1029 #else | 989 #else |
| 1030 enable_csd_whitelist_ = | 990 enable_csd_whitelist_ = |
| 1031 !cmdline->HasSwitch(switches::kDisableClientSidePhishingDetection); | 991 !cmdline->HasSwitch(switches::kDisableClientSidePhishingDetection); |
| 1032 #endif | 992 #endif |
| 1033 | 993 |
| 1034 // TODO(noelutz): remove this boolean variable since it should always be true | 994 // TODO(noelutz): remove this boolean variable since it should always be true |
| 1035 // if SafeBrowsing is enabled. Unfortunately, we have no test data for this | 995 // if SafeBrowsing is enabled. Unfortunately, we have no test data for this |
| 1036 // list right now. This means that we need to be able to disable this list | 996 // list right now. This means that we need to be able to disable this list |
| 1037 // for the SafeBrowsing test to pass. | 997 // for the SafeBrowsing test to pass. |
| 1038 enable_download_whitelist_ = enable_csd_whitelist_; | 998 enable_download_whitelist_ = enable_csd_whitelist_; |
| 1039 | 999 |
| 1040 BrowserThread::PostTask( | 1000 BrowserThread::PostTask( |
| 1041 BrowserThread::IO, FROM_HERE, | 1001 BrowserThread::IO, FROM_HERE, |
| 1042 base::Bind(&SafeBrowsingService::StartOnIOThread, | 1002 base::Bind(&SafeBrowsingService::StartOnIOThread, this)); |
| 1043 this, client_key, wrapped_key)); | |
| 1044 } | 1003 } |
| 1045 | 1004 |
| 1046 void SafeBrowsingService::Stop() { | 1005 void SafeBrowsingService::Stop() { |
| 1047 BrowserThread::PostTask( | 1006 BrowserThread::PostTask( |
| 1048 BrowserThread::IO, FROM_HERE, | 1007 BrowserThread::IO, FROM_HERE, |
| 1049 base::Bind(&SafeBrowsingService::StopOnIOThread, this)); | 1008 base::Bind(&SafeBrowsingService::StopOnIOThread, this)); |
| 1050 } | 1009 } |
| 1051 | 1010 |
| 1052 void SafeBrowsingService::OnCloseDatabase() { | 1011 void SafeBrowsingService::OnCloseDatabase() { |
| 1053 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); | 1012 DCHECK_EQ(MessageLoop::current(), safe_browsing_thread_->message_loop()); |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1460 Stop(); | 1419 Stop(); |
| 1461 | 1420 |
| 1462 if (csd_service_.get()) | 1421 if (csd_service_.get()) |
| 1463 csd_service_->SetEnabledAndRefreshState(enable); | 1422 csd_service_->SetEnabledAndRefreshState(enable); |
| 1464 if (download_service_.get()) { | 1423 if (download_service_.get()) { |
| 1465 download_service_->SetEnabled( | 1424 download_service_->SetEnabled( |
| 1466 enable && !CommandLine::ForCurrentProcess()->HasSwitch( | 1425 enable && !CommandLine::ForCurrentProcess()->HasSwitch( |
| 1467 switches::kDisableImprovedDownloadProtection)); | 1426 switches::kDisableImprovedDownloadProtection)); |
| 1468 } | 1427 } |
| 1469 } | 1428 } |
| OLD | NEW |