blob: 65645e014eff6e375ed097fab7c90b424a689935 [file] [log] [blame]
// 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/file_utilities_message_filter.h"
#include "base/file_util.h"
#include "content/browser/child_process_security_policy_impl.h"
#include "content/common/file_utilities_messages.h"
namespace content {
FileUtilitiesMessageFilter::FileUtilitiesMessageFilter(int process_id)
: process_id_(process_id) {
}
FileUtilitiesMessageFilter::~FileUtilitiesMessageFilter() {
}
void FileUtilitiesMessageFilter::OverrideThreadForMessage(
const IPC::Message& message,
BrowserThread::ID* thread) {
if (IPC_MESSAGE_CLASS(message) == FileUtilitiesMsgStart)
*thread = BrowserThread::FILE;
}
bool FileUtilitiesMessageFilter::OnMessageReceived(const IPC::Message& message,
bool* message_was_ok) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP_EX(FileUtilitiesMessageFilter, message, *message_was_ok)
IPC_MESSAGE_HANDLER(FileUtilitiesMsg_GetFileInfo, OnGetFileInfo)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}
void FileUtilitiesMessageFilter::OnGetFileInfo(
const base::FilePath& path,
base::PlatformFileInfo* result,
base::PlatformFileError* status) {
*result = base::PlatformFileInfo();
*status = base::PLATFORM_FILE_OK;
// Get file metadata only when the child process has been granted
// permission to read the file.
if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile(
process_id_, path)) {
return;
}
if (!file_util::GetFileInfo(path, result))
*status = base::PLATFORM_FILE_ERROR_FAILED;
}
} // namespace content