diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-13 17:25:12 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-13 17:25:12 +0000 |
commit | d6336a9e8c15b5f3b0be1da2685fcc471e27fbac (patch) | |
tree | 9db441797f9e945735cbbe5a16693ae068972b23 /chrome | |
parent | 399c16fa178366fb55aa8e8b5acd313beede6a40 (diff) | |
download | chromium_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')
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"] } |