1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 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) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_URL_FILTER_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_URL_FILTER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/observer_list.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_site_list.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_users.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL; 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SupervisedUserBlacklist; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class manages the filtering behavior for a given URL, i.e. it tells 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// callers if a given URL should be allowed, blocked or warned about. It uses 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// information from multiple sources: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * A default setting (allow, block or warn). 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * The set of installed and enabled content packs, which contain whitelists 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of URL patterns that should be allowed. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// * User-specified manual overrides (allow or block) for either sites 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (hostnames) or exact URLs, which take precedence over the previous 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sources. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// References to it can be passed around on different threads (the refcounting 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is thread-safe), but the object itself should always be accessed on the same 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// thread (member access isn't thread-safe). 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserURLFilter 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : public base::RefCountedThreadSafe<SupervisedUserURLFilter>, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public base::NonThreadSafe { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum FilteringBehavior { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ALLOW, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WARN, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BLOCK, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HISTOGRAM_BOUNDING_VALUE 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Observer { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSiteListUpdated() = 0; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Contents; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserURLFilter(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static FilteringBehavior BehaviorFromInt(int behavior_value); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Normalizes a URL for matching purposes. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GURL Normalize(const GURL& url); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns true if the URL has a standard scheme. Only URLs with standard 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // schemes are filtered. 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This method is public for testing. 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool HasFilteredScheme(const GURL& url); 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns true if the |host| matches the pattern. A pattern is a hostname 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // with one or both of the following modifications: 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // - If the pattern starts with "*.", it matches the host or any subdomain 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // (e.g. the pattern "*.google.com" would match google.com, www.google.com, 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // or accounts.google.com). 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // - If the pattern ends with ".*", it matches the host on any known TLD 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // (e.g. the pattern "google.*" would match google.com or google.co.uk). 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // See the SupervisedUserURLFilterTest.HostMatchesPattern unit test for more 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // examples. 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Asterisks in other parts of the pattern are not allowed. 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |host| and |pattern| are assumed to be normalized to lower-case. 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This method is public for testing. 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static bool HostMatchesPattern(const std::string& host, 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& pattern); 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetSites(const GURL& url, 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<SupervisedUserSiteList::Site*>* sites) const; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the filtering behavior for a given URL, based on the default 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // behavior and whether it is on a site list. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FilteringBehavior GetFilteringBehaviorForURL(const GURL& url) const; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the filtering behavior for pages not on a list (default is ALLOW). 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDefaultFilteringBehavior(FilteringBehavior behavior); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Asynchronously loads the specified site lists and updates the 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // filter to recognize each site on them. 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void LoadWhitelists(ScopedVector<SupervisedUserSiteList> site_lists); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sets the static blacklist of blocked hosts. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetBlacklist(SupervisedUserBlacklist* blacklist); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the list of matched patterns to the passed in list. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This method is only used for testing. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetFromPatterns(const std::vector<std::string>& patterns); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the set of manually allowed or blocked hosts. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetManualHosts(const std::map<std::string, bool>* host_map); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the set of manually allowed or blocked URLs. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetManualURLs(const std::map<GURL, bool>* url_map); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddObserver(Observer* observer); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveObserver(Observer* observer); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend class base::RefCountedThreadSafe<SupervisedUserURLFilter>; 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ~SupervisedUserURLFilter(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetContents(scoped_ptr<Contents> url_matcher); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ObserverList<Observer> observers_; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FilteringBehavior default_behavior_; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Contents> contents_; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maps from a URL to whether it is manually allowed (true) or blocked 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (false). 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<GURL, bool> url_map_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maps from a hostname to whether it is manually allowed (true) or blocked 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (false). 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, bool> host_map_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Not owned. 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SupervisedUserBlacklist* blacklist_; 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SupervisedUserURLFilter); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_URL_FILTER_H_ 134