summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/fileapi/file_system_backend.cc
diff options
context:
space:
mode:
authorsatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-09 01:22:32 +0000
committersatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-09 01:22:32 +0000
commitf19bbf6c744effbec923b99f0bf99bc3fc13e3ff (patch)
treeb20155f7dc0dd550c234229f1af615902c0a278e /chrome/browser/chromeos/fileapi/file_system_backend.cc
parent814de9746a16fe9ce661bc140e238643b8e0bdc2 (diff)
downloadchromium_src-f19bbf6c744effbec923b99f0bf99bc3fc13e3ff.zip
chromium_src-f19bbf6c744effbec923b99f0bf99bc3fc13e3ff.tar.gz
chromium_src-f19bbf6c744effbec923b99f0bf99bc3fc13e3ff.tar.bz2
fileapi: Rename FileSystemMountProvider to FileSystemBackend
The old name is a misnomer as this class no longer provides mount points! Per some discussion, FileSystemBackend matches what the class is currently doing and trying to be. BUG=257016 TEST=none TBR=hidehiko@chromium.org, joi@chromium.org, kinuko@chromium.org, vandebo@chromium.org # for one-line #include renames in chrome/browser/browsing_data/browsing_data_file_system_helper.cc chrome/browser/extensions/component_loader.cc chrome/browser/extensions/extension_service.cc Review URL: https://codereview.chromium.org/18344013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@210480 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/fileapi/file_system_backend.cc')
-rw-r--r--chrome/browser/chromeos/fileapi/file_system_backend.cc321
1 files changed, 321 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/fileapi/file_system_backend.cc b/chrome/browser/chromeos/fileapi/file_system_backend.cc
new file mode 100644
index 0000000..148e148
--- /dev/null
+++ b/chrome/browser/chromeos/fileapi/file_system_backend.cc
@@ -0,0 +1,321 @@
+// Copyright 2013 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 "chrome/browser/chromeos/fileapi/file_system_backend.h"
+
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop.h"
+#include "base/path_service.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/synchronization/lock.h"
+#include "chrome/browser/chromeos/fileapi/file_access_permissions.h"
+#include "chrome/browser/chromeos/fileapi/file_system_backend_delegate.h"
+#include "chromeos/dbus/cros_disks_client.h"
+#include "webkit/browser/blob/file_stream_reader.h"
+#include "webkit/browser/fileapi/async_file_util_adapter.h"
+#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
+#include "webkit/browser/fileapi/external_mount_points.h"
+#include "webkit/browser/fileapi/file_system_context.h"
+#include "webkit/browser/fileapi/file_system_file_stream_reader.h"
+#include "webkit/browser/fileapi/file_system_operation_context.h"
+#include "webkit/browser/fileapi/file_system_task_runners.h"
+#include "webkit/browser/fileapi/file_system_url.h"
+#include "webkit/browser/fileapi/isolated_context.h"
+#include "webkit/browser/fileapi/isolated_file_util.h"
+#include "webkit/browser/fileapi/local_file_stream_writer.h"
+#include "webkit/browser/fileapi/local_file_system_operation.h"
+
+namespace {
+
+const char kChromeUIScheme[] = "chrome";
+
+} // namespace
+
+namespace chromeos {
+
+// static
+bool FileSystemBackend::CanHandleURL(const fileapi::FileSystemURL& url) {
+ if (!url.is_valid())
+ return false;
+ return url.type() == fileapi::kFileSystemTypeNativeLocal ||
+ url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal ||
+ url.type() == fileapi::kFileSystemTypeDrive;
+}
+
+FileSystemBackend::FileSystemBackend(
+ FileSystemBackendDelegate* drive_delegate,
+ scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy,
+ scoped_refptr<fileapi::ExternalMountPoints> mount_points,
+ fileapi::ExternalMountPoints* system_mount_points)
+ : special_storage_policy_(special_storage_policy),
+ file_access_permissions_(new FileAccessPermissions()),
+ local_file_util_(new fileapi::AsyncFileUtilAdapter(
+ new fileapi::IsolatedFileUtil())),
+ drive_delegate_(drive_delegate),
+ mount_points_(mount_points),
+ system_mount_points_(system_mount_points) {
+}
+
+FileSystemBackend::~FileSystemBackend() {
+}
+
+void FileSystemBackend::AddSystemMountPoints() {
+ // RegisterFileSystem() is no-op if the mount point with the same name
+ // already exists, hence it's safe to call without checking if a mount
+ // point already exists or not.
+
+ // TODO(satorux): "Downloads" directory should probably be per-profile. For
+ // this to be per-profile, a unique directory path should be chosen per
+ // profile, and the mount point should be added to
+ // mount_points_. crbug.com/247236
+ base::FilePath home_path;
+ if (PathService::Get(base::DIR_HOME, &home_path)) {
+ system_mount_points_->RegisterFileSystem(
+ "Downloads",
+ fileapi::kFileSystemTypeNativeLocal,
+ home_path.AppendASCII("Downloads"));
+ }
+
+ system_mount_points_->RegisterFileSystem(
+ "archive",
+ fileapi::kFileSystemTypeNativeLocal,
+ chromeos::CrosDisksClient::GetArchiveMountPoint());
+ system_mount_points_->RegisterFileSystem(
+ "removable",
+ fileapi::kFileSystemTypeNativeLocal,
+ chromeos::CrosDisksClient::GetRemovableDiskMountPoint());
+ system_mount_points_->RegisterFileSystem(
+ "oem",
+ fileapi::kFileSystemTypeRestrictedNativeLocal,
+ base::FilePath(FILE_PATH_LITERAL("/usr/share/oem")));
+}
+
+bool FileSystemBackend::CanHandleType(fileapi::FileSystemType type) const {
+ switch (type) {
+ case fileapi::kFileSystemTypeExternal:
+ case fileapi::kFileSystemTypeDrive:
+ case fileapi::kFileSystemTypeRestrictedNativeLocal:
+ case fileapi::kFileSystemTypeNativeLocal:
+ case fileapi::kFileSystemTypeNativeForPlatformApp:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void FileSystemBackend::OpenFileSystem(
+ const GURL& origin_url,
+ fileapi::FileSystemType type,
+ fileapi::OpenFileSystemMode mode,
+ const OpenFileSystemCallback& callback) {
+ DCHECK(fileapi::IsolatedContext::IsIsolatedType(type));
+ // Nothing to validate for external filesystem.
+ callback.Run(base::PLATFORM_FILE_OK);
+}
+
+fileapi::FileSystemQuotaUtil* FileSystemBackend::GetQuotaUtil() {
+ // No quota support.
+ return NULL;
+}
+
+bool FileSystemBackend::IsAccessAllowed(
+ const fileapi::FileSystemURL& url) const {
+ if (!url.is_valid())
+ return false;
+
+ // Permit access to mount points from internal WebUI.
+ const GURL& origin_url = url.origin();
+ if (origin_url.SchemeIs(kChromeUIScheme))
+ return true;
+
+ // No extra check is needed for isolated file systems.
+ if (url.mount_type() == fileapi::kFileSystemTypeIsolated)
+ return true;
+
+ if (!CanHandleURL(url))
+ return false;
+
+ std::string extension_id = origin_url.host();
+ // Check first to make sure this extension has fileBrowserHander permissions.
+ if (!special_storage_policy_->IsFileHandler(extension_id))
+ return false;
+
+ return file_access_permissions_->HasAccessPermission(extension_id,
+ url.virtual_path());
+}
+
+void FileSystemBackend::GrantFullAccessToExtension(
+ const std::string& extension_id) {
+ DCHECK(special_storage_policy_->IsFileHandler(extension_id));
+ if (!special_storage_policy_->IsFileHandler(extension_id))
+ return;
+
+ std::vector<fileapi::MountPoints::MountPointInfo> files;
+ mount_points_->AddMountPointInfosTo(&files);
+ system_mount_points_->AddMountPointInfosTo(&files);
+
+ for (size_t i = 0; i < files.size(); ++i) {
+ file_access_permissions_->GrantAccessPermission(
+ extension_id,
+ base::FilePath::FromUTF8Unsafe(files[i].name));
+ }
+}
+
+void FileSystemBackend::GrantFileAccessToExtension(
+ const std::string& extension_id, const base::FilePath& virtual_path) {
+ // All we care about here is access from extensions for now.
+ DCHECK(special_storage_policy_->IsFileHandler(extension_id));
+ if (!special_storage_policy_->IsFileHandler(extension_id))
+ return;
+
+ std::string id;
+ fileapi::FileSystemType type;
+ base::FilePath path;
+ if (!mount_points_->CrackVirtualPath(virtual_path, &id, &type, &path) &&
+ !system_mount_points_->CrackVirtualPath(virtual_path,
+ &id, &type, &path)) {
+ return;
+ }
+
+ if (type == fileapi::kFileSystemTypeRestrictedNativeLocal) {
+ LOG(ERROR) << "Can't grant access for restricted mount point";
+ return;
+ }
+
+ file_access_permissions_->GrantAccessPermission(extension_id, virtual_path);
+}
+
+void FileSystemBackend::RevokeAccessForExtension(
+ const std::string& extension_id) {
+ file_access_permissions_->RevokePermissions(extension_id);
+}
+
+std::vector<base::FilePath> FileSystemBackend::GetRootDirectories() const {
+ std::vector<fileapi::MountPoints::MountPointInfo> mount_points;
+ mount_points_->AddMountPointInfosTo(&mount_points);
+ system_mount_points_->AddMountPointInfosTo(&mount_points);
+
+ std::vector<base::FilePath> root_dirs;
+ for (size_t i = 0; i < mount_points.size(); ++i)
+ root_dirs.push_back(mount_points[i].path);
+ return root_dirs;
+}
+
+fileapi::FileSystemFileUtil* FileSystemBackend::GetFileUtil(
+ fileapi::FileSystemType type) {
+ DCHECK(type == fileapi::kFileSystemTypeNativeLocal ||
+ type == fileapi::kFileSystemTypeRestrictedNativeLocal);
+ return local_file_util_->sync_file_util();
+}
+
+fileapi::AsyncFileUtil* FileSystemBackend::GetAsyncFileUtil(
+ fileapi::FileSystemType type) {
+ if (type == fileapi::kFileSystemTypeDrive)
+ return drive_delegate_->GetAsyncFileUtil(type);
+
+ DCHECK(type == fileapi::kFileSystemTypeNativeLocal ||
+ type == fileapi::kFileSystemTypeRestrictedNativeLocal);
+ return local_file_util_.get();
+}
+
+fileapi::CopyOrMoveFileValidatorFactory*
+FileSystemBackend::GetCopyOrMoveFileValidatorFactory(
+ fileapi::FileSystemType type, base::PlatformFileError* error_code) {
+ DCHECK(error_code);
+ *error_code = base::PLATFORM_FILE_OK;
+ return NULL;
+}
+
+fileapi::FileSystemOperation* FileSystemBackend::CreateFileSystemOperation(
+ const fileapi::FileSystemURL& url,
+ fileapi::FileSystemContext* context,
+ base::PlatformFileError* error_code) const {
+ DCHECK(url.is_valid());
+
+ if (!IsAccessAllowed(url)) {
+ *error_code = base::PLATFORM_FILE_ERROR_SECURITY;
+ return NULL;
+ }
+
+ if (url.type() == fileapi::kFileSystemTypeDrive)
+ return drive_delegate_->CreateFileSystemOperation(url, context, error_code);
+
+ DCHECK(url.type() == fileapi::kFileSystemTypeNativeLocal ||
+ url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal);
+ scoped_ptr<fileapi::FileSystemOperationContext> operation_context(
+ new fileapi::FileSystemOperationContext(context));
+ operation_context->set_root_path(GetFileSystemRootPath(url));
+ return new fileapi::LocalFileSystemOperation(url, context,
+ operation_context.Pass());
+}
+
+scoped_ptr<webkit_blob::FileStreamReader>
+FileSystemBackend::CreateFileStreamReader(
+ const fileapi::FileSystemURL& url,
+ int64 offset,
+ const base::Time& expected_modification_time,
+ fileapi::FileSystemContext* context) const {
+ DCHECK(url.is_valid());
+
+ if (!IsAccessAllowed(url))
+ return scoped_ptr<webkit_blob::FileStreamReader>();
+
+ if (url.type() == fileapi::kFileSystemTypeDrive) {
+ return drive_delegate_->CreateFileStreamReader(
+ url, offset, expected_modification_time, context);
+ }
+
+ return scoped_ptr<webkit_blob::FileStreamReader>(
+ new fileapi::FileSystemFileStreamReader(
+ context, url, offset, expected_modification_time));
+}
+
+scoped_ptr<fileapi::FileStreamWriter>
+FileSystemBackend::CreateFileStreamWriter(
+ const fileapi::FileSystemURL& url,
+ int64 offset,
+ fileapi::FileSystemContext* context) const {
+ DCHECK(url.is_valid());
+
+ if (!IsAccessAllowed(url))
+ return scoped_ptr<fileapi::FileStreamWriter>();
+
+ if (url.type() == fileapi::kFileSystemTypeDrive)
+ return drive_delegate_->CreateFileStreamWriter(url, offset, context);
+
+ if (url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal)
+ return scoped_ptr<fileapi::FileStreamWriter>();
+
+ DCHECK(url.type() == fileapi::kFileSystemTypeNativeLocal);
+ return scoped_ptr<fileapi::FileStreamWriter>(
+ new fileapi::LocalFileStreamWriter(
+ context->task_runners()->file_task_runner(), url.path(), offset));
+}
+
+bool FileSystemBackend::GetVirtualPath(
+ const base::FilePath& filesystem_path,
+ base::FilePath* virtual_path) {
+ return mount_points_->GetVirtualPath(filesystem_path, virtual_path) ||
+ system_mount_points_->GetVirtualPath(filesystem_path, virtual_path);
+}
+
+base::FilePath FileSystemBackend::GetFileSystemRootPath(
+ const fileapi::FileSystemURL& url) const {
+ DCHECK(fileapi::IsolatedContext::IsIsolatedType(url.mount_type()));
+ if (!url.is_valid())
+ return base::FilePath();
+
+ base::FilePath root_path;
+ std::string mount_name = url.filesystem_id();
+ if (!mount_points_->GetRegisteredPath(mount_name, &root_path) &&
+ !system_mount_points_->GetRegisteredPath(mount_name, &root_path)) {
+ return base::FilePath();
+ }
+
+ return root_path.DirName();
+}
+
+} // namespace chromeos