summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-13 17:25:12 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-13 17:25:12 +0000
commitd6336a9e8c15b5f3b0be1da2685fcc471e27fbac (patch)
tree9db441797f9e945735cbbe5a16693ae068972b23 /chrome
parent399c16fa178366fb55aa8e8b5acd313beede6a40 (diff)
downloadchromium_src-d6336a9e8c15b5f3b0be1da2685fcc471e27fbac.zip
chromium_src-d6336a9e8c15b5f3b0be1da2685fcc471e27fbac.tar.gz
chromium_src-d6336a9e8c15b5f3b0be1da2685fcc471e27fbac.tar.bz2
Add privacy_blacklists key to extension manifest and validate it.
This is the first step towards shipping privacy blacklists in extensions. TEST=Covered by unit_tests. BUG=none Review URL: http://codereview.chromium.org/164349 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23316 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/extension_file_util.cc12
-rw-r--r--chrome/common/extensions/extension.cc20
-rw-r--r--chrome/common/extensions/extension.h12
-rw-r--r--chrome/common/extensions/extension_constants.cc5
-rw-r--r--chrome/common/extensions/extension_constants.h3
-rw-r--r--chrome/common/extensions/extension_unittest.cc17
-rw-r--r--chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/blacklist.pbl12
-rw-r--r--chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/manifest.json3
8 files changed, 81 insertions, 3 deletions
diff --git a/chrome/browser/extensions/extension_file_util.cc b/chrome/browser/extensions/extension_file_util.cc
index 838bcdf..6c86965 100644
--- a/chrome/browser/extensions/extension_file_util.cc
+++ b/chrome/browser/extensions/extension_file_util.cc
@@ -239,6 +239,7 @@ Extension* LoadExtension(const FilePath& extension_path, bool require_key,
}
}
+ // Validate claimed plugin paths.
for (size_t i = 0; i < extension->plugins().size(); ++i) {
const Extension::PluginInfo& plugin = extension->plugins()[i];
if (!file_util::PathExists(plugin.path)) {
@@ -248,6 +249,17 @@ Extension* LoadExtension(const FilePath& extension_path, bool require_key,
}
}
+ // Validate claimed privacy blacklists paths.
+ for (size_t i = 0; i < extension->privacy_blacklists().size(); ++i) {
+ const Extension::PrivacyBlacklistInfo& blacklist =
+ extension->privacy_blacklists()[i];
+ if (!file_util::PathExists(blacklist.path)) {
+ *error = StringPrintf("Could not load '%s' for privacy blacklist.",
+ WideToUTF8(blacklist.path.ToWStringHack()).c_str());
+ return NULL;
+ }
+ }
+
// Validate icon location for page actions.
const PageActionMap& page_actions = extension->page_actions();
for (PageActionMap::const_iterator i(page_actions.begin());
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index 0ed6bf5..ebb8d13 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -716,6 +716,26 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id,
return true;
}
+ // Initialize privacy blacklists (optional).
+ if (source.HasKey(keys::kPrivacyBlacklists)) {
+ ListValue* blacklists;
+ if (!source.GetList(keys::kPrivacyBlacklists, &blacklists)) {
+ *error = errors::kInvalidPrivacyBlacklists;
+ return false;
+ }
+
+ for (size_t i = 0; i < blacklists->GetSize(); ++i) {
+ std::string path;
+ if (!blacklists->GetString(i, &path)) {
+ *error = ExtensionErrorUtils::FormatErrorMessage(
+ errors::kInvalidPrivacyBlacklistsPath, IntToString(i));
+ return false;
+ }
+ privacy_blacklists_.push_back(PrivacyBlacklistInfo());
+ privacy_blacklists_.back().path = path_.AppendASCII(path);
+ }
+ }
+
// Initialize plugins (optional).
if (source.HasKey(keys::kPlugins)) {
ListValue* list_value;
diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h
index 1452014..5bcc456 100644
--- a/chrome/common/extensions/extension.h
+++ b/chrome/common/extensions/extension.h
@@ -71,6 +71,10 @@ class Extension {
PERMISSION_CLASS_FULL, // red
};
+ struct PrivacyBlacklistInfo {
+ FilePath path; // Path to the plain-text blacklist.
+ };
+
// An NPAPI plugin included in the extension.
struct PluginInfo {
FilePath path; // Path to the plugin.
@@ -182,6 +186,9 @@ class Extension {
const std::string& description() const { return description_; }
const UserScriptList& content_scripts() const { return content_scripts_; }
const PageActionMap& page_actions() const { return page_actions_; }
+ const std::vector<PrivacyBlacklistInfo>& privacy_blacklists() const {
+ return privacy_blacklists_;
+ }
const std::vector<PluginInfo>& plugins() const { return plugins_; }
const GURL& background_url() const { return background_url_; }
const std::vector<ToolstripInfo>& toolstrips() const { return toolstrips_; }
@@ -284,6 +291,9 @@ class Extension {
// A list of page actions.
PageActionMap page_actions_;
+ // Optional list of privacy blacklistrom.
+ std::vector<PrivacyBlacklistInfo> privacy_blacklists_;
+
// Optional list of NPAPI plugins and associated properties.
std::vector<PluginInfo> plugins_;
@@ -324,7 +334,7 @@ class Extension {
// URL for fetching an update manifest
GURL update_url_;
-
+
// Runtime data:
diff --git a/chrome/common/extensions/extension_constants.cc b/chrome/common/extensions/extension_constants.cc
index 7965746..f1b8783 100644
--- a/chrome/common/extensions/extension_constants.cc
+++ b/chrome/common/extensions/extension_constants.cc
@@ -21,6 +21,7 @@ const wchar_t* kPermissions = L"permissions";
const wchar_t* kPlugins = L"plugins";
const wchar_t* kPluginsPath = L"path";
const wchar_t* kPluginsPublic = L"public";
+const wchar_t* kPrivacyBlacklists = L"privacy_blacklists";
const wchar_t* kPublicKey = L"key";
const wchar_t* kRunAt = L"run_at";
const wchar_t* kSignature = L"signature";
@@ -108,6 +109,10 @@ const char* kInvalidPluginsPath =
"Invalid value for 'plugins[*].path'.";
const char* kInvalidPluginsPublic =
"Invalid value for 'plugins[*].public'.";
+const char* kInvalidPrivacyBlacklists =
+ "Invalid value for 'privacy_blacklists'.";
+const char* kInvalidPrivacyBlacklistsPath =
+ "Invalid value for 'privacy_blacklists[*]'.";
const char* kInvalidBackground =
"Invalid value for 'background'.";
const char* kInvalidRunAt =
diff --git a/chrome/common/extensions/extension_constants.h b/chrome/common/extensions/extension_constants.h
index 0bac6dd..2785b28 100644
--- a/chrome/common/extensions/extension_constants.h
+++ b/chrome/common/extensions/extension_constants.h
@@ -22,6 +22,7 @@ namespace extension_manifest_keys {
extern const wchar_t* kPlugins;
extern const wchar_t* kPluginsPath;
extern const wchar_t* kPluginsPublic;
+ extern const wchar_t* kPrivacyBlacklists;
extern const wchar_t* kPublicKey;
extern const wchar_t* kSignature;
extern const wchar_t* kRunAt;
@@ -67,6 +68,8 @@ namespace extension_manifest_errors {
extern const char* kInvalidPlugins;
extern const char* kInvalidPluginsPath;
extern const char* kInvalidPluginsPublic;
+ extern const char* kInvalidPrivacyBlacklists;
+ extern const char* kInvalidPrivacyBlacklistsPath;
extern const char* kInvalidBackground;
extern const char* kInvalidRunAt;
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc
index a0eed4e..fc97cc1 100644
--- a/chrome/common/extensions/extension_unittest.cc
+++ b/chrome/common/extensions/extension_unittest.cc
@@ -52,8 +52,8 @@ TEST(ExtensionTest, InitFromValueInvalid) {
JSONFileValueSerializer serializer(extensions_path);
scoped_ptr<DictionaryValue> valid_value(
static_cast<DictionaryValue*>(serializer.Deserialize(&error)));
+ EXPECT_EQ("", error);
ASSERT_TRUE(valid_value.get());
- ASSERT_EQ("", error);
ASSERT_TRUE(extension.InitFromValue(*valid_value, true, &error));
ASSERT_EQ("", error);
@@ -216,6 +216,21 @@ TEST(ExtensionTest, InitFromValueInvalid) {
permissions->Set(0, Value::CreateStringValue("file:///C:/foo.txt"));
EXPECT_FALSE(extension.InitFromValue(*input_value, true, &error));
EXPECT_TRUE(MatchPattern(error, errors::kInvalidPermissionScheme));
+
+ // Test invalid privacy blacklists list.
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ input_value->SetInteger(keys::kPrivacyBlacklists, 42);
+ EXPECT_FALSE(extension.InitFromValue(*input_value, true, &error));
+ EXPECT_EQ(errors::kInvalidPrivacyBlacklists, error);
+
+ // Test invalid privacy blacklists list item.
+ input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy()));
+ ListValue* privacy_blacklists = NULL;
+ input_value->GetList(keys::kPrivacyBlacklists, &privacy_blacklists);
+ ASSERT_FALSE(NULL == privacy_blacklists);
+ privacy_blacklists->Set(0, Value::CreateIntegerValue(42));
+ EXPECT_FALSE(extension.InitFromValue(*input_value, true, &error));
+ EXPECT_TRUE(MatchPattern(error, errors::kInvalidPrivacyBlacklistsPath));
}
TEST(ExtensionTest, InitFromValueValid) {
diff --git a/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/blacklist.pbl b/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/blacklist.pbl
new file mode 100644
index 0000000..b9dc8d2
--- /dev/null
+++ b/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/blacklist.pbl
@@ -0,0 +1,12 @@
+[Chromium::PrivacyBlacklist]
+|Name: AnnoyingAds
+|URL: http://www.ads.tv
+
+# Block Ads by servers
+annoying.ads.tv/@ => kBlockAll
+
+# Block Ads by name
+@/annoying/120x600.jpg => kBlockAll
+
+# Block Ads by path
+@/annoying_ads/@ => kBlockAll
diff --git a/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/manifest.json b/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/manifest.json
index 03acc6b..65283a3 100644
--- a/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/manifest.json
+++ b/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/manifest.json
@@ -25,5 +25,6 @@
"matches": ["http://*.news.com/*"],
"js": ["js_files/script3.js"]
}
- ]
+ ],
+ "privacy_blacklists": ["blacklist.pbl"]
}