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