Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: chrome/common/extensions/extension.cc

Issue 10815028: Make ActiveTabPermissionManager also grant the tabs permission. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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.h" 5 #include "chrome/common/extensions/extension.h"
6 6
7 #include <ostream> 7 #include <ostream>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 3420 matching lines...) Expand 10 before | Expand all | Expand 10 after
3431 if (CanExecuteScriptEverywhere()) 3431 if (CanExecuteScriptEverywhere())
3432 return true; 3432 return true;
3433 3433
3434 return false; 3434 return false;
3435 } 3435 }
3436 3436
3437 // Otherwise, the valid schemes were handled by URLPattern. 3437 // Otherwise, the valid schemes were handled by URLPattern.
3438 return true; 3438 return true;
3439 } 3439 }
3440 3440
3441 bool Extension::HasAPIPermission( 3441 bool Extension::HasAPIPermission(APIPermission::ID permission) const {
3442 APIPermission::ID permission) const {
3443 base::AutoLock auto_lock(runtime_data_lock_); 3442 base::AutoLock auto_lock(runtime_data_lock_);
3444 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); 3443 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission);
3445 } 3444 }
3446 3445
3447 bool Extension::HasAPIPermission( 3446 bool Extension::HasAPIPermission(const std::string& function_name) const {
3448 const std::string& function_name) const {
3449 base::AutoLock auto_lock(runtime_data_lock_); 3447 base::AutoLock auto_lock(runtime_data_lock_);
3450 return runtime_data_.GetActivePermissions()-> 3448 return runtime_data_.GetActivePermissions()->
3451 HasAccessToFunction(function_name); 3449 HasAccessToFunction(function_name);
3452 } 3450 }
3453 3451
3452 bool Extension::HasAPIPermissionForTab(int tab_id,
3453 APIPermission::ID permission) const {
3454 base::AutoLock auto_lock(runtime_data_lock_);
3455 if (runtime_data_.GetActivePermissions()->HasAPIPermission(permission))
3456 return true;
3457 scoped_refptr<const PermissionSet> tab_specific_permissions =
3458 runtime_data_.GetTabSpecificPermissions(tab_id);
3459 return tab_specific_permissions.get() &&
3460 tab_specific_permissions->HasAPIPermission(permission);
3461 }
3462
3454 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { 3463 const URLPatternSet& Extension::GetEffectiveHostPermissions() const {
3455 base::AutoLock auto_lock(runtime_data_lock_); 3464 base::AutoLock auto_lock(runtime_data_lock_);
3456 return runtime_data_.GetActivePermissions()->effective_hosts(); 3465 return runtime_data_.GetActivePermissions()->effective_hosts();
3457 } 3466 }
3458 3467
3459 bool Extension::HasHostPermission(const GURL& url) const { 3468 bool Extension::HasHostPermission(const GURL& url) const {
3460 if (url.SchemeIs(chrome::kChromeUIScheme) && 3469 if (url.SchemeIs(chrome::kChromeUIScheme) &&
3461 url.host() != chrome::kChromeUIFaviconHost && 3470 url.host() != chrome::kChromeUIFaviconHost &&
3462 url.host() != chrome::kChromeUIThumbnailHost && 3471 url.host() != chrome::kChromeUIThumbnailHost &&
3463 location() != Extension::COMPONENT) { 3472 location() != Extension::COMPONENT) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3541 *error = errors::kCannotScriptGallery; 3550 *error = errors::kCannotScriptGallery;
3542 return false; 3551 return false;
3543 } 3552 }
3544 3553
3545 if (page_url.SchemeIs(chrome::kChromeUIScheme) && 3554 if (page_url.SchemeIs(chrome::kChromeUIScheme) &&
3546 !CanExecuteScriptEverywhere()) 3555 !CanExecuteScriptEverywhere())
3547 return false; 3556 return false;
3548 3557
3549 // If a tab ID is specified, try the tab-specific permissions. 3558 // If a tab ID is specified, try the tab-specific permissions.
3550 if (tab_id >= 0) { 3559 if (tab_id >= 0) {
3551 const URLPatternSet* tab_permissions = 3560 scoped_refptr<const PermissionSet> tab_permissions =
3552 runtime_data_.GetTabSpecificHostPermissions(tab_id); 3561 runtime_data_.GetTabSpecificPermissions(tab_id);
3553 if (tab_permissions && 3562 if (tab_permissions.get() &&
3554 tab_permissions->MatchesSecurityOrigin(page_url)) { 3563 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) {
3555 return true; 3564 return true;
3556 } 3565 }
3557 } 3566 }
3558 3567
3559 // If a script is specified, use its matches. 3568 // If a script is specified, use its matches.
3560 if (script) 3569 if (script)
3561 return script->MatchesURL(page_url); 3570 return script->MatchesURL(page_url);
3562 3571
3563 // Otherwise, see if this extension has permission to execute script 3572 // Otherwise, see if this extension has permission to execute script
3564 // programmatically on pages. 3573 // programmatically on pages.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3614 } 3623 }
3615 } 3624 }
3616 3625
3617 return false; 3626 return false;
3618 } 3627 }
3619 3628
3620 bool Extension::CanCaptureVisiblePage(const GURL& page_url, 3629 bool Extension::CanCaptureVisiblePage(const GURL& page_url,
3621 int tab_id, 3630 int tab_id,
3622 std::string *error) const { 3631 std::string *error) const {
3623 if (tab_id >= 0) { 3632 if (tab_id >= 0) {
3624 const URLPatternSet* tab_permissions = 3633 scoped_refptr<const PermissionSet> tab_permissions =
3625 GetTabSpecificHostPermissions(tab_id); 3634 GetTabSpecificPermissions(tab_id);
3626 if (tab_permissions && 3635 if (tab_permissions.get() &&
3627 tab_permissions->MatchesSecurityOrigin(page_url)) { 3636 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) {
3628 return true; 3637 return true;
3629 } 3638 }
3630 } 3639 }
3631 3640
3632 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) 3641 if (HasHostPermission(page_url) || page_url.GetOrigin() == url())
3633 return true; 3642 return true;
3634 3643
3635 if (error) { 3644 if (error) {
3636 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, 3645 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage,
3637 page_url.spec()); 3646 page_url.spec());
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
3776 3785
3777 bool Extension::HasContentScriptAtURL(const GURL& url) const { 3786 bool Extension::HasContentScriptAtURL(const GURL& url) const {
3778 for (UserScriptList::const_iterator it = content_scripts_.begin(); 3787 for (UserScriptList::const_iterator it = content_scripts_.begin();
3779 it != content_scripts_.end(); ++it) { 3788 it != content_scripts_.end(); ++it) {
3780 if (it->MatchesURL(url)) 3789 if (it->MatchesURL(url))
3781 return true; 3790 return true;
3782 } 3791 }
3783 return false; 3792 return false;
3784 } 3793 }
3785 3794
3786 const URLPatternSet* Extension::GetTabSpecificHostPermissions( 3795 scoped_refptr<const PermissionSet> Extension::GetTabSpecificPermissions(
3787 int tab_id) const { 3796 int tab_id) const {
3788 base::AutoLock auto_lock(runtime_data_lock_); 3797 base::AutoLock auto_lock(runtime_data_lock_);
3789 return runtime_data_.GetTabSpecificHostPermissions(tab_id); 3798 return runtime_data_.GetTabSpecificPermissions(tab_id);
3790 } 3799 }
3791 3800
3792 void Extension::SetTabSpecificHostPermissions( 3801 void Extension::UpdateTabSpecificPermissions(
3793 int tab_id, 3802 int tab_id,
3794 const URLPatternSet& permissions) const { 3803 const PermissionSet* permissions) const {
3795 base::AutoLock auto_lock(runtime_data_lock_); 3804 base::AutoLock auto_lock(runtime_data_lock_);
3796 runtime_data_.SetTabSpecificHostPermissions(tab_id, permissions); 3805 runtime_data_.UpdateTabSpecificPermissions(tab_id, permissions);
3797 } 3806 }
3798 3807
3799 void Extension::ClearTabSpecificHostPermissions(int tab_id) const { 3808 void Extension::ClearTabSpecificPermissions(int tab_id) const {
3800 base::AutoLock auto_lock(runtime_data_lock_); 3809 base::AutoLock auto_lock(runtime_data_lock_);
3801 runtime_data_.ClearTabSpecificHostPermissions(tab_id); 3810 runtime_data_.ClearTabSpecificPermissions(tab_id);
3802 } 3811 }
3803 3812
3804 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { 3813 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) {
3805 if (!is_platform_app()) 3814 if (!is_platform_app())
3806 return true; 3815 return true;
3807 3816
3808 if (!has_background_page()) { 3817 if (!has_background_page()) {
3809 *utf8_error = errors::kBackgroundRequiredForPlatformApps; 3818 *utf8_error = errors::kBackgroundRequiredForPlatformApps;
3810 return false; 3819 return false;
3811 } 3820 }
(...skipping 21 matching lines...) Expand all
3833 scoped_refptr<const PermissionSet> 3842 scoped_refptr<const PermissionSet>
3834 Extension::RuntimeData::GetActivePermissions() const { 3843 Extension::RuntimeData::GetActivePermissions() const {
3835 return active_permissions_; 3844 return active_permissions_;
3836 } 3845 }
3837 3846
3838 void Extension::RuntimeData::SetActivePermissions( 3847 void Extension::RuntimeData::SetActivePermissions(
3839 const PermissionSet* active) { 3848 const PermissionSet* active) {
3840 active_permissions_ = active; 3849 active_permissions_ = active;
3841 } 3850 }
3842 3851
3843 const URLPatternSet* 3852 scoped_refptr<const PermissionSet>
3844 Extension::RuntimeData::GetTabSpecificHostPermissions(int tab_id) const { 3853 Extension::RuntimeData::GetTabSpecificPermissions(int tab_id) const {
3845 CHECK_GE(tab_id, 0); 3854 CHECK_GE(tab_id, 0);
3846 TabHostPermissionsMap::const_iterator it = 3855 TabPermissionsMap::const_iterator it = tab_specific_permissions_.find(tab_id);
3847 tab_specific_host_permissions_.find(tab_id); 3856 return (it != tab_specific_permissions_.end()) ? it->second : NULL;
3848 return (it != tab_specific_host_permissions_.end()) ? it->second.get() : NULL;
3849 } 3857 }
3850 3858
3851 void Extension::RuntimeData::SetTabSpecificHostPermissions( 3859 void Extension::RuntimeData::UpdateTabSpecificPermissions(
3852 int tab_id, 3860 int tab_id,
3853 const URLPatternSet& hosts) { 3861 const PermissionSet* permissions) {
3854 CHECK_GE(tab_id, 0); 3862 CHECK_GE(tab_id, 0);
3855 tab_specific_host_permissions_[tab_id] = 3863 if (tab_specific_permissions_.count(tab_id)) {
3856 make_linked_ptr(new URLPatternSet(hosts)); 3864 tab_specific_permissions_[tab_id] = PermissionSet::CreateUnion(
3865 tab_specific_permissions_[tab_id],
3866 permissions);
3867 } else {
3868 tab_specific_permissions_[tab_id] = permissions;
3869 }
3857 } 3870 }
3858 3871
3859 void Extension::RuntimeData::ClearTabSpecificHostPermissions(int tab_id) { 3872 void Extension::RuntimeData::ClearTabSpecificPermissions(int tab_id) {
3860 CHECK_GE(tab_id, 0); 3873 CHECK_GE(tab_id, 0);
3861 tab_specific_host_permissions_.erase(tab_id); 3874 tab_specific_permissions_.erase(tab_id);
3862 } 3875 }
3863 3876
3864 UnloadedExtensionInfo::UnloadedExtensionInfo( 3877 UnloadedExtensionInfo::UnloadedExtensionInfo(
3865 const Extension* extension, 3878 const Extension* extension,
3866 extension_misc::UnloadedExtensionReason reason) 3879 extension_misc::UnloadedExtensionReason reason)
3867 : reason(reason), 3880 : reason(reason),
3868 already_disabled(false), 3881 already_disabled(false),
3869 extension(extension) {} 3882 extension(extension) {}
3870 3883
3871 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( 3884 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo(
3872 const Extension* extension, 3885 const Extension* extension,
3873 const PermissionSet* permissions, 3886 const PermissionSet* permissions,
3874 Reason reason) 3887 Reason reason)
3875 : reason(reason), 3888 : reason(reason),
3876 extension(extension), 3889 extension(extension),
3877 permissions(permissions) {} 3890 permissions(permissions) {}
3878 3891
3879 } // namespace extensions 3892 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698