| // Copyright (c) 2012 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. |
| |
| #ifndef WEBKIT_FILEAPI_SANDBOX_MOUNT_POINT_PROVIDER_H_ |
| #define WEBKIT_FILEAPI_SANDBOX_MOUNT_POINT_PROVIDER_H_ |
| |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/compiler_specific.h" |
| #include "base/file_path.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "googleurl/src/gurl.h" |
| #include "webkit/fileapi/fileapi_export.h" |
| #include "webkit/fileapi/file_system_mount_point_provider.h" |
| #include "webkit/fileapi/file_system_options.h" |
| #include "webkit/fileapi/file_system_quota_util.h" |
| #include "webkit/fileapi/task_runner_bound_observer_list.h" |
| |
| namespace base { |
| class SequencedTaskRunner; |
| } |
| |
| namespace quota { |
| class QuotaManagerProxy; |
| } |
| |
| namespace fileapi { |
| |
| class ObfuscatedFileUtil; |
| class SandboxQuotaObserver; |
| |
| // An interface to construct or crack sandboxed filesystem paths for |
| // TEMPORARY or PERSISTENT filesystems, which are placed under the user's |
| // profile directory in a sandboxed way. |
| // This interface also lets one enumerate and remove storage for the origins |
| // that use the filesystem. |
| class FILEAPI_EXPORT SandboxMountPointProvider |
| : public FileSystemMountPointProvider, |
| public FileSystemQuotaUtil { |
| public: |
| using FileSystemMountPointProvider::ValidateFileSystemCallback; |
| using FileSystemMountPointProvider::DeleteFileSystemCallback; |
| |
| // Origin enumerator interface. |
| // An instance of this interface is assumed to be called on the file thread. |
| class OriginEnumerator { |
| public: |
| virtual ~OriginEnumerator() {} |
| |
| // Returns the next origin. Returns empty if there are no more origins. |
| virtual GURL Next() = 0; |
| |
| // Returns the current origin's information. |
| virtual bool HasFileSystemType(FileSystemType type) const = 0; |
| }; |
| |
| // The legacy [pre-obfuscation] FileSystem directory name, kept around for |
| // migration and migration testing. |
| static const FilePath::CharType kOldFileSystemDirectory[]; |
| // The FileSystem directory name. |
| static const FilePath::CharType kNewFileSystemDirectory[]; |
| // Where we move the old filesystem directory if migration fails. |
| static const FilePath::CharType kRenamedOldFileSystemDirectory[]; |
| |
| static bool CanHandleType(FileSystemType type); |
| |
| // |file_task_runner| is used to validate the root directory and delete the |
| // obfuscated file util. |
| SandboxMountPointProvider( |
| quota::QuotaManagerProxy* quota_manager_proxy, |
| base::SequencedTaskRunner* file_task_runner, |
| const FilePath& profile_path, |
| const FileSystemOptions& file_system_options); |
| virtual ~SandboxMountPointProvider(); |
| |
| // FileSystemMountPointProvider overrides. |
| virtual void ValidateFileSystemRoot( |
| const GURL& origin_url, |
| FileSystemType type, |
| bool create, |
| const ValidateFileSystemCallback& callback) OVERRIDE; |
| virtual FilePath GetFileSystemRootPathOnFileThread( |
| const GURL& origin_url, |
| FileSystemType type, |
| const FilePath& virtual_path, |
| bool create) OVERRIDE; |
| virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE; |
| virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE; |
| virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE; |
| virtual FilePath GetPathForPermissionsCheck(const FilePath& virtual_path) |
| const OVERRIDE; |
| virtual FileSystemOperation* CreateFileSystemOperation( |
| const FileSystemURL& url, |
| FileSystemContext* context, |
| base::PlatformFileError* error_code) const OVERRIDE; |
| virtual webkit_blob::FileStreamReader* CreateFileStreamReader( |
| const FileSystemURL& url, |
| int64 offset, |
| FileSystemContext* context) const OVERRIDE; |
| virtual FileStreamWriter* CreateFileStreamWriter( |
| const FileSystemURL& url, |
| int64 offset, |
| FileSystemContext* context) const OVERRIDE; |
| virtual FileSystemQuotaUtil* GetQuotaUtil() OVERRIDE; |
| virtual void DeleteFileSystem( |
| const GURL& origin_url, |
| FileSystemType type, |
| FileSystemContext* context, |
| const DeleteFileSystemCallback& callback) OVERRIDE; |
| |
| FilePath old_base_path() const; |
| FilePath new_base_path() const; |
| FilePath renamed_old_base_path() const; |
| |
| // Returns an origin enumerator of this provider. |
| // This method can only be called on the file thread. |
| OriginEnumerator* CreateOriginEnumerator() const; |
| |
| // Gets a base directory path of the sandboxed filesystem that is |
| // specified by |origin_url| and |type|. |
| // (The path is similar to the origin's root path but doesn't contain |
| // the 'unique' part.) |
| // Returns an empty path if the given type is invalid. |
| // This method can only be called on the file thread. |
| FilePath GetBaseDirectoryForOriginAndType( |
| const GURL& origin_url, |
| FileSystemType type, |
| bool create) const; |
| |
| // Deletes the data on the origin and reports the amount of deleted data |
| // to the quota manager via |proxy|. |
| base::PlatformFileError DeleteOriginDataOnFileThread( |
| FileSystemContext* context, |
| quota::QuotaManagerProxy* proxy, |
| const GURL& origin_url, |
| FileSystemType type); |
| |
| // FileSystemQuotaUtil overrides. |
| virtual void GetOriginsForTypeOnFileThread( |
| FileSystemType type, |
| std::set<GURL>* origins) OVERRIDE; |
| virtual void GetOriginsForHostOnFileThread( |
| FileSystemType type, |
| const std::string& host, |
| std::set<GURL>* origins) OVERRIDE; |
| virtual int64 GetOriginUsageOnFileThread( |
| FileSystemContext* context, |
| const GURL& origin_url, |
| FileSystemType type) OVERRIDE; |
| |
| virtual void InvalidateUsageCache(const GURL& origin_url, |
| FileSystemType type) OVERRIDE; |
| |
| void CollectOpenFileSystemMetrics(base::PlatformFileError error_code); |
| |
| // Returns update observers for the given type. |
| const UpdateObserverList* GetUpdateObservers(FileSystemType type) const; |
| |
| // Reset all observers. |
| void ResetObservers(); |
| |
| private: |
| friend class SandboxQuotaObserver; |
| |
| // Returns a path to the usage cache file. |
| FilePath GetUsageCachePathForOriginAndType( |
| const GURL& origin_url, |
| FileSystemType type) const; |
| |
| FilePath OldCreateFileSystemRootPath( |
| const GURL& origin_url, FileSystemType type); |
| |
| // Returns true if the given |url|'s scheme is allowed to access |
| // filesystem. |
| bool IsAllowedScheme(const GURL& url) const; |
| |
| friend class LocalFileSystemTestOriginHelper; |
| friend class SandboxMountPointProviderMigrationTest; |
| friend class SandboxMountPointProviderOriginEnumeratorTest; |
| |
| scoped_refptr<base::SequencedTaskRunner> file_task_runner_; |
| |
| const FilePath profile_path_; |
| |
| FileSystemOptions file_system_options_; |
| |
| scoped_ptr<ObfuscatedFileUtil> sandbox_file_util_; |
| |
| scoped_ptr<SandboxQuotaObserver> quota_observer_; |
| |
| // Acccessed only on the file thread. |
| std::set<GURL> visited_origins_; |
| |
| // Observers. |
| UpdateObserverList update_observers_; |
| AccessObserverList access_observers_; |
| |
| base::Time next_release_time_for_open_filesystem_stat_; |
| |
| base::WeakPtrFactory<SandboxMountPointProvider> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SandboxMountPointProvider); |
| }; |
| |
| } // namespace fileapi |
| |
| #endif // WEBKIT_FILEAPI_SANDBOX_MOUNT_POINT_PROVIDER_H_ |