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

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

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, 1 month 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 #include "chrome/common/extensions/extension_permission_set.h" 5 #include "chrome/common/extensions/extension_permission_set.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/memory/singleton.h" 10 #include "base/memory/singleton.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 ExtensionPermissionMessage ExtensionAPIPermission::GetMessage() const { 153 ExtensionPermissionMessage ExtensionAPIPermission::GetMessage() const {
154 return ExtensionPermissionMessage( 154 return ExtensionPermissionMessage(
155 message_id_, l10n_util::GetStringUTF16(l10n_message_id_)); 155 message_id_, l10n_util::GetStringUTF16(l10n_message_id_));
156 } 156 }
157 157
158 ExtensionAPIPermission::ExtensionAPIPermission( 158 ExtensionAPIPermission::ExtensionAPIPermission(
159 ID id, 159 ID id,
160 const char* name, 160 const char* name,
161 int l10n_message_id, 161 int l10n_message_id,
162 ExtensionPermissionMessage::ID message_id, 162 ExtensionPermissionMessage::ID message_id,
163 int flags) 163 int flags,
164 int type_restrictions)
164 : id_(id), 165 : id_(id),
165 name_(name), 166 name_(name),
166 flags_(flags), 167 flags_(flags),
168 type_restrictions_(type_restrictions),
167 l10n_message_id_(l10n_message_id), 169 l10n_message_id_(l10n_message_id),
168 message_id_(message_id) { 170 message_id_(message_id) {}
169 }
170 171
171 ExtensionAPIPermission::~ExtensionAPIPermission() { 172 ExtensionAPIPermission::~ExtensionAPIPermission() {}
173
174 // static
175 void ExtensionAPIPermission::RegisterPermissions(
176 ExtensionPermissionsInfo* info) {
177
178 // Register hosted app permissions.
179 info->RegisterPermission(
180 kBackground, "background", 0,
181 ExtensionPermissionMessage::kNone, kFlagSupportsOptional, kTypeAll);
182 info->RegisterPermission(
183 kClipboardRead, "clipboardRead", IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD,
184 ExtensionPermissionMessage::kClipboard, kFlagSupportsOptional, kTypeAll);
185 info->RegisterPermission(
186 kClipboardWrite, "clipboardWrite", 0,
187 ExtensionPermissionMessage::kNone, kFlagSupportsOptional, kTypeAll);
188 info->RegisterPermission(
189 kChromePrivate, "chromePrivate", 0,
190 ExtensionPermissionMessage::kNone, kFlagNone,
191 kTypeAll - kTypePlatformApp);
192 info->RegisterPermission(
193 kExperimental, "experimental", 0,
194 ExtensionPermissionMessage::kNone, kFlagNone, kTypeAll);
195 info->RegisterPermission(
196 kGeolocation, "geolocation", IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
197 ExtensionPermissionMessage::kGeolocation, kFlagNone, kTypeAll);
198 info->RegisterPermission(
199 kNotification, "notifications", 0,
200 ExtensionPermissionMessage::kNone, kFlagSupportsOptional, kTypeAll);
201 info->RegisterPermission(
202 kUnlimitedStorage, "unlimitedStorage", 0,
203 ExtensionPermissionMessage::kNone, kFlagNone, kTypeAll);
204
205 // Hosted app and private permissions.
206 info->RegisterPermission(
207 kChromeAuthPrivate, "chromeAuthPrivate", 0,
208 ExtensionPermissionMessage::kNone, kFlagComponentOnly,
209 kTypeAll - kTypePlatformApp);
210 info->RegisterPermission(
211 kWebstorePrivate, "webstorePrivate", 0,
212 ExtensionPermissionMessage::kNone, kFlagComponentOnly, kTypeAll);
213
214 // Register extension permissions.
215 info->RegisterPermission(
216 kBookmark, "bookmarks", IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
217 ExtensionPermissionMessage::kBookmarks,
218 kFlagSupportsOptional, kTypeDefault);
219 info->RegisterPermission(
220 kContentSettings, "contentSettings",
221 IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS,
222 ExtensionPermissionMessage::kContentSettings, kFlagNone, kTypeDefault);
223 info->RegisterPermission(
224 kContextMenus, "contextMenus", 0,
225 ExtensionPermissionMessage::kNone, kFlagSupportsOptional, kTypeDefault);
226 info->RegisterPermission(
227 kCookie, "cookies", 0,
228 ExtensionPermissionMessage::kNone, kFlagSupportsOptional,
229 kTypeDefault - kTypePlatformApp);
230 info->RegisterPermission(
231 kDebugger, "debugger", IDS_EXTENSION_PROMPT_WARNING_DEBUGGER,
232 ExtensionPermissionMessage::kDebugger,
233 kFlagSupportsOptional, kTypeDefault);
234 info->RegisterPermission(
235 kFileBrowserHandler, "fileBrowserHandler", 0,
236 ExtensionPermissionMessage::kNone, kFlagNone, kTypeDefault);
237 info->RegisterPermission(
238 kHistory, "history", IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
239 ExtensionPermissionMessage::kBrowsingHistory,
240 kFlagSupportsOptional, kTypeDefault);
241 info->RegisterPermission(
242 kIdle, "idle", 0, ExtensionPermissionMessage::kNone,
243 kFlagSupportsOptional, kTypeDefault);
244 info->RegisterPermission(
245 kInputMethodPrivate, "inputMethodPrivate", 0,
246 ExtensionPermissionMessage::kNone, kFlagNone, kTypeDefault);
247 info->RegisterPermission(
248 kManagement, "management", IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
249 ExtensionPermissionMessage::kManagement,
250 kFlagSupportsOptional, kTypeDefault);
251 info->RegisterPermission(
252 kTab, "tabs", IDS_EXTENSION_PROMPT_WARNING_TABS,
253 ExtensionPermissionMessage::kTabs, kFlagSupportsOptional,
254 kTypeDefault - kTypePlatformApp);
255 info->RegisterPermission(
256 kTts, "tts", 0,
257 ExtensionPermissionMessage::kNone, kFlagNone, kTypeDefault);
258 info->RegisterPermission(
259 kTtsEngine, "ttsEngine", IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE,
260 ExtensionPermissionMessage::kTtsEngine, kFlagNone, kTypeDefault);
261 info->RegisterPermission(
262 kWebNavigation, "webNavigation", 0,
263 ExtensionPermissionMessage::kNone, kFlagNone,
264 kTypeDefault - kTypePlatformApp);
265 info->RegisterPermission(
266 kWebRequest, "webRequest", 0,
267 ExtensionPermissionMessage::kNone, kFlagNone,
268 kTypeDefault - kTypePlatformApp);
269 info->RegisterPermission(
270 kWebSocketProxyPrivate, "webSocketProxyPrivate", 0,
271 ExtensionPermissionMessage::kNone, kFlagNone,
272 kTypeDefault - kTypePlatformApp);
273
274 // Register private permissions.
275 info->RegisterPermission(
276 kChromeosInfoPrivate, "chromeosInfoPrivate", 0,
277 ExtensionPermissionMessage::kNone, kFlagComponentOnly, kTypeDefault);
278 info->RegisterPermission(
279 kFileBrowserPrivate, "fileBrowserPrivate", 0,
280 ExtensionPermissionMessage::kNone, kFlagComponentOnly, kTypeDefault);
281 info->RegisterPermission(
282 kMediaPlayerPrivate, "mediaPlayerPrivate", 0,
283 ExtensionPermissionMessage::kNone, kFlagComponentOnly, kTypeDefault);
284
285 // Full url access permissions.
286 info->RegisterPermission(
287 kProxy, "proxy", 0, ExtensionPermissionMessage::kNone,
288 kFlagImpliesFullURLAccess, kTypeDefault);
289
290 info->RegisterPermission(
291 kDevtools, "devtools", 0, ExtensionPermissionMessage::kNone,
292 kFlagImpliesFullURLAccess, kTypeDefault);
293
294 info->RegisterPermission(
295 kPlugin, "plugin", IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
296 ExtensionPermissionMessage::kFullAccess,
297 kFlagImpliesFullURLAccess | kFlagImpliesFullAccess, kTypeDefault);
298
299 // Register aliases.
300 info->RegisterAlias("unlimitedStorage", kOldUnlimitedStoragePermission);
301 info->RegisterAlias("tabs", kWindowsPermission);
172 } 302 }
173 303
174 // 304 //
175 // ExtensionPermissionsInfo 305 // ExtensionPermissionsInfo
176 // 306 //
177 307
178 // static 308 // static
179 ExtensionPermissionsInfo* ExtensionPermissionsInfo::GetInstance() { 309 ExtensionPermissionsInfo* ExtensionPermissionsInfo::GetInstance() {
180 return Singleton<ExtensionPermissionsInfo>::get(); 310 return Singleton<ExtensionPermissionsInfo>::get();
181 } 311 }
(...skipping 29 matching lines...) Expand all
211 } 341 }
212 342
213 ExtensionPermissionsInfo::~ExtensionPermissionsInfo() { 343 ExtensionPermissionsInfo::~ExtensionPermissionsInfo() {
214 for (IDMap::iterator i = id_map_.begin(); i != id_map_.end(); ++i) 344 for (IDMap::iterator i = id_map_.begin(); i != id_map_.end(); ++i)
215 delete i->second; 345 delete i->second;
216 } 346 }
217 347
218 ExtensionPermissionsInfo::ExtensionPermissionsInfo() 348 ExtensionPermissionsInfo::ExtensionPermissionsInfo()
219 : hosted_app_permission_count_(0), 349 : hosted_app_permission_count_(0),
220 permission_count_(0) { 350 permission_count_(0) {
221 // Map the permissions flags to shorter names for convenience. 351 ExtensionAPIPermission::RegisterPermissions(this);
222 int none = ExtensionAPIPermission::kFlagNone;
223 int hosted_app = ExtensionAPIPermission::kFlagHostedApp;
224 int component_only = ExtensionAPIPermission::kFlagComponentOnly;
225 int full_access = ExtensionAPIPermission::kFlagImpliesFullAccess;
226 int all_urls = ExtensionAPIPermission::kFlagImpliesFullURLAccess;
227
228 // Note: please update the permissions API documentation when modifying which
229 // permissions can be specified as optional.
230 int optional = ExtensionAPIPermission::kFlagSupportsOptional;
231
232 // Hosted app permissions
233 RegisterPermission(
234 ExtensionAPIPermission::kBackground, "background", 0,
235 ExtensionPermissionMessage::kNone, hosted_app | optional);
236 RegisterPermission(
237 ExtensionAPIPermission::kClipboardRead, "clipboardRead",
238 IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD,
239 ExtensionPermissionMessage::kClipboard, hosted_app | optional);
240 RegisterPermission(
241 ExtensionAPIPermission::kClipboardWrite, "clipboardWrite", 0,
242 ExtensionPermissionMessage::kNone, hosted_app | optional);
243 RegisterPermission(
244 ExtensionAPIPermission::kChromePrivate, "chromePrivate", 0,
245 ExtensionPermissionMessage::kNone, hosted_app);
246 RegisterPermission(
247 ExtensionAPIPermission::kExperimental, "experimental", 0,
248 ExtensionPermissionMessage::kNone, hosted_app);
249 RegisterPermission(
250 ExtensionAPIPermission::kGeolocation, "geolocation",
251 IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
252 ExtensionPermissionMessage::kGeolocation, hosted_app);
253 RegisterPermission(
254 ExtensionAPIPermission::kNotification, "notifications", 0,
255 ExtensionPermissionMessage::kNone, hosted_app | optional);
256 RegisterPermission(
257 ExtensionAPIPermission::kUnlimitedStorage, "unlimitedStorage", 0,
258 ExtensionPermissionMessage::kNone, hosted_app);
259
260 // Hosted app and private permissions.
261 RegisterPermission(
262 ExtensionAPIPermission::kChromeAuthPrivate, "chromeAuthPrivate", 0,
263 ExtensionPermissionMessage::kNone, hosted_app | component_only);
264 RegisterPermission(
265 ExtensionAPIPermission::kWebstorePrivate, "webstorePrivate", 0,
266 ExtensionPermissionMessage::kNone, hosted_app | component_only);
267
268 // Extension permissions.
269 RegisterPermission(
270 ExtensionAPIPermission::kBookmark, "bookmarks",
271 IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
272 ExtensionPermissionMessage::kBookmarks, optional);
273 RegisterPermission(
274 ExtensionAPIPermission::kContentSettings, "contentSettings",
275 IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS,
276 ExtensionPermissionMessage::kContentSettings, none);
277 RegisterPermission(
278 ExtensionAPIPermission::kContextMenus, "contextMenus", 0,
279 ExtensionPermissionMessage::kNone, optional);
280 RegisterPermission(
281 ExtensionAPIPermission::kCookie, "cookies", 0,
282 ExtensionPermissionMessage::kNone, optional);
283 RegisterPermission(
284 ExtensionAPIPermission::kDebugger, "debugger",
285 IDS_EXTENSION_PROMPT_WARNING_DEBUGGER,
286 ExtensionPermissionMessage::kDebugger, optional);
287 RegisterPermission(
288 ExtensionAPIPermission::kFileBrowserHandler, "fileBrowserHandler", 0,
289 ExtensionPermissionMessage::kNone, none);
290 RegisterPermission(
291 ExtensionAPIPermission::kHistory, "history",
292 IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
293 ExtensionPermissionMessage::kBrowsingHistory, optional);
294 RegisterPermission(
295 ExtensionAPIPermission::kIdle, "idle", 0,
296 ExtensionPermissionMessage::kNone, optional);
297 RegisterPermission(
298 ExtensionAPIPermission::kInputMethodPrivate, "inputMethodPrivate", 0,
299 ExtensionPermissionMessage::kNone, none);
300 RegisterPermission(
301 ExtensionAPIPermission::kManagement, "management",
302 IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
303 ExtensionPermissionMessage::kManagement, optional);
304 RegisterPermission(
305 ExtensionAPIPermission::kTab, "tabs",
306 IDS_EXTENSION_PROMPT_WARNING_TABS,
307 ExtensionPermissionMessage::kTabs, optional);
308 RegisterPermission(
309 ExtensionAPIPermission::kTts, "tts", 0,
310 ExtensionPermissionMessage::kNone, none);
311 RegisterPermission(
312 ExtensionAPIPermission::kTtsEngine, "ttsEngine",
313 IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE,
314 ExtensionPermissionMessage::kTtsEngine, none);
315 RegisterPermission(
316 ExtensionAPIPermission::kWebNavigation, "webNavigation", 0,
317 ExtensionPermissionMessage::kNone, none);
318 RegisterPermission(
319 ExtensionAPIPermission::kWebRequest, "webRequest", 0,
320 ExtensionPermissionMessage::kNone, none);
321 RegisterPermission(
322 ExtensionAPIPermission::kWebSocketProxyPrivate,
323 "webSocketProxyPrivate", 0,
324 ExtensionPermissionMessage::kNone, none);
325
326 // Private permissions
327 RegisterPermission(
328 ExtensionAPIPermission::kChromeosInfoPrivate, "chromeosInfoPrivate", 0,
329 ExtensionPermissionMessage::kNone, component_only);
330 RegisterPermission(
331 ExtensionAPIPermission::kFileBrowserPrivate, "fileBrowserPrivate", 0,
332 ExtensionPermissionMessage::kNone, component_only);
333 RegisterPermission(
334 ExtensionAPIPermission::kMediaPlayerPrivate, "mediaPlayerPrivate", 0,
335 ExtensionPermissionMessage::kNone, component_only);
336
337 // Full url access permissions.
338 RegisterPermission(
339 ExtensionAPIPermission::kProxy, "proxy", 0,
340 ExtensionPermissionMessage::kNone, all_urls);
341
342 RegisterPermission(
343 ExtensionAPIPermission::kDevtools, "devtools", 0,
344 ExtensionPermissionMessage::kNone, all_urls);
345
346 RegisterPermission(
347 ExtensionAPIPermission::kPlugin, "plugin",
348 IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
349 ExtensionPermissionMessage::kFullAccess, all_urls | full_access);
350
351 // Register Aliases
352 RegisterAlias("unlimitedStorage", kOldUnlimitedStoragePermission);
353 RegisterAlias("tabs", kWindowsPermission);
354 } 352 }
355 353
356 void ExtensionPermissionsInfo::RegisterAlias( 354 void ExtensionPermissionsInfo::RegisterAlias(
357 const char* name, const char* alias) { 355 const char* name, const char* alias) {
358 DCHECK(name_map_.find(name) != name_map_.end()); 356 DCHECK(name_map_.find(name) != name_map_.end());
359 DCHECK(name_map_.find(alias) == name_map_.end()); 357 DCHECK(name_map_.find(alias) == name_map_.end());
360 name_map_[alias] = name_map_[name]; 358 name_map_[alias] = name_map_[name];
361 } 359 }
362 360
363 void ExtensionPermissionsInfo::RegisterPermission( 361 void ExtensionPermissionsInfo::RegisterPermission(
364 ExtensionAPIPermission::ID id, 362 ExtensionAPIPermission::ID id,
365 const char* name, 363 const char* name,
366 int l10n_message_id, 364 int l10n_message_id,
367 ExtensionPermissionMessage::ID message_id, 365 ExtensionPermissionMessage::ID message_id,
368 int flags) { 366 int flags,
367 int type_restrictions) {
369 DCHECK(id_map_.find(id) == id_map_.end()); 368 DCHECK(id_map_.find(id) == id_map_.end());
370 DCHECK(name_map_.find(name) == name_map_.end()); 369 DCHECK(name_map_.find(name) == name_map_.end());
371 370
372 ExtensionAPIPermission* permission = 371 ExtensionAPIPermission* permission = new ExtensionAPIPermission(
373 new ExtensionAPIPermission(id, name, l10n_message_id, message_id, flags); 372 id, name, l10n_message_id, message_id, flags, type_restrictions);
374 373
375 id_map_[id] = permission; 374 id_map_[id] = permission;
376 name_map_[name] = permission; 375 name_map_[name] = permission;
377 376
378 permission_count_++; 377 permission_count_++;
379 if (permission->is_hosted_app())
380 hosted_app_permission_count_++;
381 } 378 }
382 379
383 // 380 //
384 // ExtensionPermissionSet 381 // ExtensionPermissionSet
385 // 382 //
386 383
387 ExtensionPermissionSet::ExtensionPermissionSet() { 384 ExtensionPermissionSet::ExtensionPermissionSet() {
388 } 385 }
389 386
390 ExtensionPermissionSet::ExtensionPermissionSet( 387 ExtensionPermissionSet::ExtensionPermissionSet(
(...skipping 10 matching lines...) Expand all
401 ExtensionPermissionSet::ExtensionPermissionSet( 398 ExtensionPermissionSet::ExtensionPermissionSet(
402 const ExtensionAPIPermissionSet& apis, 399 const ExtensionAPIPermissionSet& apis,
403 const URLPatternSet& explicit_hosts, 400 const URLPatternSet& explicit_hosts,
404 const URLPatternSet& scriptable_hosts) 401 const URLPatternSet& scriptable_hosts)
405 : apis_(apis), 402 : apis_(apis),
406 scriptable_hosts_(scriptable_hosts) { 403 scriptable_hosts_(scriptable_hosts) {
407 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); 404 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
408 InitEffectiveHosts(); 405 InitEffectiveHosts();
409 } 406 }
410 407
411 ExtensionPermissionSet::~ExtensionPermissionSet() { 408 ExtensionPermissionSet::~ExtensionPermissionSet() {}
412 }
413 409
414 // static 410 // static
415 ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference( 411 ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference(
416 const ExtensionPermissionSet* set1, 412 const ExtensionPermissionSet* set1,
417 const ExtensionPermissionSet* set2) { 413 const ExtensionPermissionSet* set2) {
418 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet(); 414 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet();
419 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1; 415 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1;
420 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2; 416 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
421 417
422 ExtensionAPIPermissionSet apis; 418 ExtensionAPIPermissionSet apis;
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 std::set<std::string> new_hosts_set(GetDistinctHosts(new_list, false, false)); 831 std::set<std::string> new_hosts_set(GetDistinctHosts(new_list, false, false));
836 std::set<std::string> old_hosts_set(GetDistinctHosts(old_list, false, false)); 832 std::set<std::string> old_hosts_set(GetDistinctHosts(old_list, false, false));
837 std::set<std::string> new_hosts_only; 833 std::set<std::string> new_hosts_only;
838 834
839 std::set_difference(new_hosts_set.begin(), new_hosts_set.end(), 835 std::set_difference(new_hosts_set.begin(), new_hosts_set.end(),
840 old_hosts_set.begin(), old_hosts_set.end(), 836 old_hosts_set.begin(), old_hosts_set.end(),
841 std::inserter(new_hosts_only, new_hosts_only.begin())); 837 std::inserter(new_hosts_only, new_hosts_only.begin()));
842 838
843 return !new_hosts_only.empty(); 839 return !new_hosts_only.empty();
844 } 840 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698