Chromium Code Reviews| 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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 138 } | 138 } |
| 139 | 139 |
| 140 return ExtensionPermissionMessage(message_id, message); | 140 return ExtensionPermissionMessage(message_id, message); |
| 141 } | 141 } |
| 142 | 142 |
| 143 ExtensionPermissionMessage::ExtensionPermissionMessage( | 143 ExtensionPermissionMessage::ExtensionPermissionMessage( |
| 144 ExtensionPermissionMessage::ID id, const string16& message) | 144 ExtensionPermissionMessage::ID id, const string16& message) |
| 145 : id_(id), message_(message) { | 145 : id_(id), message_(message) { |
| 146 } | 146 } |
| 147 | 147 |
| 148 ExtensionPermissionMessage::~ExtensionPermissionMessage() { | 148 ExtensionPermissionMessage::~ExtensionPermissionMessage() {} |
| 149 } | |
| 150 | 149 |
| 151 // | 150 // |
| 152 // ExtensionPermission | 151 // ExtensionPermission |
| 153 // | 152 // |
| 154 | 153 |
| 154 ExtensionAPIPermission::~ExtensionAPIPermission() {} | |
| 155 | |
| 155 ExtensionPermissionMessage ExtensionAPIPermission::GetMessage() const { | 156 ExtensionPermissionMessage ExtensionAPIPermission::GetMessage() const { |
| 156 return ExtensionPermissionMessage( | 157 return ExtensionPermissionMessage( |
| 157 message_id_, l10n_util::GetStringUTF16(l10n_message_id_)); | 158 message_id_, l10n_util::GetStringUTF16(l10n_message_id_)); |
| 158 } | 159 } |
| 159 | 160 |
| 160 ExtensionAPIPermission::ExtensionAPIPermission( | 161 ExtensionAPIPermission::ExtensionAPIPermission( |
| 161 ID id, | 162 ID id, |
| 162 const char* name, | 163 const char* name, |
| 163 int l10n_message_id, | 164 int l10n_message_id, |
| 164 ExtensionPermissionMessage::ID message_id, | 165 ExtensionPermissionMessage::ID message_id, |
| 165 int flags) | 166 int flags) |
| 166 : id_(id), | 167 : id_(id), |
| 167 name_(name), | 168 name_(name), |
| 168 flags_(flags), | 169 flags_(flags), |
| 169 l10n_message_id_(l10n_message_id), | 170 l10n_message_id_(l10n_message_id), |
| 170 message_id_(message_id) {} | 171 message_id_(message_id) {} |
| 171 | 172 |
| 172 ExtensionAPIPermission::~ExtensionAPIPermission() {} | |
| 173 | |
| 174 // static | 173 // static |
| 175 void ExtensionAPIPermission::RegisterAllPermissions( | 174 void ExtensionAPIPermission::RegisterAllPermissions( |
| 176 ExtensionPermissionsInfo* info) { | 175 ExtensionPermissionsInfo* info) { |
| 177 | 176 |
| 178 // Register permissions for all extension types. | 177 // Register permissions for all extension types. |
| 179 info->RegisterPermission( | 178 info->RegisterPermission( |
| 180 kBackground, "background", 0, | 179 kBackground, "background", 0, |
| 181 ExtensionPermissionMessage::kNone, kFlagNone); | 180 ExtensionPermissionMessage::kNone, kFlagNone); |
| 182 info->RegisterPermission( | 181 info->RegisterPermission( |
| 183 kClipboardRead, "clipboardRead", IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD, | 182 kClipboardRead, "clipboardRead", IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD, |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 398 delete i->second; | 397 delete i->second; |
| 399 } | 398 } |
| 400 | 399 |
| 401 ExtensionPermissionsInfo::ExtensionPermissionsInfo() | 400 ExtensionPermissionsInfo::ExtensionPermissionsInfo() |
| 402 : hosted_app_permission_count_(0), | 401 : hosted_app_permission_count_(0), |
| 403 permission_count_(0) { | 402 permission_count_(0) { |
| 404 ExtensionAPIPermission::RegisterAllPermissions(this); | 403 ExtensionAPIPermission::RegisterAllPermissions(this); |
| 405 } | 404 } |
| 406 | 405 |
| 407 void ExtensionPermissionsInfo::RegisterAlias( | 406 void ExtensionPermissionsInfo::RegisterAlias( |
| 408 const char* name, const char* alias) { | 407 const char* name, |
|
Nico
2012/04/25 13:20:37
?
Ryan Sleevi
2012/04/25 15:13:59
Style guide. Only two forms: all on one line or on
| |
| 408 const char* alias) { | |
| 409 DCHECK(name_map_.find(name) != name_map_.end()); | 409 DCHECK(name_map_.find(name) != name_map_.end()); |
| 410 DCHECK(name_map_.find(alias) == name_map_.end()); | 410 DCHECK(name_map_.find(alias) == name_map_.end()); |
| 411 name_map_[alias] = name_map_[name]; | 411 name_map_[alias] = name_map_[name]; |
| 412 } | 412 } |
| 413 | 413 |
| 414 ExtensionAPIPermission* ExtensionPermissionsInfo::RegisterPermission( | 414 ExtensionAPIPermission* ExtensionPermissionsInfo::RegisterPermission( |
| 415 ExtensionAPIPermission::ID id, | 415 ExtensionAPIPermission::ID id, |
| 416 const char* name, | 416 const char* name, |
| 417 int l10n_message_id, | 417 int l10n_message_id, |
| 418 ExtensionPermissionMessage::ID message_id, | 418 ExtensionPermissionMessage::ID message_id, |
| 419 int flags) { | 419 int flags) { |
| 420 DCHECK(id_map_.find(id) == id_map_.end()); | 420 DCHECK(id_map_.find(id) == id_map_.end()); |
| 421 DCHECK(name_map_.find(name) == name_map_.end()); | 421 DCHECK(name_map_.find(name) == name_map_.end()); |
| 422 | 422 |
| 423 ExtensionAPIPermission* permission = new ExtensionAPIPermission( | 423 ExtensionAPIPermission* permission = new ExtensionAPIPermission( |
| 424 id, name, l10n_message_id, message_id, flags); | 424 id, name, l10n_message_id, message_id, flags); |
| 425 | 425 |
| 426 id_map_[id] = permission; | 426 id_map_[id] = permission; |
| 427 name_map_[name] = permission; | 427 name_map_[name] = permission; |
| 428 | 428 |
| 429 permission_count_++; | 429 permission_count_++; |
| 430 | 430 |
| 431 return permission; | 431 return permission; |
| 432 } | 432 } |
| 433 | 433 |
| 434 // | 434 // |
| 435 // ExtensionPermissionSet | 435 // ExtensionPermissionSet |
| 436 // | 436 // |
| 437 | 437 |
| 438 ExtensionPermissionSet::ExtensionPermissionSet() { | 438 ExtensionPermissionSet::ExtensionPermissionSet() {} |
| 439 } | |
| 440 | 439 |
| 441 ExtensionPermissionSet::ExtensionPermissionSet( | 440 ExtensionPermissionSet::ExtensionPermissionSet( |
| 442 const Extension* extension, | 441 const Extension* extension, |
| 443 const ExtensionAPIPermissionSet& apis, | 442 const ExtensionAPIPermissionSet& apis, |
| 444 const URLPatternSet& explicit_hosts, | 443 const URLPatternSet& explicit_hosts, |
| 445 const ExtensionOAuth2Scopes& scopes) | 444 const ExtensionOAuth2Scopes& scopes) |
| 446 : apis_(apis), | 445 : apis_(apis), |
| 447 scopes_(scopes) { | 446 scopes_(scopes) { |
| 448 DCHECK(extension); | 447 DCHECK(extension); |
| 449 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); | 448 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 472 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); | 471 AddPatternsAndRemovePaths(explicit_hosts, &explicit_hosts_); |
| 473 InitEffectiveHosts(); | 472 InitEffectiveHosts(); |
| 474 } | 473 } |
| 475 | 474 |
| 476 ExtensionPermissionSet::ExtensionPermissionSet( | 475 ExtensionPermissionSet::ExtensionPermissionSet( |
| 477 const ExtensionOAuth2Scopes& scopes) | 476 const ExtensionOAuth2Scopes& scopes) |
| 478 : scopes_(scopes) { | 477 : scopes_(scopes) { |
| 479 InitEffectiveHosts(); | 478 InitEffectiveHosts(); |
| 480 } | 479 } |
| 481 | 480 |
| 482 ExtensionPermissionSet::~ExtensionPermissionSet() {} | |
|
Nico
2012/04/25 13:20:37
Wasn't the consensus on that thread to keep constr
Ryan Sleevi
2012/04/25 15:13:59
No, it was "the style guide says X so we do X, no
| |
| 483 | |
| 484 // static | 481 // static |
| 485 ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference( | 482 ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference( |
| 486 const ExtensionPermissionSet* set1, | 483 const ExtensionPermissionSet* set1, |
| 487 const ExtensionPermissionSet* set2) { | 484 const ExtensionPermissionSet* set2) { |
| 488 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet(); | 485 scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet(); |
| 489 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1; | 486 const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1; |
| 490 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2; | 487 const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2; |
| 491 | 488 |
| 492 ExtensionAPIPermissionSet apis; | 489 ExtensionAPIPermissionSet apis; |
| 493 std::set_difference(set1_safe->apis().begin(), set1_safe->apis().end(), | 490 std::set_difference(set1_safe->apis().begin(), set1_safe->apis().end(), |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 794 | 791 |
| 795 if (HasLessAPIPrivilegesThan(permissions)) | 792 if (HasLessAPIPrivilegesThan(permissions)) |
| 796 return true; | 793 return true; |
| 797 | 794 |
| 798 if (HasLessScopesThan(permissions)) | 795 if (HasLessScopesThan(permissions)) |
| 799 return true; | 796 return true; |
| 800 | 797 |
| 801 return false; | 798 return false; |
| 802 } | 799 } |
| 803 | 800 |
| 801 ExtensionPermissionSet::~ExtensionPermissionSet() {} | |
| 802 | |
| 804 // static | 803 // static |
| 805 std::set<std::string> ExtensionPermissionSet::GetDistinctHosts( | 804 std::set<std::string> ExtensionPermissionSet::GetDistinctHosts( |
| 806 const URLPatternSet& host_patterns, | 805 const URLPatternSet& host_patterns, |
| 807 bool include_rcd, | 806 bool include_rcd, |
| 808 bool exclude_file_scheme) { | 807 bool exclude_file_scheme) { |
| 809 // Use a vector to preserve order (also faster than a map on small sets). | 808 // Use a vector to preserve order (also faster than a map on small sets). |
| 810 // Each item is a host split into two parts: host without RCDs and | 809 // Each item is a host split into two parts: host without RCDs and |
| 811 // current best RCD. | 810 // current best RCD. |
| 812 typedef std::vector<std::pair<std::string, std::string> > HostVector; | 811 typedef std::vector<std::pair<std::string, std::string> > HostVector; |
| 813 HostVector hosts_best_rcd; | 812 HostVector hosts_best_rcd; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 848 } | 847 } |
| 849 | 848 |
| 850 // Build up the final vector by concatenating hosts and RCDs. | 849 // Build up the final vector by concatenating hosts and RCDs. |
| 851 std::set<std::string> distinct_hosts; | 850 std::set<std::string> distinct_hosts; |
| 852 for (HostVector::iterator it = hosts_best_rcd.begin(); | 851 for (HostVector::iterator it = hosts_best_rcd.begin(); |
| 853 it != hosts_best_rcd.end(); ++it) | 852 it != hosts_best_rcd.end(); ++it) |
| 854 distinct_hosts.insert(it->first + it->second); | 853 distinct_hosts.insert(it->first + it->second); |
| 855 return distinct_hosts; | 854 return distinct_hosts; |
| 856 } | 855 } |
| 857 | 856 |
| 858 void ExtensionPermissionSet::InitEffectiveHosts() { | |
| 859 effective_hosts_.ClearPatterns(); | |
| 860 | |
| 861 URLPatternSet::CreateUnion( | |
| 862 explicit_hosts(), scriptable_hosts(), &effective_hosts_); | |
| 863 } | |
| 864 | |
| 865 void ExtensionPermissionSet::InitImplicitExtensionPermissions( | 857 void ExtensionPermissionSet::InitImplicitExtensionPermissions( |
| 866 const Extension* extension) { | 858 const Extension* extension) { |
| 867 // Add the implied permissions. | 859 // Add the implied permissions. |
| 868 if (!extension->plugins().empty()) | 860 if (!extension->plugins().empty()) |
| 869 apis_.insert(ExtensionAPIPermission::kPlugin); | 861 apis_.insert(ExtensionAPIPermission::kPlugin); |
| 870 | 862 |
| 871 if (!extension->devtools_url().is_empty()) | 863 if (!extension->devtools_url().is_empty()) |
| 872 apis_.insert(ExtensionAPIPermission::kDevtools); | 864 apis_.insert(ExtensionAPIPermission::kDevtools); |
| 873 | 865 |
| 874 // Add the scriptable hosts. | 866 // Add the scriptable hosts. |
| 875 for (UserScriptList::const_iterator content_script = | 867 for (UserScriptList::const_iterator content_script = |
| 876 extension->content_scripts().begin(); | 868 extension->content_scripts().begin(); |
| 877 content_script != extension->content_scripts().end(); ++content_script) { | 869 content_script != extension->content_scripts().end(); ++content_script) { |
| 878 URLPatternSet::const_iterator pattern = | 870 URLPatternSet::const_iterator pattern = |
| 879 content_script->url_patterns().begin(); | 871 content_script->url_patterns().begin(); |
| 880 for (; pattern != content_script->url_patterns().end(); ++pattern) | 872 for (; pattern != content_script->url_patterns().end(); ++pattern) |
| 881 scriptable_hosts_.AddPattern(*pattern); | 873 scriptable_hosts_.AddPattern(*pattern); |
| 882 } | 874 } |
| 883 } | 875 } |
| 884 | 876 |
| 877 void ExtensionPermissionSet::InitEffectiveHosts() { | |
| 878 effective_hosts_.ClearPatterns(); | |
| 879 | |
| 880 URLPatternSet::CreateUnion( | |
| 881 explicit_hosts(), scriptable_hosts(), &effective_hosts_); | |
| 882 } | |
| 883 | |
| 885 std::set<ExtensionPermissionMessage> | 884 std::set<ExtensionPermissionMessage> |
| 886 ExtensionPermissionSet::GetSimplePermissionMessages() const { | 885 ExtensionPermissionSet::GetSimplePermissionMessages() const { |
| 887 std::set<ExtensionPermissionMessage> messages; | 886 std::set<ExtensionPermissionMessage> messages; |
| 888 ExtensionPermissionsInfo* info = ExtensionPermissionsInfo::GetInstance(); | 887 ExtensionPermissionsInfo* info = ExtensionPermissionsInfo::GetInstance(); |
| 889 for (ExtensionAPIPermissionSet::const_iterator i = apis_.begin(); | 888 for (ExtensionAPIPermissionSet::const_iterator i = apis_.begin(); |
| 890 i != apis_.end(); ++i) { | 889 i != apis_.end(); ++i) { |
| 891 DCHECK_GT(ExtensionPermissionMessage::kNone, | 890 DCHECK_GT(ExtensionPermissionMessage::kNone, |
| 892 ExtensionPermissionMessage::kUnknown); | 891 ExtensionPermissionMessage::kUnknown); |
| 893 ExtensionAPIPermission* perm = info->GetByID(*i); | 892 ExtensionAPIPermission* perm = info->GetByID(*i); |
| 894 if (perm && perm->message_id() > ExtensionPermissionMessage::kNone) | 893 if (perm && perm->message_id() > ExtensionPermissionMessage::kNone) |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 951 ExtensionOAuth2Scopes current_scopes = scopes(); | 950 ExtensionOAuth2Scopes current_scopes = scopes(); |
| 952 ExtensionOAuth2Scopes new_scopes = permissions->scopes(); | 951 ExtensionOAuth2Scopes new_scopes = permissions->scopes(); |
| 953 ExtensionOAuth2Scopes delta_scopes; | 952 ExtensionOAuth2Scopes delta_scopes; |
| 954 std::set_difference(new_scopes.begin(), new_scopes.end(), | 953 std::set_difference(new_scopes.begin(), new_scopes.end(), |
| 955 current_scopes.begin(), current_scopes.end(), | 954 current_scopes.begin(), current_scopes.end(), |
| 956 std::inserter(delta_scopes, delta_scopes.begin())); | 955 std::inserter(delta_scopes, delta_scopes.begin())); |
| 957 | 956 |
| 958 // We have less privileges if there are additional scopes present. | 957 // We have less privileges if there are additional scopes present. |
| 959 return !delta_scopes.empty(); | 958 return !delta_scopes.empty(); |
| 960 } | 959 } |
| OLD | NEW |