| 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.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 3434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3445 if (CanExecuteScriptEverywhere()) | 3445 if (CanExecuteScriptEverywhere()) |
| 3446 return true; | 3446 return true; |
| 3447 | 3447 |
| 3448 return false; | 3448 return false; |
| 3449 } | 3449 } |
| 3450 | 3450 |
| 3451 // Otherwise, the valid schemes were handled by URLPattern. | 3451 // Otherwise, the valid schemes were handled by URLPattern. |
| 3452 return true; | 3452 return true; |
| 3453 } | 3453 } |
| 3454 | 3454 |
| 3455 bool Extension::HasAPIPermission( | 3455 bool Extension::HasAPIPermission(APIPermission::ID permission) const { |
| 3456 APIPermission::ID permission) const { | |
| 3457 base::AutoLock auto_lock(runtime_data_lock_); | 3456 base::AutoLock auto_lock(runtime_data_lock_); |
| 3458 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); | 3457 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); |
| 3459 } | 3458 } |
| 3460 | 3459 |
| 3461 bool Extension::HasAPIPermission( | 3460 bool Extension::HasAPIPermission(const std::string& function_name) const { |
| 3462 const std::string& function_name) const { | |
| 3463 base::AutoLock auto_lock(runtime_data_lock_); | 3461 base::AutoLock auto_lock(runtime_data_lock_); |
| 3464 return runtime_data_.GetActivePermissions()-> | 3462 return runtime_data_.GetActivePermissions()-> |
| 3465 HasAccessToFunction(function_name); | 3463 HasAccessToFunction(function_name); |
| 3466 } | 3464 } |
| 3467 | 3465 |
| 3466 bool Extension::HasAPIPermissionForTab(int tab_id, |
| 3467 APIPermission::ID permission) const { |
| 3468 base::AutoLock auto_lock(runtime_data_lock_); |
| 3469 if (runtime_data_.GetActivePermissions()->HasAPIPermission(permission)) |
| 3470 return true; |
| 3471 scoped_refptr<const PermissionSet> tab_specific_permissions = |
| 3472 runtime_data_.GetTabSpecificPermissions(tab_id); |
| 3473 return tab_specific_permissions.get() && |
| 3474 tab_specific_permissions->HasAPIPermission(permission); |
| 3475 } |
| 3476 |
| 3468 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { | 3477 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { |
| 3469 base::AutoLock auto_lock(runtime_data_lock_); | 3478 base::AutoLock auto_lock(runtime_data_lock_); |
| 3470 return runtime_data_.GetActivePermissions()->effective_hosts(); | 3479 return runtime_data_.GetActivePermissions()->effective_hosts(); |
| 3471 } | 3480 } |
| 3472 | 3481 |
| 3473 bool Extension::HasHostPermission(const GURL& url) const { | 3482 bool Extension::HasHostPermission(const GURL& url) const { |
| 3474 if (url.SchemeIs(chrome::kChromeUIScheme) && | 3483 if (url.SchemeIs(chrome::kChromeUIScheme) && |
| 3475 url.host() != chrome::kChromeUIFaviconHost && | 3484 url.host() != chrome::kChromeUIFaviconHost && |
| 3476 url.host() != chrome::kChromeUIThumbnailHost && | 3485 url.host() != chrome::kChromeUIThumbnailHost && |
| 3477 location() != Extension::COMPONENT) { | 3486 location() != Extension::COMPONENT) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3555 *error = errors::kCannotScriptGallery; | 3564 *error = errors::kCannotScriptGallery; |
| 3556 return false; | 3565 return false; |
| 3557 } | 3566 } |
| 3558 | 3567 |
| 3559 if (page_url.SchemeIs(chrome::kChromeUIScheme) && | 3568 if (page_url.SchemeIs(chrome::kChromeUIScheme) && |
| 3560 !CanExecuteScriptEverywhere()) | 3569 !CanExecuteScriptEverywhere()) |
| 3561 return false; | 3570 return false; |
| 3562 | 3571 |
| 3563 // If a tab ID is specified, try the tab-specific permissions. | 3572 // If a tab ID is specified, try the tab-specific permissions. |
| 3564 if (tab_id >= 0) { | 3573 if (tab_id >= 0) { |
| 3565 const URLPatternSet* tab_permissions = | 3574 scoped_refptr<const PermissionSet> tab_permissions = |
| 3566 runtime_data_.GetTabSpecificHostPermissions(tab_id); | 3575 runtime_data_.GetTabSpecificPermissions(tab_id); |
| 3567 if (tab_permissions && | 3576 if (tab_permissions.get() && |
| 3568 tab_permissions->MatchesSecurityOrigin(page_url)) { | 3577 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) { |
| 3569 return true; | 3578 return true; |
| 3570 } | 3579 } |
| 3571 } | 3580 } |
| 3572 | 3581 |
| 3573 // If a script is specified, use its matches. | 3582 // If a script is specified, use its matches. |
| 3574 if (script) | 3583 if (script) |
| 3575 return script->MatchesURL(page_url); | 3584 return script->MatchesURL(page_url); |
| 3576 | 3585 |
| 3577 // Otherwise, see if this extension has permission to execute script | 3586 // Otherwise, see if this extension has permission to execute script |
| 3578 // programmatically on pages. | 3587 // programmatically on pages. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3628 } | 3637 } |
| 3629 } | 3638 } |
| 3630 | 3639 |
| 3631 return false; | 3640 return false; |
| 3632 } | 3641 } |
| 3633 | 3642 |
| 3634 bool Extension::CanCaptureVisiblePage(const GURL& page_url, | 3643 bool Extension::CanCaptureVisiblePage(const GURL& page_url, |
| 3635 int tab_id, | 3644 int tab_id, |
| 3636 std::string *error) const { | 3645 std::string *error) const { |
| 3637 if (tab_id >= 0) { | 3646 if (tab_id >= 0) { |
| 3638 const URLPatternSet* tab_permissions = | 3647 scoped_refptr<const PermissionSet> tab_permissions = |
| 3639 GetTabSpecificHostPermissions(tab_id); | 3648 GetTabSpecificPermissions(tab_id); |
| 3640 if (tab_permissions && | 3649 if (tab_permissions.get() && |
| 3641 tab_permissions->MatchesSecurityOrigin(page_url)) { | 3650 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) { |
| 3642 return true; | 3651 return true; |
| 3643 } | 3652 } |
| 3644 } | 3653 } |
| 3645 | 3654 |
| 3646 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) | 3655 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) |
| 3647 return true; | 3656 return true; |
| 3648 | 3657 |
| 3649 if (error) { | 3658 if (error) { |
| 3650 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, | 3659 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, |
| 3651 page_url.spec()); | 3660 page_url.spec()); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3790 | 3799 |
| 3791 bool Extension::HasContentScriptAtURL(const GURL& url) const { | 3800 bool Extension::HasContentScriptAtURL(const GURL& url) const { |
| 3792 for (UserScriptList::const_iterator it = content_scripts_.begin(); | 3801 for (UserScriptList::const_iterator it = content_scripts_.begin(); |
| 3793 it != content_scripts_.end(); ++it) { | 3802 it != content_scripts_.end(); ++it) { |
| 3794 if (it->MatchesURL(url)) | 3803 if (it->MatchesURL(url)) |
| 3795 return true; | 3804 return true; |
| 3796 } | 3805 } |
| 3797 return false; | 3806 return false; |
| 3798 } | 3807 } |
| 3799 | 3808 |
| 3800 const URLPatternSet* Extension::GetTabSpecificHostPermissions( | 3809 scoped_refptr<const PermissionSet> Extension::GetTabSpecificPermissions( |
| 3801 int tab_id) const { | 3810 int tab_id) const { |
| 3802 base::AutoLock auto_lock(runtime_data_lock_); | 3811 base::AutoLock auto_lock(runtime_data_lock_); |
| 3803 return runtime_data_.GetTabSpecificHostPermissions(tab_id); | 3812 return runtime_data_.GetTabSpecificPermissions(tab_id); |
| 3804 } | 3813 } |
| 3805 | 3814 |
| 3806 void Extension::SetTabSpecificHostPermissions( | 3815 void Extension::UpdateTabSpecificPermissions( |
| 3807 int tab_id, | 3816 int tab_id, |
| 3808 const URLPatternSet& permissions) const { | 3817 const PermissionSet* permissions) const { |
| 3809 base::AutoLock auto_lock(runtime_data_lock_); | 3818 base::AutoLock auto_lock(runtime_data_lock_); |
| 3810 runtime_data_.SetTabSpecificHostPermissions(tab_id, permissions); | 3819 runtime_data_.UpdateTabSpecificPermissions(tab_id, permissions); |
| 3811 } | 3820 } |
| 3812 | 3821 |
| 3813 void Extension::ClearTabSpecificHostPermissions(int tab_id) const { | 3822 void Extension::ClearTabSpecificPermissions(int tab_id) const { |
| 3814 base::AutoLock auto_lock(runtime_data_lock_); | 3823 base::AutoLock auto_lock(runtime_data_lock_); |
| 3815 runtime_data_.ClearTabSpecificHostPermissions(tab_id); | 3824 runtime_data_.ClearTabSpecificPermissions(tab_id); |
| 3816 } | 3825 } |
| 3817 | 3826 |
| 3818 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { | 3827 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { |
| 3819 if (!is_platform_app()) | 3828 if (!is_platform_app()) |
| 3820 return true; | 3829 return true; |
| 3821 | 3830 |
| 3822 if (!has_background_page()) { | 3831 if (!has_background_page()) { |
| 3823 *utf8_error = errors::kBackgroundRequiredForPlatformApps; | 3832 *utf8_error = errors::kBackgroundRequiredForPlatformApps; |
| 3824 return false; | 3833 return false; |
| 3825 } | 3834 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3847 scoped_refptr<const PermissionSet> | 3856 scoped_refptr<const PermissionSet> |
| 3848 Extension::RuntimeData::GetActivePermissions() const { | 3857 Extension::RuntimeData::GetActivePermissions() const { |
| 3849 return active_permissions_; | 3858 return active_permissions_; |
| 3850 } | 3859 } |
| 3851 | 3860 |
| 3852 void Extension::RuntimeData::SetActivePermissions( | 3861 void Extension::RuntimeData::SetActivePermissions( |
| 3853 const PermissionSet* active) { | 3862 const PermissionSet* active) { |
| 3854 active_permissions_ = active; | 3863 active_permissions_ = active; |
| 3855 } | 3864 } |
| 3856 | 3865 |
| 3857 const URLPatternSet* | 3866 scoped_refptr<const PermissionSet> |
| 3858 Extension::RuntimeData::GetTabSpecificHostPermissions(int tab_id) const { | 3867 Extension::RuntimeData::GetTabSpecificPermissions(int tab_id) const { |
| 3859 CHECK_GE(tab_id, 0); | 3868 CHECK_GE(tab_id, 0); |
| 3860 TabHostPermissionsMap::const_iterator it = | 3869 TabPermissionsMap::const_iterator it = tab_specific_permissions_.find(tab_id); |
| 3861 tab_specific_host_permissions_.find(tab_id); | 3870 return (it != tab_specific_permissions_.end()) ? it->second : NULL; |
| 3862 return (it != tab_specific_host_permissions_.end()) ? it->second.get() : NULL; | |
| 3863 } | 3871 } |
| 3864 | 3872 |
| 3865 void Extension::RuntimeData::SetTabSpecificHostPermissions( | 3873 void Extension::RuntimeData::UpdateTabSpecificPermissions( |
| 3866 int tab_id, | 3874 int tab_id, |
| 3867 const URLPatternSet& hosts) { | 3875 const PermissionSet* permissions) { |
| 3868 CHECK_GE(tab_id, 0); | 3876 CHECK_GE(tab_id, 0); |
| 3869 tab_specific_host_permissions_[tab_id] = | 3877 if (tab_specific_permissions_.count(tab_id)) { |
| 3870 make_linked_ptr(new URLPatternSet(hosts)); | 3878 tab_specific_permissions_[tab_id] = PermissionSet::CreateUnion( |
| 3879 tab_specific_permissions_[tab_id], |
| 3880 permissions); |
| 3881 } else { |
| 3882 tab_specific_permissions_[tab_id] = permissions; |
| 3883 } |
| 3871 } | 3884 } |
| 3872 | 3885 |
| 3873 void Extension::RuntimeData::ClearTabSpecificHostPermissions(int tab_id) { | 3886 void Extension::RuntimeData::ClearTabSpecificPermissions(int tab_id) { |
| 3874 CHECK_GE(tab_id, 0); | 3887 CHECK_GE(tab_id, 0); |
| 3875 tab_specific_host_permissions_.erase(tab_id); | 3888 tab_specific_permissions_.erase(tab_id); |
| 3876 } | 3889 } |
| 3877 | 3890 |
| 3878 UnloadedExtensionInfo::UnloadedExtensionInfo( | 3891 UnloadedExtensionInfo::UnloadedExtensionInfo( |
| 3879 const Extension* extension, | 3892 const Extension* extension, |
| 3880 extension_misc::UnloadedExtensionReason reason) | 3893 extension_misc::UnloadedExtensionReason reason) |
| 3881 : reason(reason), | 3894 : reason(reason), |
| 3882 already_disabled(false), | 3895 already_disabled(false), |
| 3883 extension(extension) {} | 3896 extension(extension) {} |
| 3884 | 3897 |
| 3885 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3898 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
| 3886 const Extension* extension, | 3899 const Extension* extension, |
| 3887 const PermissionSet* permissions, | 3900 const PermissionSet* permissions, |
| 3888 Reason reason) | 3901 Reason reason) |
| 3889 : reason(reason), | 3902 : reason(reason), |
| 3890 extension(extension), | 3903 extension(extension), |
| 3891 permissions(permissions) {} | 3904 permissions(permissions) {} |
| 3892 | 3905 |
| 3893 } // namespace extensions | 3906 } // namespace extensions |
| OLD | NEW |