blob: 3b7f9ca281ac5f59325f2b54617fc5496b983658 [file] [log] [blame]
// 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_