Index: chrome/browser/safe_browsing/client_side_detection_service.cc |
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc |
index 0c29e3ebf183072e0d74d23dabbe98d0cd53d651..22df39d624779de161f7f199ff03ffc78e54f00b 100644 |
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc |
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc |
@@ -9,18 +9,26 @@ |
#include "base/file_util_proxy.h" |
#include "base/logging.h" |
#include "base/message_loop.h" |
+#include "base/metrics/histogram.h" |
#include "base/platform_file.h" |
#include "base/scoped_ptr.h" |
#include "base/stl_util-inl.h" |
#include "base/task.h" |
+#include "chrome/browser/browser_process.h" |
#include "chrome/browser/browser_thread.h" |
+#include "chrome/browser/renderer_host/resource_dispatcher_host.h" |
#include "chrome/browser/safe_browsing/csd.pb.h" |
+#include "chrome/browser/safe_browsing/safe_browsing_service.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "chrome/browser/tab_contents/tab_util.h" |
+#include "chrome/common/chrome_switches.h" |
#include "chrome/common/net/http_return.h" |
#include "chrome/common/net/url_fetcher.h" |
#include "chrome/common/net/url_request_context_getter.h" |
#include "googleurl/src/gurl.h" |
#include "net/base/load_flags.h" |
#include "net/url_request/url_request_status.h" |
+#include "webkit/glue/resource_type.h" |
namespace safe_browsing { |
@@ -29,6 +37,80 @@ const char ClientSideDetectionService::kClientReportPhishingUrl[] = |
const char ClientSideDetectionService::kClientModelUrl[] = |
"https://ssl.gstatic.com/safebrowsing/csd/client_model_v0.pb"; |
+CsdClient::CsdClient(int render_process_id, int render_view_id) |
+ : render_process_id_(render_process_id), |
+ render_view_id_(render_view_id), |
+ navigated_away_(false) {} |
+ |
+CsdClient::~CsdClient() {} |
+ |
+void CsdClient::OnUrlCheckResult(const GURL& url, |
lzheng
2011/01/25 00:43:43
I don't think this is actually used? The interface
noelutz
2011/02/10 01:16:23
Removed.
|
+ SafeBrowsingService::UrlCheckResult result) { |
+ delete this; |
Brian Ryner
2011/01/20 23:36:40
This looks a little odd at first glance, can you a
noelutz
2011/02/10 01:16:23
Done.
|
+} |
+ |
+void CsdClient::OnBlockingPageComplete(bool proceed) { |
+ delete this; |
+} |
+ |
+void CsdClient::MaybeShowPhishingInterstitial(GURL phishing_url, |
+ bool is_phishing) { |
+ if (navigated_away_) { |
+ // The user already navigated away from the phishing page. The server was |
+ // too slow. |
+ UMA_HISTOGRAM_COUNTS("SBClientPhishing.ServerVerdictTooLate", 1); |
+ } |
+ TabContents* tab = tab_util::GetTabContentsByID(render_process_id_, |
+ render_view_id_); |
+ if (tab) { |
+ // No matter what we need to remove ourselves as a navigation observer if |
+ // the tab still exists. |
+ tab->RemoveNavigationObserver(this); |
+ |
+ if (is_phishing && |
+ CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableClientSidePhishingInterstitial)) { |
+ // While we are on the UI thread we make sure that the user did not |
+ // navigate away from the phishing page while we were busy checking |
+ // whether or not the page is phishing. |
+ // TODO(noelutz): this is not perfect. It's still possible that the |
+ // user browses away before the interstitial is shown. Maybe we should |
+ // stop all pending navigations? |
+ ResourceDispatcherHost* resource = |
+ g_browser_process->resource_dispatcher_host(); |
+ if (!navigated_away_ && resource && resource->safe_browsing_service()) { |
+ // TODO(noelutz): refactor this code so that we don't need to use |
+ // the SafeBrowsing service class. |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ NewRunnableMethod(resource->safe_browsing_service(), |
+ &SafeBrowsingService::DisplayBlockingPage, |
+ phishing_url, phishing_url, |
+ // We only classify the main frame URL. |
+ ResourceType::MAIN_FRAME, |
+ // TODO(noelutz): create a separate threat type |
+ // for client-side phishing detection. |
+ SafeBrowsingService::URL_PHISHING, |
+ this, |
+ render_process_id_, |
+ render_view_id_)); |
+ return; // don't delete this object yet. |
+ } |
+ } |
+ } |
+ delete this; |
+} |
+ |
+void CsdClient::DidNavigateMainFramePostCommit( |
+ const NavigationController::LoadCommittedDetails& details, |
+ const ViewHostMsg_FrameNavigate_Params& params) { |
+ // If a sub-frame navigation happens we still consider the main-frame as |
+ // phishing if both the client and the server agree that the main-frame |
+ // is phishing. |
+ navigated_away_ = details.is_main_frame; |
+} |
+ |
struct ClientSideDetectionService::ClientReportInfo { |
scoped_ptr<ClientReportPhishingRequestCallback> callback; |
GURL phishing_url; |
@@ -253,6 +335,7 @@ void ClientSideDetectionService::StartClientReportPhishingRequest( |
fetcher->set_request_context(request_context_getter_.get()); |
fetcher->set_upload_data("application/octet-stream", request_data); |
fetcher->Start(); |
+ LOG(INFO) << "Start sending csd request"; |
Brian Ryner
2011/01/20 23:36:40
Make this a VLOG?
noelutz
2011/02/10 01:16:23
Removed. Needed only for debugging.
|
} |
void ClientSideDetectionService::HandleModelResponse( |
@@ -293,6 +376,7 @@ void ClientSideDetectionService::HandlePhishingVerdict( |
int response_code, |
const ResponseCookies& cookies, |
const std::string& data) { |
+ LOG(INFO) << "Stop sending csd request"; |
Brian Ryner
2011/01/20 23:36:40
Same here.
noelutz
2011/02/10 01:16:23
Removed. Needed only for debugging.
|
ClientPhishingResponse response; |
scoped_ptr<ClientReportInfo> info(client_phishing_reports_[source]); |
if (status.is_success() && RC_REQUEST_OK == response_code && |
@@ -300,7 +384,8 @@ void ClientSideDetectionService::HandlePhishingVerdict( |
info->callback->Run(info->phishing_url, response.phishy()); |
} else { |
DLOG(ERROR) << "Unable to get the server verdict for URL: " |
- << info->phishing_url; |
+ << info->phishing_url << " status: " << status.status() << " " |
+ << "response_code:" << response_code; |
info->callback->Run(info->phishing_url, false); |
} |
client_phishing_reports_.erase(source); |