| Index: chrome/common/extensions/extension_permission_set.cc
|
| diff --git a/chrome/common/extensions/extension_permission_set.cc b/chrome/common/extensions/extension_permission_set.cc
|
| index 787200ed57b8edcd695a1748d57ec17317dbedf1..72d8815be4f50dcd019020a1925c37fd94b887ff 100644
|
| --- a/chrome/common/extensions/extension_permission_set.cc
|
| +++ b/chrome/common/extensions/extension_permission_set.cc
|
| @@ -7,10 +7,12 @@
|
| #include <algorithm>
|
| #include <string>
|
|
|
| +#include "base/command_line.h"
|
| #include "base/memory/singleton.h"
|
| #include "base/values.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/utf_string_conversions.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/extensions/extension_constants.h"
|
| #include "chrome/common/extensions/extension_l10n_util.h"
|
| @@ -66,6 +68,39 @@ const char* kNonPermissionFunctionNames[] = {
|
| const size_t kNumNonPermissionFunctionNames =
|
| arraysize(kNonPermissionFunctionNames);
|
|
|
| +// ExtensionAPIPermission::kTerminalPrivate whitelist.
|
| +const char* kTerminalPrivateWhitelist[] = {
|
| + "pnhechapfaindjhompbnflcldabbghjo" // HTerm app.
|
| +};
|
| +
|
| +// ExtensionAPIPermission::kWebSocketProxyPrivate whitelist.
|
| +// ExtensionAPIPermission::kInputMethodPrivate whitelist.
|
| +const char* kChromeOSWhitelist[] = {
|
| + "haiffjcadagjlijoggckpgfnoeiflnem",
|
| + "gnedhmakppccajfpfiihfcdlnpgomkcf",
|
| + "fjcibdnjlbfnbfdjneajpipnlcppleek",
|
| + "okddffdblfhhnmhodogpojmfkjmhinfp",
|
| + "pnhechapfaindjhompbnflcldabbghjo" // HTerm app.
|
| +};
|
| +
|
| +// ExtensionAPIPermission::kChromePrivate whitelist.
|
| +const char* kChromePrivateWhitelist[] = {
|
| + "haiffjcadagjlijoggckpgfnoeiflnem",
|
| + "gnedhmakppccajfpfiihfcdlnpgomkcf",
|
| + "fjcibdnjlbfnbfdjneajpipnlcppleek"
|
| +};
|
| +
|
| +// ExtensionAPIPermission::kChromeAuthPrivate whitelist.
|
| +const char* kChromeAuthPrivateWhitelist[] = {
|
| + extension_misc::kCloudPrintAppId
|
| +};
|
| +
|
| +// ExtensionAPIPermission::kWebstorePrivate whitelist.
|
| +const char* kWebstorePrivateWhitelist[] = {
|
| + extension_misc::kEnterpriseWebStoreAppId,
|
| + extension_misc::kWebStoreAppId
|
| +};
|
| +
|
| const char kOldUnlimitedStoragePermission[] = "unlimited_storage";
|
| const char kWindowsPermission[] = "windows";
|
|
|
| @@ -198,17 +233,19 @@ void ExtensionAPIPermission::RegisterAllPermissions(
|
|
|
| // Register hosted app permissions that are also private.
|
| info->RegisterPermission(
|
| - kChromePrivate, "chromePrivate", 0,
|
| - ExtensionPermissionMessage::kNone, kFlagCannotBeOptional,
|
| + kChromePrivate, "chromePrivate", 0, ExtensionPermissionMessage::kNone,
|
| + kFlagCannotBeOptional | kFlagEnforceWhitelist,
|
| kTypeAll - kTypePlatformApp);
|
| info->RegisterPermission(
|
| kChromeAuthPrivate, "chromeAuthPrivate", 0,
|
| ExtensionPermissionMessage::kNone,
|
| - kFlagComponentOnly | kFlagCannotBeOptional, kTypeAll - kTypePlatformApp);
|
| + kFlagComponentOnly | kFlagCannotBeOptional | kFlagEnforceWhitelist,
|
| + kTypeAll - kTypePlatformApp);
|
| info->RegisterPermission(
|
| kWebstorePrivate, "webstorePrivate", 0,
|
| ExtensionPermissionMessage::kNone,
|
| - kFlagComponentOnly | kFlagCannotBeOptional, kTypeAll - kTypePlatformApp);
|
| + kFlagComponentOnly | kFlagCannotBeOptional | kFlagEnforceWhitelist,
|
| + kTypeAll - kTypePlatformApp);
|
|
|
| // Register hosted and packaged app permissions.
|
| info->RegisterPermission(
|
| @@ -246,7 +283,8 @@ void ExtensionAPIPermission::RegisterAllPermissions(
|
| kFlagImpliesFullURLAccess, kTypeDefault);
|
| info->RegisterPermission(
|
| kInputMethodPrivate, "inputMethodPrivate", 0,
|
| - ExtensionPermissionMessage::kNone, kFlagCannotBeOptional, kTypeDefault);
|
| + ExtensionPermissionMessage::kNone,
|
| + kFlagCannotBeOptional | kFlagEnforceWhitelist, kTypeDefault);
|
| info->RegisterPermission(
|
| kManagement, "management", IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
|
| ExtensionPermissionMessage::kManagement, kFlagNone, kTypeDefault);
|
| @@ -262,8 +300,8 @@ void ExtensionAPIPermission::RegisterAllPermissions(
|
| ExtensionPermissionMessage::kTabs, kFlagNone,
|
| kTypeDefault - kTypePlatformApp);
|
| info->RegisterPermission(
|
| - kTerminalPrivate, "terminalPrivate", 0,
|
| - ExtensionPermissionMessage::kNone, kFlagCannotBeOptional, kTypeDefault);
|
| + kTerminalPrivate, "terminalPrivate", 0, ExtensionPermissionMessage::kNone,
|
| + kFlagCannotBeOptional | kFlagEnforceWhitelist, kTypeDefault);
|
| info->RegisterPermission(
|
| kTts, "tts", 0,
|
| ExtensionPermissionMessage::kNone, kFlagCannotBeOptional, kTypeDefault);
|
| @@ -284,7 +322,8 @@ void ExtensionAPIPermission::RegisterAllPermissions(
|
| kTypeDefault - kTypePlatformApp);
|
| info->RegisterPermission(
|
| kWebSocketProxyPrivate, "webSocketProxyPrivate", 0,
|
| - ExtensionPermissionMessage::kNone, kFlagCannotBeOptional,
|
| + ExtensionPermissionMessage::kNone,
|
| + kFlagCannotBeOptional | kFlagEnforceWhitelist,
|
| kTypeDefault - kTypePlatformApp);
|
|
|
| // Register private permissions.
|
| @@ -338,6 +377,40 @@ void ExtensionAPIPermission::RegisterAllPermissions(
|
| info->RegisterAlias("tabs", kWindowsPermission);
|
| }
|
|
|
| +// static
|
| +void ExtensionAPIPermission::RegisterWhitelists(
|
| + ExtensionPermissionsInfo* info) {
|
| + info->RegisterWhitelist(kTerminalPrivate,
|
| + kTerminalPrivateWhitelist,
|
| + arraysize(kTerminalPrivateWhitelist));
|
| + info->RegisterWhitelist(kWebSocketProxyPrivate,
|
| + kChromeOSWhitelist,
|
| + arraysize(kChromeOSWhitelist));
|
| + info->RegisterWhitelist(kChromePrivate,
|
| + kChromePrivateWhitelist,
|
| + arraysize(kChromePrivateWhitelist));
|
| + info->RegisterWhitelist(kInputMethodPrivate,
|
| + kChromeOSWhitelist,
|
| + arraysize(kChromeOSWhitelist));
|
| + info->RegisterWhitelist(kChromeAuthPrivate,
|
| + kChromeAuthPrivateWhitelist,
|
| + arraysize(kChromeAuthPrivateWhitelist));
|
| + info->RegisterWhitelist(kWebstorePrivate,
|
| + kWebstorePrivateWhitelist,
|
| + arraysize(kWebstorePrivateWhitelist));
|
| +}
|
| +
|
| +bool ExtensionAPIPermission::IsWhitelisted(
|
| + const std::string& extension_id) const {
|
| + DCHECK(should_enforce_whitelist());
|
| + return whitelist_.find(extension_id) != whitelist_.end();
|
| +}
|
| +
|
| +void ExtensionAPIPermission::AddToWhitelist(const std::string& extension_id) {
|
| + DCHECK(should_enforce_whitelist());
|
| + whitelist_.insert(extension_id);
|
| +}
|
| +
|
| //
|
| // ExtensionPermissionsInfo
|
| //
|
| @@ -386,6 +459,7 @@ ExtensionPermissionsInfo::ExtensionPermissionsInfo()
|
| : hosted_app_permission_count_(0),
|
| permission_count_(0) {
|
| ExtensionAPIPermission::RegisterAllPermissions(this);
|
| + ExtensionAPIPermission::RegisterWhitelists(this);
|
| }
|
|
|
| void ExtensionPermissionsInfo::RegisterAlias(
|
| @@ -414,6 +488,23 @@ void ExtensionPermissionsInfo::RegisterPermission(
|
| permission_count_++;
|
| }
|
|
|
| +void ExtensionPermissionsInfo::RegisterWhitelist(
|
| + ExtensionAPIPermission::ID id,
|
| + const char* whitelist[],
|
| + int whitelist_length) {
|
| + ExtensionAPIPermission* permission = GetByID(id);
|
| + DCHECK(permission->should_enforce_whitelist());
|
| +
|
| + for (int x = 0; x < whitelist_length; ++x)
|
| + permission->AddToWhitelist(whitelist[x]);
|
| +
|
| + // Tests can add an extension ID to the whitelists via the command line.
|
| + CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| + if (command_line->HasSwitch(switches::kWhitelistedExtensionID))
|
| + permission->AddToWhitelist(command_line->GetSwitchValueASCII(
|
| + switches::kWhitelistedExtensionID));
|
| +}
|
| +
|
| //
|
| // ExtensionPermissionSet
|
| //
|
|
|