123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- // Copyright 2020 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "components/reputation/core/safety_tips_config.h"
- #include "components/reputation/core/safety_tip_test_utils.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "url/gurl.h"
- namespace reputation {
- // Build an allowlist with testable scoped allowlist entries.
- void ConfigureAllowlistWithScopes() {
- auto config_proto = GetOrCreateSafetyTipsConfig();
- config_proto->clear_allowed_pattern();
- config_proto->clear_canonical_pattern();
- config_proto->clear_cohort();
- // Note that allowed_pattern *must* stay sorted.
- // error-canonical-index.tld has a cohort with an invalid allowed index.
- auto* pattern_bad_allowed = config_proto->add_allowed_pattern();
- pattern_bad_allowed->set_pattern("error-allowed-index.tld/");
- auto* cohort_bad_allowed = config_proto->add_cohort();
- cohort_bad_allowed->add_allowed_index(100);
- pattern_bad_allowed->add_cohort_index(0); // cohort_bad_allowed
- // error-canonical-index.tld has a cohort with an invalid canonical index.
- auto* pattern_bad_canonical = config_proto->add_allowed_pattern();
- pattern_bad_canonical->set_pattern("error-canonical-index.tld/");
- auto* cohort_bad_canonical = config_proto->add_cohort();
- cohort_bad_canonical->add_canonical_index(100);
- pattern_bad_canonical->add_cohort_index(1); // cohort_bad_canonical
- // error-cohort-index.tld has an invalid index.
- auto* pattern_bad_cohort = config_proto->add_allowed_pattern();
- pattern_bad_cohort->set_pattern("error-cohort-index.tld/");
- pattern_bad_cohort->add_cohort_index(100);
- // siteA.tld is only a canonical_pattern, so can't spoof anyone.
- config_proto->add_canonical_pattern()->set_pattern("sitea.tld/");
- // siteB.tld is only allowed to spoof siteA.tld and itself.
- auto* pattern_b = config_proto->add_allowed_pattern();
- pattern_b->set_pattern("siteb.tld/");
- auto* cohort_b = config_proto->add_cohort();
- cohort_b->add_allowed_index(3); // siteB
- cohort_b->add_canonical_index(0); // siteA
- pattern_b->add_cohort_index(2); // cohort_b
- // siteC.tld is allowed to spoof siteB.tld and itself.
- auto* pattern_c = config_proto->add_allowed_pattern();
- pattern_c->set_pattern("sitec.tld/");
- auto* cohort_c = config_proto->add_cohort();
- cohort_c->add_allowed_index(3); // siteB
- cohort_c->add_allowed_index(4); // siteC
- pattern_c->add_cohort_index(3); // cohort_c
- // siteD.tld is allowed to spoof anyone, so has no cohort.
- auto* pattern_d = config_proto->add_allowed_pattern();
- pattern_d->set_pattern("sited.tld/");
- // Implicitly, siteE.tld can't spoof anyone, since it isn't in the proto.
- SetSafetyTipsRemoteConfigProto(std::move(config_proto));
- }
- // Minimal test for an unscoped allowlist entry.
- TEST(SafetyTipsConfigTest, TestBasicUrlAllowlist) {
- SetSafetyTipAllowlistPatterns({"example.com/"}, {}, {});
- auto* config = GetSafetyTipsRemoteConfigProto();
- // Basic unscoped entries are allowed to spoof any ("canonical") domain.
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://example.com"), GURL("http://example.com")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://example.com"), GURL("http://example.org")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://example.org"), GURL("http://example.org")));
- }
- // Tests for a scoped allowlist (i.e. entries not permitted to spoof anything).
- TEST(SafetyTipsConfigTest, TestScopedUrlAllowlist) {
- ConfigureAllowlistWithScopes();
- auto* config = GetSafetyTipsRemoteConfigProto();
- // Site A is only a canonical domain, so can't spoof anything.
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitea.tld"), GURL("http://sitea.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitea.tld"), GURL("http://siteb.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitea.tld"), GURL("http://sitee.tld")));
- // Site B can spoof sites A & B, but not other stuff.
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://siteb.tld"), GURL("http://sitea.tld")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://siteb.tld"), GURL("http://siteb.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://siteb.tld"), GURL("http://sitec.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://siteb.tld"), GURL("http://sited.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://siteb.tld"), GURL("http://sitee.tld")));
- // Site C can spoof sites B and C, but not anything else.
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitec.tld"), GURL("http://sitea.tld")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitec.tld"), GURL("http://siteb.tld")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitec.tld"), GURL("http://sitec.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitec.tld"), GURL("http://sited.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sitec.tld"), GURL("http://sitee.tld")));
- // Site D has a wildcard, and can spoof anyone.
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sited.tld"), GURL("http://sitea.tld")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sited.tld"), GURL("http://siteb.tld")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sited.tld"), GURL("http://sitec.tld")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sited.tld"), GURL("http://sited.tld")));
- EXPECT_TRUE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://sited.tld"), GURL("http://sitee.tld")));
- // These sites all have invalid indices in their entries. Each should
- // invalidate the relevant part of their allowlist entry (i.e. act as if it's
- // not there), rather than crashing.
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://error-cohort-index.tld"), GURL("http://sitea.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://error-canonical-index.tld"),
- GURL("http://sitea.tld")));
- EXPECT_FALSE(IsUrlAllowlistedBySafetyTipsComponent(
- config, GURL("http://error-allowed-index.tld"),
- GURL("http://sitea.tld")));
- }
- TEST(SafetyTipsConfigTest, TestTargetUrlAllowlist) {
- SetSafetyTipAllowlistPatterns({}, {"exa.*\\.com"}, {});
- auto* config = GetSafetyTipsRemoteConfigProto();
- EXPECT_TRUE(
- IsTargetHostAllowlistedBySafetyTipsComponent(config, "example.com"));
- EXPECT_FALSE(
- IsTargetHostAllowlistedBySafetyTipsComponent(config, "example.org"));
- }
- TEST(SafetyTipsConfigTest, TestCommonWords) {
- // IsCommonWordInConfigProto does a binary search of sorted common words.
- SetSafetyTipAllowlistPatterns({}, {}, {"common3", "common1", "common2"});
- auto* config = GetSafetyTipsRemoteConfigProto();
- EXPECT_TRUE(IsCommonWordInConfigProto(config, "common1"));
- EXPECT_TRUE(IsCommonWordInConfigProto(config, "common2"));
- EXPECT_TRUE(IsCommonWordInConfigProto(config, "common3"));
- EXPECT_FALSE(IsCommonWordInConfigProto(config, "uncommon"));
- }
- } // namespace reputation
|