Reviewers: Devlin
CL:
https://codereview.chromium.org/2730533002/Message:
rdevlin.cronin@: PTAL?
Description:
chrome.contentSettings API: Do not allow wildcard patterns that match extension
URLs
BUG=677714
Affected files (+60, -3 lines):
M chrome/browser/extensions/api/content_settings/content_settings_api.cc
M chrome/test/data/extensions/api_test/content_settings/unsupporteddefaultsettings/test.js
M components/content_settings/core/common/BUILD.gn
M components/content_settings/core/common/DEPS
M components/content_settings/core/common/content_settings_pattern.h
M components/content_settings/core/common/content_settings_pattern.cc
M components/content_settings/core/common/content_settings_pattern_unittest.cc
Index: chrome/browser/extensions/api/content_settings/content_settings_api.cc
diff --git a/chrome/browser/extensions/api/content_settings/content_settings_api.cc b/chrome/browser/extensions/api/content_settings/content_settings_api.cc
index c63d8f45e015fc794c3b8d4ccf7e9ed7c85be237..51e795481ab3848523cd0944a7f7b29c069ca747 100644
--- a/chrome/browser/extensions/api/content_settings/content_settings_api.cc
+++ b/chrome/browser/extensions/api/content_settings/content_settings_api.cc
@@ -214,8 +214,11 @@ ContentSettingsContentSettingSetFunction::Run() {
// some values might not be supported.
// For example, camera supports [allow, ask, block] for exceptions, but only
// [ask, block] for the default setting.
- if (primary_pattern == ContentSettingsPattern::Wildcard() &&
- secondary_pattern == ContentSettingsPattern::Wildcard() &&
+ // Also, do not allow wildcard patterns that match chrome-extension URLs.
+ if (((primary_pattern.MatchesExtensionUrls() &&
+ secondary_pattern.MatchesExtensionUrls()) ||
+ (primary_pattern == ContentSettingsPattern::Wildcard() &&
+ secondary_pattern == ContentSettingsPattern::Wildcard())) &&
!HostContentSettingsMap::IsDefaultSettingAllowedForType(setting,
content_type)) {
static const char kUnsupportedDefaultSettingError[] =
Index: chrome/test/data/extensions/api_test/content_settings/unsupporteddefaultsettings/test.js
diff --git a/chrome/test/data/extensions/api_test/content_settings/unsupporteddefaultsettings/test.js b/chrome/test/data/extensions/api_test/content_settings/unsupporteddefaultsettings/test.js
index d57487041ffcc461c9b2bdcb6f39504ca3c8f575..e7574e7903f73a78f0dc75290b7daf6e12da4fd3 100644
--- a/chrome/test/data/extensions/api_test/content_settings/unsupporteddefaultsettings/test.js
+++ b/chrome/test/data/extensions/api_test/content_settings/unsupporteddefaultsettings/test.js
@@ -36,7 +36,7 @@ function expectFalse(message) {
}
chrome.test.runTests([
- function setDefaultContentSettings() {
+ function setDefaultContentSettingsAllUrls() {
settings.forEach(function(type, setting) {
cs[type].set({
'primaryPattern': '<all_urls>',
@@ -47,6 +47,32 @@ chrome.test.runTests([
"' is not supported as the default setting of " + type + "."));
});
},
+
+ // Patterns with scheme wildcards and extension IDs shouldn't be added.
+ function setDefaultContentSettingsExtensionUrlWildcard() {
+ settings.forEach(function(type, setting) {
+ cs[type].set({
+ 'primaryPattern': '*://' +
chrome.runtime.id + '/*',
+ 'secondaryPattern': '*://' +
chrome.runtime.id + '/*',
+ 'setting': setting
+ },
+ chrome.test.callbackFail("'" + setting +
+ "' is not supported as the default setting of " + type + "."));
+ });
+ },
+
+ // Patterns with chrome-extension scheme and extension IDs shouldn't be added.
+ function setDefaultContentSettingsExtensionUrlWildcard() {
+ settings.forEach(function(type, setting) {
+ cs[type].set({
+ 'primaryPattern': 'chrome-extension://' +
chrome.runtime.id + '/*',
+ 'secondaryPattern': 'chrome-extension://' +
chrome.runtime.id + '/*',
+ 'setting': setting
+ },
+ chrome.test.callbackFail("Invalid scheme."));
+ });
+ },
+
function setExceptions() {
settings.forEach(function(type, setting) {
cs[type].set({
Index: components/content_settings/core/common/BUILD.gn
diff --git a/components/content_settings/core/common/BUILD.gn b/components/content_settings/core/common/BUILD.gn
index 42404221620090bf37de7d687fefa8a87d135a1c..d00951022c6806bc2e155a59ddc28fda40a44d45 100644
--- a/components/content_settings/core/common/BUILD.gn
+++ b/components/content_settings/core/common/BUILD.gn
@@ -23,6 +23,7 @@ static_library("common") {
"//base",
"//mojo/public/cpp/bindings:struct_traits",
"//net",
+ "//third_party/re2",
"//url",
]
}
Index: components/content_settings/core/common/DEPS
diff --git a/components/content_settings/core/common/DEPS b/components/content_settings/core/common/DEPS
index 4e501b277a109fbcd61ef6b99845c9137f4b6775..426d09ff5227aa39bcaebb73b0504f173db831f6 100644
--- a/components/content_settings/core/common/DEPS
+++ b/components/content_settings/core/common/DEPS
@@ -2,5 +2,6 @@ include_rules = [
"+mojo/public/cpp/bindings",
"+net/base",
"+testing",
+ "+third_party/re2",
"+url",
]
Index: components/content_settings/core/common/content_settings_pattern.cc
diff --git a/components/content_settings/core/common/content_settings_pattern.cc b/components/content_settings/core/common/content_settings_pattern.cc
index a83a6959a02240575eae95fe7168e4ea75c644bc..f2694c27eae180ff92e4582aaf1c26275df800b0 100644
--- a/components/content_settings/core/common/content_settings_pattern.cc
+++ b/components/content_settings/core/common/content_settings_pattern.cc
@@ -14,6 +14,7 @@
#include "base/strings/string_util.h"
#include "components/content_settings/core/common/content_settings_pattern_parser.h"
#include "net/base/url_util.h"
+#include "third_party/re2/src/re2/re2.h"
#include "url/gurl.h"
namespace {
@@ -533,6 +534,13 @@ ContentSettingsPattern::ContentSettingsPattern(
is_valid_(valid) {
}
+bool ContentSettingsPattern::MatchesExtensionUrls() const {
+ const char kExtensionIdRegex[] = "^[a-zA-Z]{32}";
+ return (parts_.is_scheme_wildcard || parts_.scheme == "chrome-extension") &&
+ (parts_.has_domain_wildcard ||
+ RE2::FullMatch(parts_.host, kExtensionIdRegex));
+}
+
bool ContentSettingsPattern::Matches(
const GURL& url) const {
// An invalid pattern matches nothing.
Index: components/content_settings/core/common/content_settings_pattern.h
diff --git a/components/content_settings/core/common/content_settings_pattern.h b/components/content_settings/core/common/content_settings_pattern.h
index 7d6fc8d00dd04d3e700a806eccc368907dd6f21e..36db8f72a9a41b274af36196836d6a6fd911ed12 100644
--- a/components/content_settings/core/common/content_settings_pattern.h
+++ b/components/content_settings/core/common/content_settings_pattern.h
@@ -190,6 +190,11 @@ class ContentSettingsPattern {
// True if |url| matches this pattern.
bool Matches(const GURL& url) const;
+ // True if the pattern matches any extension URL (i.e. the scheme is
+ // a wildcard or chrome-extension, and the hostname is a wildcard or looks
+ // like an extension ID).
+ bool MatchesExtensionUrls() const;
+
// True if this pattern matches all hosts (i.e. it has a host wildcard).
bool MatchesAllHosts() const;
Index: components/content_settings/core/common/content_settings_pattern_unittest.cc
diff --git a/components/content_settings/core/common/content_settings_pattern_unittest.cc b/components/content_settings/core/common/content_settings_pattern_unittest.cc
index d5aab80ab86a3d0d69fde5eef8acd91633b49729..90a1dc13aded144c831c4d53fa179bdb31bb8cb4 100644
--- a/components/content_settings/core/common/content_settings_pattern_unittest.cc
+++ b/components/content_settings/core/common/content_settings_pattern_unittest.cc
@@ -317,6 +317,19 @@ TEST(ContentSettingsPatternTest, FromString_FilePatterns) {
pattern.Compare(file_wildcard));
}
+TEST(ContentSettingsPatternTest, FromString_MatchesExtensionUrls) {
+ EXPECT_TRUE(Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
+ .MatchesExtensionUrls());
+ EXPECT_FALSE(
+ Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelelaaaa/")
+ .MatchesExtensionUrls());
+
+ EXPECT_TRUE(
+ Pattern("*://peoadpeiejnhkmpaakpnompolbglelel/").MatchesExtensionUrls());
+ EXPECT_FALSE(Pattern("*://peoadpeiejnhkmpaakpnompolbglelelaaaa/")
+ .MatchesExtensionUrls());
+}
+
TEST(ContentSettingsPatternTest, FromString_ExtensionPatterns) {
EXPECT_TRUE(Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
.IsValid());