| Index: webkit/fileapi/sandbox_mount_point_provider.cc
|
| diff --git a/webkit/fileapi/sandbox_mount_point_provider.cc b/webkit/fileapi/sandbox_mount_point_provider.cc
|
| index 661d760ffab35a2fcd12623a95da155b664d3c0d..0d31db392627f920035740c9f4f260b8663fb6a2 100644
|
| --- a/webkit/fileapi/sandbox_mount_point_provider.cc
|
| +++ b/webkit/fileapi/sandbox_mount_point_provider.cc
|
| @@ -18,7 +18,7 @@
|
| #include "googleurl/src/gurl.h"
|
| #include "net/base/net_util.h"
|
| #include "webkit/fileapi/file_system_operation_context.h"
|
| -#include "webkit/fileapi/file_system_path_manager.h"
|
| +#include "webkit/fileapi/file_system_options.h"
|
| #include "webkit/fileapi/file_system_types.h"
|
| #include "webkit/fileapi/file_system_usage_cache.h"
|
| #include "webkit/fileapi/file_system_util.h"
|
| @@ -31,10 +31,13 @@ using quota::QuotaManagerProxy;
|
|
|
| namespace {
|
|
|
| -static const FilePath::CharType kOldFileSystemUniqueNamePrefix[] =
|
| +const char kChromeScheme[] = "chrome";
|
| +const char kExtensionScheme[] = "chrome-extension";
|
| +
|
| +const FilePath::CharType kOldFileSystemUniqueNamePrefix[] =
|
| FILE_PATH_LITERAL("chrome-");
|
| -static const int kOldFileSystemUniqueLength = 16;
|
| -static const unsigned kOldFileSystemUniqueDirectoryNameLength =
|
| +const int kOldFileSystemUniqueLength = 16;
|
| +const unsigned kOldFileSystemUniqueDirectoryNameLength =
|
| kOldFileSystemUniqueLength + arraysize(kOldFileSystemUniqueNamePrefix) - 1;
|
|
|
| const char kOpenFileSystem[] = "FileSystem.OpenFileSystem";
|
| @@ -48,24 +51,15 @@ enum FileSystemError {
|
|
|
| // Restricted names.
|
| // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions
|
| -static const char* const kRestrictedNames[] = {
|
| +const char* const kRestrictedNames[] = {
|
| ".", "..",
|
| };
|
|
|
| // Restricted chars.
|
| -static const FilePath::CharType kRestrictedChars[] = {
|
| +const FilePath::CharType kRestrictedChars[] = {
|
| '/', '\\',
|
| };
|
|
|
| -inline std::string FilePathStringToASCII(
|
| - const FilePath::StringType& path_string) {
|
| -#if defined(OS_WIN)
|
| - return WideToASCII(path_string);
|
| -#elif defined(OS_POSIX)
|
| - return path_string;
|
| -#endif
|
| -}
|
| -
|
| FilePath::StringType OldCreateUniqueDirectoryName(const GURL& origin_url) {
|
| // This can be anything but need to be unpredictable.
|
| static const FilePath::CharType letters[] = FILE_PATH_LITERAL(
|
| @@ -136,14 +130,13 @@ class OldSandboxOriginEnumerator
|
| if (current_.empty())
|
| return GURL();
|
| return fileapi::GetOriginURLFromIdentifier(
|
| - FilePathStringToASCII(current_.BaseName().value()));
|
| + current_.BaseName().MaybeAsASCII());
|
| }
|
|
|
| virtual bool HasFileSystemType(fileapi::FileSystemType type) const OVERRIDE {
|
| if (current_.empty())
|
| return false;
|
| - std::string directory =
|
| - fileapi::FileSystemPathManager::GetFileSystemTypeString(type);
|
| + std::string directory = GetFileSystemTypeString(type);
|
| DCHECK(!directory.empty());
|
| return file_util::DirectoryExists(current_.AppendASCII(directory));
|
| }
|
| @@ -165,8 +158,7 @@ FilePath OldGetBaseDirectoryForOrigin(
|
| FilePath OldGetBaseDirectoryForOriginAndType(
|
| const FilePath& old_base_path,
|
| const GURL& origin_url, fileapi::FileSystemType type) {
|
| - std::string type_string =
|
| - fileapi::FileSystemPathManager::GetFileSystemTypeString(type);
|
| + std::string type_string = GetFileSystemTypeString(type);
|
| if (type_string.empty()) {
|
| NOTREACHED();
|
| return FilePath();
|
| @@ -279,34 +271,6 @@ const FilePath::CharType
|
| SandboxMountPointProvider::kRenamedOldFileSystemDirectory[] =
|
| FILE_PATH_LITERAL("FS.old");
|
|
|
| -SandboxMountPointProvider::SandboxMountPointProvider(
|
| - FileSystemPathManager* path_manager,
|
| - scoped_refptr<base::MessageLoopProxy> file_message_loop,
|
| - const FilePath& profile_path)
|
| - : FileSystemQuotaUtil(file_message_loop),
|
| - path_manager_(path_manager),
|
| - file_message_loop_(file_message_loop),
|
| - profile_path_(profile_path),
|
| - sandbox_file_util_(
|
| - new ObfuscatedFileUtil(
|
| - profile_path.Append(kNewFileSystemDirectory),
|
| - QuotaFileUtil::CreateDefault())) {
|
| -}
|
| -
|
| -SandboxMountPointProvider::~SandboxMountPointProvider() {
|
| - if (!file_message_loop_->BelongsToCurrentThread())
|
| - file_message_loop_->ReleaseSoon(FROM_HERE, sandbox_file_util_.release());
|
| -}
|
| -
|
| -bool SandboxMountPointProvider::IsAccessAllowed(const GURL& origin_url,
|
| - FileSystemType type,
|
| - const FilePath& unused) {
|
| - if (type != kFileSystemTypeTemporary && type != kFileSystemTypePersistent)
|
| - return false;
|
| - // We essentially depend on quota to do our access controls.
|
| - return path_manager_->IsAllowedScheme(origin_url);
|
| -}
|
| -
|
| class SandboxMountPointProvider::GetFileSystemRootPathTask
|
| : public base::RefCountedThreadSafe<
|
| SandboxMountPointProvider::GetFileSystemRootPathTask> {
|
| @@ -317,7 +281,7 @@ class SandboxMountPointProvider::GetFileSystemRootPathTask
|
| FileSystemType type,
|
| ObfuscatedFileUtil* file_util,
|
| const FilePath& old_base_path,
|
| - const FileSystemPathManager::GetRootPathCallback& callback)
|
| + const FileSystemMountPointProvider::GetRootPathCallback& callback)
|
| : file_message_loop_(file_message_loop),
|
| origin_message_loop_proxy_(
|
| base::MessageLoopProxy::current()),
|
| @@ -366,8 +330,7 @@ class SandboxMountPointProvider::GetFileSystemRootPathTask
|
|
|
| void DispatchCallback(const FilePath& root_path) {
|
| std::string origin_identifier = GetOriginIdentifierFromURL(origin_url_);
|
| - std::string type_string =
|
| - FileSystemPathManager::GetFileSystemTypeString(type_);
|
| + std::string type_string = GetFileSystemTypeString(type_);
|
| DCHECK(!type_string.empty());
|
| std::string name = origin_identifier + ":" + type_string;
|
|
|
| @@ -384,64 +347,45 @@ class SandboxMountPointProvider::GetFileSystemRootPathTask
|
| FileSystemType type_;
|
| scoped_refptr<ObfuscatedFileUtil> file_util_;
|
| FilePath old_base_path_;
|
| - FileSystemPathManager::GetRootPathCallback callback_;
|
| + FileSystemMountPointProvider::GetRootPathCallback callback_;
|
| };
|
|
|
| -FilePath SandboxMountPointProvider::old_base_path() const {
|
| - return profile_path_.Append(kOldFileSystemDirectory);
|
| -}
|
| -
|
| -FilePath SandboxMountPointProvider::new_base_path() const {
|
| - return profile_path_.Append(kNewFileSystemDirectory);
|
| +SandboxMountPointProvider::SandboxMountPointProvider(
|
| + scoped_refptr<base::MessageLoopProxy> file_message_loop,
|
| + const FilePath& profile_path,
|
| + FileSystemOptions* file_system_options)
|
| + : FileSystemQuotaUtil(file_message_loop),
|
| + file_message_loop_(file_message_loop),
|
| + profile_path_(profile_path),
|
| + file_system_options_(file_system_options),
|
| + sandbox_file_util_(
|
| + new ObfuscatedFileUtil(
|
| + profile_path.Append(kNewFileSystemDirectory),
|
| + QuotaFileUtil::CreateDefault())) {
|
| + DCHECK(file_system_options);
|
| }
|
|
|
| -FilePath SandboxMountPointProvider::renamed_old_base_path() const {
|
| - return profile_path_.Append(kRenamedOldFileSystemDirectory);
|
| +SandboxMountPointProvider::~SandboxMountPointProvider() {
|
| + if (!file_message_loop_->BelongsToCurrentThread())
|
| + file_message_loop_->ReleaseSoon(FROM_HERE, sandbox_file_util_.release());
|
| }
|
|
|
| -bool SandboxMountPointProvider::IsRestrictedFileName(const FilePath& filename)
|
| - const {
|
| - if (filename.value().empty())
|
| +bool SandboxMountPointProvider::IsAccessAllowed(const GURL& origin_url,
|
| + FileSystemType type,
|
| + const FilePath& unused) {
|
| + if (type != kFileSystemTypeTemporary && type != kFileSystemTypePersistent)
|
| return false;
|
| -
|
| - std::string filename_lower = StringToLowerASCII(
|
| - FilePathStringToASCII(filename.value()));
|
| -
|
| - for (size_t i = 0; i < arraysize(kRestrictedNames); ++i) {
|
| - // Exact match.
|
| - if (filename_lower == kRestrictedNames[i])
|
| - return true;
|
| - }
|
| -
|
| - for (size_t i = 0; i < arraysize(kRestrictedChars); ++i) {
|
| - if (filename.value().find(kRestrictedChars[i]) !=
|
| - FilePath::StringType::npos)
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -std::vector<FilePath> SandboxMountPointProvider::GetRootDirectories() const {
|
| - NOTREACHED();
|
| - // TODO(ericu): Implement this method and check for access permissions as
|
| - // fileBrowserPrivate extension API does. We currently have another mechanism,
|
| - // but we should switch over. This may also need to call MigrateIfNeeded().
|
| - return std::vector<FilePath>();
|
| -}
|
| -
|
| -SandboxMountPointProvider::OriginEnumerator*
|
| -SandboxMountPointProvider::CreateOriginEnumerator() const {
|
| - MigrateIfNeeded(sandbox_file_util_, old_base_path());
|
| - return new ObfuscatedOriginEnumerator(sandbox_file_util_.get());
|
| + // We essentially depend on quota to do our access controls, so here
|
| + // we only check if the requested scheme is allowed or not.
|
| + return IsAllowedScheme(origin_url);
|
| }
|
|
|
| void SandboxMountPointProvider::ValidateFileSystemRootAndGetURL(
|
| const GURL& origin_url, fileapi::FileSystemType type, bool create,
|
| - const FileSystemPathManager::GetRootPathCallback& callback) {
|
| + const FileSystemMountPointProvider::GetRootPathCallback& callback) {
|
| FilePath origin_base_path;
|
|
|
| - if (path_manager_->is_incognito()) {
|
| + if (file_system_options_->is_incognito()) {
|
| // TODO(kinuko): return an isolated temporary directory.
|
| callback.Run(false, FilePath(), std::string());
|
| UMA_HISTOGRAM_ENUMERATION(kOpenFileSystem,
|
| @@ -450,7 +394,7 @@ void SandboxMountPointProvider::ValidateFileSystemRootAndGetURL(
|
| return;
|
| }
|
|
|
| - if (!path_manager_->IsAllowedScheme(origin_url)) {
|
| + if (!IsAllowedScheme(origin_url)) {
|
| callback.Run(false, FilePath(), std::string());
|
| UMA_HISTOGRAM_ENUMERATION(kOpenFileSystem,
|
| kInvalidScheme,
|
| @@ -469,11 +413,11 @@ FilePath
|
| SandboxMountPointProvider::ValidateFileSystemRootAndGetPathOnFileThread(
|
| const GURL& origin_url, FileSystemType type, const FilePath& unused,
|
| bool create) {
|
| - if (path_manager_->is_incognito())
|
| + if (file_system_options_->is_incognito())
|
| // TODO(kinuko): return an isolated temporary directory.
|
| return FilePath();
|
|
|
| - if (!path_manager_->IsAllowedScheme(origin_url))
|
| + if (!IsAllowedScheme(origin_url))
|
| return FilePath();
|
|
|
| MigrateIfNeeded(sandbox_file_util_, old_base_path());
|
| @@ -482,6 +426,58 @@ SandboxMountPointProvider::ValidateFileSystemRootAndGetPathOnFileThread(
|
| origin_url, type, create);
|
| }
|
|
|
| +bool SandboxMountPointProvider::IsRestrictedFileName(const FilePath& filename)
|
| + const {
|
| + if (filename.value().empty())
|
| + return false;
|
| +
|
| + std::string filename_lower = StringToLowerASCII(filename.MaybeAsASCII());
|
| +
|
| + for (size_t i = 0; i < arraysize(kRestrictedNames); ++i) {
|
| + // Exact match.
|
| + if (filename_lower == kRestrictedNames[i])
|
| + return true;
|
| + }
|
| +
|
| + for (size_t i = 0; i < arraysize(kRestrictedChars); ++i) {
|
| + if (filename.value().find(kRestrictedChars[i]) !=
|
| + FilePath::StringType::npos)
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +std::vector<FilePath> SandboxMountPointProvider::GetRootDirectories() const {
|
| + NOTREACHED();
|
| + // TODO(ericu): Implement this method and check for access permissions as
|
| + // fileBrowserPrivate extension API does. We currently have another mechanism,
|
| + // but we should switch over. This may also need to call MigrateIfNeeded().
|
| + return std::vector<FilePath>();
|
| +}
|
| +
|
| +FileSystemFileUtil* SandboxMountPointProvider::GetFileUtil() {
|
| + return sandbox_file_util_.get();
|
| +}
|
| +
|
| +FilePath SandboxMountPointProvider::old_base_path() const {
|
| + return profile_path_.Append(kOldFileSystemDirectory);
|
| +}
|
| +
|
| +FilePath SandboxMountPointProvider::new_base_path() const {
|
| + return profile_path_.Append(kNewFileSystemDirectory);
|
| +}
|
| +
|
| +FilePath SandboxMountPointProvider::renamed_old_base_path() const {
|
| + return profile_path_.Append(kRenamedOldFileSystemDirectory);
|
| +}
|
| +
|
| +SandboxMountPointProvider::OriginEnumerator*
|
| +SandboxMountPointProvider::CreateOriginEnumerator() const {
|
| + MigrateIfNeeded(sandbox_file_util_, old_base_path());
|
| + return new ObfuscatedOriginEnumerator(sandbox_file_util_.get());
|
| +}
|
| +
|
| FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType(
|
| const GURL& origin_url, fileapi::FileSystemType type, bool create) const {
|
|
|
| @@ -640,10 +636,6 @@ void SandboxMountPointProvider::InvalidateUsageCache(
|
| FileSystemUsageCache::IncrementDirty(usage_file_path);
|
| }
|
|
|
| -FileSystemFileUtil* SandboxMountPointProvider::GetFileUtil() {
|
| - return sandbox_file_util_.get();
|
| -}
|
| -
|
| FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType(
|
| const GURL& origin_url, fileapi::FileSystemType type) const {
|
| FilePath base_path =
|
| @@ -678,4 +670,13 @@ FilePath SandboxMountPointProvider::OldCreateFileSystemRootPath(
|
| return root;
|
| }
|
|
|
| +bool SandboxMountPointProvider::IsAllowedScheme(const GURL& url) const {
|
| + // Basically we only accept http or https. We allow file:// URLs
|
| + // only if --allow-file-access-from-files flag is given.
|
| + return url.SchemeIs("http") || url.SchemeIs("https") ||
|
| + url.SchemeIs(kExtensionScheme) || url.SchemeIs(kChromeScheme) ||
|
| + (url.SchemeIsFile() &&
|
| + file_system_options_->allow_file_access_from_files());
|
| +}
|
| +
|
| } // namespace fileapi
|
|
|