15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode_url_filter.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ManagedModeURLFilterTest : public ::testing::Test, 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ManagedModeURLFilter::Observer { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedModeURLFilterTest() : filter_(new ManagedModeURLFilter) { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::BLOCK); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->AddObserver(this); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ManagedModeURLFilterTest() { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->RemoveObserver(this); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ManagedModeURLFilter::Observer: 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSiteListUpdated() OVERRIDE { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) run_loop_.Quit(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsURLWhitelisted(const std::string& url) { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return filter_->GetFilteringBehaviorForURL(GURL(url)) == 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedModeURLFilter::ALLOW; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RunLoop run_loop_; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ManagedModeURLFilter> filter_; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Basic) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> list; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow domain and all subdomains, for any filtered scheme. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("google.com"); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetFromPatterns(list); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://google.com")); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://google.com/")); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://google.com/whatever")); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("https://google.com/")); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://notgoogle.com/")); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com")); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://x.mail.google.com")); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("https://x.mail.google.com/")); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://x.y.google.com/a/b")); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://youtube.com/")); 584e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("bogus://youtube.com/")); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("chrome://youtube.com/")); 614e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch EXPECT_TRUE(IsURLWhitelisted("chrome://extensions/")); 624e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch EXPECT_TRUE(IsURLWhitelisted("chrome-extension://foo/main.html")); 634e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch EXPECT_TRUE(IsURLWhitelisted("file:///home/chronos/user/Downloads/img.jpg")); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Inactive) { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::ALLOW); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> list; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("google.com"); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetFromPatterns(list); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the filter is inactive, every URL should be whitelisted. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://google.com")); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("https://www.example.com")); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Scheme) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> list; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter only http, ftp and ws schemes. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("http://secure.com"); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("ftp://secure.com"); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("ws://secure.com"); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetFromPatterns(list); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://secure.com")); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://secure.com/whatever")); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("ftp://secure.com/")); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("ws://secure.com")); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("https://secure.com/")); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("wss://secure.com")); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.secure.com")); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("https://www.secure.com")); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("wss://www.secure.com")); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Path) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> list; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter only a certain path prefix. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("path.to/ruin"); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetFromPatterns(list); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin")); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("https://path.to/ruin")); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruins")); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://path.to/ruin/signup")); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.path.to/ruin")); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://path.to/fortune")); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, PathAndScheme) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> list; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter only a certain path prefix and scheme. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("https://s.aaa.com/path"); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetFromPatterns(list); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path")); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("https://s.aaa.com/path/bbb")); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://s.aaa.com/path")); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("https://aaa.com/path")); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("https://x.aaa.com/path")); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/bbb")); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("https://s.aaa.com/")); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Host) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> list; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter only a certain hostname, without subdomains. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(".www.example.com"); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetFromPatterns(list); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.example.com")); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://example.com")); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://subdomain.example.com")); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ManagedModeURLFilterTest, IPAddress) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> list; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter an ip address. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back("123.123.123.123"); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filter_->SetFromPatterns(list); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://123.123.123.123/")); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://123.123.123.124/")); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Canonicalization) { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We assume that the hosts and URLs are already canonicalized. 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::map<std::string, bool> hosts; 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) hosts["www.moose.org"] = true; 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) hosts["www.xn--n3h.net"] = true; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::map<GURL, bool> urls; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) urls[GURL("http://www.example.com/foo/")] = true; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) urls[GURL("http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m")] = true; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) filter_->SetManualHosts(&hosts); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) filter_->SetManualURLs(&urls); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Base cases. 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/")); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted( 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m")); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that non-URI characters are escaped. 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted( 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.example.com/\xc3\x85t\xc3\xb8mstr\xc3\xb6m")); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that unnecessary URI escapes are unescaped. 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/%66%6F%6F/")); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the default port are removed. 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.example.com:80/foo/")); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that scheme and hostname are lowercased. 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("htTp://wWw.eXamPle.com/foo/")); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("HttP://WwW.mOOsE.orG/blurp/")); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that UTF-8 in hostnames are converted to punycode. 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.\xe2\x98\x83\x0a.net/bla/")); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that query and ref are stripped. 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/?bar=baz#ref")); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1904e4e753d5cd2290fa40ed922142a29a98128a209Ben MurdochTEST_F(ManagedModeURLFilterTest, HasFilteredScheme) { 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 1924e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("http://example.com"))); 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 1944e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("https://example.com"))); 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 1964e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("ftp://example.com"))); 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 1984e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("gopher://example.com"))); 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 2004e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("ws://example.com"))); 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE( 2024e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("wss://example.com"))); 2034e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch 2044e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch EXPECT_FALSE( 2054e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("file://example.com"))); 2064e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch EXPECT_FALSE( 2074e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("filesystem://80cols.com"))); 2084e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch EXPECT_FALSE( 2094e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("chrome://example.com"))); 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE( 2114e4e753d5cd2290fa40ed922142a29a98128a209Ben Murdoch ManagedModeURLFilter::HasFilteredScheme(GURL("wtf://example.com"))); 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ManagedModeURLFilterTest, HostMatchesPattern) { 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.com")); 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("google.com", "*.google.com")); 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("accounts.google.com", 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.com")); 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.de", 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.com")); 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("notgoogle.com", 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.com")); 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.google.*")); 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.de", 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.google.*")); 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.co.uk", 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.google.*")); 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.blogspot.com", 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.google.*")); 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google", "www.google.*")); 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("google.com", "www.google.*")); 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("mail.google.com", 2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.google.*")); 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.googleplex.com", 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.google.*")); 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.googleco.uk", 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.google.*")); 2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.google.*")); 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("google.com", "*.google.*")); 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("accounts.google.com", 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.*")); 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("mail.google.com", 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.*")); 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.de", 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.*")); 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE( 2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("google.de", 2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.*")); 2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("google.blogspot.com", 2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.*")); 2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("google", "*.google.*")); 2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("notgoogle.com", "*.google.*")); 2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.googleplex.com", 2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.google.*")); 2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Now test a few invalid patterns. They should never match. 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "")); 2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", ".")); 2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*")); 2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", ".*")); 2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.")); 2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.*")); 2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google..com", "*..*")); 3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*.*.com")); 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "www.*.*")); 3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(ManagedModeURLFilter::HostMatchesPattern("www.google.com", 3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "*.goo.*le.*")); 3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE( 3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ManagedModeURLFilter::HostMatchesPattern("www.google.com", "*google*")); 3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(ManagedModeURLFilter::HostMatchesPattern("www.google.com", 3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "www.*.google.com")); 3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ManagedModeURLFilterTest, Patterns) { 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::map<std::string, bool> hosts; 3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Initally, the second rule is ignored because has the same value as the 3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // default (block). When we change the default to allow, the first rule is 3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ignored instead. 3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) hosts["*.google.com"] = true; 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) hosts["www.google.*"] = false; 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) hosts["accounts.google.com"] = false; 3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) hosts["mail.google.com"] = true; 3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->SetManualHosts(&hosts); 3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Initially, the default filtering behavior is BLOCK. 3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://www.google.com/foo/")); 3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/")); 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/")); 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/")); 3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->SetDefaultFilteringBehavior(ManagedModeURLFilter::ALLOW); 3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://www.google.com/foo/")); 3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://accounts.google.com/bar/")); 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(IsURLWhitelisted("http://www.google.co.uk/blurp/")); 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(IsURLWhitelisted("http://mail.google.com/moose/")); 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 337