summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
authortbarzic@chromium.org <tbarzic@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-10 20:55:32 +0000
committertbarzic@chromium.org <tbarzic@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-10 20:55:32 +0000
commit9ee973fa6345d6ff6142c008898f837ae54ba221 (patch)
tree5bf6ae52203e1b44fb6f2db949f974172f907ede /chrome/browser/extensions
parentd050063fd74e400e00fda3c1c43bff7bbca7ccdc (diff)
downloadchromium_src-9ee973fa6345d6ff6142c008898f837ae54ba221.zip
chromium_src-9ee973fa6345d6ff6142c008898f837ae54ba221.tar.gz
chromium_src-9ee973fa6345d6ff6142c008898f837ae54ba221.tar.bz2
Fix ExecuteTaskFileSystemCallback dispatcher
Make callback dispatcher set permissions for the process of exetension linked with the task that is being executed, not its process. This should also fix FileSystemExtensionApiTest.FileBrowserTest TEST=FileSystemExtensionApiTest.* BUG=103406 Review URL: http://codereview.chromium.org/8508049 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@109502 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r--chrome/browser/extensions/extension_file_browser_private_api.cc47
-rw-r--r--chrome/browser/extensions/extension_local_filesystem_apitest.cc2
2 files changed, 29 insertions, 20 deletions
diff --git a/chrome/browser/extensions/extension_file_browser_private_api.cc b/chrome/browser/extensions/extension_file_browser_private_api.cc
index ee540d0..05f1988 100644
--- a/chrome/browser/extensions/extension_file_browser_private_api.cc
+++ b/chrome/browser/extensions/extension_file_browser_private_api.cc
@@ -634,17 +634,14 @@ class ExecuteTasksFileSystemCallbackDispatcher
const std::string task_id,
const std::vector<GURL>& file_urls)
: function_(function),
- process_id_(0),
+ target_process_id_(0),
profile_(profile),
source_url_(source_url),
extension_(extension),
task_id_(task_id),
origin_file_urls_(file_urls) {
DCHECK(function_);
- if (function_->render_view_host() &&
- function_->render_view_host()->process()) {
- process_id_ = function_->render_view_host()->process()->id();
- }
+ ExtractTargetExtensionAndProcessID();
}
// fileapi::FileSystemCallbackDispatcher overrides.
@@ -711,14 +708,33 @@ class ExecuteTasksFileSystemCallbackDispatcher
}
private:
+ // Extracts target extension's id and process from the tasks's id.
+ void ExtractTargetExtensionAndProcessID() {
+ // Get task details.
+ std::string action_id;
+ if (!CrackTaskIdentifier(task_id_, &target_extension_id_, &action_id))
+ return;
+
+ GURL extension_url =
+ Extension::GetBaseURLFromExtensionId(target_extension_id_);
+ ExtensionProcessManager* manager = profile_->GetExtensionProcessManager();
+
+ SiteInstance* site_instance = manager->GetSiteInstanceForURL(extension_url);
+ if (!site_instance || !site_instance->HasProcess())
+ return;
+ RenderProcessHost* process = site_instance->GetProcess();
+
+ target_process_id_ = process->id();
+ }
+
// Checks legitimacy of file url and grants file RO access permissions from
// handler (target) extension and its renderer process.
bool SetupFileAccessPermissions(const GURL& origin_file_url,
- GURL* target_file_url, FilePath* file_path, bool* is_directory) {
+ GURL* target_file_url, FilePath* file_path, bool* is_directory) {
if (!extension_.get())
return false;
- if (process_id_ == 0)
+ if (target_process_id_ == 0)
return false;
GURL file_origin_url;
@@ -774,21 +790,13 @@ class ExecuteTasksFileSystemCallbackDispatcher
if (file_info.is_symbolic_link)
return false;
- // Get task details.
- std::string target_extension_id;
- std::string action_id;
- if (!CrackTaskIdentifier(task_id_, &target_extension_id,
- &action_id)) {
- return false;
- }
-
// TODO(zelidrag): Add explicit R/W + R/O permissions for non-component
// extensions.
// Grant R/O access permission to non-component extension and R/W to
// component extensions.
ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile(
- process_id_,
+ target_process_id_,
final_file_path,
extension_->location() != Extension::COMPONENT ?
kReadOnlyFilePermissions : kReadWriteFilePermissions);
@@ -796,12 +804,12 @@ class ExecuteTasksFileSystemCallbackDispatcher
// Grant access to this particular file to target extension. This will
// ensure that the target extension can access only this FS entry and
// prevent from traversing FS hierarchy upward.
- external_provider->GrantFileAccessToExtension(target_extension_id,
+ external_provider->GrantFileAccessToExtension(target_extension_id_,
virtual_path);
// Output values.
GURL target_origin_url(Extension::GetBaseURLFromExtensionId(
- target_extension_id));
+ target_extension_id_));
GURL base_url = fileapi::GetFileSystemRootURI(target_origin_url,
fileapi::kFileSystemTypeExternal);
*target_file_url = GURL(base_url.spec() + virtual_path.value());
@@ -812,12 +820,13 @@ class ExecuteTasksFileSystemCallbackDispatcher
}
ExecuteTasksFileBrowserFunction* function_;
- int process_id_;
+ int target_process_id_;
Profile* profile_;
// Extension source URL.
GURL source_url_;
scoped_refptr<const Extension> extension_;
std::string task_id_;
+ std::string target_extension_id_;
std::vector<GURL> origin_file_urls_;
DISALLOW_COPY_AND_ASSIGN(ExecuteTasksFileSystemCallbackDispatcher);
};
diff --git a/chrome/browser/extensions/extension_local_filesystem_apitest.cc b/chrome/browser/extensions/extension_local_filesystem_apitest.cc
index 28bce86..6b7d9c3 100644
--- a/chrome/browser/extensions/extension_local_filesystem_apitest.cc
+++ b/chrome/browser/extensions/extension_local_filesystem_apitest.cc
@@ -38,7 +38,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemExtensionApiTest, LocalFileSystem) {
}
-IN_PROC_BROWSER_TEST_F(FileSystemExtensionApiTest, DISABLED_FileBrowserTest) {
+IN_PROC_BROWSER_TEST_F(FileSystemExtensionApiTest, FileBrowserTest) {
AddTmpMountPoint();
ASSERT_TRUE(RunExtensionTest("filesystem_handler")) << message_;
ASSERT_TRUE(RunComponentExtensionTest("filebrowser_component")) << message_;