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