Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Unified Diff: chrome/browser/managed_mode/managed_mode_url_filter.cc

Issue 335833003: Rename "managed (mode|user)" to "supervised user" (part 2) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review comments (+ a few other cleanups) Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/managed_mode/managed_mode_url_filter.cc
diff --git a/chrome/browser/managed_mode/managed_mode_url_filter.cc b/chrome/browser/managed_mode/managed_mode_url_filter.cc
deleted file mode 100644
index efd9645d32f34d5c3a193a0d6ef7cf63590f885a..0000000000000000000000000000000000000000
--- a/chrome/browser/managed_mode/managed_mode_url_filter.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-// Copyright (c) 2012 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 "chrome/browser/managed_mode/managed_mode_url_filter.h"
-
-#include "base/containers/hash_tables.h"
-#include "base/files/file_path.h"
-#include "base/json/json_file_value_serializer.h"
-#include "base/metrics/histogram.h"
-#include "base/sha1.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/task_runner_util.h"
-#include "base/threading/sequenced_worker_pool.h"
-#include "components/policy/core/browser/url_blacklist_manager.h"
-#include "components/url_fixer/url_fixer.h"
-#include "components/url_matcher/url_matcher.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
-#include "url/gurl.h"
-
-using content::BrowserThread;
-using net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES;
-using net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES;
-using net::registry_controlled_domains::GetRegistryLength;
-using policy::URLBlacklist;
-using url_matcher::URLMatcher;
-using url_matcher::URLMatcherConditionSet;
-
-struct ManagedModeURLFilter::Contents {
- URLMatcher url_matcher;
- std::map<URLMatcherConditionSet::ID, int> matcher_site_map;
- base::hash_multimap<std::string, int> hash_site_map;
- std::vector<ManagedModeSiteList::Site> sites;
-};
-
-namespace {
-
-// URL schemes not in this list (e.g., file:// and chrome://) will always be
-// allowed.
-const char* kFilteredSchemes[] = {
- "http",
- "https",
- "ftp",
- "gopher",
- "ws",
- "wss"
-};
-
-
-// This class encapsulates all the state that is required during construction of
-// a new ManagedModeURLFilter::Contents.
-class FilterBuilder {
- public:
- FilterBuilder();
- ~FilterBuilder();
-
- // Adds a single URL pattern for the site identified by |site_id|.
- bool AddPattern(const std::string& pattern, int site_id);
-
- // Adds a single hostname SHA1 hash for the site identified by |site_id|.
- void AddHostnameHash(const std::string& hash, int site_id);
-
- // Adds all the sites in |site_list|, with URL patterns and hostname hashes.
- void AddSiteList(ManagedModeSiteList* site_list);
-
- // Finalizes construction of the ManagedModeURLFilter::Contents and returns
- // them. This method should be called before this object is destroyed.
- scoped_ptr<ManagedModeURLFilter::Contents> Build();
-
- private:
- scoped_ptr<ManagedModeURLFilter::Contents> contents_;
- URLMatcherConditionSet::Vector all_conditions_;
- URLMatcherConditionSet::ID matcher_id_;
-};
-
-FilterBuilder::FilterBuilder()
- : contents_(new ManagedModeURLFilter::Contents()),
- matcher_id_(0) {}
-
-FilterBuilder::~FilterBuilder() {
- DCHECK(!contents_.get());
-}
-
-bool FilterBuilder::AddPattern(const std::string& pattern, int site_id) {
- DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
- std::string scheme;
- std::string host;
- uint16 port;
- std::string path;
- std::string query;
- bool match_subdomains = true;
- URLBlacklist::SegmentURLCallback callback =
- static_cast<URLBlacklist::SegmentURLCallback>(url_fixer::SegmentURL);
- if (!URLBlacklist::FilterToComponents(
- callback, pattern,
- &scheme, &host, &match_subdomains, &port, &path, &query)) {
- LOG(ERROR) << "Invalid pattern " << pattern;
- return false;
- }
-
- scoped_refptr<URLMatcherConditionSet> condition_set =
- URLBlacklist::CreateConditionSet(
- &contents_->url_matcher, ++matcher_id_,
- scheme, host, match_subdomains, port, path, query, true);
- all_conditions_.push_back(condition_set);
- contents_->matcher_site_map[matcher_id_] = site_id;
- return true;
-}
-
-void FilterBuilder::AddHostnameHash(const std::string& hash, int site_id) {
- contents_->hash_site_map.insert(std::make_pair(StringToUpperASCII(hash),
- site_id));
-}
-
-void FilterBuilder::AddSiteList(ManagedModeSiteList* site_list) {
- std::vector<ManagedModeSiteList::Site> sites;
- site_list->GetSites(&sites);
- int site_id = contents_->sites.size();
- for (std::vector<ManagedModeSiteList::Site>::const_iterator it =
- sites.begin(); it != sites.end(); ++it) {
- const ManagedModeSiteList::Site& site = *it;
- contents_->sites.push_back(site);
-
- for (std::vector<std::string>::const_iterator pattern_it =
- site.patterns.begin();
- pattern_it != site.patterns.end(); ++pattern_it) {
- AddPattern(*pattern_it, site_id);
- }
-
- for (std::vector<std::string>::const_iterator hash_it =
- site.hostname_hashes.begin();
- hash_it != site.hostname_hashes.end(); ++hash_it) {
- AddHostnameHash(*hash_it, site_id);
- }
-
- site_id++;
- }
-}
-
-scoped_ptr<ManagedModeURLFilter::Contents> FilterBuilder::Build() {
- DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
- contents_->url_matcher.AddConditionSets(all_conditions_);
- return contents_.Pass();
-}
-
-scoped_ptr<ManagedModeURLFilter::Contents> CreateWhitelistFromPatterns(
- const std::vector<std::string>& patterns) {
- DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
-
- FilterBuilder builder;
- for (std::vector<std::string>::const_iterator it = patterns.begin();
- it != patterns.end(); ++it) {
- // TODO(bauerb): We should create a fake site for the whitelist.
- builder.AddPattern(*it, -1);
- }
-
- return builder.Build();
-}
-
-scoped_ptr<ManagedModeURLFilter::Contents> LoadWhitelistsOnBlockingPoolThread(
- ScopedVector<ManagedModeSiteList> site_lists) {
- DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
-
- FilterBuilder builder;
- for (ScopedVector<ManagedModeSiteList>::iterator it = site_lists.begin();
- it != site_lists.end(); ++it) {
- builder.AddSiteList(*it);
- }
-
- return builder.Build();
-}
-
-} // namespace
-
-ManagedModeURLFilter::ManagedModeURLFilter()
- : default_behavior_(ALLOW),
- contents_(new Contents()) {
- // Detach from the current thread so we can be constructed on a different
- // thread than the one where we're used.
- DetachFromThread();
-}
-
-ManagedModeURLFilter::~ManagedModeURLFilter() {
- DCHECK(CalledOnValidThread());
-}
-
-// static
-ManagedModeURLFilter::FilteringBehavior
-ManagedModeURLFilter::BehaviorFromInt(int behavior_value) {
- DCHECK_GE(behavior_value, ALLOW);
- DCHECK_LE(behavior_value, BLOCK);
- return static_cast<FilteringBehavior>(behavior_value);
-}
-
-// static
-GURL ManagedModeURLFilter::Normalize(const GURL& url) {
- GURL normalized_url = url;
- GURL::Replacements replacements;
- // Strip username, password, query, and ref.
- replacements.ClearUsername();
- replacements.ClearPassword();
- replacements.ClearQuery();
- replacements.ClearRef();
- return url.ReplaceComponents(replacements);
-}
-
-// static
-bool ManagedModeURLFilter::HasFilteredScheme(const GURL& url) {
- for (size_t i = 0; i < arraysize(kFilteredSchemes); ++i) {
- if (url.scheme() == kFilteredSchemes[i])
- return true;
- }
- return false;
-}
-
-std::string GetHostnameHash(const GURL& url) {
- std::string hash = base::SHA1HashString(url.host());
- return base::HexEncode(hash.data(), hash.length());
-}
-
-// static
-bool ManagedModeURLFilter::HostMatchesPattern(const std::string& host,
- const std::string& pattern) {
- std::string trimmed_pattern = pattern;
- std::string trimmed_host = host;
- if (EndsWith(pattern, ".*", true)) {
- size_t registry_length = GetRegistryLength(
- trimmed_host, EXCLUDE_UNKNOWN_REGISTRIES, EXCLUDE_PRIVATE_REGISTRIES);
- // A host without a known registry part does not match.
- if (registry_length == 0)
- return false;
-
- trimmed_pattern.erase(trimmed_pattern.length() - 2);
- trimmed_host.erase(trimmed_host.length() - (registry_length + 1));
- }
-
- if (StartsWithASCII(trimmed_pattern, "*.", true)) {
- trimmed_pattern.erase(0, 2);
-
- // The remaining pattern should be non-empty, and it should not contain
- // further stars. Also the trimmed host needs to end with the trimmed
- // pattern.
- if (trimmed_pattern.empty() ||
- trimmed_pattern.find('*') != std::string::npos ||
- !EndsWith(trimmed_host, trimmed_pattern, true)) {
- return false;
- }
-
- // The trimmed host needs to have a dot separating the subdomain from the
- // matched pattern piece, unless there is no subdomain.
- int pos = trimmed_host.length() - trimmed_pattern.length();
- DCHECK_GE(pos, 0);
- return (pos == 0) || (trimmed_host[pos - 1] == '.');
- }
-
- return trimmed_host == trimmed_pattern;
-}
-
-ManagedModeURLFilter::FilteringBehavior
-ManagedModeURLFilter::GetFilteringBehaviorForURL(const GURL& url) const {
- DCHECK(CalledOnValidThread());
-
- // URLs with a non-standard scheme (e.g. chrome://) are always allowed.
- if (!HasFilteredScheme(url))
- return ALLOW;
-
- // Check manual overrides for the exact URL.
- std::map<GURL, bool>::const_iterator url_it = url_map_.find(Normalize(url));
- if (url_it != url_map_.end())
- return url_it->second ? ALLOW : BLOCK;
-
- // Check manual overrides for the hostname.
- std::string host = url.host();
- std::map<std::string, bool>::const_iterator host_it = host_map_.find(host);
- if (host_it != host_map_.end())
- return host_it->second ? ALLOW : BLOCK;
-
- // Look for patterns matching the hostname, with a value that is different
- // from the default (a value of true in the map meaning allowed).
- for (std::map<std::string, bool>::const_iterator host_it =
- host_map_.begin(); host_it != host_map_.end(); ++host_it) {
- if ((host_it->second == (default_behavior_ == BLOCK)) &&
- HostMatchesPattern(host, host_it->first)) {
- return host_it->second ? ALLOW : BLOCK;
- }
- }
-
- // If the default behavior is to allow, we don't need to check anything else.
- if (default_behavior_ == ALLOW)
- return ALLOW;
-
- // Check the list of URL patterns.
- std::set<URLMatcherConditionSet::ID> matching_ids =
- contents_->url_matcher.MatchURL(url);
- if (!matching_ids.empty())
- return ALLOW;
-
- // Check the list of hostname hashes.
- if (contents_->hash_site_map.count(GetHostnameHash(url)))
- return ALLOW;
-
- // Fall back to the default behavior.
- return default_behavior_;
-}
-
-void ManagedModeURLFilter::GetSites(
- const GURL& url,
- std::vector<ManagedModeSiteList::Site*>* sites) const {
- std::set<URLMatcherConditionSet::ID> matching_ids =
- contents_->url_matcher.MatchURL(url);
- for (std::set<URLMatcherConditionSet::ID>::const_iterator it =
- matching_ids.begin(); it != matching_ids.end(); ++it) {
- std::map<URLMatcherConditionSet::ID, int>::const_iterator entry =
- contents_->matcher_site_map.find(*it);
- if (entry == contents_->matcher_site_map.end()) {
- NOTREACHED();
- continue;
- }
- sites->push_back(&contents_->sites[entry->second]);
- }
-
- typedef base::hash_multimap<std::string, int>::const_iterator
- hash_site_map_iterator;
- std::pair<hash_site_map_iterator, hash_site_map_iterator> bounds =
- contents_->hash_site_map.equal_range(GetHostnameHash(url));
- for (hash_site_map_iterator hash_it = bounds.first;
- hash_it != bounds.second; hash_it++) {
- sites->push_back(&contents_->sites[hash_it->second]);
- }
-}
-
-void ManagedModeURLFilter::SetDefaultFilteringBehavior(
- FilteringBehavior behavior) {
- DCHECK(CalledOnValidThread());
- default_behavior_ = behavior;
-}
-
-void ManagedModeURLFilter::LoadWhitelists(
- ScopedVector<ManagedModeSiteList> site_lists) {
- DCHECK(CalledOnValidThread());
-
- base::PostTaskAndReplyWithResult(
- BrowserThread::GetBlockingPool(),
- FROM_HERE,
- base::Bind(&LoadWhitelistsOnBlockingPoolThread,
- base::Passed(&site_lists)),
- base::Bind(&ManagedModeURLFilter::SetContents, this));
-}
-
-void ManagedModeURLFilter::SetFromPatterns(
- const std::vector<std::string>& patterns) {
- DCHECK(CalledOnValidThread());
-
- base::PostTaskAndReplyWithResult(
- BrowserThread::GetBlockingPool(),
- FROM_HERE,
- base::Bind(&CreateWhitelistFromPatterns, patterns),
- base::Bind(&ManagedModeURLFilter::SetContents, this));
-}
-
-void ManagedModeURLFilter::SetManualHosts(
- const std::map<std::string, bool>* host_map) {
- DCHECK(CalledOnValidThread());
- host_map_ = *host_map;
- UMA_HISTOGRAM_CUSTOM_COUNTS("ManagedMode.ManualHostsEntries",
- host_map->size(), 1, 1000, 50);
-}
-
-void ManagedModeURLFilter::SetManualURLs(
- const std::map<GURL, bool>* url_map) {
- DCHECK(CalledOnValidThread());
- url_map_ = *url_map;
- UMA_HISTOGRAM_CUSTOM_COUNTS("ManagedMode.ManualURLsEntries",
- url_map->size(), 1, 1000, 50);
-}
-
-void ManagedModeURLFilter::AddObserver(Observer* observer) {
- observers_.AddObserver(observer);
-}
-
-void ManagedModeURLFilter::RemoveObserver(Observer* observer) {
- observers_.RemoveObserver(observer);
-}
-
-void ManagedModeURLFilter::SetContents(scoped_ptr<Contents> contents) {
- DCHECK(CalledOnValidThread());
- contents_ = contents.Pass();
- FOR_EACH_OBSERVER(Observer, observers_, OnSiteListUpdated());
-}
« no previous file with comments | « chrome/browser/managed_mode/managed_mode_url_filter.h ('k') | chrome/browser/managed_mode/managed_mode_url_filter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698