Home | History | Annotate | Download | only in managed_mode
      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
      3 // found in the LICENSE file.
      4 
      5 #include "base/bind.h"
      6 #include "base/bind_helpers.h"
      7 #include "base/message_loop/message_loop.h"
      8 #include "base/run_loop.h"
      9 #include "chrome/browser/managed_mode/managed_mode_url_filter.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 #include "url/gurl.h"
     12 
     13 class ManagedModeURLFilterTest : public ::testing::Test,
     14                                  public ManagedModeURLFilter::Observer {
     15  public:
     16   ManagedModeURLFilterTest() : filter_(new ManagedModeURLFilter) {
     17     filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::BLOCK);
     18     filter_->AddObserver(this);
     19   }
     20 
     21   virtual ~ManagedModeURLFilterTest() {
     22     filter_->RemoveObserver(this);
     23   }
     24 
     25   // ManagedModeURLFilter::Observer:
     26   virtual void OnSiteListUpdated() OVERRIDE {
     27     run_loop_.Quit();
     28   }
     29 
     30  protected:
     31   bool IsURLWhitelisted(const std::string& url) {
     32     return filter_->GetFilteringBehaviorForURL(GURL(url)) ==
     33            ManagedModeURLFilter::ALLOW;
     34   }
     35 
     36   base::MessageLoop message_loop_;
     37   base::RunLoop run_loop_;
     38   scoped_refptr<ManagedModeURLFilter> filter_;
     39 };
     40 
     41 // Disable all tests if ENABLE_CONFIGURATION_POLICY is not defined
     42 // Since IsURLWhitelisted() doesn't work.
     43 #if defined(ENABLE_CONFIGURATION_POLICY)
     44 
     45 TEST_F(ManagedModeURLFilterTest, Basic) {
     46   std::vector<std::string> list;
     47   // Allow domain and all subdomains, for any filtered scheme.
     48   list.push_back("google.com");
     49   filter_->SetFromPatterns(list);
     50   run_loop_.Run();
     51 
     52   EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
     53   EXPECT_TRUE(IsURLWhitelisted("http://google.com/"));
     54   EXPECT_TRUE(IsURLWhitelisted("http://google.com/whatever"));
     55   EXPECT_TRUE(IsURLWhitelisted("https://google.com/"));
     56   EXPECT_FALSE(IsURLWhitelisted("http://notgoogle.com/"));
     57   EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com"));
     58   EXPECT_TRUE(IsURLWhitelisted("http://x.mail.google.com"));
     59   EXPECT_TRUE(IsURLWhitelisted("https://x.mail.google.com/"));
     60   EXPECT_TRUE(IsURLWhitelisted("http://x.y.google.com/a/b"));
     61   EXPECT_FALSE(IsURLWhitelisted("http://youtube.com/"));
     62   EXPECT_TRUE(IsURLWhitelisted("bogus://youtube.com/"));
     63   EXPECT_TRUE(IsURLWhitelisted("chrome://youtube.com/"));
     64 }
     65 
     66 TEST_F(ManagedModeURLFilterTest, Inactive) {
     67   filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::ALLOW);
     68 
     69   std::vector<std::string> list;
     70   list.push_back("google.com");
     71   filter_->SetFromPatterns(list);
     72   run_loop_.Run();
     73 
     74   // If the filter is inactive, every URL should be whitelisted.
     75   EXPECT_TRUE(IsURLWhitelisted("http://google.com"));
     76   EXPECT_TRUE(IsURLWhitelisted("https://www.example.com"));
     77 }
     78 
     79 TEST_F(ManagedModeURLFilterTest, Scheme) {
     80   std::vector<std::string> list;
     81   // Filter only http, ftp and ws schemes.
     82   list.push_back("http://secure.com");
     83   list.push_back("ftp://secure.com");
     84   list.push_back("ws://secure.com");
     85   filter_->SetFromPatterns(list);
     86   run_loop_.Run();
     87 
     88   EXPECT_TRUE(IsURLWhitelisted("http://secure.com"));
     89   EXPECT_TRUE(IsURLWhitelisted("http://secure.com/whatever"));
     90   EXPECT_TRUE(IsURLWhitelisted("ftp://secure.com/"));
     91   EXPECT_TRUE(IsURLWhitelisted("ws://secure.com"));
     92   EXPECT_FALSE(IsURLWhitelisted("https://secure.com/"));
     93   EXPECT_FALSE(IsURLWhitelisted("wss://secure.com"));
     94   EXPECT_TRUE(IsURLWhitelisted("http://www.secure.com"));
     95   EXPECT_FALSE(IsURLWhitelisted("https://www.secure.com"));
     96   EXPECT_FALSE(IsURLWhitelisted("wss://www.secure.com"));
     97 }
     98 
     99 TEST_F(ManagedModeURLFilterTest, Path) {
    100   std::vector<std::string> list;
    101   // Filter only a certain path prefix.
    102   list.push_back("path.to/ruin");
    103   filter_->SetFromPatterns(list);
    104   run_loop_.Run();
    105 
    106   EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin"));
    107   EXPECT_TRUE(IsURLWhitelisted("https://path.to/ruin"));
    108   EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruins"));
    109   EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin/signup"));
    110   EXPECT_TRUE(IsURLWhitelisted("http://www.path.to/ruin"));
    111   EXPECT_FALSE(IsURLWhitelisted("http://path.to/fortune"));
    112 }
    113 
    114 TEST_F(ManagedModeURLFilterTest, PathAndScheme) {
    115   std::vector<std::string> list;
    116   // Filter only a certain path prefix and scheme.
    117   list.push_back("https://s.aaa.com/path");
    118   filter_->SetFromPatterns(list);
    119   run_loop_.Run();
    120 
    121   EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path"));
    122   EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path/bbb"));
    123   EXPECT_FALSE(IsURLWhitelisted("http://s.aaa.com/path"));
    124   EXPECT_FALSE(IsURLWhitelisted("https://aaa.com/path"));
    125   EXPECT_FALSE(IsURLWhitelisted("https://x.aaa.com/path"));
    126   EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/bbb"));
    127   EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/"));
    128 }
    129 
    130 TEST_F(ManagedModeURLFilterTest, Host) {
    131   std::vector<std::string> list;
    132   // Filter only a certain hostname, without subdomains.
    133   list.push_back(".www.example.com");
    134   filter_->SetFromPatterns(list);
    135   run_loop_.Run();
    136 
    137   EXPECT_TRUE(IsURLWhitelisted("http://www.example.com"));
    138   EXPECT_FALSE(IsURLWhitelisted("http://example.com"));
    139   EXPECT_FALSE(IsURLWhitelisted("http://subdomain.example.com"));
    140 }
    141 
    142 TEST_F(ManagedModeURLFilterTest, IPAddress) {
    143   std::vector<std::string> list;
    144   // Filter an ip address.
    145   list.push_back("123.123.123.123");
    146   filter_->SetFromPatterns(list);
    147   run_loop_.Run();
    148 
    149   EXPECT_TRUE(IsURLWhitelisted("http://123.123.123.123/"));
    150   EXPECT_FALSE(IsURLWhitelisted("http://123.123.123.124/"));
    151 }
    152 
    153 TEST_F(ManagedModeURLFilterTest, Canonicalization) {
    154   // We assume that the hosts and URLs are already canonicalized.
    155   std::map<std::string, bool> hosts;
    156   hosts["www.moose.org"] = true;
    157   hosts["www.xn--n3h.net"] = true;
    158   std::map<GURL, bool> urls;
    159   urls[GURL("http://www.example.com/foo/")] = true;
    160   urls[GURL("http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m")] = true;
    161   filter_->SetManualHosts(&hosts);
    162   filter_->SetManualURLs(&urls);
    163 
    164   // Base cases.
    165   EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/"));
    166   EXPECT_TRUE(IsURLWhitelisted(
    167       "http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m"));
    168 
    169   // Verify that non-URI characters are escaped.
    170   EXPECT_TRUE(IsURLWhitelisted(
    171       "http://www.example.com/\xc3\x85t\xc3\xb8mstr\xc3\xb6m"));
    172 
    173   // Verify that unnecessary URI escapes are unescaped.
    174   EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/%66%6F%6F/"));
    175 
    176   // Verify that the default port are removed.
    177   EXPECT_TRUE(IsURLWhitelisted("http://www.example.com:80/foo/"));
    178 
    179   // Verify that scheme and hostname are lowercased.
    180   EXPECT_TRUE(IsURLWhitelisted("htTp://wWw.eXamPle.com/foo/"));
    181   EXPECT_TRUE(IsURLWhitelisted("HttP://WwW.mOOsE.orG/blurp/"));
    182 
    183   // Verify that UTF-8 in hostnames are converted to punycode.
    184   EXPECT_TRUE(IsURLWhitelisted("http://www.\xe2\x98\x83\x0a.net/bla/"));
    185 
    186   // Verify that query and ref are stripped.
    187   EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/?bar=baz#ref"));
    188 }
    189 
    190 TEST_F(ManagedModeURLFilterTest, HasStandardScheme) {
    191   EXPECT_TRUE(
    192       ManagedModeURLFilter::HasStandardScheme(GURL("http://example.com")));
    193   EXPECT_TRUE(
    194       ManagedModeURLFilter::HasStandardScheme(GURL("https://example.com")));
    195   EXPECT_TRUE(
    196       ManagedModeURLFilter::HasStandardScheme(GURL("ftp://example.com")));
    197   EXPECT_TRUE(
    198       ManagedModeURLFilter::HasStandardScheme(GURL("gopher://example.com")));
    199   EXPECT_TRUE(
    200       ManagedModeURLFilter::HasStandardScheme(GURL("ws://example.com")));
    201   EXPECT_TRUE(
    202       ManagedModeURLFilter::HasStandardScheme(GURL("wss://example.com")));
    203   EXPECT_FALSE(
    204       ManagedModeURLFilter::HasStandardScheme(GURL("wtf://example.com")));
    205 }
    206 
    207 #endif  // ENABLE_CONFIGURATION_POLICY
    208