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

Side by Side Diff: chrome/common/extensions/extension.cc

Issue 164039: Add module-level permissions to extensions. (Closed)
Patch Set: final nits Created 11 years, 4 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 unified diff | Download patch
« no previous file with comments | « chrome/common/extensions/extension.h ('k') | chrome/common/render_messages_internal.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/extension.h" 5 #include "chrome/common/extensions/extension.h"
6 6
7 #include "app/resource_bundle.h" 7 #include "app/resource_bundle.h"
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/file_path.h" 9 #include "base/file_path.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 13 matching lines...) Expand all
24 24
25 #if defined(OS_WIN) 25 #if defined(OS_WIN)
26 #include "base/registry.h" 26 #include "base/registry.h"
27 #endif 27 #endif
28 28
29 namespace keys = extension_manifest_keys; 29 namespace keys = extension_manifest_keys;
30 namespace values = extension_manifest_values; 30 namespace values = extension_manifest_values;
31 namespace errors = extension_manifest_errors; 31 namespace errors = extension_manifest_errors;
32 32
33 namespace { 33 namespace {
34 const int kPEMOutputColumns = 65; 34 const int kPEMOutputColumns = 65;
35 35
36 // KEY MARKERS 36 // KEY MARKERS
37 const char kKeyBeginHeaderMarker[] = "-----BEGIN"; 37 const char kKeyBeginHeaderMarker[] = "-----BEGIN";
38 const char kKeyBeginFooterMarker[] = "-----END"; 38 const char kKeyBeginFooterMarker[] = "-----END";
39 const char kKeyInfoEndMarker[] = "KEY-----"; 39 const char kKeyInfoEndMarker[] = "KEY-----";
40 const char kPublic[] = "PUBLIC"; 40 const char kPublic[] = "PUBLIC";
41 const char kPrivate[] = "PRIVATE"; 41 const char kPrivate[] = "PRIVATE";
42 42
43 const int kRSAKeySize = 1024; 43 const int kRSAKeySize = 1024;
44 44
45 // Converts a normal hexadecimal string into the alphabet used by extensions. 45 // Converts a normal hexadecimal string into the alphabet used by extensions.
46 // We use the characters 'a'-'p' instead of '0'-'f' to avoid ever having a 46 // We use the characters 'a'-'p' instead of '0'-'f' to avoid ever having a
47 // completely numeric host, since some software interprets that as an IP 47 // completely numeric host, since some software interprets that as an IP
48 // address. 48 // address.
49 static void ConvertHexadecimalToIDAlphabet(std::string* id) { 49 static void ConvertHexadecimalToIDAlphabet(std::string* id) {
50 for (size_t i = 0; i < id->size(); ++i) 50 for (size_t i = 0; i < id->size(); ++i)
51 (*id)[i] = HexStringToInt(id->substr(i, 1)) + 'a'; 51 (*id)[i] = HexStringToInt(id->substr(i, 1)) + 'a';
52 }
53
54 // Returns true if the given string is an API permission (see kPermissionNames).
55 static bool IsAPIPermission(const std::string& str) {
56 for (size_t i = 0; i < Extension::kNumPermissions; ++i) {
57 if (str == Extension::kPermissionNames[i])
58 return true;
52 } 59 }
53 }; 60
61 return false;
62 }
63
64 } // namespace
54 65
55 // static 66 // static
56 int Extension::id_counter_ = 0; 67 int Extension::id_counter_ = 0;
57 68
58 const char Extension::kManifestFilename[] = "manifest.json"; 69 const char Extension::kManifestFilename[] = "manifest.json";
59 70
60 // A list of all the keys allowed by themes. 71 // A list of all the keys allowed by themes.
61 static const wchar_t* kValidThemeKeys[] = { 72 static const wchar_t* kValidThemeKeys[] = {
62 keys::kDescription, 73 keys::kDescription,
63 keys::kName, 74 keys::kName,
(...skipping 14 matching lines...) Expand all
78 89
79 const char Extension::kMimeType[] = "application/x-chrome-extension"; 90 const char Extension::kMimeType[] = "application/x-chrome-extension";
80 91
81 const int Extension::kIconSizes[] = { 92 const int Extension::kIconSizes[] = {
82 EXTENSION_ICON_LARGE, 93 EXTENSION_ICON_LARGE,
83 EXTENSION_ICON_MEDIUM, 94 EXTENSION_ICON_MEDIUM,
84 EXTENSION_ICON_SMALL, 95 EXTENSION_ICON_SMALL,
85 EXTENSION_ICON_BITTY 96 EXTENSION_ICON_BITTY
86 }; 97 };
87 98
99 const char* Extension::kPermissionNames[] = {
100 "tabs",
101 "bookmarks",
102 };
103 const size_t Extension::kNumPermissions =
104 arraysize(Extension::kPermissionNames);
105
88 Extension::~Extension() { 106 Extension::~Extension() {
89 for (PageActionMap::iterator i = page_actions_.begin(); 107 for (PageActionMap::iterator i = page_actions_.begin();
90 i != page_actions_.end(); ++i) 108 i != page_actions_.end(); ++i)
91 delete i->second; 109 delete i->second;
92 } 110 }
93 111
94 const std::string Extension::VersionString() const { 112 const std::string Extension::VersionString() const {
95 return version_->GetString(); 113 return version_->GetString();
96 } 114 }
97 115
(...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 PageAction* page_action = 863 PageAction* page_action =
846 LoadPageActionHelper(page_action_value, i, error); 864 LoadPageActionHelper(page_action_value, i, error);
847 if (!page_action) 865 if (!page_action)
848 return false; // Failed to parse page action definition. 866 return false; // Failed to parse page action definition.
849 page_actions_[page_action->id()] = page_action; 867 page_actions_[page_action->id()] = page_action;
850 } 868 }
851 } 869 }
852 870
853 // Initialize the permissions (optional). 871 // Initialize the permissions (optional).
854 if (source.HasKey(keys::kPermissions)) { 872 if (source.HasKey(keys::kPermissions)) {
855 ListValue* hosts = NULL; 873 ListValue* permissions = NULL;
856 if (!source.GetList(keys::kPermissions, &hosts)) { 874 if (!source.GetList(keys::kPermissions, &permissions)) {
857 *error = ExtensionErrorUtils::FormatErrorMessage( 875 *error = ExtensionErrorUtils::FormatErrorMessage(
858 errors::kInvalidPermissions, ""); 876 errors::kInvalidPermissions, "");
859 return false; 877 return false;
860 } 878 }
861 879
862 if (hosts->GetSize() == 0) { 880 if (permissions->GetSize() == 0) {
863 ExtensionErrorReporter::GetInstance()->ReportError( 881 ExtensionErrorReporter::GetInstance()->ReportError(
864 errors::kInvalidPermissionCountWarning, false); 882 errors::kInvalidPermissionCountWarning, false);
865 } 883 }
866 884
867 for (size_t i = 0; i < hosts->GetSize(); ++i) { 885 for (size_t i = 0; i < permissions->GetSize(); ++i) {
868 std::string host_str; 886 std::string permission_str;
869 if (!hosts->GetString(i, &host_str)) { 887 if (!permissions->GetString(i, &permission_str)) {
870 *error = ExtensionErrorUtils::FormatErrorMessage( 888 *error = ExtensionErrorUtils::FormatErrorMessage(
871 errors::kInvalidPermission, IntToString(i)); 889 errors::kInvalidPermission, IntToString(i));
872 return false; 890 return false;
873 } 891 }
874 892
893 // Check if it's a module permission. If so, enable that permission.
894 if (IsAPIPermission(permission_str)) {
895 api_permissions_.push_back(permission_str);
896 continue;
897 }
898
899 // Otherwise, it's a host pattern permission.
875 URLPattern pattern; 900 URLPattern pattern;
876 if (!pattern.Parse(host_str)) { 901 if (!pattern.Parse(permission_str)) {
877 *error = ExtensionErrorUtils::FormatErrorMessage( 902 *error = ExtensionErrorUtils::FormatErrorMessage(
878 errors::kInvalidPermission, IntToString(i)); 903 errors::kInvalidPermission, IntToString(i));
879 return false; 904 return false;
880 } 905 }
881 906
882 // Only accept http/https persmissions at the moment. 907 // Only accept http/https persmissions at the moment.
883 if ((pattern.scheme() != chrome::kHttpScheme) && 908 if ((pattern.scheme() != chrome::kHttpScheme) &&
884 (pattern.scheme() != chrome::kHttpsScheme)) { 909 (pattern.scheme() != chrome::kHttpsScheme)) {
885 *error = ExtensionErrorUtils::FormatErrorMessage( 910 *error = ExtensionErrorUtils::FormatErrorMessage(
886 errors::kInvalidPermissionScheme, IntToString(i)); 911 errors::kInvalidPermissionScheme, IntToString(i));
887 return false; 912 return false;
888 } 913 }
889 914
890 permissions_.push_back(pattern); 915 host_permissions_.push_back(pattern);
891 } 916 }
892 } 917 }
893 918
894 return true; 919 return true;
895 } 920 }
896 921
897 std::set<FilePath> Extension::GetBrowserImages() { 922 std::set<FilePath> Extension::GetBrowserImages() {
898 std::set<FilePath> image_paths; 923 std::set<FilePath> image_paths;
899 924
900 // extension icons 925 // extension icons
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
933 } 958 }
934 959
935 void Extension::SetBackgroundPageReady() { 960 void Extension::SetBackgroundPageReady() {
936 DCHECK(!background_url().is_empty()); 961 DCHECK(!background_url().is_empty());
937 background_page_ready_ = true; 962 background_page_ready_ = true;
938 NotificationService::current()->Notify( 963 NotificationService::current()->Notify(
939 NotificationType::EXTENSION_BACKGROUND_PAGE_READY, 964 NotificationType::EXTENSION_BACKGROUND_PAGE_READY,
940 Source<Extension>(this), 965 Source<Extension>(this),
941 NotificationService::NoDetails()); 966 NotificationService::NoDetails());
942 } 967 }
OLDNEW
« no previous file with comments | « chrome/common/extensions/extension.h ('k') | chrome/common/render_messages_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698