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

Side by Side Diff: chrome/common/extensions/extension_permission_set.h

Issue 8598022: Restrict access to permissions based on extension types. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_PERMISSION_SET_H_ 5 #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_PERMISSION_SET_H_
6 #define CHROME_COMMON_EXTENSIONS_EXTENSION_PERMISSION_SET_H_ 6 #define CHROME_COMMON_EXTENSIONS_EXTENSION_PERMISSION_SET_H_
7 #pragma once 7 #pragma once
8 8
9 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
11 #include <string> 11 #include <string>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/gtest_prod_util.h" 14 #include "base/gtest_prod_util.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/memory/scoped_ptr.h" 16 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/singleton.h" 17 #include "base/memory/singleton.h"
18 #include "base/string16.h" 18 #include "base/string16.h"
19 #include "chrome/common/extensions/url_pattern_set.h" 19 #include "chrome/common/extensions/url_pattern_set.h"
20 20
21 class Extension; 21 class Extension;
22 class ExtensionPermissionsInfo;
22 23
23 // When prompting the user to install or approve permissions, we display 24 // When prompting the user to install or approve permissions, we display
24 // messages describing the effects of the permissions rather than listing the 25 // messages describing the effects of the permissions rather than listing the
25 // permissions themselves. Each ExtensionPermissionMessage represents one of the 26 // permissions themselves. Each ExtensionPermissionMessage represents one of the
26 // messages shown to the user. 27 // messages shown to the user.
27 class ExtensionPermissionMessage { 28 class ExtensionPermissionMessage {
28 public: 29 public:
29 // Do not reorder this enumeration. If you need to add a new enum, add it just 30 // Do not reorder this enumeration. If you need to add a new enum, add it just
30 // prior to kEnumBoundary. 31 // prior to kEnumBoundary.
31 enum ID { 32 enum ID {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 kWebRequest, 126 kWebRequest,
126 kWebRequestBlocking, 127 kWebRequestBlocking,
127 kWebSocketProxyPrivate, 128 kWebSocketProxyPrivate,
128 kWebstorePrivate, 129 kWebstorePrivate,
129 kEnumBoundary 130 kEnumBoundary
130 }; 131 };
131 132
132 enum Flag { 133 enum Flag {
133 kFlagNone = 0, 134 kFlagNone = 0,
134 135
135 // Indicates if the permission can be accessed by hosted apps.
136 kFlagHostedApp = 1 << 0,
137
138 // Indicates if the permission implies full access (native code). 136 // Indicates if the permission implies full access (native code).
139 kFlagImpliesFullAccess = 1 << 1, 137 kFlagImpliesFullAccess = 1 << 0,
140 138
141 // Indicates if the permission implies full URL access. 139 // Indicates if the permission implies full URL access.
142 kFlagImpliesFullURLAccess = 1 << 2, 140 kFlagImpliesFullURLAccess = 1 << 1,
143 141
144 // Indicates that the permission is private to COMPONENT extensions. 142 // Indicates that the permission is private to COMPONENT extensions.
145 kFlagComponentOnly = 1 << 3, 143 kFlagComponentOnly = 1 << 2,
146 144
147 // Indicates that the permission supports the optional permissions API. 145 // Indicates that the permission supports the optional permissions API.
148 kFlagSupportsOptional = 1 << 4, 146 kFlagSupportsOptional = 1 << 3,
147 };
149 148
150 // Indicates whether the permission is available only to platform apps. 149 // Flags for specifying what extension types can use the permission.
151 kFlagPlatformAppOnly = 1 << 5, 150 enum TypeRestriction {
151 kTypeNone = 0,
152
153 // Extension::TYPE_EXTENSION and Extension::TYPE_USER_SCRIPT
154 kTypeExtension = 1 << 0,
155
156 // Extension::TYPE_HOSTED_APP
157 kTypeHostedApp = 1 << 1,
158
159 // Extension::TYPE_PACKAGED_APP
160 kTypePackagedApp = 1 << 2,
161
162 // Extension::TYPE_PLATFORM_APP
163 kTypePlatformApp = 1 << 3,
164
165 // Supports all types.
166 kTypeAll = (1 << 4) - 1,
167
168 // Convenience flag for all types except hosted apps.
169 kTypeDefault = kTypeAll - kTypeHostedApp,
152 }; 170 };
153 171
154 typedef std::set<ID> IDSet; 172 typedef std::set<ID> IDSet;
155 173
156 ~ExtensionAPIPermission(); 174 ~ExtensionAPIPermission();
157 175
158 // Returns the localized permission message associated with this api. 176 // Returns the localized permission message associated with this api.
159 ExtensionPermissionMessage GetMessage() const; 177 ExtensionPermissionMessage GetMessage() const;
160 178
161 int flags() const { return flags_; } 179 int flags() const { return flags_; }
162 180
181 int type_restrictions() const { return type_restrictions_; }
182
163 ID id() const { return id_; } 183 ID id() const { return id_; }
164 184
165 // Returns the message id associated with this permission. 185 // Returns the message id associated with this permission.
166 ExtensionPermissionMessage::ID message_id() const { 186 ExtensionPermissionMessage::ID message_id() const {
167 return message_id_; 187 return message_id_;
168 } 188 }
169 189
170 // Returns the name of this permission. 190 // Returns the name of this permission.
171 const char* name() const { return name_; } 191 const char* name() const { return name_; }
172 192
173 // Returns true if this permission implies full access (e.g., native code). 193 // Returns true if this permission implies full access (e.g., native code).
174 bool implies_full_access() const { 194 bool implies_full_access() const {
175 return (flags_ & kFlagImpliesFullAccess) != 0; 195 return (flags_ & kFlagImpliesFullAccess) != 0;
176 } 196 }
177 197
178 // Returns true if this permission implies full URL access. 198 // Returns true if this permission implies full URL access.
179 bool implies_full_url_access() const { 199 bool implies_full_url_access() const {
180 return (flags_ & kFlagImpliesFullURLAccess) != 0; 200 return (flags_ & kFlagImpliesFullURLAccess) != 0;
181 } 201 }
182 202
183 // Returns true if this permission can be accessed by hosted apps.
184 bool is_hosted_app() const {
185 return (flags_ & kFlagHostedApp) != 0;
186 }
187
188 // Returns true if this permission can only be acquired by COMPONENT 203 // Returns true if this permission can only be acquired by COMPONENT
189 // extensions. 204 // extensions.
190 bool is_component_only() const { 205 bool is_component_only() const {
191 return (flags_ & kFlagComponentOnly) != 0; 206 return (flags_ & kFlagComponentOnly) != 0;
192 } 207 }
193 208
209 // Returns true if regular extensions can specify this permission.
210 bool supports_extensions() const {
211 return (type_restrictions_ & kTypeExtension) != 0;
212 }
213
214 // Returns true if hosted apps can specify this permission.
215 bool supports_hosted_apps() const {
216 return (type_restrictions_ & kTypeHostedApp) != 0;
217 }
218
219 // Returns true if packaged apps can specify this permission.
220 bool supports_packaged_apps() const {
221 return (type_restrictions_ & kTypePackagedApp) != 0;
222 }
223
224 // Returns true if platform apps can specify this permission.
225 bool supports_platform_apps() const {
226 return (type_restrictions_ & kTypePlatformApp) != 0;
227 }
228
194 // Returns true if this permission can be added and removed via the 229 // Returns true if this permission can be added and removed via the
195 // optional permissions extension API. 230 // optional permissions extension API.
196 bool supports_optional() const { 231 bool supports_optional() const {
197 return (flags_ & kFlagSupportsOptional) != 0; 232 return (flags_ & kFlagSupportsOptional) != 0;
198 } 233 }
199 234
200 // Returns true if this permission can only be acquired by platform apps. 235 // Returns true if this permissions supports the specified |type|.
201 bool is_platform_app_only() const { 236 bool supports_type(TypeRestriction type) const {
202 return (flags_ & kFlagPlatformAppOnly) != 0; 237 return (type_restrictions_ & type) != 0;
203 } 238 }
204 239
205 private: 240 private:
206 // Instances should only be constructed from within ExtensionPermissionsInfo. 241 // Instances should only be constructed from within ExtensionPermissionsInfo.
207 friend class ExtensionPermissionsInfo; 242 friend class ExtensionPermissionsInfo;
208 243
244 // Register ALL the permissions!
245 static void RegisterAllPermissions(ExtensionPermissionsInfo* info);
246
209 explicit ExtensionAPIPermission( 247 explicit ExtensionAPIPermission(
210 ID id, 248 ID id,
211 const char* name, 249 const char* name,
212 int l10n_message_id, 250 int l10n_message_id,
213 ExtensionPermissionMessage::ID message_id, 251 ExtensionPermissionMessage::ID message_id,
214 int flags); 252 int flags,
253 int type_restrictions);
215 254
216 ID id_; 255 ID id_;
217 const char* name_; 256 const char* name_;
218 int flags_; 257 int flags_;
258 int type_restrictions_;
219 int l10n_message_id_; 259 int l10n_message_id_;
220 ExtensionPermissionMessage::ID message_id_; 260 ExtensionPermissionMessage::ID message_id_;
221 }; 261 };
222 262
223 typedef std::set<ExtensionAPIPermission::ID> ExtensionAPIPermissionSet; 263 typedef std::set<ExtensionAPIPermission::ID> ExtensionAPIPermissionSet;
224 264
225 // Singleton that holds the extension permission instances and provides static 265 // Singleton that holds the extension permission instances and provides static
226 // methods for accessing them. 266 // methods for accessing them.
227 class ExtensionPermissionsInfo { 267 class ExtensionPermissionsInfo {
228 public: 268 public:
229 // Returns a pointer to the singleton instance. 269 // Returns a pointer to the singleton instance.
230 static ExtensionPermissionsInfo* GetInstance(); 270 static ExtensionPermissionsInfo* GetInstance();
231 271
232 // Returns the permission with the given |id|, and NULL if it doesn't exist. 272 // Returns the permission with the given |id|, and NULL if it doesn't exist.
233 ExtensionAPIPermission* GetByID(ExtensionAPIPermission::ID id); 273 ExtensionAPIPermission* GetByID(ExtensionAPIPermission::ID id);
234 274
235 // Returns the permission with the given |name|, and NULL if none 275 // Returns the permission with the given |name|, and NULL if none
236 // exists. 276 // exists.
237 ExtensionAPIPermission* GetByName(std::string name); 277 ExtensionAPIPermission* GetByName(std::string name);
238 278
239 // Returns a set containing all valid api permission ids. 279 // Returns a set containing all valid api permission ids.
240 ExtensionAPIPermissionSet GetAll(); 280 ExtensionAPIPermissionSet GetAll();
241 281
242 // Converts all the permission names in |permission_names| to permission ids. 282 // Converts all the permission names in |permission_names| to permission ids.
243 ExtensionAPIPermissionSet GetAllByName( 283 ExtensionAPIPermissionSet GetAllByName(
244 const std::set<std::string>& permission_names); 284 const std::set<std::string>& permission_names);
245 285
246 // Gets the total number of API permissions available to hosted apps.
247 size_t get_hosted_app_permission_count() {
248 return hosted_app_permission_count_;
249 }
250
251 // Gets the total number of API permissions. 286 // Gets the total number of API permissions.
252 size_t get_permission_count() { return permission_count_; } 287 size_t get_permission_count() { return permission_count_; }
253 288
254 private: 289 private:
290 friend class ExtensionAPIPermission;
291
255 ~ExtensionPermissionsInfo(); 292 ~ExtensionPermissionsInfo();
256 ExtensionPermissionsInfo(); 293 ExtensionPermissionsInfo();
257 294
258 // Registers an |alias| for a given permission |name|. 295 // Registers an |alias| for a given permission |name|.
259 void RegisterAlias(const char* name, const char* alias); 296 void RegisterAlias(const char* name, const char* alias);
260 297
261 // Registers a permission with the specified attributes and flags. 298 // Registers a permission with the specified attributes and flags.
262 void RegisterPermission( 299 void RegisterPermission(
263 ExtensionAPIPermission::ID id, 300 ExtensionAPIPermission::ID id,
264 const char* name, 301 const char* name,
265 int l10n_message_id, 302 int l10n_message_id,
266 ExtensionPermissionMessage::ID message_id, 303 ExtensionPermissionMessage::ID message_id,
267 int flags); 304 int flags,
305 int type_restrictions);
268 306
269 // Maps permission ids to permissions. 307 // Maps permission ids to permissions.
270 typedef std::map<ExtensionAPIPermission::ID, ExtensionAPIPermission*> IDMap; 308 typedef std::map<ExtensionAPIPermission::ID, ExtensionAPIPermission*> IDMap;
271 309
272 // Maps names and aliases to permissions. 310 // Maps names and aliases to permissions.
273 typedef std::map<std::string, ExtensionAPIPermission*> NameMap; 311 typedef std::map<std::string, ExtensionAPIPermission*> NameMap;
274 312
275 IDMap id_map_; 313 IDMap id_map_;
276 NameMap name_map_; 314 NameMap name_map_;
277 315
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 bool HasEffectiveAccessToURL(const GURL& url) const; 403 bool HasEffectiveAccessToURL(const GURL& url) const;
366 404
367 // Returns ture if this permission set effectively represents full access 405 // Returns ture if this permission set effectively represents full access
368 // (e.g. native code). 406 // (e.g. native code).
369 bool HasEffectiveFullAccess() const; 407 bool HasEffectiveFullAccess() const;
370 408
371 // Returns true if this permission set includes permissions that are 409 // Returns true if this permission set includes permissions that are
372 // restricted to internal extensions. 410 // restricted to internal extensions.
373 bool HasPrivatePermissions() const; 411 bool HasPrivatePermissions() const;
374 412
375 // Returns true if this permission set includes permissions that are
376 // restricted to platform apps.
377 bool HasPlatformAppPermissions() const;
378
379 // Returns true if |permissions| has a greater privilege level than this 413 // Returns true if |permissions| has a greater privilege level than this
380 // permission set (e.g., this permission set has less permissions). 414 // permission set (e.g., this permission set has less permissions).
381 bool HasLessPrivilegesThan(const ExtensionPermissionSet* permissions) const; 415 bool HasLessPrivilegesThan(const ExtensionPermissionSet* permissions) const;
382 416
383 const ExtensionAPIPermissionSet& apis() const { return apis_; } 417 const ExtensionAPIPermissionSet& apis() const { return apis_; }
384 418
385 const URLPatternSet& effective_hosts() const { return effective_hosts_; } 419 const URLPatternSet& effective_hosts() const { return effective_hosts_; }
386 420
387 const URLPatternSet& explicit_hosts() const { return explicit_hosts_; } 421 const URLPatternSet& explicit_hosts() const { return explicit_hosts_; }
388 422
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 462
429 // The list of hosts that can be scripted by content scripts. 463 // The list of hosts that can be scripted by content scripts.
430 // TODO(jstritar): Rename to "user_script_hosts_"? 464 // TODO(jstritar): Rename to "user_script_hosts_"?
431 URLPatternSet scriptable_hosts_; 465 URLPatternSet scriptable_hosts_;
432 466
433 // The list of hosts this effectively grants access to. 467 // The list of hosts this effectively grants access to.
434 URLPatternSet effective_hosts_; 468 URLPatternSet effective_hosts_;
435 }; 469 };
436 470
437 #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_PERMISSION_SET_H_ 471 #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_PERMISSION_SET_H_
OLDNEW
« no previous file with comments | « chrome/common/extensions/extension_manifests_unittest.cc ('k') | chrome/common/extensions/extension_permission_set.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698