| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |