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

Unified Diff: components/policy/core/browser/url_blacklist_manager.cc

Issue 1692503002: Functionality to allow blacklist and whitelist of custom schemes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed unused comments Created 4 years, 9 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: components/policy/core/browser/url_blacklist_manager.cc
diff --git a/components/policy/core/browser/url_blacklist_manager.cc b/components/policy/core/browser/url_blacklist_manager.cc
index ffc8dacb602d8646f41a87fda11a62db2fe038d9..f2574fe2c7546d8950fc3c90d961998879433f39 100644
--- a/components/policy/core/browser/url_blacklist_manager.cc
+++ b/components/policy/core/browser/url_blacklist_manager.cc
@@ -26,6 +26,7 @@
#include "net/base/net_errors.h"
#include "url/third_party/mozilla/url_parse.h"
#include "url/url_constants.h"
+#include "url/url_util.h"
using url_matcher::URLMatcher;
using url_matcher::URLMatcherCondition;
@@ -230,6 +231,36 @@ bool URLBlacklist::IsURLBlocked(const GURL& url) const {
return !max->allow;
}
+net::NetworkDelegate::URLBlacklistState URLBlacklist::GetURLBlacklistState(
+ const GURL& url) const {
+ std::set<URLMatcherConditionSet::ID> matching_ids =
+ url_matcher_->MatchURL(url);
+
+ const FilterComponents* max = NULL;
Thiemo Nagel 2016/03/08 18:44:34 NULL --> nullptr
igorcov1 2016/04/12 07:01:45 Done.
+ for (std::set<URLMatcherConditionSet::ID>::iterator id = matching_ids.begin();
+ id != matching_ids.end(); ++id) {
+ std::map<int, FilterComponents>::const_iterator it = filters_.find(*id);
+ DCHECK(it != filters_.end());
+ const FilterComponents& filter = it->second;
+ if (!max || FilterTakesPrecedence(filter, *max))
+ max = &filter;
+ }
+
+ // Default neutral.
+ if (!max)
+ return net::NetworkDelegate::URLBlacklistState::URL_NEUTRAL_STATE;
+
+ // Some of the internal Chrome URLs are not affected by the "*" in the
+ // blacklist. Note that the "*" is the lowest priority filter possible, so
+ // any higher priority filter will be applied first.
+ if (max->IsBlacklistWildcard() && BypassBlacklistWildcardForURL(url))
+ return net::NetworkDelegate::URLBlacklistState::URL_IN_WHITELIST;
+
+ return max->allow ?
+ net::NetworkDelegate::URLBlacklistState::URL_IN_WHITELIST :
+ net::NetworkDelegate::URLBlacklistState::URL_IN_BLACKLIST;
+}
+
size_t URLBlacklist::Size() const {
return filters_.size();
}
@@ -245,7 +276,8 @@ bool URLBlacklist::FilterToComponents(SegmentURLCallback segment_url,
std::string* query) {
url::Parsed parsed;
- if (segment_url(filter, &parsed) == url::kFileScheme) {
+ std::string url_scheme = segment_url(filter, &parsed);
+ if (url_scheme == url::kFileScheme) {
base::FilePath file_path;
if (!net::FileURLToFilePath(GURL(filter), &file_path))
return false;
@@ -264,8 +296,19 @@ bool URLBlacklist::FilterToComponents(SegmentURLCallback segment_url,
return true;
}
- if (!parsed.host.is_nonempty())
+ // Check if a custom scheme pattern is defined.
+ if (!url_scheme.empty() && !parsed.host.is_nonempty() &&
Thiemo Nagel 2016/03/08 18:44:34 Why must the host be empty? The IsStandard() call
igorcov 2016/03/09 15:21:06 We want our code to check for custom scheme only w
Thiemo Nagel 2016/03/10 14:37:26 I don't think that we should depend on undocumente
igorcov1 2016/04/12 07:01:45 The code already relies on that implementation det
Thiemo Nagel 2016/04/12 13:35:47 While the fact that you state is true, I don't con
igorcov 2016/04/12 16:09:30 Move the code outside of checking the URL host. Th
Thiemo Nagel 2016/04/12 17:20:57 What is the purpose of the remaining "if (!parsed.
+ !url::IsStandard(url_scheme.c_str(),
+ url::Component(0,
+ static_cast<int>(url_scheme.length()))) &&
+ filter == url_scheme + "://*") {
Thiemo Nagel 2016/03/08 18:44:34 This breaks normalization of URLs and schemes (eg.
igorcov 2016/03/09 15:21:06 The filter is defined by admin, and it has to be a
Thiemo Nagel 2016/03/10 14:37:26 We don't specify that schemes must be lower-case b
igorcov1 2016/04/12 07:01:45 It's case insensitive because the url_scheme is ta
Thiemo Nagel 2016/04/12 14:43:05 The way I read GetValidScheme(), normalization onl
igorcov 2016/04/12 16:09:30 I've fixed to compare ignore case. Unfortunately t
Thiemo Nagel 2016/04/12 17:20:57 I don't think this is acceptable. Please implemen
igorcov 2016/04/18 15:16:35 Implemented to have scheme, host and path case ins
+ scheme->assign(url_scheme);
+ return true;
+ }
+
+ if (!parsed.host.is_nonempty()) {
return false;
+ }
if (parsed.scheme.is_nonempty())
scheme->assign(filter, parsed.scheme.begin, parsed.scheme.len);
@@ -491,6 +534,12 @@ bool URLBlacklistManager::IsURLBlocked(const GURL& url) const {
return blacklist_->IsURLBlocked(url);
}
+net::NetworkDelegate::URLBlacklistState
+URLBlacklistManager::GetURLBlacklistState(const GURL& url) const {
+ DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
+ return blacklist_->GetURLBlacklistState(url);
+}
+
bool URLBlacklistManager::ShouldBlockRequestForFrame(const GURL& url,
int* reason) const {
DCHECK(io_task_runner_->RunsTasksOnCurrentThread());

Powered by Google App Engine
This is Rietveld 408576698