| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/api/plugins/plugins_handler.h" | 5 #include "extensions/common/manifest_handlers/plugins_handler.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| 11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 16 #include "chrome/grit/generated_resources.h" | |
| 17 #include "extensions/common/error_utils.h" | 16 #include "extensions/common/error_utils.h" |
| 18 #include "extensions/common/manifest.h" | 17 #include "extensions/common/manifest.h" |
| 19 #include "extensions/common/manifest_constants.h" | 18 #include "extensions/common/manifest_constants.h" |
| 20 #include "extensions/common/manifest_handlers/permissions_parser.h" | 19 #include "extensions/common/manifest_handlers/permissions_parser.h" |
| 21 #include "extensions/common/permissions/api_permission.h" | 20 #include "extensions/common/permissions/api_permission.h" |
| 22 #include "extensions/common/permissions/api_permission_set.h" | 21 #include "extensions/common/permissions/api_permission_set.h" |
| 22 #include "extensions/strings/grit/extensions_strings.h" |
| 23 #include "ui/base/l10n/l10n_util.h" | 23 #include "ui/base/l10n/l10n_util.h" |
| 24 | 24 |
| 25 namespace extensions { | 25 namespace extensions { |
| 26 | 26 |
| 27 namespace keys = manifest_keys; | 27 namespace keys = manifest_keys; |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 struct PluginManifestData : Extension::ManifestData { | 31 struct PluginManifestData : Extension::ManifestData { |
| 32 // Optional list of NPAPI plugins and associated properties for an extension. | 32 // Optional list of NPAPI plugins and associated properties for an extension. |
| 33 PluginInfo::PluginVector plugins; | 33 PluginInfo::PluginVector plugins; |
| 34 }; | 34 }; |
| 35 | 35 |
| 36 } // namespace | 36 } // namespace |
| 37 | 37 |
| 38 PluginInfo::PluginInfo(const base::FilePath& plugin_path, bool plugin_is_public) | 38 PluginInfo::PluginInfo(const base::FilePath& plugin_path, bool plugin_is_public) |
| 39 : path(plugin_path), is_public(plugin_is_public) { | 39 : path(plugin_path), is_public(plugin_is_public) {} |
| 40 } | |
| 41 | 40 |
| 42 PluginInfo::~PluginInfo() { | 41 PluginInfo::~PluginInfo() {} |
| 43 } | |
| 44 | 42 |
| 45 // static | 43 // static |
| 46 const PluginInfo::PluginVector* PluginInfo::GetPlugins( | 44 const PluginInfo::PluginVector* PluginInfo::GetPlugins( |
| 47 const Extension* extension) { | 45 const Extension* extension) { |
| 48 PluginManifestData* data = static_cast<PluginManifestData*>( | 46 PluginManifestData* data = static_cast<PluginManifestData*>( |
| 49 extension->GetManifestData(keys::kPlugins)); | 47 extension->GetManifestData(keys::kPlugins)); |
| 50 return data ? &data->plugins : NULL; | 48 return data ? &data->plugins : NULL; |
| 51 } | 49 } |
| 52 | 50 |
| 53 // static | 51 // static |
| 54 bool PluginInfo::HasPlugins(const Extension* extension) { | 52 bool PluginInfo::HasPlugins(const Extension* extension) { |
| 55 PluginManifestData* data = static_cast<PluginManifestData*>( | 53 PluginManifestData* data = static_cast<PluginManifestData*>( |
| 56 extension->GetManifestData(keys::kPlugins)); | 54 extension->GetManifestData(keys::kPlugins)); |
| 57 return data && !data->plugins.empty() ? true : false; | 55 return data && !data->plugins.empty() ? true : false; |
| 58 } | 56 } |
| 59 | 57 |
| 60 PluginsHandler::PluginsHandler() { | 58 PluginsHandler::PluginsHandler() {} |
| 61 } | |
| 62 | 59 |
| 63 PluginsHandler::~PluginsHandler() { | 60 PluginsHandler::~PluginsHandler() {} |
| 64 } | |
| 65 | 61 |
| 66 const std::vector<std::string> PluginsHandler::Keys() const { | 62 const std::vector<std::string> PluginsHandler::Keys() const { |
| 67 return SingleKey(keys::kPlugins); | 63 return SingleKey(keys::kPlugins); |
| 68 } | 64 } |
| 69 | 65 |
| 70 bool PluginsHandler::Parse(Extension* extension, base::string16* error) { | 66 bool PluginsHandler::Parse(Extension* extension, base::string16* error) { |
| 71 const base::ListValue* list_value = NULL; | 67 const base::ListValue* list_value = NULL; |
| 72 if (!extension->manifest()->GetList(keys::kPlugins, &list_value)) { | 68 if (!extension->manifest()->GetList(keys::kPlugins, &list_value)) { |
| 73 *error = base::ASCIIToUTF16(manifest_errors::kInvalidPlugins); | 69 *error = base::ASCIIToUTF16(manifest_errors::kInvalidPlugins); |
| 74 return false; | 70 return false; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 93 // Get plugins[i].content (optional). | 89 // Get plugins[i].content (optional). |
| 94 bool is_public = false; | 90 bool is_public = false; |
| 95 if (plugin_value->HasKey(keys::kPluginsPublic)) { | 91 if (plugin_value->HasKey(keys::kPluginsPublic)) { |
| 96 if (!plugin_value->GetBoolean(keys::kPluginsPublic, &is_public)) { | 92 if (!plugin_value->GetBoolean(keys::kPluginsPublic, &is_public)) { |
| 97 *error = ErrorUtils::FormatErrorMessageUTF16( | 93 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 98 manifest_errors::kInvalidPluginsPublic, base::SizeTToString(i)); | 94 manifest_errors::kInvalidPluginsPublic, base::SizeTToString(i)); |
| 99 return false; | 95 return false; |
| 100 } | 96 } |
| 101 } | 97 } |
| 102 | 98 |
| 103 // We don't allow extensions to load NPAPI plugins on Chrome OS, but still | 99 // We don't allow extensions to load NPAPI plugins on Chrome OS, but still |
| 104 // parse the entries to display consistent error messages. If the extension | 100 // parse the entries to display consistent error messages. If the extension |
| 105 // actually requires the plugins then LoadRequirements will prevent it | 101 // actually requires the plugins then LoadRequirements will prevent it |
| 106 // loading. | 102 // loading. |
| 107 #if defined(OS_CHROMEOS) | 103 #if defined(OS_CHROMEOS) |
| 108 continue; | 104 continue; |
| 109 #endif // defined(OS_CHROMEOS). | 105 #endif // defined(OS_CHROMEOS). |
| 110 plugins_data->plugins.push_back(PluginInfo( | 106 plugins_data->plugins.push_back(PluginInfo( |
| 111 extension->path().Append(base::FilePath::FromUTF8Unsafe(path_str)), | 107 extension->path().Append(base::FilePath::FromUTF8Unsafe(path_str)), |
| 112 is_public)); | 108 is_public)); |
| 113 } | 109 } |
| 114 | 110 |
| 115 if (!plugins_data->plugins.empty()) { | 111 if (!plugins_data->plugins.empty()) { |
| 116 extension->SetManifestData(keys::kPlugins, std::move(plugins_data)); | 112 extension->SetManifestData(keys::kPlugins, std::move(plugins_data)); |
| 117 PermissionsParser::AddAPIPermission(extension, APIPermission::kPlugin); | 113 PermissionsParser::AddAPIPermission(extension, APIPermission::kPlugin); |
| 118 } | 114 } |
| 119 | 115 |
| 120 return true; | 116 return true; |
| 121 } | 117 } |
| 122 | 118 |
| 123 bool PluginsHandler::Validate(const Extension* extension, | 119 bool PluginsHandler::Validate(const Extension* extension, |
| 124 std::string* error, | 120 std::string* error, |
| 125 std::vector<InstallWarning>* warnings) const { | 121 std::vector<InstallWarning>* warnings) const { |
| 126 // Validate claimed plugin paths. | 122 // Validate claimed plugin paths. |
| 127 if (extensions::PluginInfo::HasPlugins(extension)) { | 123 if (extensions::PluginInfo::HasPlugins(extension)) { |
| 128 const extensions::PluginInfo::PluginVector* plugins = | 124 const extensions::PluginInfo::PluginVector* plugins = |
| 129 extensions::PluginInfo::GetPlugins(extension); | 125 extensions::PluginInfo::GetPlugins(extension); |
| 130 CHECK(plugins); | 126 CHECK(plugins); |
| 131 for (std::vector<extensions::PluginInfo>::const_iterator plugin = | 127 for (std::vector<extensions::PluginInfo>::const_iterator plugin = |
| 132 plugins->begin(); | 128 plugins->begin(); |
| 133 plugin != plugins->end(); ++plugin) { | 129 plugin != plugins->end(); ++plugin) { |
| 134 if (!base::PathExists(plugin->path)) { | 130 if (!base::PathExists(plugin->path)) { |
| 135 *error = l10n_util::GetStringFUTF8( | 131 *error = |
| 136 IDS_EXTENSION_LOAD_PLUGIN_PATH_FAILED, | 132 l10n_util::GetStringFUTF8(IDS_EXTENSION_LOAD_PLUGIN_PATH_FAILED, |
| 137 plugin->path.LossyDisplayName()); | 133 plugin->path.LossyDisplayName()); |
| 138 return false; | 134 return false; |
| 139 } | 135 } |
| 140 } | 136 } |
| 141 } | 137 } |
| 142 return true; | 138 return true; |
| 143 } | 139 } |
| 144 | 140 |
| 145 } // namespace extensions | 141 } // namespace extensions |
| OLD | NEW |