blob: 5d1593dd4b62dffbe01b50d54be162c2f08e9ed0 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_FILEAPI_FILE_SYSTEM_BACKEND_H_
#define CHROME_BROWSER_ASH_FILEAPI_FILE_SYSTEM_BACKEND_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "components/account_id/account_id.h"
#include "components/file_access/scoped_file_access_delegate.h"
#include "storage/browser/file_system/file_system_backend.h"
#include "storage/browser/file_system/task_runner_bound_observer_list.h"
#include "storage/common/file_system/file_system_types.h"
#include "url/origin.h"
class Profile;
namespace storage {
class CopyOrMoveFileValidatorFactory;
class ExternalMountPoints;
class FileSystemURL;
class WatcherManager;
} // namespace storage
namespace ash {
class FileSystemBackendDelegate;
class FileAccessPermissions;
inline constexpr char kSystemMountNameArchive[] = "archive";
inline constexpr char kSystemMountNameRemovable[] = "removable";
// Backend Function called. Used to control access.
enum class BackendFunction {
kCreateFileSystemOperation,
kCreateFileStreamReader,
kCreateFileStreamWriter,
};
// FileSystemBackend is a Chrome OS specific implementation of
// ExternalFileSystemBackend. This class is responsible for a
// number of things, including:
//
// - Add system mount points
// - Grant/revoke/check file access permissions
// - Create FileSystemOperation per file system type
// - Create FileStreamReader/Writer per file system type
//
// Chrome OS specific static mount points:
//
// "archive" is a mount point for an archive file, such as a zip file. This
// mount point exposes contents of an archive file via cros_disks and AVFS
// <http://avf.sourceforge.net/>.
//
// "removable" is a mount point for removable media such as an SD card.
// Insertion and removal of removable media are handled by cros_disks.
//
// These mount points are placed under the "external" namespace, and file
// system URLs for these mount points look like:
//
// filesystem:<origin>/external/<mount_name>/...
//
// Other mounts are also registered by VolumeManager for MyFiles, Drive, VMs
// (crostini, arc, etc), Android Document Providers, fileSystemProviders, etc.
class FileSystemBackend : public storage::FileSystemBackend {
public:
using storage::FileSystemBackend::ResolveURLCallback;
// |system_mount_points| should outlive FileSystemBackend instance.
FileSystemBackend(
Profile* profile,
std::unique_ptr<FileSystemBackendDelegate> file_system_provider_delegate,
std::unique_ptr<FileSystemBackendDelegate> mtp_delegate,
std::unique_ptr<FileSystemBackendDelegate> arc_content_delegate,
std::unique_ptr<FileSystemBackendDelegate>
arc_documents_provider_delegate,
std::unique_ptr<FileSystemBackendDelegate> drivefs_delegate,
std::unique_ptr<FileSystemBackendDelegate> smbfs_delegate,
scoped_refptr<storage::ExternalMountPoints> mount_points,
storage::ExternalMountPoints* system_mount_points);
FileSystemBackend(const FileSystemBackend&) = delete;
FileSystemBackend& operator=(const FileSystemBackend&) = delete;
~FileSystemBackend() override;
// Gets the ChromeOS FileSystemBackend.
static FileSystemBackend* Get(const storage::FileSystemContext& context);
// Adds system mount points, such as "archive", and "removable". This
// function is no-op if these mount points are already present.
void AddSystemMountPoints();
// Returns true if CrosMountpointProvider can handle |url|, i.e. its
// file system type matches with what this provider supports.
// This could be called on any threads.
static bool CanHandleURL(const storage::FileSystemURL& url);
// Returns true if |url| is allowed to be accessed.
// This is supposed to perform ExternalFileSystem-specific security
// checks.
bool IsAccessAllowed(BackendFunction backend_function,
storage::OperationType operation_type,
const storage::FileSystemURL& url) const;
// Returns the list of top level directories that are exposed by this
// provider. This list is used to set appropriate child process file access
// permissions.
std::vector<base::FilePath> GetRootDirectories() const;
// Grants access to |virtual_path| from |origin| URL.
void GrantFileAccessToOrigin(const url::Origin& origin,
const base::FilePath& virtual_path);
// Revokes file access from origin identified with |origin|.
void RevokeAccessForOrigin(const url::Origin& origin);
// Gets virtual path by known filesystem path. Returns false when filesystem
// path is not exposed by this provider.
bool GetVirtualPath(const base::FilePath& file_system_path,
base::FilePath* virtual_path) const;
// Creates an internal File System URL for performing internal operations such
// as confirming if a file or a directory exist before granting the final
// permission to the entry. The path must be an absolute path.
storage::FileSystemURL CreateInternalURL(
storage::FileSystemContext* context,
const base::FilePath& entry_path) const;
// storage::FileSystemBackend overrides.
bool CanHandleType(storage::FileSystemType type) const override;
void Initialize(storage::FileSystemContext* context) override;
void ResolveURL(const storage::FileSystemURL& url,
storage::OpenFileSystemMode mode,
ResolveURLCallback callback) override;
storage::AsyncFileUtil* GetAsyncFileUtil(
storage::FileSystemType type) override;
storage::WatcherManager* GetWatcherManager(
storage::FileSystemType type) override;
storage::CopyOrMoveFileValidatorFactory* GetCopyOrMoveFileValidatorFactory(
storage::FileSystemType type,
base::File::Error* error_code) override;
std::unique_ptr<storage::FileSystemOperation> CreateFileSystemOperation(
storage::OperationType type,
const storage::FileSystemURL& url,
storage::FileSystemContext* context,
base::File::Error* error_code) const override;
bool SupportsStreaming(const storage::FileSystemURL& url) const override;
bool HasInplaceCopyImplementation(
storage::FileSystemType type) const override;
std::unique_ptr<storage::FileStreamReader> CreateFileStreamReader(
const storage::FileSystemURL& path,
int64_t offset,
int64_t max_bytes_to_read,
const base::Time& expected_modification_time,
storage::FileSystemContext* context,
file_access::ScopedFileAccessDelegate::RequestFilesAccessIOCallback
file_access) const override;
std::unique_ptr<storage::FileStreamWriter> CreateFileStreamWriter(
const storage::FileSystemURL& url,
int64_t offset,
storage::FileSystemContext* context) const override;
storage::FileSystemQuotaUtil* GetQuotaUtil() override;
const storage::UpdateObserverList* GetUpdateObservers(
storage::FileSystemType type) const override;
const storage::ChangeObserverList* GetChangeObservers(
storage::FileSystemType type) const override;
const storage::AccessObserverList* GetAccessObservers(
storage::FileSystemType type) const override;
private:
const AccountId account_id_;
std::unique_ptr<FileAccessPermissions> file_access_permissions_;
std::unique_ptr<storage::AsyncFileUtil> local_file_util_;
// The delegate instance for the provided file system related operations.
std::unique_ptr<FileSystemBackendDelegate> file_system_provider_delegate_;
// The delegate instance for the MTP file system related operations.
std::unique_ptr<FileSystemBackendDelegate> mtp_delegate_;
// The delegate instance for the ARC content file system related operations.
std::unique_ptr<FileSystemBackendDelegate> arc_content_delegate_;
// The delegate instance for the ARC documents provider related operations.
std::unique_ptr<FileSystemBackendDelegate> arc_documents_provider_delegate_;
// The delegate instance for the DriveFS file system related operations.
std::unique_ptr<FileSystemBackendDelegate> drivefs_delegate_;
// The delegate instance for the SmbFs file system related operations.
std::unique_ptr<FileSystemBackendDelegate> smbfs_delegate_;
// Mount points specific to the owning context (i.e. per-profile mount
// points).
//
// It is legal to have mount points with the same name as in
// system_mount_points_. Also, mount point paths may overlap with mount point
// paths in system_mount_points_. In both cases mount points in
// |mount_points_| will have a priority.
// E.g. if |mount_points_| map 'foo1' to '/foo/foo1' and
// |file_system_mount_points_| map 'xxx' to '/foo/foo1/xxx', |GetVirtualPaths|
// will resolve '/foo/foo1/xxx/yyy' as 'foo1/xxx/yyy' (i.e. the mapping from
// |mount_points_| will be used).
scoped_refptr<storage::ExternalMountPoints> mount_points_;
// Globally visible mount points. System MountPonts instance should outlive
// all FileSystemBackend instances, so raw pointer is safe.
raw_ptr<storage::ExternalMountPoints> system_mount_points_;
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_FILEAPI_FILE_SYSTEM_BACKEND_H_