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 |