Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8045)

Unified Diff: chrome/common/extensions/extension_permission_set.cc

Issue 9317013: Add a centralized mechanism for whitelisting access to extension permissions. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: merge TerminalPrivate api changes Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
//

Powered by Google App Engine
This is Rietveld 408576698