1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/renderer_host/pepper/pepper_external_file_ref_backend.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/files/file_path.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/files/file_util_proxy.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/child_process_security_policy_impl.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/browser_thread.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_errors.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_time.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/host/ppapi_host.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/proxy/ppapi_messages.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/file_type_conversion.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/time_conversion.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPepperExternalFileRefBackend::PepperExternalFileRefBackend(
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::PpapiHost* host,
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int render_process_id,
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const base::FilePath& path)
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : host_(host),
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      path_(path),
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      render_process_id_(render_process_id),
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      weak_factory_(this) {
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  task_runner_ =
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE);
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperExternalFileRefBackend::~PepperExternalFileRefBackend() {}
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperExternalFileRefBackend::MakeDirectory(
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32_t make_directory_flags) {
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This operation isn't supported for external filesystems.
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_ERROR_NOACCESS;
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperExternalFileRefBackend::Touch(
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context,
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_Time last_access_time,
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_Time last_modified_time) {
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  IPC::Message reply_msg = PpapiPluginMsg_FileRef_TouchReply();
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::FileUtilProxy::Touch(
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      task_runner_.get(),
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      path_,
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ppapi::PPTimeToTime(last_access_time),
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ppapi::PPTimeToTime(last_modified_time),
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&PepperExternalFileRefBackend::DidFinish,
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 weak_factory_.GetWeakPtr(),
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 reply_context,
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 reply_msg));
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperExternalFileRefBackend::Delete(
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context) {
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This operation isn't supported for external filesystems.
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_ERROR_NOACCESS;
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperExternalFileRefBackend::Rename(
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context,
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PepperFileRefHost* new_file_ref) {
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This operation isn't supported for external filesystems.
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_ERROR_NOACCESS;
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperExternalFileRefBackend::Query(
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context) {
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool ok = base::FileUtilProxy::GetFileInfo(
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      task_runner_.get(),
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      path_,
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&PepperExternalFileRefBackend::GetMetadataComplete,
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 weak_factory_.GetWeakPtr(),
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 reply_context));
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(ok);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperExternalFileRefBackend::ReadDirectoryEntries(
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext context) {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This operation isn't supported for external filesystems.
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_ERROR_NOACCESS;
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperExternalFileRefBackend::GetAbsolutePath(
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context) {
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  host_->SendReply(
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      reply_context,
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PpapiPluginMsg_FileRef_GetAbsolutePathReply(path_.AsUTF8Unsafe()));
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Use PP_OK_COMPLETIONPENDING instead of PP_OK since we've already sent our
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // reply above.
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemURL PepperExternalFileRefBackend::GetFileSystemURL() const {
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return storage::FileSystemURL();
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::FilePath PepperExternalFileRefBackend::GetExternalFilePath() const {
1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return path_;
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperExternalFileRefBackend::CanRead() const {
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile(
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          render_process_id_, path_)) {
111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_NOACCESS;
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return PP_OK;
114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperExternalFileRefBackend::CanWrite() const {
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Platform files have coarse-grained grants in ChildProcessSecurityPolicy.
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return CanReadWrite();
119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperExternalFileRefBackend::CanCreate() const {
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Platform files have coarse-grained grants in ChildProcessSecurityPolicy.
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return CanReadWrite();
124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperExternalFileRefBackend::CanReadWrite() const {
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanCreateReadWriteFile(
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          render_process_id_, path_)) {
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return PP_ERROR_NOACCESS;
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK;
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PepperExternalFileRefBackend::DidFinish(
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context,
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const IPC::Message& msg,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error error) {
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reply_context.params.set_result(ppapi::FileErrorToPepperError(error));
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_->SendReply(reply_context, msg);
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PepperExternalFileRefBackend::GetMetadataComplete(
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ppapi::host::ReplyMessageContext reply_context,
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::File::Error error,
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::File::Info& file_info) {
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reply_context.params.set_result(ppapi::FileErrorToPepperError(error));
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PP_FileInfo pp_file_info;
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error == base::File::FILE_OK) {
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ppapi::FileInfoToPepperFileInfo(
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        file_info, PP_FILESYSTEMTYPE_EXTERNAL, &pp_file_info);
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    memset(&pp_file_info, 0, sizeof(pp_file_info));
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_->SendReply(reply_context,
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   PpapiPluginMsg_FileRef_QueryReply(pp_file_info));
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
161