OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <map> | 5 #include <map> |
6 #include <queue> | 6 #include <queue> |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/stringprintf.h" |
13 #include "base/task.h" | 14 #include "base/task.h" |
14 #include "base/time.h" | 15 #include "base/time.h" |
| 16 #include "chrome/browser/safe_browsing/browser_features.h" |
15 #include "chrome/browser/safe_browsing/client_side_detection_service.h" | 17 #include "chrome/browser/safe_browsing/client_side_detection_service.h" |
16 #include "chrome/common/safe_browsing/client_model.pb.h" | 18 #include "chrome/common/safe_browsing/client_model.pb.h" |
17 #include "chrome/common/safe_browsing/csd.pb.h" | 19 #include "chrome/common/safe_browsing/csd.pb.h" |
| 20 #include "chrome/renderer/safe_browsing/features.h" |
18 #include "chrome/test/base/testing_browser_process_test.h" | 21 #include "chrome/test/base/testing_browser_process_test.h" |
19 #include "content/browser/browser_thread.h" | 22 #include "content/browser/browser_thread.h" |
20 #include "content/common/url_fetcher.h" | 23 #include "content/common/url_fetcher.h" |
21 #include "content/test/test_url_fetcher_factory.h" | 24 #include "content/test/test_url_fetcher_factory.h" |
22 #include "crypto/sha2.h" | 25 #include "crypto/sha2.h" |
23 #include "googleurl/src/gurl.h" | 26 #include "googleurl/src/gurl.h" |
24 #include "net/url_request/url_request_status.h" | 27 #include "net/url_request/url_request_status.h" |
25 #include "testing/gmock/include/gmock/gmock.h" | 28 #include "testing/gmock/include/gmock/gmock.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
27 | 30 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 EXPECT_TRUE(csd_service_->GetValidCachedResult( | 159 EXPECT_TRUE(csd_service_->GetValidCachedResult( |
157 GURL("http://first.url.com"), &is_phishing)); | 160 GURL("http://first.url.com"), &is_phishing)); |
158 EXPECT_FALSE(is_phishing); | 161 EXPECT_FALSE(is_phishing); |
159 EXPECT_FALSE(csd_service_->GetValidCachedResult( | 162 EXPECT_FALSE(csd_service_->GetValidCachedResult( |
160 GURL("http://third.url.com"), &is_phishing)); | 163 GURL("http://third.url.com"), &is_phishing)); |
161 EXPECT_TRUE(csd_service_->GetValidCachedResult( | 164 EXPECT_TRUE(csd_service_->GetValidCachedResult( |
162 GURL("http://fourth.url.com"), &is_phishing)); | 165 GURL("http://fourth.url.com"), &is_phishing)); |
163 EXPECT_TRUE(is_phishing); | 166 EXPECT_TRUE(is_phishing); |
164 } | 167 } |
165 | 168 |
| 169 void AddFeature(const std::string& name, double value, |
| 170 ClientPhishingRequest* request) { |
| 171 ClientPhishingRequest_Feature* feature = request->add_feature_map(); |
| 172 feature->set_name(name); |
| 173 feature->set_value(value); |
| 174 } |
| 175 |
| 176 void AddNonModelFeature(const std::string& name, double value, |
| 177 ClientPhishingRequest* request) { |
| 178 ClientPhishingRequest_Feature* feature = |
| 179 request->add_non_model_feature_map(); |
| 180 feature->set_name(name); |
| 181 feature->set_value(value); |
| 182 } |
| 183 |
166 protected: | 184 protected: |
167 scoped_ptr<ClientSideDetectionService> csd_service_; | 185 scoped_ptr<ClientSideDetectionService> csd_service_; |
168 scoped_ptr<FakeURLFetcherFactory> factory_; | 186 scoped_ptr<FakeURLFetcherFactory> factory_; |
169 MessageLoop msg_loop_; | 187 MessageLoop msg_loop_; |
170 | 188 |
171 private: | 189 private: |
172 void SendRequestDone(GURL phishing_url, bool is_phishing) { | 190 void SendRequestDone(GURL phishing_url, bool is_phishing) { |
173 ASSERT_EQ(phishing_url, phishing_url_); | 191 ASSERT_EQ(phishing_url, phishing_url_); |
174 is_phishing_ = is_phishing; | 192 is_phishing_ = is_phishing; |
175 msg_loop_.Quit(); | 193 msg_loop_.Quit(); |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 EXPECT_CALL(*service, ScheduleFetchModel(_)) | 657 EXPECT_CALL(*service, ScheduleFetchModel(_)) |
640 .WillOnce(Invoke(service, &MockClientSideDetectionService::Schedule)); | 658 .WillOnce(Invoke(service, &MockClientSideDetectionService::Schedule)); |
641 EXPECT_CALL(*service, EndFetchModel( | 659 EXPECT_CALL(*service, EndFetchModel( |
642 ClientSideDetectionService::MODEL_NOT_CHANGED)) | 660 ClientSideDetectionService::MODEL_NOT_CHANGED)) |
643 .WillOnce(Invoke(service, &MockClientSideDetectionService::Disable)); | 661 .WillOnce(Invoke(service, &MockClientSideDetectionService::Disable)); |
644 csd_service_->SetEnabled(true); | 662 csd_service_->SetEnabled(true); |
645 EXPECT_FALSE(SendClientReportPhishingRequest(GURL("http://a.com/"), 0.4f)); | 663 EXPECT_FALSE(SendClientReportPhishingRequest(GURL("http://a.com/"), 0.4f)); |
646 Mock::VerifyAndClearExpectations(service); | 664 Mock::VerifyAndClearExpectations(service); |
647 } | 665 } |
648 | 666 |
| 667 TEST_F(ClientSideDetectionServiceTest, SanitizeRequestForPingback) { |
| 668 ClientPhishingRequest request; |
| 669 request.set_url("http://www.us.host.com/blah"); |
| 670 request.set_suffix_prefix_hash("hash"); |
| 671 request.set_client_score(0.8f); |
| 672 request.set_is_phishing(true); |
| 673 AddFeature(std::string(features::kUrlTldToken) + "com", 1.0, &request); |
| 674 AddFeature(std::string(features::kUrlDomainToken) + "host", 1.0, &request); |
| 675 AddFeature(std::string(features::kUrlOtherHostToken) + "us", 1.0, &request); |
| 676 AddFeature(std::string(features::kUrlOtherHostToken) + "www", 1.0, &request); |
| 677 AddFeature(features::kUrlNumOtherHostTokensGTOne, 1.0, &request); |
| 678 AddFeature(std::string(features::kUrlPathToken) + "blah", 1.0, &request); |
| 679 AddFeature(features::kPageHasForms, 1.0, &request); |
| 680 AddFeature(std::string(features::kPageTerm) + "term", 1.0, &request); |
| 681 AddFeature(features::kPageImgOtherDomainFreq, 0.5, &request); |
| 682 request.set_model_version(3); |
| 683 AddNonModelFeature(features::kUrlHistoryVisitCount, 5.0, &request); |
| 684 AddNonModelFeature(StringPrintf("%s=http://referrer.com/", |
| 685 features::kReferrer), |
| 686 1.0, &request); |
| 687 AddNonModelFeature(StringPrintf("%s%s=http://redirreferrer.com/", |
| 688 features::kRedirectPrefix, |
| 689 features::kReferrer), |
| 690 1.0, &request); |
| 691 AddNonModelFeature(StringPrintf("%s%s=http://hostreferrer.com/", |
| 692 features::kHostPrefix, features::kReferrer), |
| 693 1.0, &request); |
| 694 AddNonModelFeature(StringPrintf("%s%s%s=http://hostredirreferrer.com/", |
| 695 features::kHostPrefix, |
| 696 features::kRedirectPrefix, |
| 697 features::kReferrer), |
| 698 1.0, &request); |
| 699 AddNonModelFeature(std::string(features::kBadIpFetch) + "1.2.3.4", |
| 700 1.0, &request); |
| 701 AddNonModelFeature(std::string(features::kSafeBrowsingMaliciousUrl) + |
| 702 "http://malicious.com/", 1.0, &request); |
| 703 AddNonModelFeature(std::string(features::kSafeBrowsingOriginalUrl) + |
| 704 "http://original.com/", 1.0, &request); |
| 705 |
| 706 csd_service_.reset(ClientSideDetectionService::Create(NULL)); |
| 707 |
| 708 ClientPhishingRequest sanitized_request; |
| 709 csd_service_->SanitizeRequestForPingback(request, &sanitized_request); |
| 710 |
| 711 // For easier debugging, we'll check the output protobuf fields individually. |
| 712 ClientPhishingRequest expected; |
| 713 expected.set_suffix_prefix_hash(request.suffix_prefix_hash()); |
| 714 expected.set_client_score(request.client_score()); |
| 715 expected.set_is_phishing(request.is_phishing()); |
| 716 AddFeature(features::kUrlNumOtherHostTokensGTOne, 1.0, &expected); |
| 717 AddFeature(features::kPageHasForms, 1.0, &expected); |
| 718 AddFeature(features::kPageImgOtherDomainFreq, 0.5, &expected); |
| 719 expected.set_model_version(3); |
| 720 AddNonModelFeature(features::kUrlHistoryVisitCount, 5.0, &expected); |
| 721 |
| 722 EXPECT_FALSE(sanitized_request.has_url()); |
| 723 EXPECT_EQ(expected.suffix_prefix_hash(), |
| 724 sanitized_request.suffix_prefix_hash()); |
| 725 EXPECT_FLOAT_EQ(expected.client_score(), sanitized_request.client_score()); |
| 726 EXPECT_EQ(expected.is_phishing(), sanitized_request.is_phishing()); |
| 727 |
| 728 ASSERT_EQ(expected.feature_map_size(), sanitized_request.feature_map_size()); |
| 729 for (int i = 0; i < expected.feature_map_size(); ++i) { |
| 730 EXPECT_EQ(expected.feature_map(i).name(), |
| 731 sanitized_request.feature_map(i).name()) << "Feature " << i; |
| 732 EXPECT_DOUBLE_EQ(expected.feature_map(i).value(), |
| 733 sanitized_request.feature_map(i).value()) |
| 734 << "Feature " << i; |
| 735 } |
| 736 EXPECT_EQ(expected.model_version(), sanitized_request.model_version()); |
| 737 ASSERT_EQ(expected.non_model_feature_map_size(), |
| 738 sanitized_request.non_model_feature_map_size()); |
| 739 for (int i = 0; i < expected.non_model_feature_map_size(); ++i) { |
| 740 EXPECT_EQ(expected.non_model_feature_map(i).name(), |
| 741 sanitized_request.non_model_feature_map(i).name()) |
| 742 << "Non-model feature " << i; |
| 743 EXPECT_DOUBLE_EQ(expected.non_model_feature_map(i).value(), |
| 744 sanitized_request.non_model_feature_map(i).value()) |
| 745 << "Non-model feature " << i; |
| 746 } |
| 747 |
| 748 // Also check the serialized forms in case there's a field that we forget |
| 749 // to add above. |
| 750 EXPECT_EQ(expected.SerializeAsString(), |
| 751 sanitized_request.SerializeAsString()); |
| 752 } |
| 753 |
649 } // namespace safe_browsing | 754 } // namespace safe_browsing |
OLD | NEW |