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

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

Issue 10049006: Add OAuth2 scopes to the ExtensionPermissionSet and granted permissions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/command_line.h" 10 #include "base/command_line.h"
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 // 434 //
435 // ExtensionPermissionSet 435 // ExtensionPermissionSet
436 // 436 //
437 437
438 ExtensionPermissionSet::ExtensionPermissionSet() { 438 ExtensionPermissionSet::ExtensionPermissionSet() {
439 } 439 }
440 440
441 ExtensionPermissionSet::ExtensionPermissionSet( 441 ExtensionPermissionSet::ExtensionPermissionSet(
442 const Extension* extension, 442 const Extension* extension,
443 const ExtensionAPIPermissionSet& apis, 443 const ExtensionAPIPermissionSet& apis,
444 const URLPatternSet& explicit_hosts) 444 const URLPatternSet& explicit_hosts,
445 : apis_(apis) { 445 const ExtensionOAuth2Scopes& scopes)
446 : apis_(apis),
447 scopes_(scopes) {
446 DCHECK(extension); 448 DCHECK(extension);
447 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); 449 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
448 InitImplicitExtensionPermissions(extension); 450 InitImplicitExtensionPermissions(extension);
449 InitEffectiveHosts(); 451 InitEffectiveHosts();
450 } 452 }
451 453
452 ExtensionPermissionSet::ExtensionPermissionSet( 454 ExtensionPermissionSet::ExtensionPermissionSet(
453 const ExtensionAPIPermissionSet& apis, 455 const ExtensionAPIPermissionSet& apis,
454 const URLPatternSet& explicit_hosts, 456 const URLPatternSet& explicit_hosts,
455 const URLPatternSet& scriptable_hosts) 457 const URLPatternSet& scriptable_hosts)
456 : apis_(apis), 458 : apis_(apis),
457 scriptable_hosts_(scriptable_hosts) { 459 scriptable_hosts_(scriptable_hosts) {
458 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); 460 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
459 InitEffectiveHosts(); 461 InitEffectiveHosts();
460 } 462 }
461 463
464 ExtensionPermissionSet::ExtensionPermissionSet(
465 const ExtensionAPIPermissionSet& apis,
466 const URLPatternSet& explicit_hosts,
467 const URLPatternSet& scriptable_hosts,
468 const ExtensionOAuth2Scopes& scopes)
469 : apis_(apis),
470 scriptable_hosts_(scriptable_hosts),
471 scopes_(scopes) {
472 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
473 InitEffectiveHosts();
474 }
475
476 ExtensionPermissionSet::ExtensionPermissionSet(
477 const ExtensionOAuth2Scopes& scopes)
478 : scopes_(scopes) {
479 InitEffectiveHosts();
480 }
481
462 ExtensionPermissionSet::~ExtensionPermissionSet() {} 482 ExtensionPermissionSet::~ExtensionPermissionSet() {}
463 483
464 // static 484 // static
465 ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference( 485 ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference(
466 const ExtensionPermissionSet* set1, 486 const ExtensionPermissionSet* set1,
467 const ExtensionPermissionSet* set2) { 487 const ExtensionPermissionSet* set2) {
468 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet(); 488 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet();
469 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1; 489 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1;
470 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2; 490 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
471 491
472 ExtensionAPIPermissionSet apis; 492 ExtensionAPIPermissionSet apis;
473 std::set_difference(set1_safe->apis().begin(), set1_safe->apis().end(), 493 std::set_difference(set1_safe->apis().begin(), set1_safe->apis().end(),
474 set2_safe->apis().begin(), set2_safe->apis().end(), 494 set2_safe->apis().begin(), set2_safe->apis().end(),
475 std::insert_iterator<ExtensionAPIPermissionSet>( 495 std::insert_iterator<ExtensionAPIPermissionSet>(
476 apis, apis.begin())); 496 apis, apis.begin()));
477 497
478 URLPatternSet explicit_hosts; 498 URLPatternSet explicit_hosts;
479 URLPatternSet::CreateDifference(set1_safe->explicit_hosts(), 499 URLPatternSet::CreateDifference(set1_safe->explicit_hosts(),
480 set2_safe->explicit_hosts(), 500 set2_safe->explicit_hosts(),
481 &explicit_hosts); 501 &explicit_hosts);
482 502
483 URLPatternSet scriptable_hosts; 503 URLPatternSet scriptable_hosts;
484 URLPatternSet::CreateDifference(set1_safe->scriptable_hosts(), 504 URLPatternSet::CreateDifference(set1_safe->scriptable_hosts(),
485 set2_safe->scriptable_hosts(), 505 set2_safe->scriptable_hosts(),
486 &scriptable_hosts); 506 &scriptable_hosts);
487 return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); 507
508 ExtensionOAuth2Scopes scopes;
509 std::set_difference(set1_safe->scopes().begin(), set1_safe->scopes().end(),
510 set2_safe->scopes().begin(), set2_safe->scopes().end(),
511 std::insert_iterator<ExtensionOAuth2Scopes>(
512 scopes, scopes.begin()));
513
514 return new ExtensionPermissionSet(
515 apis, explicit_hosts, scriptable_hosts, scopes);
488 } 516 }
489 517
490 // static 518 // static
491 ExtensionPermissionSet* ExtensionPermissionSet::CreateIntersection( 519 ExtensionPermissionSet* ExtensionPermissionSet::CreateIntersection(
492 const ExtensionPermissionSet* set1, 520 const ExtensionPermissionSet* set1,
493 const ExtensionPermissionSet* set2) { 521 const ExtensionPermissionSet* set2) {
494 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet(); 522 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet();
495 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1; 523 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1;
496 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2; 524 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
497 525
498 ExtensionAPIPermissionSet apis; 526 ExtensionAPIPermissionSet apis;
499 std::set_intersection(set1_safe->apis().begin(), set1_safe->apis().end(), 527 std::set_intersection(set1_safe->apis().begin(), set1_safe->apis().end(),
500 set2_safe->apis().begin(), set2_safe->apis().end(), 528 set2_safe->apis().begin(), set2_safe->apis().end(),
501 std::insert_iterator<ExtensionAPIPermissionSet>( 529 std::insert_iterator<ExtensionAPIPermissionSet>(
502 apis, apis.begin())); 530 apis, apis.begin()));
503 URLPatternSet explicit_hosts; 531 URLPatternSet explicit_hosts;
504 URLPatternSet::CreateIntersection(set1_safe->explicit_hosts(), 532 URLPatternSet::CreateIntersection(set1_safe->explicit_hosts(),
505 set2_safe->explicit_hosts(), 533 set2_safe->explicit_hosts(),
506 &explicit_hosts); 534 &explicit_hosts);
507 535
508 URLPatternSet scriptable_hosts; 536 URLPatternSet scriptable_hosts;
509 URLPatternSet::CreateIntersection(set1_safe->scriptable_hosts(), 537 URLPatternSet::CreateIntersection(set1_safe->scriptable_hosts(),
510 set2_safe->scriptable_hosts(), 538 set2_safe->scriptable_hosts(),
511 &scriptable_hosts); 539 &scriptable_hosts);
512 return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); 540
541 ExtensionOAuth2Scopes scopes;
542 std::set_intersection(set1_safe->scopes().begin(), set1_safe->scopes().end(),
543 set2_safe->scopes().begin(), set2_safe->scopes().end(),
544 std::insert_iterator<ExtensionOAuth2Scopes>(
545 scopes, scopes.begin()));
546
547 return new ExtensionPermissionSet(
548 apis, explicit_hosts, scriptable_hosts, scopes);
513 } 549 }
550
514 // static 551 // static
515 ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion( 552 ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion(
516 const ExtensionPermissionSet* set1, 553 const ExtensionPermissionSet* set1,
517 const ExtensionPermissionSet* set2) { 554 const ExtensionPermissionSet* set2) {
518 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet(); 555 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet();
519 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1; 556 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1;
520 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2; 557 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
521 558
522 ExtensionAPIPermissionSet apis; 559 ExtensionAPIPermissionSet apis;
523 std::set_union(set1_safe->apis().begin(), set1_safe->apis().end(), 560 std::set_union(set1_safe->apis().begin(), set1_safe->apis().end(),
524 set2_safe->apis().begin(), set2_safe->apis().end(), 561 set2_safe->apis().begin(), set2_safe->apis().end(),
525 std::insert_iterator<ExtensionAPIPermissionSet>( 562 std::insert_iterator<ExtensionAPIPermissionSet>(
526 apis, apis.begin())); 563 apis, apis.begin()));
527 564
528 URLPatternSet explicit_hosts; 565 URLPatternSet explicit_hosts;
529 URLPatternSet::CreateUnion(set1_safe->explicit_hosts(), 566 URLPatternSet::CreateUnion(set1_safe->explicit_hosts(),
530 set2_safe->explicit_hosts(), 567 set2_safe->explicit_hosts(),
531 &explicit_hosts); 568 &explicit_hosts);
532 569
533 URLPatternSet scriptable_hosts; 570 URLPatternSet scriptable_hosts;
534 URLPatternSet::CreateUnion(set1_safe->scriptable_hosts(), 571 URLPatternSet::CreateUnion(set1_safe->scriptable_hosts(),
535 set2_safe->scriptable_hosts(), 572 set2_safe->scriptable_hosts(),
536 &scriptable_hosts); 573 &scriptable_hosts);
537 574
538 return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); 575 ExtensionOAuth2Scopes scopes;
576 std::set_union(set1_safe->scopes().begin(), set1_safe->scopes().end(),
577 set2_safe->scopes().begin(), set2_safe->scopes().end(),
578 std::insert_iterator<ExtensionOAuth2Scopes>(
579 scopes, scopes.begin()));
580
581 return new ExtensionPermissionSet(
582 apis, explicit_hosts, scriptable_hosts, scopes);
539 } 583 }
540 584
541 bool ExtensionPermissionSet::operator==( 585 bool ExtensionPermissionSet::operator==(
542 const ExtensionPermissionSet& rhs) const { 586 const ExtensionPermissionSet& rhs) const {
543 return apis_ == rhs.apis_ && 587 return apis_ == rhs.apis_ &&
544 scriptable_hosts_ == rhs.scriptable_hosts_ && 588 scriptable_hosts_ == rhs.scriptable_hosts_ &&
545 explicit_hosts_ == rhs.explicit_hosts_; 589 explicit_hosts_ == rhs.explicit_hosts_ &&
590 scopes_ == rhs.scopes_;
546 } 591 }
547 592
548 bool ExtensionPermissionSet::Contains(const ExtensionPermissionSet& set) const { 593 bool ExtensionPermissionSet::Contains(const ExtensionPermissionSet& set) const {
549 // Every set includes the empty set. 594 // Every set includes the empty set.
550 if (set.IsEmpty()) 595 if (set.IsEmpty())
551 return true; 596 return true;
552 597
553 if (!std::includes(apis_.begin(), apis_.end(), 598 if (!std::includes(apis_.begin(), apis_.end(),
554 set.apis().begin(), set.apis().end())) 599 set.apis().begin(), set.apis().end()))
555 return false; 600 return false;
556 601
557 if (!explicit_hosts().Contains(set.explicit_hosts())) 602 if (!explicit_hosts().Contains(set.explicit_hosts()))
558 return false; 603 return false;
559 604
560 if (!scriptable_hosts().Contains(set.scriptable_hosts())) 605 if (!scriptable_hosts().Contains(set.scriptable_hosts()))
561 return false; 606 return false;
562 607
608 if (!std::includes(scopes_.begin(), scopes_.end(),
609 set.scopes().begin(), set.scopes().end()))
610 return false;
611
563 return true; 612 return true;
564 } 613 }
565 614
566 std::set<std::string> ExtensionPermissionSet::GetAPIsAsStrings() const { 615 std::set<std::string> ExtensionPermissionSet::GetAPIsAsStrings() const {
567 ExtensionPermissionsInfo* info = ExtensionPermissionsInfo::GetInstance(); 616 ExtensionPermissionsInfo* info = ExtensionPermissionsInfo::GetInstance();
568 std::set<std::string> apis_str; 617 std::set<std::string> apis_str;
569 for (ExtensionAPIPermissionSet::const_iterator i = apis_.begin(); 618 for (ExtensionAPIPermissionSet::const_iterator i = apis_.begin();
570 i != apis_.end(); ++i) { 619 i != apis_.end(); ++i) {
571 ExtensionAPIPermission* permission = info->GetByID(*i); 620 ExtensionAPIPermission* permission = info->GetByID(*i);
572 if (permission) 621 if (permission)
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 // Otherwise, it's a privilege increase if the new one has full access. 788 // Otherwise, it's a privilege increase if the new one has full access.
740 if (permissions->HasEffectiveFullAccess()) 789 if (permissions->HasEffectiveFullAccess())
741 return true; 790 return true;
742 791
743 if (HasLessHostPrivilegesThan(permissions)) 792 if (HasLessHostPrivilegesThan(permissions))
744 return true; 793 return true;
745 794
746 if (HasLessAPIPrivilegesThan(permissions)) 795 if (HasLessAPIPrivilegesThan(permissions))
747 return true; 796 return true;
748 797
798 if (HasLessScopesThan(permissions))
799 return true;
800
749 return false; 801 return false;
750 } 802 }
751 803
752 // static 804 // static
753 std::set<std::string> ExtensionPermissionSet::GetDistinctHosts( 805 std::set<std::string> ExtensionPermissionSet::GetDistinctHosts(
754 const URLPatternSet& host_patterns, 806 const URLPatternSet& host_patterns,
755 bool include_rcd, 807 bool include_rcd,
756 bool exclude_file_scheme) { 808 bool exclude_file_scheme) {
757 // Use a vector to preserve order (also faster than a map on small sets). 809 // Use a vector to preserve order (also faster than a map on small sets).
758 // Each item is a host split into two parts: host without RCDs and 810 // Each item is a host split into two parts: host without RCDs and
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 std::set<std::string> new_hosts_set(GetDistinctHosts(new_list, false, false)); 935 std::set<std::string> new_hosts_set(GetDistinctHosts(new_list, false, false));
884 std::set<std::string> old_hosts_set(GetDistinctHosts(old_list, false, false)); 936 std::set<std::string> old_hosts_set(GetDistinctHosts(old_list, false, false));
885 std::set<std::string> new_hosts_only; 937 std::set<std::string> new_hosts_only;
886 938
887 std::set_difference(new_hosts_set.begin(), new_hosts_set.end(), 939 std::set_difference(new_hosts_set.begin(), new_hosts_set.end(),
888 old_hosts_set.begin(), old_hosts_set.end(), 940 old_hosts_set.begin(), old_hosts_set.end(),
889 std::inserter(new_hosts_only, new_hosts_only.begin())); 941 std::inserter(new_hosts_only, new_hosts_only.begin()));
890 942
891 return !new_hosts_only.empty(); 943 return !new_hosts_only.empty();
892 } 944 }
945
946 bool ExtensionPermissionSet::HasLessScopesThan(
947 const ExtensionPermissionSet* permissions) const {
948 if (permissions == NULL)
949 return false;
950
951 ExtensionOAuth2Scopes current_scopes = scopes();
952 ExtensionOAuth2Scopes new_scopes = permissions->scopes();
953 ExtensionOAuth2Scopes delta_scopes;
954 std::set_difference(new_scopes.begin(), new_scopes.end(),
955 current_scopes.begin(), current_scopes.end(),
956 std::inserter(delta_scopes, delta_scopes.begin()));
957
958 // We have less privileges if there are additional scopes present.
959 return !delta_scopes.empty();
960 }
OLDNEW
« no previous file with comments | « chrome/common/extensions/extension_permission_set.h ('k') | chrome/common/extensions/extension_permission_set_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698