• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "content/browser/renderer_host/file_utilities_message_filter.h"
6 
7 #include "base/files/file_util.h"
8 #include "content/browser/child_process_security_policy_impl.h"
9 #include "content/common/file_utilities_messages.h"
10 
11 namespace content {
12 
FileUtilitiesMessageFilter(int process_id)13 FileUtilitiesMessageFilter::FileUtilitiesMessageFilter(int process_id)
14     : BrowserMessageFilter(FileUtilitiesMsgStart),
15       process_id_(process_id) {
16 }
17 
~FileUtilitiesMessageFilter()18 FileUtilitiesMessageFilter::~FileUtilitiesMessageFilter() {
19 }
20 
OverrideThreadForMessage(const IPC::Message & message,BrowserThread::ID * thread)21 void FileUtilitiesMessageFilter::OverrideThreadForMessage(
22     const IPC::Message& message,
23     BrowserThread::ID* thread) {
24   if (IPC_MESSAGE_CLASS(message) == FileUtilitiesMsgStart)
25     *thread = BrowserThread::FILE;
26 }
27 
OnMessageReceived(const IPC::Message & message)28 bool FileUtilitiesMessageFilter::OnMessageReceived(
29     const IPC::Message& message) {
30   bool handled = true;
31   IPC_BEGIN_MESSAGE_MAP(FileUtilitiesMessageFilter, message)
32     IPC_MESSAGE_HANDLER(FileUtilitiesMsg_GetFileInfo, OnGetFileInfo)
33     IPC_MESSAGE_UNHANDLED(handled = false)
34   IPC_END_MESSAGE_MAP()
35   return handled;
36 }
37 
OnGetFileInfo(const base::FilePath & path,base::File::Info * result,base::File::Error * status)38 void FileUtilitiesMessageFilter::OnGetFileInfo(
39     const base::FilePath& path,
40     base::File::Info* result,
41     base::File::Error* status) {
42   *result = base::File::Info();
43   *status = base::File::FILE_OK;
44 
45   // Get file metadata only when the child process has been granted
46   // permission to read the file.
47   if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile(
48       process_id_, path)) {
49     return;
50   }
51 
52   if (!base::GetFileInfo(path, result))
53     *status = base::File::FILE_ERROR_FAILED;
54 }
55 
56 }  // namespace content
57