diff options
author | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-23 17:10:42 +0000 |
---|---|---|
committer | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-23 17:10:42 +0000 |
commit | 3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013 (patch) | |
tree | 0fba63f95cfe2d3cb20dbf5ec9156e6f223e66dc /chrome/browser | |
parent | eec23bcdb7ac703c4c32f059b5871361f2bdd5e6 (diff) | |
download | chromium_src-3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013.zip chromium_src-3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013.tar.gz chromium_src-3e31a0ada9e03e67f8a6fc74e6e750fe4fc61013.tar.bz2 |
Move version metadata from PluginGroup into PluginInstaller.
This also moves the plug-in information JSON files into their own subdirectory, so they can be changed without requiring OWNERS reviews for chrome/browser/resources (which is mostly WebUI otherwise).
BUG=124396
TEST=PluginInstallerTest.SecurityStatus:PluginFinderTest.JsonSyntax
Review URL: https://chromiumcodereview.appspot.com/10263022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@138502 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
16 files changed, 475 insertions, 139 deletions
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 28a9d02..9c24f53 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd @@ -90,13 +90,13 @@ <include name="IDR_PLUGINS_HTML" file="resources\plugins.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> <include name="IDR_PLUGINS_JS" file="resources\plugins.js" type="BINDATA" /> <if expr="is_win"> - <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_win.json" type="BINDATA" /> + <include name="IDR_PLUGIN_DB_JSON" file="resources\plugin_metadata\plugins_win.json" type="BINDATA" /> </if> <if expr="is_macosx"> - <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_mac.json" type="BINDATA" /> + <include name="IDR_PLUGIN_DB_JSON" file="resources\plugin_metadata\plugins_mac.json" type="BINDATA" /> </if> <if expr="is_linux"> - <include name="IDR_PLUGIN_DB_JSON" file="resources\plugins_linux.json" type="BINDATA" /> + <include name="IDR_PLUGIN_DB_JSON" file="resources\plugin_metadata\plugins_linux.json" type="BINDATA" /> </if> <include name="IDR_POLICY_CSS" file="resources\policy.css" type="BINDATA"/> <include name="IDR_POLICY_HTML" file="resources\policy.html" flattenhtml="true" allowexternalscript="true" type="BINDATA"/> diff --git a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc index c44e5a0..8dc534f 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_apitest.cc @@ -105,7 +105,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, const char* kFooName = "Foo Plugin"; const char* kBarName = "Bar Plugin"; const webkit::npapi::PluginGroupDefinition kPluginDefinitions[] = { - { "foo", "Foo", kFooName, NULL, 0 }, + { "foo", "Foo", kFooName }, }; webkit::npapi::MockPluginList plugin_list(kPluginDefinitions, diff --git a/chrome/browser/plugin_finder.cc b/chrome/browser/plugin_finder.cc index 2456169..a4609ed 100644 --- a/chrome/browser/plugin_finder.cc +++ b/chrome/browser/plugin_finder.cc @@ -130,14 +130,35 @@ PluginInstaller* PluginFinder::CreateInstaller( DCHECK(success); bool display_url = false; plugin_dict->GetBoolean("displayurl", &display_url); - bool requires_authorization = true; - plugin_dict->GetBoolean("requires_authorization", &requires_authorization); + PluginInstaller* installer = new PluginInstaller(identifier, - GURL(url), - GURL(help_url), name, display_url, - requires_authorization); + GURL(url), + GURL(help_url)); + ListValue* versions = NULL; + if (plugin_dict->GetList("versions", &versions)) { + for (ListValue::const_iterator it = versions->begin(); + it != versions->end(); ++it) { + DictionaryValue* version_dict = NULL; + if (!(*it)->GetAsDictionary(&version_dict)) { + NOTREACHED(); + continue; + } + std::string version; + success = version_dict->GetString("version", &version); + DCHECK(success); + std::string status_str; + success = version_dict->GetString("status", &status_str); + DCHECK(success); + PluginInstaller::SecurityStatus status = + PluginInstaller::SECURITY_STATUS_UP_TO_DATE; + success = PluginInstaller::ParseSecurityStatus(status_str, &status); + DCHECK(success); + installer->AddVersion(Version(version), status); + } + } + installers_[identifier] = installer; return installer; } diff --git a/chrome/browser/plugin_finder_unittest.cc b/chrome/browser/plugin_finder_unittest.cc index fede022..d6afe1f 100644 --- a/chrome/browser/plugin_finder_unittest.cc +++ b/chrome/browser/plugin_finder_unittest.cc @@ -5,6 +5,7 @@ #include "chrome/browser/plugin_finder.h" #include "base/values.h" +#include "chrome/browser/plugin_installer.h" #include "testing/gtest/include/gtest/gtest.h" #include "webkit/plugins/npapi/plugin_list.h" @@ -36,20 +37,21 @@ TEST(PluginFinderTest, JsonSyntax) { mime_type_it != mime_types->end(); ++mime_type_it) { EXPECT_TRUE((*mime_type_it)->GetAsString(&dummy_str)); } - } -} - -TEST(PluginFinderTest, PluginGroups) { - PluginFinder plugin_finder; - PluginList* plugin_list = PluginList::Singleton(); - const std::vector<PluginGroup*>& plugin_groups = - plugin_list->GetHardcodedPluginGroups(); - for (std::vector<PluginGroup*>::const_iterator it = plugin_groups.begin(); - it != plugin_groups.end(); ++it) { - if ((*it)->version_ranges().empty()) + ListValue* versions = NULL; + if (!plugin->GetList("versions", &versions)) continue; - std::string identifier = (*it)->identifier(); - EXPECT_TRUE(plugin_finder.FindPluginWithIdentifier(identifier)) << - "Couldn't find PluginInstaller for '" << identifier << "'"; + + for (ListValue::const_iterator it = versions->begin(); + it != versions->end(); ++it) { + DictionaryValue* version_dict = NULL; + ASSERT_TRUE((*it)->GetAsDictionary(&version_dict)); + EXPECT_TRUE(version_dict->GetString("version", &dummy_str)); + std::string status_str; + EXPECT_TRUE(version_dict->GetString("status", &status_str)); + PluginInstaller::SecurityStatus status = + PluginInstaller::SECURITY_STATUS_UP_TO_DATE; + EXPECT_TRUE(PluginInstaller::ParseSecurityStatus(status_str, &status)) + << "Invalid security status \"" << status_str << "\""; + } } } diff --git a/chrome/browser/plugin_infobar_delegates.cc b/chrome/browser/plugin_infobar_delegates.cc index e8a94ba..59bf3a3 100644 --- a/chrome/browser/plugin_infobar_delegates.cc +++ b/chrome/browser/plugin_infobar_delegates.cc @@ -150,11 +150,11 @@ InfoBarDelegate* OutdatedPluginInfoBarDelegate::Create( PluginInstaller* installer) { string16 message; switch (installer->state()) { - case PluginInstaller::kStateIdle: + case PluginInstaller::INSTALLER_STATE_IDLE: message = l10n_util::GetStringFUTF16(IDS_PLUGIN_OUTDATED_PROMPT, installer->name()); break; - case PluginInstaller::kStateDownloading: + case PluginInstaller::INSTALLER_STATE_DOWNLOADING: message = l10n_util::GetStringFUTF16(IDS_PLUGIN_DOWNLOADING, installer->name()); break; @@ -216,7 +216,7 @@ string16 OutdatedPluginInfoBarDelegate::GetButtonLabel( bool OutdatedPluginInfoBarDelegate::Accept() { content::RecordAction(UserMetricsAction("OutdatedPluginInfobar.Update")); - if (installer()->state() != PluginInstaller::kStateIdle) { + if (installer()->state() != PluginInstaller::INSTALLER_STATE_IDLE) { NOTREACHED(); return false; } @@ -314,11 +314,11 @@ InfoBarDelegate* PluginInstallerInfoBarDelegate::Create( string16 message; const string16& plugin_name = installer->name(); switch (installer->state()) { - case PluginInstaller::kStateIdle: + case PluginInstaller::INSTALLER_STATE_IDLE: message = l10n_util::GetStringFUTF16( IDS_PLUGININSTALLER_INSTALLPLUGIN_PROMPT, plugin_name); break; - case PluginInstaller::kStateDownloading: + case PluginInstaller::INSTALLER_STATE_DOWNLOADING: message = l10n_util::GetStringFUTF16(IDS_PLUGIN_DOWNLOADING, plugin_name); break; } diff --git a/chrome/browser/plugin_installer.cc b/chrome/browser/plugin_installer.cc index 75e9cf2..8ba5853 100644 --- a/chrome/browser/plugin_installer.cc +++ b/chrome/browser/plugin_installer.cc @@ -25,6 +25,7 @@ #include "content/public/browser/resource_dispatcher_host.h" #include "content/public/browser/web_contents.h" #include "net/url_request/url_request.h" +#include "webkit/plugins/npapi/plugin_group.h" using content::BrowserThread; using content::DownloadItem; @@ -59,34 +60,83 @@ void BeginDownload( } } -} +} // namespace PluginInstaller::PluginInstaller(const std::string& identifier, - const GURL& plugin_url, - const GURL& help_url, const string16& name, bool url_for_display, - bool requires_authorization) - : state_(kStateIdle), - identifier_(identifier), - plugin_url_(plugin_url), - help_url_(help_url), + const GURL& plugin_url, + const GURL& help_url) + : identifier_(identifier), name_(name), url_for_display_(url_for_display), - requires_authorization_(requires_authorization) { + plugin_url_(plugin_url), + help_url_(help_url), + state_(INSTALLER_STATE_IDLE) { } PluginInstaller::~PluginInstaller() { } +void PluginInstaller::AddVersion(const Version& version, + SecurityStatus status) { + DCHECK(versions_.find(version) == versions_.end()); + versions_[version] = status; +} + +PluginInstaller::SecurityStatus PluginInstaller::GetSecurityStatus( + const webkit::WebPluginInfo& plugin) const { + // If there are no versions defined, the plug-in is alway considered + // up-to-date. + if (versions_.empty()) + return SECURITY_STATUS_UP_TO_DATE; + + scoped_ptr<Version> version( + webkit::npapi::PluginGroup::CreateVersionFromString(plugin.version)); + if (!version.get()) + version.reset(new Version("0")); + + // |lower_bound| returns the latest version that is not newer than |version|. + std::map<Version, SecurityStatus, VersionComparator>::const_iterator it = + versions_.lower_bound(*version); + // If there is at least one version defined, everything older than the oldest + // defined version is considered out-of-date. + if (it == versions_.end()) + return SECURITY_STATUS_OUT_OF_DATE; + + return it->second; +} + +bool PluginInstaller::VersionComparator::operator() (const Version& lhs, + const Version& rhs) const { + // Keep versions ordered by newest (biggest) first. + return lhs.CompareTo(rhs) > 0; +} + +// static +bool PluginInstaller::ParseSecurityStatus( + const std::string& status_str, + PluginInstaller::SecurityStatus* status) { + if (status_str == "up_to_date") + *status = SECURITY_STATUS_UP_TO_DATE; + else if (status_str == "out_of_date") + *status = SECURITY_STATUS_OUT_OF_DATE; + else if (status_str == "requires_authorization") + *status = SECURITY_STATUS_REQUIRES_AUTHORIZATION; + else + return false; + + return true; +} + void PluginInstaller::OnDownloadUpdated(DownloadItem* download) { DownloadItem::DownloadState state = download->GetState(); switch (state) { case DownloadItem::IN_PROGRESS: return; case DownloadItem::COMPLETE: { - DCHECK_EQ(kStateDownloading, state_); - state_ = kStateIdle; + DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_); + state_ = INSTALLER_STATE_IDLE; FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadFinished()); break; @@ -96,8 +146,8 @@ void PluginInstaller::OnDownloadUpdated(DownloadItem* download) { break; } case DownloadItem::REMOVING: { - DCHECK_EQ(kStateDownloading, state_); - state_ = kStateIdle; + DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_); + state_ = INSTALLER_STATE_IDLE; break; } case DownloadItem::INTERRUPTED: { @@ -138,9 +188,9 @@ void PluginInstaller::RemoveWeakObserver( } void PluginInstaller::StartInstalling(TabContentsWrapper* wrapper) { - DCHECK(state_ == kStateIdle); + DCHECK_EQ(INSTALLER_STATE_IDLE, state_); DCHECK(!url_for_display_); - state_ = kStateDownloading; + state_ = INSTALLER_STATE_DOWNLOADING; FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadStarted()); content::WebContents* web_contents = wrapper->web_contents(); DownloadService* download_service = @@ -177,7 +227,7 @@ void PluginInstaller::DownloadStarted( } void PluginInstaller::OpenDownloadURL(content::WebContents* web_contents) { - DCHECK(state_ == kStateIdle); + DCHECK_EQ(INSTALLER_STATE_IDLE, state_); DCHECK(url_for_display_); web_contents->OpenURL(content::OpenURLParams( plugin_url_, @@ -188,13 +238,13 @@ void PluginInstaller::OpenDownloadURL(content::WebContents* web_contents) { } void PluginInstaller::DownloadError(const std::string& msg) { - DCHECK(state_ == kStateDownloading); - state_ = kStateIdle; + DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_); + state_ = INSTALLER_STATE_IDLE; FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadError(msg)); } void PluginInstaller::DownloadCancelled() { - DCHECK(state_ == kStateDownloading); - state_ = kStateIdle; + DCHECK_EQ(INSTALLER_STATE_DOWNLOADING, state_); + state_ = INSTALLER_STATE_IDLE; FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadCancelled()); } diff --git a/chrome/browser/plugin_installer.h b/chrome/browser/plugin_installer.h index b3a9f53..89cc7c7 100644 --- a/chrome/browser/plugin_installer.h +++ b/chrome/browser/plugin_installer.h @@ -8,6 +8,7 @@ #include "base/observer_list.h" #include "base/string16.h" +#include "base/version.h" #include "googleurl/src/gurl.h" #include "content/public/browser/download_id.h" #include "content/public/browser/download_item.h" @@ -22,19 +23,29 @@ namespace content { class WebContents; } +namespace webkit { +struct WebPluginInfo; +} + class PluginInstaller : public content::DownloadItem::Observer { public: - enum State { - kStateIdle, - kStateDownloading, + enum InstallerState { + INSTALLER_STATE_IDLE, + INSTALLER_STATE_DOWNLOADING, + }; + + // Information about a certain version of the plug-in. + enum SecurityStatus { + SECURITY_STATUS_UP_TO_DATE, + SECURITY_STATUS_OUT_OF_DATE, + SECURITY_STATUS_REQUIRES_AUTHORIZATION, }; PluginInstaller(const std::string& identifier, - const GURL& plugin_url, - const GURL& help_url, const string16& name, bool url_for_display, - bool requires_authorization); + const GURL& plugin_url, + const GURL& help_url); virtual ~PluginInstaller(); virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE; @@ -47,18 +58,12 @@ class PluginInstaller : public content::DownloadItem::Observer { void AddWeakObserver(WeakPluginInstallerObserver* observer); void RemoveWeakObserver(WeakPluginInstallerObserver* observer); - State state() const { return state_; } - - // Unique identifier for the plug-in. Should be kept in sync with the - // identifier in plugin_list.cc. + // Unique identifier for the plug-in. const std::string& identifier() const { return identifier_; } // Human-readable name of the plug-in. const string16& name() const { return name_; } - // Whether the plug-in requires user authorization to run. - bool requires_authorization() const { return requires_authorization_; } - // If |url_for_display| is false, |plugin_url| is the URL of the download page // for the plug-in, which should be opened in a new tab. If it is true, // |plugin_url| is the URL of the plug-in installer binary, which can be @@ -69,6 +74,15 @@ class PluginInstaller : public content::DownloadItem::Observer { // URL to open when the user clicks on the "Problems installing?" link. const GURL& help_url() const { return help_url_; } + InstallerState state() const { return state_; } + + // Adds information about a plug-in version. + void AddVersion(const Version& version, SecurityStatus status); + + // Returns the security status for the given plug-in (i.e. whether it is + // considered out-of-date, etc.) + SecurityStatus GetSecurityStatus(const webkit::WebPluginInfo& plugin) const; + // Opens the download URL in a new tab. This method should only be called if // |url_for_display| returns true. void OpenDownloadURL(content::WebContents* web_contents); @@ -78,23 +92,32 @@ class PluginInstaller : public content::DownloadItem::Observer { // returns false. void StartInstalling(TabContentsWrapper* wrapper); + // If |status_str| describes a valid security status, writes it to |status| + // and returns true, else returns false and leaves |status| unchanged. + static bool ParseSecurityStatus(const std::string& status_str, + SecurityStatus* status); + private: + struct VersionComparator { + bool operator() (const Version& lhs, const Version& rhs) const; + }; + void DownloadStarted(scoped_refptr<content::DownloadManager> dlm, content::DownloadId download_id, net::Error error); void DownloadError(const std::string& msg); void DownloadCancelled(); - State state_; - ObserverList<PluginInstallerObserver> observers_; - ObserverList<WeakPluginInstallerObserver> weak_observers_; - std::string identifier_; - GURL plugin_url_; - GURL help_url_; string16 name_; bool url_for_display_; - bool requires_authorization_; + GURL plugin_url_; + GURL help_url_; + std::map<Version, SecurityStatus, VersionComparator> versions_; + + InstallerState state_; + ObserverList<PluginInstallerObserver> observers_; + ObserverList<WeakPluginInstallerObserver> weak_observers_; DISALLOW_COPY_AND_ASSIGN(PluginInstaller); }; diff --git a/chrome/browser/plugin_installer_unittest.cc b/chrome/browser/plugin_installer_unittest.cc new file mode 100644 index 0000000..57bcf64 --- /dev/null +++ b/chrome/browser/plugin_installer_unittest.cc @@ -0,0 +1,53 @@ +// 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/plugin_installer.h" + +#include "base/utf_string_conversions.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "webkit/plugins/webplugininfo.h" + +using webkit::WebPluginInfo; + +namespace { + +PluginInstaller::SecurityStatus GetSecurityStatus(PluginInstaller* installer, + const char* version) { + WebPluginInfo plugin(ASCIIToUTF16("Foo plug-in"), + FilePath(FILE_PATH_LITERAL("/tmp/plugin.so")), + ASCIIToUTF16(version), + ASCIIToUTF16("Foo plug-in.")); + return installer->GetSecurityStatus(plugin); +} + +} // namespace + +TEST(PluginInstallerTest, SecurityStatus) { + const PluginInstaller::SecurityStatus kUpToDate = + PluginInstaller::SECURITY_STATUS_UP_TO_DATE; + const PluginInstaller::SecurityStatus kOutOfDate = + PluginInstaller::SECURITY_STATUS_OUT_OF_DATE; + const PluginInstaller::SecurityStatus kRequiresAuthorization = + PluginInstaller::SECURITY_STATUS_REQUIRES_AUTHORIZATION; + + PluginInstaller installer("claybrick-writer", + ASCIIToUTF16("ClayBrick Writer"), + true, GURL(), GURL()); + EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "1.2.3")); + + installer.AddVersion(Version("9.4.1"), kRequiresAuthorization); + installer.AddVersion(Version("10"), kOutOfDate); + installer.AddVersion(Version("10.2.1"), kUpToDate); + + // Invalid version. + EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "foo")); + + EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "0")); + EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "1.2.3")); + EXPECT_EQ(kRequiresAuthorization, GetSecurityStatus(&installer, "9.4.1")); + EXPECT_EQ(kRequiresAuthorization, GetSecurityStatus(&installer, "9.4.2")); + EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "10.2.0")); + EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "10.2.1")); + EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "11")); +} diff --git a/chrome/browser/plugin_observer.cc b/chrome/browser/plugin_observer.cc index 1b3e333..094a9a5 100644 --- a/chrome/browser/plugin_observer.cc +++ b/chrome/browser/plugin_observer.cc @@ -123,12 +123,12 @@ class PluginObserver::PluginPlaceholderHost : public PluginInstallerObserver { routing_id_(routing_id) { DCHECK(installer); switch (installer->state()) { - case PluginInstaller::kStateIdle: { + case PluginInstaller::INSTALLER_STATE_IDLE: { observer->Send(new ChromeViewMsg_FoundMissingPlugin(routing_id_, installer->name())); break; } - case PluginInstaller::kStateDownloading: { + case PluginInstaller::INSTALLER_STATE_DOWNLOADING: { DownloadStarted(); break; } diff --git a/chrome/browser/renderer_host/plugin_info_message_filter.cc b/chrome/browser/renderer_host/plugin_info_message_filter.cc index 5cc5178..f29c9ee 100644 --- a/chrome/browser/renderer_host/plugin_info_message_filter.cc +++ b/chrome/browser/renderer_host/plugin_info_message_filter.cc @@ -158,30 +158,33 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus( &uses_default_content_setting); DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT); +#if defined(ENABLE_PLUGIN_INSTALLATION) + PluginInstaller::SecurityStatus plugin_status = + PluginInstaller::SECURITY_STATUS_UP_TO_DATE; + PluginInstaller* installer = + plugin_finder->FindPluginWithIdentifier(group->identifier()); + if (installer) + plugin_status = installer->GetSecurityStatus(plugin); // Check if the plug-in is outdated. - if (group->IsVulnerable(plugin) && !allow_outdated_plugins_.GetValue()) { + if (plugin_status == PluginInstaller::SECURITY_STATUS_OUT_OF_DATE && + !allow_outdated_plugins_.GetValue()) { if (allow_outdated_plugins_.IsManaged()) { status->value = ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedDisallowed; } else { - status->value = - ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedBlocked; + status->value = ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedBlocked; } return; } -#if defined(ENABLE_PLUGIN_INSTALLATION) // Check if the plug-in requires authorization. - // TODO(bauerb): This should be a plain struct with the plug-in information. - PluginInstaller* installer = - plugin_finder->FindPluginWithIdentifier(group->identifier()); - if (((installer && installer->requires_authorization()) || + if ((plugin_status == + PluginInstaller::SECURITY_STATUS_REQUIRES_AUTHORIZATION || PluginService::GetInstance()->IsPluginUnstable(plugin.path)) && !always_authorize_plugins_.GetValue() && plugin_setting != CONTENT_SETTING_BLOCK && uses_default_content_setting) { - status->value = - ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized; + status->value = ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized; return; } #endif diff --git a/chrome/browser/resources/plugin_metadata/OWNERS b/chrome/browser/resources/plugin_metadata/OWNERS new file mode 100644 index 0000000..f8dfbbb --- /dev/null +++ b/chrome/browser/resources/plugin_metadata/OWNERS @@ -0,0 +1,3 @@ +bauerb@chromium.org +cevans@chromium.org +jschuh@chromium.org diff --git a/chrome/browser/resources/plugins_linux.json b/chrome/browser/resources/plugin_metadata/plugins_linux.json index e56f226..244831c 100644 --- a/chrome/browser/resources/plugins_linux.json +++ b/chrome/browser/resources/plugin_metadata/plugins_linux.json @@ -33,6 +33,20 @@ "application/x-java-bean,version=1.6", "application/x-java-vm" ], + "versions": [ + { + "version": "1.6.0.31", + "status": "requires_authorization" + }, + { + "version": "1.7", + "status": "out_of_date" + }, + { + "version": "1.7.0.3", + "status": "requires_authorization" + } + ], "lang": "en-US", "name": "Java(TM)", "help_url": "https://support.google.com/chrome/?p=plugin_java", @@ -44,16 +58,56 @@ "application/futuresplash", "application/x-shockwave-flash" ], + "versions": [ + { + "version": "11.1.102", + "status": "up_to_date", + "reference": "http://www.adobe.com/support/security/bulletins/apsb12-03.html" + } + ], "lang": "en-US", "name": "Adobe Flash Player", "help_url": "https://support.google.com/chrome/?p=plugin_flash", "url": "http://get.adobe.com/flashplayer/", - "requires_authorization": false, "displayurl": true }, "redhat-icetea-java": { "mime_types": [ ], + "versions": [ + { + "version": "1.8.13", + "status": "requires_authorization", + "reference": "http://blog.fuseyism.com/index.php/2012/02/15/security-icedtea6-1-8-13-1-9-13-1-10-6-and-icedtea-2-0-1-released/" + }, + { + "version": "1.9", + "status": "out_of_date" + }, + { + "version": "1.9.13", + "status": "requires_authorization", + "reference": "http://blog.fuseyism.com/index.php/2012/02/15/security-icedtea6-1-8-13-1-9-13-1-10-6-and-icedtea-2-0-1-released/" + }, + { + "version": "1.10", + "status": "out_of_date" + }, + { + "version": "1.10.6", + "status": "requires_authorization", + "reference": "http://blog.fuseyism.com/index.php/2012/02/15/security-icedtea6-1-8-13-1-9-13-1-10-6-and-icedtea-2-0-1-released/" + }, + { + "version": "2", + "status": "out_of_date" + }, + { + "version": "2.0.1", + "status": "requires_authorization", + "reference": "http://blog.fuseyism.com/index.php/2012/02/15/security-icedtea6-1-8-13-1-9-13-1-10-6-and-icedtea-2-0-1-released/" + } + ], "lang": "en-US", "name": "IcedTea", "url": "http://icedtea.classpath.org/", diff --git a/chrome/browser/resources/plugins_mac.json b/chrome/browser/resources/plugin_metadata/plugins_mac.json index 2465ece..e195e34 100644 --- a/chrome/browser/resources/plugins_mac.json +++ b/chrome/browser/resources/plugin_metadata/plugins_mac.json @@ -33,6 +33,31 @@ "application/x-java-bean,version=1.6", "application/x-java-vm" ], + "versions": [ + { + "version": "12.8.0", + "status": "requires_authorization", + "comment": "Leopard" + }, + { + "version": "13", + "status": "out_of_date" + }, + { + "version": "13.5.0", + "status": "requires_authorization", + "comment": "Snow Leopard" + }, + { + "version": "14", + "status": "out_of_date" + }, + { + "version": "14.0.3", + "status": "requires_authorization", + "comment": "Lion" + } + ], "lang": "en-US", "name": "Java(TM)", "url": "http://java.com/en/download/apple_manual.jsp", @@ -46,6 +71,13 @@ "audio/x-pn-realaudio-plugin", "audio/x-pn-realaudio" ], + "versions": [ + { + "version": "0", + "status": "requires_authorization", + "comment": "The Real Player plug-in for mac doesn't expose a version at all." + } + ], "lang": "en-US", "name": "RealPlayer", "url": "http://director.real.com/realplayer?type=rpsp_mac", @@ -56,38 +88,34 @@ "application/futuresplash", "application/x-shockwave-flash" ], + "versions": [ + { + "version": "11.1.102", + "status": "up_to_date", + "reference": "http://www.adobe.com/support/security/bulletins/apsb12-03.html" + } + ], "lang": "en-US", "name": "Adobe Flash Player", "url": "http://get.adobe.com/flashplayer/", "help_url": "https://support.google.com/chrome/?p=plugin_flash", - "requires_authorization": false, "displayurl": true }, "adobe-shockwave": { "mime_types": [ "application/x-director" ], - "lang": "en-US", - "name": "Adobe Shockwave Player", - "url": "http://www.adobe.com/shockwave/download/", - "help_url": "https://support.google.com/chrome/?p=plugin_shockwave", - "displayurl": true - }, - "adobe-reader": { - "mime_types": [ - "application/pdf", - "application/vnd.adobe.x-mars", - "application/vnd.adobe.xdp+xml", - "application/vnd.adobe.xfd+xml", - "application/vnd.adobe.xfdf", - "application/vnd.fdf" + "versions": [ + { + "version": "11.6.4.634", + "status": "requires_authorization", + "reference": "http://www.adobe.com/support/security/bulletins/apsb12-02.html" + } ], "lang": "en-US", - "name": "Adobe Reader", - "url": "http://get.adobe.com/reader/", - "help_url": "https://support.google.com/chrome/?p=plugin_pdf", - "requires_authorization": false, - "displayurl": true + "name": "Adobe Shockwave Player", + "url": "http://fpdownload.macromedia.com/get/shockwave/default/english/macosx/latest/Shockwave_Installer_Full_64bit.dmg", + "help_url": "https://support.google.com/chrome/?p=plugin_shockwave" }, "apple-quicktime": { "mime_types": [ @@ -141,6 +169,12 @@ "video/x-m4v", "video/x-mpeg" ], + "versions": [ + { + "version": "7.6.6", + "status": "requires_authorization" + } + ], "lang": "en-US", "name": "QuickTime Player", "url": "http://www.apple.com/quicktime/download/", @@ -160,6 +194,12 @@ "video/x-ms-wmv", "video/x-ms-wvx" ], + "versions": [ + { + "version": "2.2.1", + "status": "requires_authorization" + } + ], "lang": "en-US", "name": "Flip4Mac", "url": "http://www.microsoft.com/download/en/confirmation.aspx?id=9442", @@ -171,6 +211,12 @@ "video/divx", "video/x-matroska" ], + "versions": [ + { + "version": "2.2", + "status": "requires_authorization" + } + ], "lang": "en-US", "name": "DivX Web Player", "url": "http://www.divx.com/en/downloads/divx/mac", @@ -181,10 +227,16 @@ "application/x-silverlight", "application/x-silverlight-2" ], + "versions": [ + { + "version": "4.1.10111.0", + "status": "up_to_date", + "reference": "http://support.microsoft.com/kb/2668562" + } + ], "lang": "en-US", "name": "Silverlight", "url": "http://go.microsoft.com/fwlink/?LinkID=149156", - "requires_authorization": false, "displayurl": true } } diff --git a/chrome/browser/resources/plugins_win.json b/chrome/browser/resources/plugin_metadata/plugins_win.json index 202bd62..c41cdd6 100644 --- a/chrome/browser/resources/plugins_win.json +++ b/chrome/browser/resources/plugin_metadata/plugins_win.json @@ -33,6 +33,20 @@ "application/x-java-bean,version=1.6", "application/x-java-vm" ], + "versions": [ + { + "version": "6.0.310", + "status": "requires_authorization" + }, + { + "version": "7", + "status": "out_of_date" + }, + { + "version": "10.3", + "status": "requires_authorization" + } + ], "lang": "en-US", "name": "Java(TM)", "help_url": "https://support.google.com/chrome/?p=plugin_java", @@ -46,6 +60,13 @@ "audio/x-pn-realaudio-plugin", "audio/x-pn-realaudio" ], + "versions": [ + { + "version": "15.0.2.71", + "status": "requires_authorization", + "reference": "http://service.real.com/realplayer/security/02062012_player/en/" + } + ], "lang": "en-US", "name": "RealPlayer", "help_url": "https://support.google.com/chrome/?p=plugin_real", @@ -56,17 +77,30 @@ "application/futuresplash", "application/x-shockwave-flash" ], + "versions": [ + { + "version": "11.1.102", + "status": "up_to_date", + "reference": "http://www.adobe.com/support/security/bulletins/apsb12-03.html" + } + ], "lang": "en-US", "name": "Adobe Flash Player", "help_url": "https://support.google.com/chrome/?p=plugin_flash", "url": "http://get.adobe.com/flashplayer/", - "requires_authorization": false, "displayurl": true }, "adobe-shockwave": { "mime_types": [ "application/x-director" ], + "versions": [ + { + "version": "11.6.4.634", + "status": "requires_authorization", + "reference": "http://www.adobe.com/support/security/bulletins/apsb12-02.html" + } + ], "lang": "en-US", "name": "Adobe Shockwave Player", "help_url": "https://support.google.com/chrome/?p=plugin_shockwave", @@ -81,11 +115,26 @@ "application/vnd.adobe.xfdf", "application/vnd.fdf" ], + "versions": [ + { + "version": "9.5.1", + "status": "requires_authorization", + "reference": "http://www.adobe.com/support/security/bulletins/apsb12-08.html" + }, + { + "version": "10", + "status": "out_of_date" + }, + { + "version": "10.1.3", + "status": "up_to_date", + "reference": "http://www.adobe.com/support/security/bulletins/apsb12-08.html" + } + ], "lang": "en-US", "name": "Adobe Reader", "help_url": "https://support.google.com/chrome/?p=plugin_pdf", - "url": "http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.1.2/en_US/AdbeRdr1012_en_US.exe", - "requires_authorization": false + "url": "http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.1.3/en_US/AdbeRdr1013_en_US.exe" }, "apple-quicktime": { "mime_types": [ @@ -139,6 +188,12 @@ "video/x-m4v", "video/x-mpeg" ], + "versions": [ + { + "version": "7.6.9", + "status": "requires_authorization" + } + ], "lang": "en-US", "name": "QuickTime Player", "help_url": "https://support.google.com/chrome/?p=plugin_quicktime", @@ -167,6 +222,12 @@ "video/divx", "video/x-matroska" ], + "versions": [ + { + "version": "1.4.3.4", + "status": "requires_authorization" + } + ], "lang": "en-US", "name": "DivX Web Player", "help_url": "https://support.google.com/chrome/?p=plugin_divx", @@ -177,9 +238,15 @@ "application/x-silverlight", "application/x-silverlight-2" ], + "versions": [ + { + "version": "4.1.10111.0", + "status": "up_to_date", + "reference": "http://support.microsoft.com/kb/2668562" + } + ], "lang": "en-US", "name": "Silverlight", - "url": "http://go.microsoft.com/fwlink/?LinkID=149156", - "requires_authorization": false + "url": "http://go.microsoft.com/fwlink/?LinkID=149156" } } diff --git a/chrome/browser/ui/pdf/pdf_unsupported_feature.cc b/chrome/browser/ui/pdf/pdf_unsupported_feature.cc index 340dba0..46c1b27 100644 --- a/chrome/browser/ui/pdf/pdf_unsupported_feature.cc +++ b/chrome/browser/ui/pdf/pdf_unsupported_feature.cc @@ -10,6 +10,8 @@ #include "base/version.h" #include "chrome/browser/chrome_plugin_service_filter.h" #include "chrome/browser/infobars/infobar_tab_helper.h" +#include "chrome/browser/plugin_finder.h" +#include "chrome/browser/plugin_installer.h" #include "chrome/browser/plugin_prefs.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" @@ -46,9 +48,6 @@ using webkit::WebPluginInfo; namespace { -// Only launch Adobe Reader X or later. -static const uint16 kMinReaderVersionToUse = 10; - static const char kReaderUpdateUrl[] = "http://www.adobe.com/go/getreader_chrome"; @@ -250,9 +249,10 @@ class PDFUnsupportedFeatureInterstitial // PDFEnableAdobeReaderInfoBarDelegate. class PDFUnsupportedFeatureInfoBarDelegate : public ConfirmInfoBarDelegate { public: - // |reader_group| is NULL if Adobe Reader isn't installed. + // |reader| is NULL if Adobe Reader isn't installed. PDFUnsupportedFeatureInfoBarDelegate(TabContentsWrapper* tab_contents, - const PluginGroup* reader_group); + const webkit::WebPluginInfo* reader, + PluginFinder* plugin_finder); virtual ~PDFUnsupportedFeatureInfoBarDelegate(); // ConfirmInfoBarDelegate @@ -278,10 +278,11 @@ class PDFUnsupportedFeatureInfoBarDelegate : public ConfirmInfoBarDelegate { PDFUnsupportedFeatureInfoBarDelegate::PDFUnsupportedFeatureInfoBarDelegate( TabContentsWrapper* tab_contents, - const PluginGroup* reader_group) + const webkit::WebPluginInfo* reader, + PluginFinder* plugin_finder) : ConfirmInfoBarDelegate(tab_contents->infobar_tab_helper()), tab_contents_(tab_contents), - reader_installed_(!!reader_group), + reader_installed_(!!reader), reader_vulnerable_(false) { if (!reader_installed_) { content::RecordAction( @@ -290,18 +291,14 @@ PDFUnsupportedFeatureInfoBarDelegate::PDFUnsupportedFeatureInfoBarDelegate( } content::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarShown")); - const std::vector<WebPluginInfo>& plugins = - reader_group->web_plugin_infos(); - DCHECK_EQ(plugins.size(), 1u); - reader_webplugininfo_ = plugins[0]; - - reader_vulnerable_ = reader_group->IsVulnerable(reader_webplugininfo_); - if (!reader_vulnerable_) { - scoped_ptr<Version> version(PluginGroup::CreateVersionFromString( - reader_webplugininfo_.version)); - reader_vulnerable_ = - version.get() && (version->components()[0] < kMinReaderVersionToUse); - } + reader_webplugininfo_ = *reader; + + PluginInstaller* installer = + plugin_finder->FindPluginWithIdentifier("adobe-reader"); + + reader_vulnerable_ = + installer->GetSecurityStatus(*reader) != + PluginInstaller::SECURITY_STATUS_UP_TO_DATE; } PDFUnsupportedFeatureInfoBarDelegate::~PDFUnsupportedFeatureInfoBarDelegate() { @@ -377,6 +374,7 @@ void PDFUnsupportedFeatureInfoBarDelegate::OnNo() { void GotPluginGroupsCallback(int process_id, int routing_id, + PluginFinder* plugin_finder, const std::vector<PluginGroup>& groups) { WebContents* web_contents = tab_util::GetWebContentsByID(process_id, routing_id); @@ -389,7 +387,6 @@ void GotPluginGroupsCallback(int process_id, return; string16 reader_group_name(ASCIIToUTF16(PluginGroup::kAdobeReaderGroupName)); - // If the Reader plugin is disabled by policy, don't prompt them. PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(tab->profile()); if (plugin_prefs->PolicyStatusForPlugin(reader_group_name) == @@ -397,16 +394,27 @@ void GotPluginGroupsCallback(int process_id, return; } - const PluginGroup* reader_group = NULL; + const webkit::WebPluginInfo* reader = NULL; for (size_t i = 0; i < groups.size(); ++i) { if (groups[i].GetGroupName() == reader_group_name) { - reader_group = &groups[i]; + const std::vector<WebPluginInfo>& plugins = + groups[i].web_plugin_infos(); + DCHECK_EQ(plugins.size(), 1u); + reader = &plugins[0]; break; } } tab->infobar_tab_helper()->AddInfoBar( - new PDFUnsupportedFeatureInfoBarDelegate(tab, reader_group)); + new PDFUnsupportedFeatureInfoBarDelegate(tab, reader, plugin_finder)); +} + +void GotPluginFinderCallback(int process_id, + int routing_id, + PluginFinder* plugin_finder) { + PluginService::GetInstance()->GetPluginGroups( + base::Bind(&GotPluginGroupsCallback, process_id, routing_id, + base::Unretained(plugin_finder))); } } // namespace @@ -418,8 +426,7 @@ void PDFHasUnsupportedFeature(TabContentsWrapper* tab) { return; #endif - PluginService::GetInstance()->GetPluginGroups( - base::Bind(&GotPluginGroupsCallback, - tab->web_contents()->GetRenderProcessHost()->GetID(), - tab->web_contents()->GetRenderViewHost()->GetRoutingID())); + PluginFinder::Get(base::Bind(&GotPluginFinderCallback, + tab->web_contents()->GetRenderProcessHost()->GetID(), + tab->web_contents()->GetRenderViewHost()->GetRoutingID())); } diff --git a/chrome/browser/ui/webui/plugins_ui.cc b/chrome/browser/ui/webui/plugins_ui.cc index 34aef3c..a1aac36 100644 --- a/chrome/browser/ui/webui/plugins_ui.cc +++ b/chrome/browser/ui/webui/plugins_ui.cc @@ -426,16 +426,17 @@ void PluginsDOMHandler::PluginsLoaded(PluginFinder* plugin_finder, group_data->SetString("id", group.identifier()); group_data->SetString("description", active_plugin->desc); group_data->SetString("version", active_plugin->version); - group_data->SetBoolean("critical", group.IsVulnerable(*active_plugin)); - std::string update_url; #if defined(ENABLE_PLUGIN_INSTALLATION) PluginInstaller* installer = plugin_finder->FindPluginWithIdentifier(group.identifier()); - if (installer) - update_url = installer->plugin_url().spec(); + if (installer) { + bool out_of_date = installer->GetSecurityStatus(*active_plugin) == + PluginInstaller::SECURITY_STATUS_OUT_OF_DATE; + group_data->SetBoolean("critical", out_of_date); + group_data->SetString("update_url", installer->plugin_url().spec()); + } #endif - group_data->SetString("update_url", update_url); std::string enabled_mode; if (all_plugins_enabled_by_policy) { |