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 |