| Index: content/browser/renderer_host/pepper/pepper_file_message_filter.cc
|
| diff --git a/content/browser/renderer_host/pepper/pepper_file_message_filter.cc b/content/browser/renderer_host/pepper/pepper_file_message_filter.cc
|
| deleted file mode 100644
|
| index 428c6edcf8de7f84642166a7fa1ff33bce222af3..0000000000000000000000000000000000000000
|
| --- a/content/browser/renderer_host/pepper/pepper_file_message_filter.cc
|
| +++ /dev/null
|
| @@ -1,367 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/renderer_host/pepper/pepper_file_message_filter.h"
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/file_path.h"
|
| -#include "base/file_util.h"
|
| -#include "base/logging.h"
|
| -#include "base/platform_file.h"
|
| -#include "base/process_util.h"
|
| -#include "base/threading/sequenced_worker_pool.h"
|
| -#include "content/browser/child_process_security_policy_impl.h"
|
| -#include "content/browser/renderer_host/render_process_host_impl.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/common/content_constants.h"
|
| -#include "ipc/ipc_platform_file.h"
|
| -#include "ppapi/proxy/pepper_file_messages.h"
|
| -#include "ppapi/shared_impl/file_path.h"
|
| -
|
| -#if defined(OS_POSIX)
|
| -#include "base/file_descriptor_posix.h"
|
| -#endif
|
| -
|
| -namespace content {
|
| -namespace {
|
| -
|
| -// Used to check if the renderer has permission for the requested operation.
|
| -// TODO(viettrungluu): Verify these. They don't necessarily quite make sense,
|
| -// but it seems to be approximately what the file system code does.
|
| -const int kReadPermissions = base::PLATFORM_FILE_OPEN |
|
| - base::PLATFORM_FILE_READ |
|
| - base::PLATFORM_FILE_EXCLUSIVE_READ;
|
| -const int kWritePermissions = base::PLATFORM_FILE_OPEN |
|
| - base::PLATFORM_FILE_CREATE |
|
| - base::PLATFORM_FILE_CREATE_ALWAYS |
|
| - base::PLATFORM_FILE_OPEN_TRUNCATED |
|
| - base::PLATFORM_FILE_WRITE |
|
| - base::PLATFORM_FILE_EXCLUSIVE_WRITE |
|
| - base::PLATFORM_FILE_WRITE_ATTRIBUTES;
|
| -
|
| -IPC::PlatformFileForTransit PlatformFileToPlatformFileForTransit(
|
| - base::ProcessHandle peer_handle,
|
| - base::PlatformFile file_handle,
|
| - base::PlatformFileError* error) {
|
| - IPC::PlatformFileForTransit file;
|
| -#if defined(OS_WIN)
|
| - // Duplicate the file handle so that the renderer process can access the file.
|
| - if (!DuplicateHandle(GetCurrentProcess(), file_handle,
|
| - peer_handle, &file, 0, false,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - // file_handle is closed whether or not DuplicateHandle succeeds.
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - file = INVALID_HANDLE_VALUE;
|
| - }
|
| -#else
|
| - file = base::FileDescriptor(file_handle, true);
|
| -#endif
|
| - return file;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -PepperFileMessageFilter::PepperFileMessageFilter(int child_id)
|
| - : child_id_(child_id),
|
| - channel_(NULL) {
|
| -}
|
| -
|
| -base::TaskRunner* PepperFileMessageFilter::OverrideTaskRunnerForMessage(
|
| - const IPC::Message& message) {
|
| - // The blocking pool provides a pool of threads to run file
|
| - // operations, instead of a single thread which might require
|
| - // queuing time. Since these messages are synchronous as sent from
|
| - // the plugin, the sending thread cannot send a new message until
|
| - // this one returns, so there is no need to sequence tasks here. If
|
| - // the plugin has multiple threads, it cannot make assumptions about
|
| - // ordering of IPC message sends, so it cannot make assumptions
|
| - // about ordering of operations caused by those IPC messages.
|
| - if (IPC_MESSAGE_CLASS(message) == PepperFileMsgStart)
|
| - return BrowserThread::GetBlockingPool();
|
| - return NULL;
|
| -}
|
| -
|
| -bool PepperFileMessageFilter::OnMessageReceived(const IPC::Message& message,
|
| - bool* message_was_ok) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP_EX(PepperFileMessageFilter, message, *message_was_ok)
|
| - IPC_MESSAGE_HANDLER(PepperFileMsg_OpenFile, OnOpenFile)
|
| - IPC_MESSAGE_HANDLER(PepperFileMsg_RenameFile, OnRenameFile)
|
| - IPC_MESSAGE_HANDLER(PepperFileMsg_DeleteFileOrDir, OnDeleteFileOrDir)
|
| - IPC_MESSAGE_HANDLER(PepperFileMsg_CreateDir, OnCreateDir)
|
| - IPC_MESSAGE_HANDLER(PepperFileMsg_QueryFile, OnQueryFile)
|
| - IPC_MESSAGE_HANDLER(PepperFileMsg_GetDirContents, OnGetDirContents)
|
| - IPC_MESSAGE_HANDLER(PepperFileMsg_CreateTemporaryFile,
|
| - OnCreateTemporaryFile)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP_EX()
|
| - return handled;
|
| -}
|
| -
|
| -void PepperFileMessageFilter::OnDestruct() const {
|
| - BrowserThread::DeleteOnIOThread::Destruct(this);
|
| -}
|
| -
|
| -// static
|
| -FilePath PepperFileMessageFilter::GetDataDirName(const FilePath& profile_path) {
|
| - return profile_path.Append(kPepperDataDirname);
|
| -}
|
| -
|
| -PepperFileMessageFilter::~PepperFileMessageFilter() {
|
| - // This function should be called on the IO thread.
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -}
|
| -
|
| -// Called on the FILE thread:
|
| -void PepperFileMessageFilter::OnOpenFile(
|
| - const ppapi::PepperFilePath& path,
|
| - int flags,
|
| - base::PlatformFileError* error,
|
| - IPC::PlatformFileForTransit* file) {
|
| - FilePath full_path = ValidateAndConvertPepperFilePath(path, flags);
|
| - if (full_path.empty()) {
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - *file = IPC::InvalidPlatformFileForTransit();
|
| - return;
|
| - }
|
| -
|
| - base::PlatformFile file_handle = base::CreatePlatformFile(
|
| - full_path, flags, NULL, error);
|
| -
|
| - if (*error != base::PLATFORM_FILE_OK ||
|
| - file_handle == base::kInvalidPlatformFileValue) {
|
| - *file = IPC::InvalidPlatformFileForTransit();
|
| - return;
|
| - }
|
| -
|
| - // Make sure we didn't try to open a directory: directory fd shouldn't pass
|
| - // to untrusted processes because they open security holes.
|
| - base::PlatformFileInfo info;
|
| - if (!base::GetPlatformFileInfo(file_handle, &info) || info.is_directory) {
|
| - // When in doubt, throw it out.
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - *file = IPC::InvalidPlatformFileForTransit();
|
| - return;
|
| - }
|
| -
|
| - *file = PlatformFileToPlatformFileForTransit(peer_handle(), file_handle,
|
| - error);
|
| -}
|
| -
|
| -void PepperFileMessageFilter::OnRenameFile(
|
| - const ppapi::PepperFilePath& from_path,
|
| - const ppapi::PepperFilePath& to_path,
|
| - base::PlatformFileError* error) {
|
| - FilePath from_full_path = ValidateAndConvertPepperFilePath(from_path,
|
| - kWritePermissions);
|
| - FilePath to_full_path = ValidateAndConvertPepperFilePath(to_path,
|
| - kWritePermissions);
|
| - if (from_full_path.empty() || to_full_path.empty()) {
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - return;
|
| - }
|
| -
|
| - bool result = file_util::Move(from_full_path, to_full_path);
|
| - *error = result ? base::PLATFORM_FILE_OK
|
| - : base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| -}
|
| -
|
| -void PepperFileMessageFilter::OnDeleteFileOrDir(
|
| - const ppapi::PepperFilePath& path,
|
| - bool recursive,
|
| - base::PlatformFileError* error) {
|
| - FilePath full_path = ValidateAndConvertPepperFilePath(path,
|
| - kWritePermissions);
|
| - if (full_path.empty()) {
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - return;
|
| - }
|
| -
|
| - bool result = file_util::Delete(full_path, recursive);
|
| - *error = result ? base::PLATFORM_FILE_OK
|
| - : base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| -}
|
| -
|
| -void PepperFileMessageFilter::OnCreateDir(
|
| - const ppapi::PepperFilePath& path,
|
| - base::PlatformFileError* error) {
|
| - FilePath full_path = ValidateAndConvertPepperFilePath(path,
|
| - kWritePermissions);
|
| - if (full_path.empty()) {
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - return;
|
| - }
|
| -
|
| - bool result = file_util::CreateDirectory(full_path);
|
| - *error = result ? base::PLATFORM_FILE_OK
|
| - : base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| -}
|
| -
|
| -void PepperFileMessageFilter::OnQueryFile(
|
| - const ppapi::PepperFilePath& path,
|
| - base::PlatformFileInfo* info,
|
| - base::PlatformFileError* error) {
|
| - FilePath full_path = ValidateAndConvertPepperFilePath(path, kReadPermissions);
|
| - if (full_path.empty()) {
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - return;
|
| - }
|
| -
|
| - bool result = file_util::GetFileInfo(full_path, info);
|
| - *error = result ? base::PLATFORM_FILE_OK
|
| - : base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| -}
|
| -
|
| -void PepperFileMessageFilter::OnGetDirContents(
|
| - const ppapi::PepperFilePath& path,
|
| - ppapi::DirContents* contents,
|
| - base::PlatformFileError* error) {
|
| - FilePath full_path = ValidateAndConvertPepperFilePath(path, kReadPermissions);
|
| - if (full_path.empty()) {
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - return;
|
| - }
|
| -
|
| - contents->clear();
|
| -
|
| - file_util::FileEnumerator enumerator(full_path, false,
|
| - file_util::FileEnumerator::FILES |
|
| - file_util::FileEnumerator::DIRECTORIES |
|
| - file_util::FileEnumerator::INCLUDE_DOT_DOT);
|
| -
|
| - while (!enumerator.Next().empty()) {
|
| - file_util::FileEnumerator::FindInfo info;
|
| - enumerator.GetFindInfo(&info);
|
| - ppapi::DirEntry entry = {
|
| - file_util::FileEnumerator::GetFilename(info),
|
| - file_util::FileEnumerator::IsDirectory(info)
|
| - };
|
| - contents->push_back(entry);
|
| - }
|
| -
|
| - *error = base::PLATFORM_FILE_OK;
|
| -}
|
| -
|
| -void PepperFileMessageFilter::OnCreateTemporaryFile(
|
| - base::PlatformFileError* error,
|
| - IPC::PlatformFileForTransit* file) {
|
| - *error = base::PLATFORM_FILE_ERROR_FAILED;
|
| - *file = IPC::InvalidPlatformFileForTransit();
|
| -
|
| - ppapi::PepperFilePath dir_path(
|
| - ppapi::PepperFilePath::DOMAIN_MODULE_LOCAL, FilePath());
|
| - FilePath validated_dir_path = ValidateAndConvertPepperFilePath(
|
| - dir_path, kReadPermissions | kWritePermissions);
|
| - if (validated_dir_path.empty() ||
|
| - (!file_util::DirectoryExists(validated_dir_path) &&
|
| - !file_util::CreateDirectory(validated_dir_path))) {
|
| - *error = base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
|
| - return;
|
| - }
|
| -
|
| - FilePath file_path;
|
| - if (!file_util::CreateTemporaryFileInDir(validated_dir_path, &file_path))
|
| - return;
|
| -
|
| - base::PlatformFile file_handle = base::CreatePlatformFile(
|
| - file_path,
|
| - base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_READ |
|
| - base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_TEMPORARY |
|
| - base::PLATFORM_FILE_DELETE_ON_CLOSE,
|
| - NULL, error);
|
| -
|
| - if (*error != base::PLATFORM_FILE_OK) {
|
| - DCHECK_EQ(file_handle, base::kInvalidPlatformFileValue);
|
| - return;
|
| - }
|
| -
|
| - *file = PlatformFileToPlatformFileForTransit(peer_handle(), file_handle,
|
| - error);
|
| -}
|
| -
|
| -FilePath PepperFileMessageFilter::ValidateAndConvertPepperFilePath(
|
| - const ppapi::PepperFilePath& pepper_path, int flags) {
|
| - FilePath file_path; // Empty path returned on error.
|
| - if (pepper_path.domain() == ppapi::PepperFilePath::DOMAIN_ABSOLUTE) {
|
| - if (pepper_path.path().IsAbsolute() &&
|
| - ChildProcessSecurityPolicyImpl::GetInstance()->HasPermissionsForFile(
|
| - child_id(), pepper_path.path(), flags))
|
| - file_path = pepper_path.path();
|
| - }
|
| - return file_path;
|
| -}
|
| -
|
| -PepperTrustedFileMessageFilter::PepperTrustedFileMessageFilter(
|
| - int child_id,
|
| - const std::string& plugin_name,
|
| - const FilePath& profile_data_directory)
|
| - : PepperFileMessageFilter(child_id) {
|
| - plugin_data_directory_ = GetDataDirName(profile_data_directory).Append(
|
| - FilePath::FromUTF8Unsafe(plugin_name));
|
| -}
|
| -
|
| -PepperTrustedFileMessageFilter::~PepperTrustedFileMessageFilter() {
|
| -}
|
| -
|
| -FilePath PepperTrustedFileMessageFilter::ValidateAndConvertPepperFilePath(
|
| - const ppapi::PepperFilePath& pepper_path,
|
| - int flags) {
|
| - FilePath file_path; // Empty path returned on error.
|
| - switch (pepper_path.domain()) {
|
| - case ppapi::PepperFilePath::DOMAIN_ABSOLUTE:
|
| - if (pepper_path.path().IsAbsolute() &&
|
| - ChildProcessSecurityPolicyImpl::GetInstance()->HasPermissionsForFile(
|
| - child_id(), pepper_path.path(), flags))
|
| - file_path = pepper_path.path();
|
| - break;
|
| - case ppapi::PepperFilePath::DOMAIN_MODULE_LOCAL:
|
| - // This filter provides the module name portion of the path to prevent
|
| - // plugins from accessing each other's data.
|
| - if (!pepper_path.path().IsAbsolute() &&
|
| - !pepper_path.path().ReferencesParent())
|
| - file_path = plugin_data_directory_.Append(pepper_path.path());
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - return file_path;
|
| -}
|
| -
|
| -PepperUnsafeFileMessageFilter::PepperUnsafeFileMessageFilter(
|
| - int child_id,
|
| - const FilePath& profile_data_directory)
|
| - : PepperFileMessageFilter(child_id) {
|
| - profile_data_directory_ = GetDataDirName(profile_data_directory);
|
| -}
|
| -
|
| -PepperUnsafeFileMessageFilter::~PepperUnsafeFileMessageFilter() {
|
| -}
|
| -
|
| -FilePath PepperUnsafeFileMessageFilter::ValidateAndConvertPepperFilePath(
|
| - const ppapi::PepperFilePath& pepper_path,
|
| - int flags) {
|
| - FilePath file_path; // Empty path returned on error.
|
| - switch (pepper_path.domain()) {
|
| - case ppapi::PepperFilePath::DOMAIN_ABSOLUTE:
|
| - if (pepper_path.path().IsAbsolute() &&
|
| - ChildProcessSecurityPolicyImpl::GetInstance()->HasPermissionsForFile(
|
| - child_id(), pepper_path.path(), flags))
|
| - file_path = pepper_path.path();
|
| - break;
|
| - case ppapi::PepperFilePath::DOMAIN_MODULE_LOCAL:
|
| - // The message supplies the module portion of the path (so it can't
|
| - // really be trusted).
|
| - if (!pepper_path.path().IsAbsolute() &&
|
| - !pepper_path.path().ReferencesParent())
|
| - file_path = profile_data_directory_.Append(pepper_path.path());
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - return file_path;
|
| -}
|
| -
|
| -} // namespace content
|
|
|