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

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

Issue 7432006: Add an experimental permissions API for extensions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years, 5 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 | 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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 RegisterHostedAppPermission( 240 RegisterHostedAppPermission(
241 ExtensionAPIPermission::kGeolocation, "geolocation", 241 ExtensionAPIPermission::kGeolocation, "geolocation",
242 IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION, 242 IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
243 ExtensionPermissionMessage::kGeolocation); 243 ExtensionPermissionMessage::kGeolocation);
244 RegisterHostedAppPermission( 244 RegisterHostedAppPermission(
245 ExtensionAPIPermission::kNotification, "notifications", 0, 245 ExtensionAPIPermission::kNotification, "notifications", 0,
246 ExtensionPermissionMessage::kNone); 246 ExtensionPermissionMessage::kNone);
247 RegisterHostedAppPermission( 247 RegisterHostedAppPermission(
248 ExtensionAPIPermission::kUnlimitedStorage, "unlimitedStorage", 0, 248 ExtensionAPIPermission::kUnlimitedStorage, "unlimitedStorage", 0,
249 ExtensionPermissionMessage::kNone); 249 ExtensionPermissionMessage::kNone);
250 RegisterHostedAppPermission(
251 ExtensionAPIPermission::kPermissions, "permissions", 0,
252 ExtensionPermissionMessage::kNone);
250 253
251 // Hosted app and private permissions. 254 // Hosted app and private permissions.
252 RegisterPermission( 255 RegisterPermission(
253 ExtensionAPIPermission::kChromeAuthPrivate, "chromeAuthPrivate", 0, 256 ExtensionAPIPermission::kChromeAuthPrivate, "chromeAuthPrivate", 0,
254 ExtensionPermissionMessage::kNone, 257 ExtensionPermissionMessage::kNone,
255 true, true, false, false); 258 true, true, false, false);
256 RegisterPermission( 259 RegisterPermission(
257 ExtensionAPIPermission::kWebstorePrivate, "webstorePrivate", 0, 260 ExtensionAPIPermission::kWebstorePrivate, "webstorePrivate", 0,
258 ExtensionPermissionMessage::kNone, 261 ExtensionPermissionMessage::kNone,
259 true, true, false, false); 262 true, true, false, false);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 : apis_(apis), 422 : apis_(apis),
420 scriptable_hosts_(scriptable_hosts) { 423 scriptable_hosts_(scriptable_hosts) {
421 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); 424 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
422 InitEffectiveHosts(); 425 InitEffectiveHosts();
423 } 426 }
424 427
425 ExtensionPermissionSet::~ExtensionPermissionSet() { 428 ExtensionPermissionSet::~ExtensionPermissionSet() {
426 } 429 }
427 430
428 // static 431 // static
432 ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference(
433 const ExtensionPermissionSet* set1,
434 const ExtensionPermissionSet* set2) {
435 ExtensionPermissionSet empty;
436 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? &empty : set1;
437 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? &empty : set2;
438
439 ExtensionAPIPermissionSet apis;
440 std::set_difference(set1_safe->apis().begin(), set1_safe->apis().end(),
441 set2_safe->apis().begin(), set2_safe->apis().end(),
442 std::insert_iterator<ExtensionAPIPermissionSet>(
443 apis, apis.begin()));
444
445 URLPatternSet explicit_hosts;
446 URLPatternSet::CreateDifference(set1_safe->explicit_hosts(),
447 set2_safe->explicit_hosts(),
448 &explicit_hosts);
449
450 URLPatternSet scriptable_hosts;
451 URLPatternSet::CreateDifference(set1_safe->scriptable_hosts(),
452 set2_safe->scriptable_hosts(),
453 &scriptable_hosts);
454 return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts);
455 }
456
457 // static
458 ExtensionPermissionSet* ExtensionPermissionSet::CreateIntersection(
459 const ExtensionPermissionSet* set1,
460 const ExtensionPermissionSet* set2) {
461 ExtensionPermissionSet empty;
462 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? &empty : set1;
463 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? &empty : set2;
464
465 ExtensionAPIPermissionSet apis;
466 std::set_intersection(set1_safe->apis().begin(), set1_safe->apis().end(),
467 set2_safe->apis().begin(), set2_safe->apis().end(),
468 std::insert_iterator<ExtensionAPIPermissionSet>(
469 apis, apis.begin()));
470 URLPatternSet explicit_hosts;
471 URLPatternSet::CreateIntersection(set1_safe->explicit_hosts(),
472 set2_safe->explicit_hosts(),
473 &explicit_hosts);
474
475 URLPatternSet scriptable_hosts;
476 URLPatternSet::CreateIntersection(set1_safe->scriptable_hosts(),
477 set2_safe->scriptable_hosts(),
478 &scriptable_hosts);
479 return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts);
480 }
481 // static
429 ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion( 482 ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion(
430 const ExtensionPermissionSet* set1, 483 const ExtensionPermissionSet* set1,
431 const ExtensionPermissionSet* set2) { 484 const ExtensionPermissionSet* set2) {
432 ExtensionPermissionSet empty; 485 ExtensionPermissionSet empty;
433 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? &empty : set1; 486 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? &empty : set1;
434 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? &empty : set2; 487 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? &empty : set2;
435 488
436 ExtensionAPIPermissionSet apis; 489 ExtensionAPIPermissionSet apis;
437 std::set_union(set1_safe->apis().begin(), set1_safe->apis().end(), 490 std::set_union(set1_safe->apis().begin(), set1_safe->apis().end(),
438 set2_safe->apis().begin(), set2_safe->apis().end(), 491 set2_safe->apis().begin(), set2_safe->apis().end(),
439 std::insert_iterator<ExtensionAPIPermissionSet>( 492 std::insert_iterator<ExtensionAPIPermissionSet>(
440 apis, apis.begin())); 493 apis, apis.begin()));
441 494
442 URLPatternSet explicit_hosts; 495 URLPatternSet explicit_hosts;
443 URLPatternSet scriptable_hosts;
444 URLPatternSet::CreateUnion(set1_safe->explicit_hosts(), 496 URLPatternSet::CreateUnion(set1_safe->explicit_hosts(),
445 set2_safe->explicit_hosts(), 497 set2_safe->explicit_hosts(),
446 &explicit_hosts); 498 &explicit_hosts);
499
500 URLPatternSet scriptable_hosts;
447 URLPatternSet::CreateUnion(set1_safe->scriptable_hosts(), 501 URLPatternSet::CreateUnion(set1_safe->scriptable_hosts(),
448 set2_safe->scriptable_hosts(), 502 set2_safe->scriptable_hosts(),
449 &scriptable_hosts); 503 &scriptable_hosts);
450 504
451 return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); 505 return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts);
452 } 506 }
453 507
508 bool ExtensionPermissionSet::operator==(
509 const ExtensionPermissionSet& rhs) const {
510 return apis_ == rhs.apis_ &&
511 scriptable_hosts_ == rhs.scriptable_hosts_ &&
512 explicit_hosts_ == rhs.explicit_hosts_;
513 }
514
515 bool ExtensionPermissionSet::Contains(const ExtensionPermissionSet& set) const {
516 // Every set includes the empty set.
517 if (set.IsEmpty())
518 return true;
519
520 if (!std::includes(apis_.begin(), apis_.end(),
521 set.apis().begin(), set.apis().end()))
522 return false;
523
524 if (!explicit_hosts().Contains(set.explicit_hosts()))
525 return false;
526
527 if (!scriptable_hosts().Contains(set.scriptable_hosts()))
528 return false;
529
530 return true;
531 }
532
454 std::set<std::string> ExtensionPermissionSet::GetAPIsAsStrings() const { 533 std::set<std::string> ExtensionPermissionSet::GetAPIsAsStrings() const {
455 ExtensionPermissionsInfo* info = ExtensionPermissionsInfo::GetInstance(); 534 ExtensionPermissionsInfo* info = ExtensionPermissionsInfo::GetInstance();
456 std::set<std::string> apis_str; 535 std::set<std::string> apis_str;
457 for (ExtensionAPIPermissionSet::const_iterator i = apis_.begin(); 536 for (ExtensionAPIPermissionSet::const_iterator i = apis_.begin();
458 i != apis_.end(); ++i) { 537 i != apis_.end(); ++i) {
459 ExtensionAPIPermission* permission = info->GetByID(*i); 538 ExtensionAPIPermission* permission = info->GetByID(*i);
460 if (permission) 539 if (permission)
461 apis_str.insert(permission->name()); 540 apis_str.insert(permission->name());
462 } 541 }
463 return apis_str; 542 return apis_str;
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 std::set<std::string> new_hosts_set = GetDistinctHosts(new_list, false); 854 std::set<std::string> new_hosts_set = GetDistinctHosts(new_list, false);
776 std::set<std::string> old_hosts_set = GetDistinctHosts(old_list, false); 855 std::set<std::string> old_hosts_set = GetDistinctHosts(old_list, false);
777 std::set<std::string> new_hosts_only; 856 std::set<std::string> new_hosts_only;
778 857
779 std::set_difference(new_hosts_set.begin(), new_hosts_set.end(), 858 std::set_difference(new_hosts_set.begin(), new_hosts_set.end(),
780 old_hosts_set.begin(), old_hosts_set.end(), 859 old_hosts_set.begin(), old_hosts_set.end(),
781 std::inserter(new_hosts_only, new_hosts_only.begin())); 860 std::inserter(new_hosts_only, new_hosts_only.begin()));
782 861
783 return !new_hosts_only.empty(); 862 return !new_hosts_only.empty();
784 } 863 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698