| Index: webkit/chromeos/fileapi/cros_mount_point_provider.cc
|
| ===================================================================
|
| --- webkit/chromeos/fileapi/cros_mount_point_provider.cc (revision 81835)
|
| +++ webkit/chromeos/fileapi/cros_mount_point_provider.cc (working copy)
|
| @@ -14,14 +14,13 @@
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystem.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
|
| +#include "webkit/chromeos/fileapi/file_access_permissions.h"
|
| #include "webkit/fileapi/file_system_path_manager.h"
|
| +#include "webkit/fileapi/file_system_util.h"
|
| #include "webkit/glue/webkit_glue.h"
|
|
|
| namespace chromeos {
|
|
|
| -const char CrosMountPointProvider::kLocalName[] = "Local";
|
| -const char CrosMountPointProvider::kLocalDirName[] = "/local/";
|
| -
|
| typedef struct {
|
| const char* local_root_path;
|
| const char* web_root_path;
|
| @@ -36,28 +35,12 @@
|
|
|
| CrosMountPointProvider::CrosMountPointProvider(
|
| scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy)
|
| - : local_dir_name_(kLocalName),
|
| - special_storage_policy_(special_storage_policy) {
|
| -
|
| - // TODO(zelidrag): There's got to be a better way to generate UUID.
|
| - srand(time(NULL));
|
| - std::string virtual_root;
|
| - virtual_root.append(base::StringPrintf("%hx%hx-%hx-%hx-%hx-%hx%hx%hx",
|
| - static_cast<unsigned short>(rand()), static_cast<unsigned short>(rand()),
|
| - static_cast<unsigned short>(rand()),
|
| - static_cast<unsigned short>(rand()),
|
| - static_cast<unsigned short>(rand()),
|
| - static_cast<unsigned short>(rand()), static_cast<unsigned short>(rand()),
|
| - static_cast<unsigned short>(rand())));
|
| -
|
| - // Create virtual root node.
|
| - virtual_root_path_ = FilePath(virtual_root);
|
| - base_path_ = virtual_root_path_.Append(local_dir_name_);
|
| -
|
| + : special_storage_policy_(special_storage_policy),
|
| + file_access_permissions_(new FileAccessPermissions()) {
|
| for (size_t i = 0; i < arraysize(fixed_exposed_paths); i++) {
|
| - mount_point_map_.insert(std::pair<std::string, std::string>(
|
| + mount_point_map_.insert(std::pair<std::string, FilePath>(
|
| std::string(fixed_exposed_paths[i].web_root_path),
|
| - std::string(fixed_exposed_paths[i].local_root_path)));
|
| + FilePath(std::string(fixed_exposed_paths[i].local_root_path))));
|
| }
|
| }
|
|
|
| @@ -77,13 +60,13 @@
|
| fileapi::FileSystemType type,
|
| bool create,
|
| fileapi::FileSystemPathManager::GetRootPathCallback* callback_ptr) {
|
| - DCHECK(type == fileapi::kFileSystemTypeLocal);
|
| + DCHECK(type == fileapi::kFileSystemTypeExternal);
|
|
|
| std::string name(GetOriginIdentifierFromURL(origin_url));
|
| name += ':';
|
| - name += CrosMountPointProvider::kLocalName;
|
| + name += fileapi::kExternalName;
|
|
|
| - FilePath root_path = FilePath(CrosMountPointProvider::kLocalDirName);
|
| + FilePath root_path = FilePath(fileapi::kExternalDir);
|
| callback_ptr->Run(!root_path.empty(), root_path, name);
|
| }
|
|
|
| @@ -94,7 +77,7 @@
|
| fileapi::FileSystemType type,
|
| const FilePath& virtual_path,
|
| bool create) {
|
| - DCHECK(type == fileapi::kFileSystemTypeLocal);
|
| + DCHECK(type == fileapi::kFileSystemTypeExternal);
|
|
|
| std::vector<FilePath::StringType> components;
|
| virtual_path.GetComponents(&components);
|
| @@ -108,7 +91,7 @@
|
| return FilePath();
|
| }
|
|
|
| - return FilePath(iter->second);
|
| + return iter->second;
|
| }
|
|
|
| // TODO(zelidrag): Share this code with SandboxMountPointProvider impl.
|
| @@ -116,9 +99,54 @@
|
| return false;
|
| }
|
|
|
| -bool CrosMountPointProvider::IsAccessAllowed(const GURL& origin_url) {
|
| - return special_storage_policy_->IsLocalFileSystemAccessAllowed(origin_url);
|
| +bool CrosMountPointProvider::IsAccessAllowed(const GURL& origin_url,
|
| + fileapi::FileSystemType type,
|
| + const FilePath& virtual_path) {
|
| + if (type != fileapi::kFileSystemTypeExternal)
|
| + return false;
|
| + std::string extension_id = origin_url.host();
|
| + // Check first to make sure this extension has fileBrowserHander permissions.
|
| + if (!special_storage_policy_->IsFileHandler(extension_id))
|
| + return false;
|
| + return file_access_permissions_->HasAccessPermission(extension_id,
|
| + virtual_path);
|
| }
|
|
|
| +void CrosMountPointProvider::GrantFullAccessToExtension(
|
| + const std::string& extension_id) {
|
| + DCHECK(special_storage_policy_->IsFileHandler(extension_id));
|
| + if (!special_storage_policy_->IsFileHandler(extension_id))
|
| + return;
|
| + for (MountPointMap::const_iterator iter = mount_point_map_.begin();
|
| + iter != mount_point_map_.end();
|
| + ++iter) {
|
| + GrantFileAccessToExtension(extension_id, FilePath(iter->first));
|
| + }
|
| +}
|
| +
|
| +void CrosMountPointProvider::GrantFileAccessToExtension(
|
| + const std::string& extension_id, const FilePath& virtual_path) {
|
| + // All we care about here is access from extensions for now.
|
| + DCHECK(special_storage_policy_->IsFileHandler(extension_id));
|
| + if (!special_storage_policy_->IsFileHandler(extension_id))
|
| + return;
|
| + file_access_permissions_->GrantAccessPermission(extension_id, virtual_path);
|
| +}
|
| +
|
| +void CrosMountPointProvider::RevokeAccessForExtension(
|
| + const std::string& extension_id) {
|
| + file_access_permissions_->RevokePermissions(extension_id);
|
| +}
|
| +
|
| +std::vector<FilePath> CrosMountPointProvider::GetRootDirectories() const {
|
| + std::vector<FilePath> root_dirs;
|
| + for (MountPointMap::const_iterator iter = mount_point_map_.begin();
|
| + iter != mount_point_map_.end();
|
| + ++iter) {
|
| + root_dirs.push_back(iter->second.Append(iter->first));
|
| + }
|
| + return root_dirs;
|
| +}
|
| +
|
| } // namespace chromeos
|
|
|
|
|