Index: webkit/fileapi/sandboxed_file_system_operation.h |
diff --git a/webkit/fileapi/sandboxed_file_system_operation.h b/webkit/fileapi/sandboxed_file_system_operation.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..088a5f3f03f6b5a8b2206b44de848b2664c755e7 |
--- /dev/null |
+++ b/webkit/fileapi/sandboxed_file_system_operation.h |
@@ -0,0 +1,108 @@ |
+// Copyright (c) 2010 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_SANDBOXED_FILE_SYSTEM_OPERATION_H_ |
+#define WEBKIT_FILEAPI_SANDBOXED_FILE_SYSTEM_OPERATION_H_ |
+ |
+#include "base/scoped_callback_factory.h" |
+#include "webkit/fileapi/file_system_operation.h" |
+#include "webkit/fileapi/file_system_types.h" |
+ |
+namespace fileapi { |
+ |
+class SandboxedFileSystemContext; |
+ |
+// This class provides a 'sandboxed' access to the underlying file system, |
+// that is: |
+// 1. provides OpenFileSystem method that returns a (hidden) root path |
+// that is given by |file_system_context|. |
+// 2. enforces quota and file names/paths restrictions on each operation |
+// via |file_system_context|. |
+class SandboxedFileSystemOperation : public FileSystemOperation { |
+ public: |
+ // This class doesn't hold a reference or ownership of |file_system_context|. |
+ // It is the caller's responsibility to keep the pointer alive *until* |
+ // it calls any of the operation methods. The |file_system_context| won't be |
+ // used in the callback path and can be deleted after the operation is |
+ // made (e.g. after one of CreateFile, CreateDirectory, Copy, etc is called). |
+ SandboxedFileSystemOperation(FileSystemCallbackDispatcher* dispatcher, |
+ scoped_refptr<base::MessageLoopProxy> proxy, |
+ SandboxedFileSystemContext* file_system_context); |
+ |
+ void OpenFileSystem(const GURL& origin_url, |
+ fileapi::FileSystemType type, |
+ bool create); |
+ |
+ // FileSystemOperation's methods. |
+ virtual void CreateFile(const FilePath& path, |
+ bool exclusive); |
+ virtual void CreateDirectory(const FilePath& path, |
+ bool exclusive, |
+ bool recursive); |
+ virtual void Copy(const FilePath& src_path, |
+ const FilePath& dest_path); |
+ virtual void Move(const FilePath& src_path, |
+ const FilePath& dest_path); |
+ virtual void DirectoryExists(const FilePath& path); |
+ virtual void FileExists(const FilePath& path); |
+ virtual void GetMetadata(const FilePath& path); |
+ virtual void ReadDirectory(const FilePath& path); |
+ virtual void Remove(const FilePath& path, bool recursive); |
+ virtual void Write( |
+ scoped_refptr<URLRequestContext> url_request_context, |
+ const FilePath& path, const GURL& blob_url, int64 offset); |
+ virtual void Truncate(const FilePath& path, int64 length); |
+ virtual void TouchFile(const FilePath& path, |
+ const base::Time& last_access_time, |
+ const base::Time& last_modified_time); |
+ |
+ private: |
+ enum SandboxedFileSystemOperationType { |
+ kOperationOpenFileSystem = 100, |
+ }; |
+ |
+ // A callback used for OpenFileSystem. |
+ void DidGetRootPath(bool success, |
+ const FilePath& path, |
+ const std::string& name); |
+ |
+ // Checks the validity of a given |path| for reading. |
+ // Returns true if the given |path| is a valid FileSystem path. |
+ // Otherwise it calls dispatcher's DidFail method with |
+ // PLATFORM_FILE_ERROR_SECURITY and returns false. |
+ bool VerifyFileSystemPathForRead(const FilePath& path); |
+ |
+ // Checks the validity of a given |path| for writing. |
+ // Returns true if the given |path| is a valid FileSystem path, and |
+ // its origin embedded in the path has the right to write as much as |
+ // the given |growth|. |
+ // Otherwise it fires dispatcher's DidFail method with |
+ // PLATFORM_FILE_ERROR_SECURITY if the path is not valid for writing, |
+ // or with PLATFORM_FILE_ERROR_NO_SPACE if the origin is not allowed to |
+ // increase the usage by |growth|. |
+ // In either case it returns false after firing DidFail. |
+ // If |create| flag is true this also checks if the |path| contains |
+ // any restricted names and chars. If it does, the call fires dispatcher's |
+ // DidFail with PLATFORM_FILE_ERROR_SECURITY and returns false. |
+ bool VerifyFileSystemPathForWrite(const FilePath& path, |
+ bool create, |
+ int64 growth); |
+ |
+ // Checks if a given |path| does not contain any restricted names/chars |
+ // for new files. Returns true if the given |path| is safe. |
+ // Otherwise it fires dispatcher's DidFail method with |
+ // PLATFORM_FILE_ERROR_SECURITY and returns false. |
+ bool CheckIfFilePathIsSafe(const FilePath& path); |
+ |
+ // Not owned. See the comment at the constructor. |
+ SandboxedFileSystemContext* file_system_context_; |
+ |
+ base::ScopedCallbackFactory<SandboxedFileSystemOperation> callback_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SandboxedFileSystemOperation); |
+}; |
+ |
+} // namespace fileapi |
+ |
+#endif // WEBKIT_FILEAPI_SANDBOXED_FILE_SYSTEM_OPERATION_H_ |