Commit b40ffe72 authored by kinuko@chromium.org's avatar kinuko@chromium.org

Cleanup file permission check code in FileAPIMessageFilter

- Move detailed permission check code into each MountPointProvider
- Add common enum for fileapi permission policy (webkit/fileapi/file_permission_policy.{h,cc})

BUG=none, cleanup only
TEST=content_browsertests:FileSystemLayoutTest.*,browser_tests:FileBrowser*)

Review URL: https://codereview.chromium.org/11804005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@176014 0039d316-1c4b-4281-b951-d872f2087c98
parent 3157a9fd
...@@ -235,9 +235,14 @@ fileapi::FileSystemFileUtil* CrosMountPointProvider::GetFileUtil( ...@@ -235,9 +235,14 @@ fileapi::FileSystemFileUtil* CrosMountPointProvider::GetFileUtil(
return local_file_util_.get(); return local_file_util_.get();
} }
FilePath CrosMountPointProvider::GetPathForPermissionsCheck( fileapi::FilePermissionPolicy CrosMountPointProvider::GetPermissionPolicy(
const FilePath& virtual_path) const { const fileapi::FileSystemURL& url, int permissions) const {
return virtual_path; if (url.mount_type() == fileapi::kFileSystemTypeIsolated) {
// Permissions in isolated filesystems should be examined with
// FileSystem permission.
return fileapi::FILE_PERMISSION_USE_FILESYSTEM_PERMISSION;
}
return fileapi::FILE_PERMISSION_USE_FILE_PERMISSION;
} }
fileapi::FileSystemOperation* CrosMountPointProvider::CreateFileSystemOperation( fileapi::FileSystemOperation* CrosMountPointProvider::CreateFileSystemOperation(
......
...@@ -57,8 +57,9 @@ class WEBKIT_STORAGE_EXPORT CrosMountPointProvider ...@@ -57,8 +57,9 @@ class WEBKIT_STORAGE_EXPORT CrosMountPointProvider
virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE; virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE;
virtual fileapi::FileSystemFileUtil* GetFileUtil( virtual fileapi::FileSystemFileUtil* GetFileUtil(
fileapi::FileSystemType type) OVERRIDE; fileapi::FileSystemType type) OVERRIDE;
virtual FilePath GetPathForPermissionsCheck(const FilePath& virtual_path) virtual fileapi::FilePermissionPolicy GetPermissionPolicy(
const OVERRIDE; const fileapi::FileSystemURL& url,
int permissions) const OVERRIDE;
virtual fileapi::FileSystemOperation* CreateFileSystemOperation( virtual fileapi::FileSystemOperation* CreateFileSystemOperation(
const fileapi::FileSystemURL& url, const fileapi::FileSystemURL& url,
fileapi::FileSystemContext* context, fileapi::FileSystemContext* context,
......
// Copyright (c) 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 "webkit/fileapi/file_permission_policy.h"
#include "base/platform_file.h"
namespace fileapi {
const int kReadFilePermissions = base::PLATFORM_FILE_OPEN |
base::PLATFORM_FILE_READ |
base::PLATFORM_FILE_EXCLUSIVE_READ |
base::PLATFORM_FILE_ASYNC;
const int kWriteFilePermissions = base::PLATFORM_FILE_OPEN |
base::PLATFORM_FILE_WRITE |
base::PLATFORM_FILE_EXCLUSIVE_WRITE |
base::PLATFORM_FILE_ASYNC |
base::PLATFORM_FILE_WRITE_ATTRIBUTES;
const int kCreateFilePermissions = base::PLATFORM_FILE_CREATE;
const int kOpenFilePermissions = base::PLATFORM_FILE_CREATE |
base::PLATFORM_FILE_OPEN_ALWAYS |
base::PLATFORM_FILE_CREATE_ALWAYS |
base::PLATFORM_FILE_OPEN_TRUNCATED |
base::PLATFORM_FILE_WRITE |
base::PLATFORM_FILE_EXCLUSIVE_WRITE |
base::PLATFORM_FILE_DELETE_ON_CLOSE |
base::PLATFORM_FILE_WRITE_ATTRIBUTES;
} // namespace fileapi
// Copyright (c) 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.
#ifndef WEBKIT_FILEAPI_FILE_PERMISSION_POLICY_H_
#define WEBKIT_FILEAPI_FILE_PERMISSION_POLICY_H_
#include "webkit/storage/webkit_storage_export.h"
namespace fileapi {
WEBKIT_STORAGE_EXPORT extern const int kReadFilePermissions;
WEBKIT_STORAGE_EXPORT extern const int kWriteFilePermissions;
WEBKIT_STORAGE_EXPORT extern const int kCreateFilePermissions;
WEBKIT_STORAGE_EXPORT extern const int kOpenFilePermissions;
enum FilePermissionPolicy {
// Any access should be always denied.
FILE_PERMISSION_ALWAYS_DENY,
// Any access should be always allowed. (This should be used only for
// access to sandbox directories.)
FILE_PERMISSION_ALWAYS_ALLOW,
// Access should be examined by per-file permission policy.
FILE_PERMISSION_USE_FILE_PERMISSION,
// Access should be examined by per-filesystem permission policy.
FILE_PERMISSION_USE_FILESYSTEM_PERMISSION,
};
} // namespace fileapi
#endif // WEBKIT_FILEAPI_FILE_PERMISSION_POLICY_H_
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/file_path.h" #include "base/file_path.h"
#include "base/platform_file.h" #include "base/platform_file.h"
#include "webkit/fileapi/file_permission_policy.h"
#include "webkit/fileapi/file_system_types.h" #include "webkit/fileapi/file_system_types.h"
#include "webkit/storage/webkit_storage_export.h" #include "webkit/storage/webkit_storage_export.h"
...@@ -68,10 +69,10 @@ class WEBKIT_STORAGE_EXPORT FileSystemMountPointProvider { ...@@ -68,10 +69,10 @@ class WEBKIT_STORAGE_EXPORT FileSystemMountPointProvider {
// Returns the specialized FileSystemFileUtil for this mount point. // Returns the specialized FileSystemFileUtil for this mount point.
virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) = 0; virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) = 0;
// Returns file path we should use to check access permissions for // Returns file permission policy we should apply for the given |url|.
// |virtual_path|. virtual FilePermissionPolicy GetPermissionPolicy(
virtual FilePath GetPathForPermissionsCheck(const FilePath& virtual_path) const FileSystemURL& url,
const = 0; int permissions) const = 0;
// Returns a new instance of the specialized FileSystemOperation for this // Returns a new instance of the specialized FileSystemOperation for this
// mount point based on the given triplet of |origin_url|, |file_system_type| // mount point based on the given triplet of |origin_url|, |file_system_type|
......
...@@ -100,10 +100,16 @@ FileSystemFileUtil* IsolatedMountPointProvider::GetFileUtil( ...@@ -100,10 +100,16 @@ FileSystemFileUtil* IsolatedMountPointProvider::GetFileUtil(
return NULL; return NULL;
} }
FilePath IsolatedMountPointProvider::GetPathForPermissionsCheck( FilePermissionPolicy IsolatedMountPointProvider::GetPermissionPolicy(
const FilePath& virtual_path) const { const FileSystemURL& url, int permissions) const {
// For isolated filesystems we only check per-filesystem permissions. if (url.type() == kFileSystemTypeDragged && url.path().empty()) {
return FilePath(); // The root directory of the dragged filesystem must be always read-only.
if (permissions != kReadFilePermissions)
return FILE_PERMISSION_ALWAYS_DENY;
}
// Access to isolated file systems should be checked using per-filesystem
// access permission.
return FILE_PERMISSION_USE_FILESYSTEM_PERMISSION;
} }
FileSystemOperation* IsolatedMountPointProvider::CreateFileSystemOperation( FileSystemOperation* IsolatedMountPointProvider::CreateFileSystemOperation(
......
...@@ -38,8 +38,9 @@ class IsolatedMountPointProvider : public FileSystemMountPointProvider { ...@@ -38,8 +38,9 @@ class IsolatedMountPointProvider : public FileSystemMountPointProvider {
virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE; virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE;
virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE; virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE;
virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE; virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE;
virtual FilePath GetPathForPermissionsCheck(const FilePath& virtual_path) virtual FilePermissionPolicy GetPermissionPolicy(
const OVERRIDE; const FileSystemURL& url,
int permissions) const OVERRIDE;
virtual FileSystemOperation* CreateFileSystemOperation( virtual FileSystemOperation* CreateFileSystemOperation(
const FileSystemURL& url, const FileSystemURL& url,
FileSystemContext* context, FileSystemContext* context,
......
...@@ -255,11 +255,13 @@ FileSystemFileUtil* SandboxMountPointProvider::GetFileUtil( ...@@ -255,11 +255,13 @@ FileSystemFileUtil* SandboxMountPointProvider::GetFileUtil(
return sandbox_file_util_.get(); return sandbox_file_util_.get();
} }
FilePath SandboxMountPointProvider::GetPathForPermissionsCheck( FilePermissionPolicy SandboxMountPointProvider::GetPermissionPolicy(
const FilePath& virtual_path) const { const FileSystemURL& url, int permissions) const {
// Sandbox provider shouldn't directly grant permissions for its // Access to the sandbox directory (and only to the directory) should be
// data directory. // always allowed.
return FilePath(); CHECK(CanHandleType(url.type()));
CHECK(!url.path().ReferencesParent());
return FILE_PERMISSION_ALWAYS_ALLOW;
} }
FileSystemOperation* SandboxMountPointProvider::CreateFileSystemOperation( FileSystemOperation* SandboxMountPointProvider::CreateFileSystemOperation(
......
...@@ -83,8 +83,9 @@ class WEBKIT_STORAGE_EXPORT SandboxMountPointProvider ...@@ -83,8 +83,9 @@ class WEBKIT_STORAGE_EXPORT SandboxMountPointProvider
virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE; virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE;
virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE; virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE;
virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE; virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE;
virtual FilePath GetPathForPermissionsCheck(const FilePath& virtual_path) virtual FilePermissionPolicy GetPermissionPolicy(
const OVERRIDE; const FileSystemURL& url,
int permissions) const OVERRIDE;
virtual FileSystemOperation* CreateFileSystemOperation( virtual FileSystemOperation* CreateFileSystemOperation(
const FileSystemURL& url, const FileSystemURL& url,
FileSystemContext* context, FileSystemContext* context,
......
...@@ -114,9 +114,9 @@ FileSystemFileUtil* TestMountPointProvider::GetFileUtil(FileSystemType type) { ...@@ -114,9 +114,9 @@ FileSystemFileUtil* TestMountPointProvider::GetFileUtil(FileSystemType type) {
return local_file_util_.get(); return local_file_util_.get();
} }
FilePath TestMountPointProvider::GetPathForPermissionsCheck( FilePermissionPolicy TestMountPointProvider::GetPermissionPolicy(
const FilePath& virtual_path) const { const FileSystemURL& url, int permissions) const {
return base_path_.Append(virtual_path); return FILE_PERMISSION_ALWAYS_DENY;
} }
FileSystemOperation* TestMountPointProvider::CreateFileSystemOperation( FileSystemOperation* TestMountPointProvider::CreateFileSystemOperation(
......
...@@ -44,8 +44,9 @@ class WEBKIT_STORAGE_EXPORT_PRIVATE TestMountPointProvider ...@@ -44,8 +44,9 @@ class WEBKIT_STORAGE_EXPORT_PRIVATE TestMountPointProvider
virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE; virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE;
virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE; virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE;
virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE; virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE;
virtual FilePath GetPathForPermissionsCheck(const FilePath& virtual_path) virtual FilePermissionPolicy GetPermissionPolicy(
const OVERRIDE; const FileSystemURL& url,
int permissions) const OVERRIDE;
virtual FileSystemOperation* CreateFileSystemOperation( virtual FileSystemOperation* CreateFileSystemOperation(
const FileSystemURL& url, const FileSystemURL& url,
FileSystemContext* context, FileSystemContext* context,
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
'variables': { 'variables': {
'webkit_fileapi_sources': [ 'webkit_fileapi_sources': [
'../fileapi/file_observers.h', '../fileapi/file_observers.h',
'../fileapi/file_permission_policy.cc',
'../fileapi/file_permission_policy.h',
'../fileapi/file_stream_writer.h', '../fileapi/file_stream_writer.h',
'../fileapi/file_system_callback_dispatcher.cc', '../fileapi/file_system_callback_dispatcher.cc',
'../fileapi/file_system_callback_dispatcher.h', '../fileapi/file_system_callback_dispatcher.h',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment