| 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 fc3aa2c7d637203025e632e7f45777e2958b29f1..f7e31844002859ed9f9501deb8a9fb0b9806adf2 100644
|
| --- a/chrome/browser/safe_browsing/client_side_detection_service.cc
|
| +++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
|
| @@ -10,13 +10,18 @@
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/string_util.h"
|
| #include "base/stl_util.h"
|
| #include "base/task.h"
|
| #include "base/time.h"
|
| +#include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/safe_browsing/browser_features.h"
|
| +#include "chrome/browser/safe_browsing/safe_browsing_service.h"
|
| #include "chrome/common/net/http_return.h"
|
| #include "chrome/common/safe_browsing/client_model.pb.h"
|
| #include "chrome/common/safe_browsing/csd.pb.h"
|
| #include "chrome/common/safe_browsing/safebrowsing_messages.h"
|
| +#include "chrome/renderer/safe_browsing/features.h"
|
| #include "content/browser/browser_thread.h"
|
| #include "content/browser/renderer_host/render_process_host.h"
|
| #include "content/common/notification_service.h"
|
| @@ -63,8 +68,10 @@ ClientSideDetectionService::CacheState::CacheState(bool phish, base::Time time)
|
|
|
| ClientSideDetectionService::ClientSideDetectionService(
|
| net::URLRequestContextGetter* request_context_getter)
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
|
| + : sb_service_(g_browser_process->safe_browsing_service()),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
|
| request_context_getter_(request_context_getter) {
|
| + InitializeAllowedFeatures();
|
| registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
|
| NotificationService::AllSources());
|
| }
|
| @@ -237,6 +244,40 @@ void ClientSideDetectionService::EndFetchModel(ClientModelStatus status) {
|
| delay_ms);
|
| }
|
|
|
| +void ClientSideDetectionService::SanitizeRequestForPingback(
|
| + const ClientPhishingRequest& full_request,
|
| + ClientPhishingRequest* sanitized_request) {
|
| + DCHECK(full_request.IsInitialized());
|
| + sanitized_request->Clear();
|
| + if (full_request.has_suffix_prefix_hash()) {
|
| + sanitized_request->set_suffix_prefix_hash(
|
| + full_request.suffix_prefix_hash());
|
| + }
|
| + sanitized_request->set_client_score(full_request.client_score());
|
| + if (full_request.has_is_phishing()) {
|
| + sanitized_request->set_is_phishing(full_request.is_phishing());
|
| + }
|
| +
|
| + for (int i = 0; i < full_request.feature_map_size(); ++i) {
|
| + const ClientPhishingRequest_Feature& feature = full_request.feature_map(i);
|
| + if (allowed_features_.find(feature.name()) != allowed_features_.end()) {
|
| + sanitized_request->add_feature_map()->CopyFrom(feature);
|
| + }
|
| + }
|
| +
|
| + if (full_request.has_model_version()) {
|
| + sanitized_request->set_model_version(full_request.model_version());
|
| + }
|
| +
|
| + for (int i = 0; i < full_request.non_model_feature_map_size(); ++i) {
|
| + const ClientPhishingRequest_Feature& feature =
|
| + full_request.non_model_feature_map(i);
|
| + if (allowed_features_.find(feature.name()) != allowed_features_.end()) {
|
| + sanitized_request->add_non_model_feature_map()->CopyFrom(feature);
|
| + }
|
| + }
|
| +}
|
| +
|
| void ClientSideDetectionService::StartClientReportPhishingRequest(
|
| ClientPhishingRequest* verdict,
|
| ClientReportPhishingRequestCallback* callback) {
|
| @@ -244,8 +285,16 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
|
| scoped_ptr<ClientPhishingRequest> request(verdict);
|
| scoped_ptr<ClientReportPhishingRequestCallback> cb(callback);
|
|
|
| + // Create the version of the request proto that we'll send over the network.
|
| + ClientPhishingRequest request_to_send;
|
| + if (sb_service_ && sb_service_->CanReportStats()) {
|
| + request_to_send.CopyFrom(*request);
|
| + } else {
|
| + SanitizeRequestForPingback(*request, &request_to_send);
|
| + }
|
| +
|
| std::string request_data;
|
| - if (!request->SerializeToString(&request_data)) {
|
| + if (!request_to_send.SerializeToString(&request_data)) {
|
| UMA_HISTOGRAM_COUNTS("SBClientPhishing.RequestNotSerialized", 1);
|
| VLOG(1) << "Unable to serialize the CSD request. Proto file changed?";
|
| if (cb.get()) {
|
| @@ -435,6 +484,44 @@ bool ClientSideDetectionService::InitializePrivateNetworks() {
|
| return true;
|
| }
|
|
|
| +void ClientSideDetectionService::InitializeAllowedFeatures() {
|
| + static const char* const kAllowedFeatures[] = {
|
| + // Renderer (model) features.
|
| + features::kUrlHostIsIpAddress,
|
| + features::kUrlNumOtherHostTokensGTOne,
|
| + features::kUrlNumOtherHostTokensGTThree,
|
| + features::kPageHasForms,
|
| + features::kPageActionOtherDomainFreq,
|
| + features::kPageHasTextInputs,
|
| + features::kPageHasPswdInputs,
|
| + features::kPageHasRadioInputs,
|
| + features::kPageHasCheckInputs,
|
| + features::kPageExternalLinksFreq,
|
| + features::kPageSecureLinksFreq,
|
| + features::kPageNumScriptTagsGTOne,
|
| + features::kPageNumScriptTagsGTSix,
|
| + features::kPageImgOtherDomainFreq,
|
| + // Browser (non-model) features.
|
| + features::kUrlHistoryVisitCount,
|
| + features::kUrlHistoryTypedCount,
|
| + features::kUrlHistoryLinkCount,
|
| + features::kUrlHistoryVisitCountMoreThan24hAgo,
|
| + features::kHttpHostVisitCount,
|
| + features::kHttpsHostVisitCount,
|
| + features::kFirstHttpHostVisitMoreThan24hAgo,
|
| + features::kFirstHttpsHostVisitMoreThan24hAgo,
|
| + features::kHasSSLReferrer,
|
| + features::kPageTransitionType,
|
| + features::kIsFirstNavigation,
|
| + features::kSafeBrowsingIsSubresource,
|
| + features::kSafeBrowsingThreatType,
|
| + };
|
| +
|
| + for (size_t i = 0; i < arraysize(kAllowedFeatures); ++i) {
|
| + allowed_features_.insert(kAllowedFeatures[i]);
|
| + }
|
| +}
|
| +
|
| // static
|
| void ClientSideDetectionService::SetBadSubnets(const ClientSideModel& model,
|
| BadSubnetMap* bad_subnets) {
|
|
|