Chromium Code Reviews| 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..06a1234f14780dda1cec016ae0e189d4c7f62f3d 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,41 @@ const char* kNonPermissionFunctionNames[] = { |
| const size_t kNumNonPermissionFunctionNames = |
| arraysize(kNonPermissionFunctionNames); |
| +// TODO(jstritar): We should find out what these extensions are. |
| + |
| +// ExtensionAPIPermission::kTerminalPrivate whitelist. |
| +const char* kTerminalPrivateWhitelist[] = { |
| + extension_misc::kHTermAppId |
| +}; |
| + |
| +// ExtensionAPIPermission::kWebSocketProxyPrivate whitelist. |
| +// ExtensionAPIPermission::kInputMethodPrivate whitelist. |
| +const char* kChromeOSWhitelist[] = { |
| + "haiffjcadagjlijoggckpgfnoeiflnem", |
| + "gnedhmakppccajfpfiihfcdlnpgomkcf", |
| + "fjcibdnjlbfnbfdjneajpipnlcppleek", |
| + "okddffdblfhhnmhodogpojmfkjmhinfp", |
|
tbarzic
2012/02/02 00:36:07
okddffdblfhhnmhodogpojmfkjmhinfp should also be ad
jstritar
2012/02/02 17:51:10
Done. Also added made sure that TerminalExtensionH
|
| + extension_misc::kHTermAppId |
| +}; |
| + |
| +// 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 +235,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 +285,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 +302,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 +324,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 +379,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 +461,7 @@ ExtensionPermissionsInfo::ExtensionPermissionsInfo() |
| : hosted_app_permission_count_(0), |
| permission_count_(0) { |
| ExtensionAPIPermission::RegisterAllPermissions(this); |
| + ExtensionAPIPermission::RegisterWhitelists(this); |
| } |
| void ExtensionPermissionsInfo::RegisterAlias( |
| @@ -414,6 +490,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 |
| // |