| Index: chrome/common/extensions/extension_permission_set.cc
|
| diff --git a/chrome/common/extensions/extension_permission_set.cc b/chrome/common/extensions/extension_permission_set.cc
|
| index d805f8232a089d978246482601d6506d2c9cf564..8b882c795b4882eb6dd06117a052ae988c6d9640 100644
|
| --- a/chrome/common/extensions/extension_permission_set.cc
|
| +++ b/chrome/common/extensions/extension_permission_set.cc
|
| @@ -441,8 +441,10 @@ ExtensionPermissionSet::ExtensionPermissionSet() {
|
| ExtensionPermissionSet::ExtensionPermissionSet(
|
| const Extension* extension,
|
| const ExtensionAPIPermissionSet& apis,
|
| - const URLPatternSet& explicit_hosts)
|
| - : apis_(apis) {
|
| + const URLPatternSet& explicit_hosts,
|
| + const ExtensionOAuth2Scopes& scopes)
|
| + : apis_(apis),
|
| + scopes_(scopes) {
|
| DCHECK(extension);
|
| AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
|
| InitImplicitExtensionPermissions(extension);
|
| @@ -453,12 +455,30 @@ ExtensionPermissionSet::ExtensionPermissionSet(
|
| const ExtensionAPIPermissionSet& apis,
|
| const URLPatternSet& explicit_hosts,
|
| const URLPatternSet& scriptable_hosts)
|
| - : apis_(apis),
|
| - scriptable_hosts_(scriptable_hosts) {
|
| + : apis_(apis),
|
| + scriptable_hosts_(scriptable_hosts) {
|
| + AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
|
| + InitEffectiveHosts();
|
| +}
|
| +
|
| +ExtensionPermissionSet::ExtensionPermissionSet(
|
| + const ExtensionAPIPermissionSet& apis,
|
| + const URLPatternSet& explicit_hosts,
|
| + const URLPatternSet& scriptable_hosts,
|
| + const ExtensionOAuth2Scopes& scopes)
|
| + : apis_(apis),
|
| + scriptable_hosts_(scriptable_hosts),
|
| + scopes_(scopes) {
|
| AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_);
|
| InitEffectiveHosts();
|
| }
|
|
|
| +ExtensionPermissionSet::ExtensionPermissionSet(
|
| + const ExtensionOAuth2Scopes& scopes)
|
| + : scopes_(scopes) {
|
| + InitEffectiveHosts();
|
| +}
|
| +
|
| ExtensionPermissionSet::~ExtensionPermissionSet() {}
|
|
|
| // static
|
| @@ -484,7 +504,15 @@ ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference(
|
| URLPatternSet::CreateDifference(set1_safe->scriptable_hosts(),
|
| set2_safe->scriptable_hosts(),
|
| &scriptable_hosts);
|
| - return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts);
|
| +
|
| + ExtensionOAuth2Scopes scopes;
|
| + std::set_difference(set1_safe->scopes().begin(), set1_safe->scopes().end(),
|
| + set2_safe->scopes().begin(), set2_safe->scopes().end(),
|
| + std::insert_iterator<ExtensionOAuth2Scopes>(
|
| + scopes, scopes.begin()));
|
| +
|
| + return new ExtensionPermissionSet(
|
| + apis, explicit_hosts, scriptable_hosts, scopes);
|
| }
|
|
|
| // static
|
| @@ -509,8 +537,17 @@ ExtensionPermissionSet* ExtensionPermissionSet::CreateIntersection(
|
| URLPatternSet::CreateIntersection(set1_safe->scriptable_hosts(),
|
| set2_safe->scriptable_hosts(),
|
| &scriptable_hosts);
|
| - return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts);
|
| +
|
| + ExtensionOAuth2Scopes scopes;
|
| + std::set_intersection(set1_safe->scopes().begin(), set1_safe->scopes().end(),
|
| + set2_safe->scopes().begin(), set2_safe->scopes().end(),
|
| + std::insert_iterator<ExtensionOAuth2Scopes>(
|
| + scopes, scopes.begin()));
|
| +
|
| + return new ExtensionPermissionSet(
|
| + apis, explicit_hosts, scriptable_hosts, scopes);
|
| }
|
| +
|
| // static
|
| ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion(
|
| const ExtensionPermissionSet* set1,
|
| @@ -535,14 +572,22 @@ ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion(
|
| set2_safe->scriptable_hosts(),
|
| &scriptable_hosts);
|
|
|
| - return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts);
|
| + ExtensionOAuth2Scopes scopes;
|
| + std::set_union(set1_safe->scopes().begin(), set1_safe->scopes().end(),
|
| + set2_safe->scopes().begin(), set2_safe->scopes().end(),
|
| + std::insert_iterator<ExtensionOAuth2Scopes>(
|
| + scopes, scopes.begin()));
|
| +
|
| + return new ExtensionPermissionSet(
|
| + apis, explicit_hosts, scriptable_hosts, scopes);
|
| }
|
|
|
| bool ExtensionPermissionSet::operator==(
|
| const ExtensionPermissionSet& rhs) const {
|
| return apis_ == rhs.apis_ &&
|
| scriptable_hosts_ == rhs.scriptable_hosts_ &&
|
| - explicit_hosts_ == rhs.explicit_hosts_;
|
| + explicit_hosts_ == rhs.explicit_hosts_ &&
|
| + scopes_ == rhs.scopes_;
|
| }
|
|
|
| bool ExtensionPermissionSet::Contains(const ExtensionPermissionSet& set) const {
|
| @@ -560,6 +605,10 @@ bool ExtensionPermissionSet::Contains(const ExtensionPermissionSet& set) const {
|
| if (!scriptable_hosts().Contains(set.scriptable_hosts()))
|
| return false;
|
|
|
| + if (!std::includes(scopes_.begin(), scopes_.end(),
|
| + set.scopes().begin(), set.scopes().end()))
|
| + return false;
|
| +
|
| return true;
|
| }
|
|
|
| @@ -746,6 +795,9 @@ bool ExtensionPermissionSet::HasLessPrivilegesThan(
|
| if (HasLessAPIPrivilegesThan(permissions))
|
| return true;
|
|
|
| + if (HasLessScopesThan(permissions))
|
| + return true;
|
| +
|
| return false;
|
| }
|
|
|
| @@ -890,3 +942,19 @@ bool ExtensionPermissionSet::HasLessHostPrivilegesThan(
|
|
|
| return !new_hosts_only.empty();
|
| }
|
| +
|
| +bool ExtensionPermissionSet::HasLessScopesThan(
|
| + const ExtensionPermissionSet* permissions) const {
|
| + if (permissions == NULL)
|
| + return false;
|
| +
|
| + ExtensionOAuth2Scopes current_scopes = scopes();
|
| + ExtensionOAuth2Scopes new_scopes = permissions->scopes();
|
| + ExtensionOAuth2Scopes delta_scopes;
|
| + std::set_difference(new_scopes.begin(), new_scopes.end(),
|
| + current_scopes.begin(), current_scopes.end(),
|
| + std::inserter(delta_scopes, delta_scopes.begin()));
|
| +
|
| + // We have less privileges if there are additional scopes present.
|
| + return !delta_scopes.empty();
|
| +}
|
|
|