Commit 2d174304 authored by mpcomplete@google.com's avatar mpcomplete@google.com

Disallow content scripts from running in a process containing the webstore.

BUG=116128
TBR=asargent@chromium.org, thestig@chromium.org

Review URL: https://codereview.chromium.org/15929004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202676 0039d316-1c4b-4281-b951-d872f2087c98
parent 57052bc3
...@@ -213,7 +213,8 @@ void ChromeContentRendererClient::RenderThreadStarted() { ...@@ -213,7 +213,8 @@ void ChromeContentRendererClient::RenderThreadStarted() {
chrome_observer_.reset(new ChromeRenderProcessObserver(this)); chrome_observer_.reset(new ChromeRenderProcessObserver(this));
extension_dispatcher_.reset(new extensions::Dispatcher()); extension_dispatcher_.reset(new extensions::Dispatcher());
permissions_policy_delegate_.reset( permissions_policy_delegate_.reset(
new extensions::RendererPermissionsPolicyDelegate()); new extensions::RendererPermissionsPolicyDelegate(
extension_dispatcher_.get()));
prescient_networking_dispatcher_.reset(new PrescientNetworkingDispatcher()); prescient_networking_dispatcher_.reset(new PrescientNetworkingDispatcher());
net_predictor_.reset(new RendererNetPredictor()); net_predictor_.reset(new RendererNetPredictor());
spellcheck_.reset(new SpellCheck()); spellcheck_.reset(new SpellCheck());
...@@ -1058,6 +1059,9 @@ bool ChromeContentRendererClient::HandleSetCookieRequest( ...@@ -1058,6 +1059,9 @@ bool ChromeContentRendererClient::HandleSetCookieRequest(
void ChromeContentRendererClient::SetExtensionDispatcher( void ChromeContentRendererClient::SetExtensionDispatcher(
extensions::Dispatcher* extension_dispatcher) { extensions::Dispatcher* extension_dispatcher) {
extension_dispatcher_.reset(extension_dispatcher); extension_dispatcher_.reset(extension_dispatcher);
permissions_policy_delegate_.reset(
new extensions::RendererPermissionsPolicyDelegate(
extension_dispatcher_.get()));
} }
bool ChromeContentRendererClient::CrossesExtensionExtents( bool ChromeContentRendererClient::CrossesExtensionExtents(
......
...@@ -622,10 +622,14 @@ void Dispatcher::OnLoaded( ...@@ -622,10 +622,14 @@ void Dispatcher::OnLoaded(
extension_load_errors_[i->id] = error; extension_load_errors_[i->id] = error;
continue; continue;
} }
extensions_.Insert(extension); OnLoadedInternal(extension);
} }
} }
void Dispatcher::OnLoadedInternal(scoped_refptr<const Extension> extension) {
extensions_.Insert(extension);
}
void Dispatcher::OnUnloaded(const std::string& id) { void Dispatcher::OnUnloaded(const std::string& id) {
extensions_.Remove(id); extensions_.Remove(id);
active_extension_ids_.erase(id); active_extension_ids_.erase(id);
......
...@@ -131,6 +131,8 @@ class Dispatcher : public content::RenderProcessObserver { ...@@ -131,6 +131,8 @@ class Dispatcher : public content::RenderProcessObserver {
private: private:
friend class RenderViewTest; friend class RenderViewTest;
FRIEND_TEST_ALL_PREFIXES(RendererPermissionsPolicyDelegateTest,
CannotScriptWebstore);
typedef void (*BindingInstaller)(ModuleSystem* module_system, typedef void (*BindingInstaller)(ModuleSystem* module_system,
v8::Handle<v8::Object> chrome, v8::Handle<v8::Object> chrome,
v8::Handle<v8::Object> chrome_hidden); v8::Handle<v8::Object> chrome_hidden);
...@@ -155,6 +157,7 @@ class Dispatcher : public content::RenderProcessObserver { ...@@ -155,6 +157,7 @@ class Dispatcher : public content::RenderProcessObserver {
void OnSetFunctionNames(const std::vector<std::string>& names); void OnSetFunctionNames(const std::vector<std::string>& names);
void OnLoaded( void OnLoaded(
const std::vector<ExtensionMsg_Loaded_Params>& loaded_extensions); const std::vector<ExtensionMsg_Loaded_Params>& loaded_extensions);
void OnLoadedInternal(scoped_refptr<const Extension> extension);
void OnUnloaded(const std::string& id); void OnUnloaded(const std::string& id);
void OnSetScriptingWhitelist( void OnSetScriptingWhitelist(
const Extension::ScriptingWhitelist& extension_ids); const Extension::ScriptingWhitelist& extension_ids);
......
...@@ -6,13 +6,16 @@ ...@@ -6,13 +6,16 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/extension_manifest_constants.h" #include "chrome/common/extensions/extension_manifest_constants.h"
#include "chrome/renderer/extensions/dispatcher.h"
namespace extensions { namespace extensions {
namespace errors = extension_manifest_errors; namespace errors = extension_manifest_errors;
RendererPermissionsPolicyDelegate::RendererPermissionsPolicyDelegate() { RendererPermissionsPolicyDelegate::RendererPermissionsPolicyDelegate(
Dispatcher* dispatcher) : dispatcher_(dispatcher) {
PermissionsData::SetPolicyDelegate(this); PermissionsData::SetPolicyDelegate(this);
} }
RendererPermissionsPolicyDelegate::~RendererPermissionsPolicyDelegate() { RendererPermissionsPolicyDelegate::~RendererPermissionsPolicyDelegate() {
...@@ -33,6 +36,12 @@ bool RendererPermissionsPolicyDelegate::CanExecuteScriptOnPage( ...@@ -33,6 +36,12 @@ bool RendererPermissionsPolicyDelegate::CanExecuteScriptOnPage(
return false; return false;
} }
if (dispatcher_->IsExtensionActive(extension_misc::kWebStoreAppId)) {
if (error)
*error = errors::kCannotScriptGallery;
return false;
}
return true; return true;
} }
......
...@@ -9,11 +9,13 @@ ...@@ -9,11 +9,13 @@
namespace extensions { namespace extensions {
class Dispatcher;
// Policy delegate for the renderer process. // Policy delegate for the renderer process.
class RendererPermissionsPolicyDelegate class RendererPermissionsPolicyDelegate
: public PermissionsData::PolicyDelegate { : public PermissionsData::PolicyDelegate {
public: public:
RendererPermissionsPolicyDelegate(); explicit RendererPermissionsPolicyDelegate(Dispatcher* dispatcher);
virtual ~RendererPermissionsPolicyDelegate(); virtual ~RendererPermissionsPolicyDelegate();
virtual bool CanExecuteScriptOnPage(const Extension* extension, virtual bool CanExecuteScriptOnPage(const Extension* extension,
...@@ -24,6 +26,9 @@ class RendererPermissionsPolicyDelegate ...@@ -24,6 +26,9 @@ class RendererPermissionsPolicyDelegate
int process_id, int process_id,
std::string* error) OVERRIDE; std::string* error) OVERRIDE;
private:
Dispatcher* dispatcher_;
DISALLOW_COPY_AND_ASSIGN(RendererPermissionsPolicyDelegate); DISALLOW_COPY_AND_ASSIGN(RendererPermissionsPolicyDelegate);
}; };
......
...@@ -6,13 +6,12 @@ ...@@ -6,13 +6,12 @@
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_builder.h" #include "chrome/common/extensions/extension_builder.h"
#include "chrome/common/extensions/extension_messages.h"
#include "chrome/common/extensions/permissions/permissions_data.h" #include "chrome/common/extensions/permissions/permissions_data.h"
#include "chrome/renderer/extensions/dispatcher.h"
#include "chrome/renderer/extensions/renderer_permissions_policy_delegate.h" #include "chrome/renderer/extensions/renderer_permissions_policy_delegate.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "content/public/test/mock_render_process_host.h" #include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_browser_thread.h" #include "content/public/test/mock_render_thread.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace extensions { namespace extensions {
...@@ -20,14 +19,20 @@ namespace extensions { ...@@ -20,14 +19,20 @@ namespace extensions {
namespace { namespace {
class RendererPermissionsPolicyDelegateTest : public testing::Test { class RendererPermissionsPolicyDelegateTest : public testing::Test {
public: public:
RendererPermissionsPolicyDelegateTest() { RendererPermissionsPolicyDelegateTest() {
} }
virtual void SetUp() { virtual void SetUp() {
policy_delegate_.reset(new RendererPermissionsPolicyDelegate()); testing::Test::SetUp();
render_thread_.reset(new content::MockRenderThread());
extension_dispatcher_.reset(new Dispatcher());
policy_delegate_.reset(
new RendererPermissionsPolicyDelegate(extension_dispatcher_.get()));
} }
protected: protected:
scoped_ptr<Dispatcher> extension_dispatcher_;
scoped_ptr<RendererPermissionsPolicyDelegate> policy_delegate_; scoped_ptr<RendererPermissionsPolicyDelegate> policy_delegate_;
scoped_ptr<content::MockRenderThread> render_thread_;
}; };
scoped_refptr<const Extension> CreateTestExtension(const std::string& id) { scoped_refptr<const Extension> CreateTestExtension(const std::string& id) {
...@@ -45,7 +50,7 @@ scoped_refptr<const Extension> CreateTestExtension(const std::string& id) { ...@@ -45,7 +50,7 @@ scoped_refptr<const Extension> CreateTestExtension(const std::string& id) {
// Tests that CanExecuteScriptOnPage returns false for the signin process, // Tests that CanExecuteScriptOnPage returns false for the signin process,
// all else being equal. // all else being equal.
TEST_F(RendererPermissionsPolicyDelegateTest, CanExecuteScriptOnPage) { TEST_F(RendererPermissionsPolicyDelegateTest, CannotScriptSigninProcess) {
GURL kSigninUrl( GURL kSigninUrl(
"https://accounts.google.com/ServiceLogin?service=chromiumsync"); "https://accounts.google.com/ServiceLogin?service=chromiumsync");
scoped_refptr<const Extension> extension(CreateTestExtension("a")); scoped_refptr<const Extension> extension(CreateTestExtension("a"));
...@@ -70,4 +75,34 @@ TEST_F(RendererPermissionsPolicyDelegateTest, CanExecuteScriptOnPage) { ...@@ -70,4 +75,34 @@ TEST_F(RendererPermissionsPolicyDelegateTest, CanExecuteScriptOnPage) {
&error)) << error; &error)) << error;
} }
// Tests that CanExecuteScriptOnPage returns false for the any process
// which hosts the webstore.
TEST_F(RendererPermissionsPolicyDelegateTest, CannotScriptWebstore) {
GURL kAnyUrl("http://example.com/");
scoped_refptr<const Extension> extension(CreateTestExtension("a"));
std::string error;
EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage(extension,
kAnyUrl,
kAnyUrl,
-1,
NULL,
-1,
&error)) << error;
// Pretend we are in the webstore process. We should not be able to execute
// script.
scoped_refptr<const Extension> webstore_extension(
CreateTestExtension(extension_misc::kWebStoreAppId));
extension_dispatcher_->OnLoadedInternal(webstore_extension);
extension_dispatcher_->OnActivateExtension(extension_misc::kWebStoreAppId);
EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage(extension,
kAnyUrl,
kAnyUrl,
-1,
NULL,
-1,
&error)) << error;
}
} // namespace extensions } // namespace extensions
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment