| Index: chrome/common/extensions/extension.cc
|
| diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
|
| index 719f61cf10050b501bbbeb727e76c223c1fe5e90..17fb86730124586dc604da56f8d9e445e5eeac69 100644
|
| --- a/chrome/common/extensions/extension.cc
|
| +++ b/chrome/common/extensions/extension.cc
|
| @@ -31,26 +31,37 @@ namespace values = extension_manifest_values;
|
| namespace errors = extension_manifest_errors;
|
|
|
| namespace {
|
| - const int kPEMOutputColumns = 65;
|
| +const int kPEMOutputColumns = 65;
|
| +
|
| +// KEY MARKERS
|
| +const char kKeyBeginHeaderMarker[] = "-----BEGIN";
|
| +const char kKeyBeginFooterMarker[] = "-----END";
|
| +const char kKeyInfoEndMarker[] = "KEY-----";
|
| +const char kPublic[] = "PUBLIC";
|
| +const char kPrivate[] = "PRIVATE";
|
| +
|
| +const int kRSAKeySize = 1024;
|
| +
|
| +// Converts a normal hexadecimal string into the alphabet used by extensions.
|
| +// We use the characters 'a'-'p' instead of '0'-'f' to avoid ever having a
|
| +// completely numeric host, since some software interprets that as an IP
|
| +// address.
|
| +static void ConvertHexadecimalToIDAlphabet(std::string* id) {
|
| + for (size_t i = 0; i < id->size(); ++i)
|
| + (*id)[i] = HexStringToInt(id->substr(i, 1)) + 'a';
|
| +}
|
|
|
| - // KEY MARKERS
|
| - const char kKeyBeginHeaderMarker[] = "-----BEGIN";
|
| - const char kKeyBeginFooterMarker[] = "-----END";
|
| - const char kKeyInfoEndMarker[] = "KEY-----";
|
| - const char kPublic[] = "PUBLIC";
|
| - const char kPrivate[] = "PRIVATE";
|
| +// Returns true if the given string is an API permission (see kPermissionNames).
|
| +static bool IsAPIPermission(const std::string& str) {
|
| + for (size_t i = 0; i < Extension::kNumPermissions; ++i) {
|
| + if (str == Extension::kPermissionNames[i])
|
| + return true;
|
| + }
|
|
|
| - const int kRSAKeySize = 1024;
|
| + return false;
|
| +}
|
|
|
| - // Converts a normal hexadecimal string into the alphabet used by extensions.
|
| - // We use the characters 'a'-'p' instead of '0'-'f' to avoid ever having a
|
| - // completely numeric host, since some software interprets that as an IP
|
| - // address.
|
| - static void ConvertHexadecimalToIDAlphabet(std::string* id) {
|
| - for (size_t i = 0; i < id->size(); ++i)
|
| - (*id)[i] = HexStringToInt(id->substr(i, 1)) + 'a';
|
| - }
|
| -};
|
| +} // namespace
|
|
|
| // static
|
| int Extension::id_counter_ = 0;
|
| @@ -85,6 +96,13 @@ const int Extension::kIconSizes[] = {
|
| EXTENSION_ICON_BITTY
|
| };
|
|
|
| +const char* Extension::kPermissionNames[] = {
|
| + "tabs",
|
| + "bookmarks",
|
| +};
|
| +const size_t Extension::kNumPermissions =
|
| + arraysize(Extension::kPermissionNames);
|
| +
|
| Extension::~Extension() {
|
| for (PageActionMap::iterator i = page_actions_.begin();
|
| i != page_actions_.end(); ++i)
|
| @@ -852,28 +870,35 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id,
|
|
|
| // Initialize the permissions (optional).
|
| if (source.HasKey(keys::kPermissions)) {
|
| - ListValue* hosts = NULL;
|
| - if (!source.GetList(keys::kPermissions, &hosts)) {
|
| + ListValue* permissions = NULL;
|
| + if (!source.GetList(keys::kPermissions, &permissions)) {
|
| *error = ExtensionErrorUtils::FormatErrorMessage(
|
| errors::kInvalidPermissions, "");
|
| return false;
|
| }
|
|
|
| - if (hosts->GetSize() == 0) {
|
| + if (permissions->GetSize() == 0) {
|
| ExtensionErrorReporter::GetInstance()->ReportError(
|
| errors::kInvalidPermissionCountWarning, false);
|
| }
|
|
|
| - for (size_t i = 0; i < hosts->GetSize(); ++i) {
|
| - std::string host_str;
|
| - if (!hosts->GetString(i, &host_str)) {
|
| + for (size_t i = 0; i < permissions->GetSize(); ++i) {
|
| + std::string permission_str;
|
| + if (!permissions->GetString(i, &permission_str)) {
|
| *error = ExtensionErrorUtils::FormatErrorMessage(
|
| errors::kInvalidPermission, IntToString(i));
|
| return false;
|
| }
|
|
|
| + // Check if it's a module permission. If so, enable that permission.
|
| + if (IsAPIPermission(permission_str)) {
|
| + api_permissions_.push_back(permission_str);
|
| + continue;
|
| + }
|
| +
|
| + // Otherwise, it's a host pattern permission.
|
| URLPattern pattern;
|
| - if (!pattern.Parse(host_str)) {
|
| + if (!pattern.Parse(permission_str)) {
|
| *error = ExtensionErrorUtils::FormatErrorMessage(
|
| errors::kInvalidPermission, IntToString(i));
|
| return false;
|
| @@ -887,7 +912,7 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id,
|
| return false;
|
| }
|
|
|
| - permissions_.push_back(pattern);
|
| + host_permissions_.push_back(pattern);
|
| }
|
| }
|
|
|
|
|