1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "webkit/fileapi/sandbox_mount_point_provider.h"
9 #include "base/basictypes.h"
10 #include "base/file_util.h"
11 #include "base/files/scoped_temp_dir.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/message_loop.h"
14 #include "base/message_loop_proxy.h"
15 #include "googleurl/src/gurl.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webkit/fileapi/file_system_mount_point_provider.h"
18 #include "webkit/fileapi/file_system_url.h"
19 #include "webkit/fileapi/file_system_util.h"
20 #include "webkit/fileapi/mock_file_system_options.h"
26 FileSystemURL
CreateFileSystemURL(const char* path
) {
27 const GURL
kOrigin("http://foo/");
28 return FileSystemURL::CreateForTest(
29 kOrigin
, kFileSystemTypeTemporary
, base::FilePath::FromUTF8Unsafe(path
));
34 class SandboxMountPointProviderOriginEnumeratorTest
: public testing::Test
{
36 virtual void SetUp() {
37 ASSERT_TRUE(data_dir_
.CreateUniqueTempDir());
38 sandbox_provider_
.reset(
39 new SandboxMountPointProvider(
41 base::MessageLoopProxy::current(),
43 CreateAllowFileAccessOptions()));
46 SandboxMountPointProvider::OriginEnumerator
* CreateEnumerator() const {
47 return sandbox_provider_
->CreateOriginEnumerator();
51 void CreateOriginTypeDirectory(const GURL
& origin
,
52 fileapi::FileSystemType type
) {
53 base::FilePath target
= sandbox_provider_
->
54 GetBaseDirectoryForOriginAndType(origin
, type
, true);
55 ASSERT_TRUE(!target
.empty());
56 ASSERT_TRUE(file_util::DirectoryExists(target
));
59 base::ScopedTempDir data_dir_
;
60 MessageLoop message_loop_
;
61 scoped_ptr
<SandboxMountPointProvider
> sandbox_provider_
;
64 TEST_F(SandboxMountPointProviderOriginEnumeratorTest
, Empty
) {
65 scoped_ptr
<SandboxMountPointProvider::OriginEnumerator
> enumerator(
67 ASSERT_TRUE(enumerator
->Next().is_empty());
70 TEST_F(SandboxMountPointProviderOriginEnumeratorTest
, EnumerateOrigins
) {
71 const char* temporary_origins
[] = {
72 "http://www.bar.com/",
73 "http://www.foo.com/",
74 "http://www.foo.com:1/",
75 "http://www.example.com:8080/",
76 "http://www.google.com:80/",
78 const char* persistent_origins
[] = {
79 "http://www.bar.com/",
80 "http://www.foo.com:8080/",
81 "http://www.foo.com:80/",
83 size_t temporary_size
= ARRAYSIZE_UNSAFE(temporary_origins
);
84 size_t persistent_size
= ARRAYSIZE_UNSAFE(persistent_origins
);
85 std::set
<GURL
> temporary_set
, persistent_set
;
86 for (size_t i
= 0; i
< temporary_size
; ++i
) {
87 CreateOriginTypeDirectory(GURL(temporary_origins
[i
]),
88 fileapi::kFileSystemTypeTemporary
);
89 temporary_set
.insert(GURL(temporary_origins
[i
]));
91 for (size_t i
= 0; i
< persistent_size
; ++i
) {
92 CreateOriginTypeDirectory(GURL(persistent_origins
[i
]),
93 kFileSystemTypePersistent
);
94 persistent_set
.insert(GURL(persistent_origins
[i
]));
97 scoped_ptr
<SandboxMountPointProvider::OriginEnumerator
> enumerator(
99 size_t temporary_actual_size
= 0;
100 size_t persistent_actual_size
= 0;
102 while (!(current
= enumerator
->Next()).is_empty()) {
103 SCOPED_TRACE(testing::Message() << "EnumerateOrigin " << current
.spec());
104 if (enumerator
->HasFileSystemType(kFileSystemTypeTemporary
)) {
105 ASSERT_TRUE(temporary_set
.find(current
) != temporary_set
.end());
106 ++temporary_actual_size
;
108 if (enumerator
->HasFileSystemType(kFileSystemTypePersistent
)) {
109 ASSERT_TRUE(persistent_set
.find(current
) != persistent_set
.end());
110 ++persistent_actual_size
;
114 EXPECT_EQ(temporary_size
, temporary_actual_size
);
115 EXPECT_EQ(persistent_size
, persistent_actual_size
);
118 TEST(SandboxMountPointProviderTest
, AccessPermissions
) {
119 MessageLoop message_loop_
;
120 SandboxMountPointProvider
provider(
121 NULL
, base::MessageLoopProxy::current(), base::FilePath(),
122 CreateAllowFileAccessOptions());
124 // Any access should be allowed in sandbox directory.
125 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
126 provider
.GetPermissionPolicy(CreateFileSystemURL("foo"),
127 kReadFilePermissions
));
128 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
129 provider
.GetPermissionPolicy(CreateFileSystemURL("foo"),
130 kWriteFilePermissions
));
131 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
132 provider
.GetPermissionPolicy(CreateFileSystemURL("foo"),
133 kCreateFilePermissions
));
135 // Access to a path with parent references ('..') should be disallowed.
136 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
137 provider
.GetPermissionPolicy(CreateFileSystemURL("a/../b"),
138 kReadFilePermissions
));
140 // Access from non-allowed scheme should be disallowed.
141 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
142 provider
.GetPermissionPolicy(
143 FileSystemURL::CreateForTest(
144 GURL("unknown://bar"), kFileSystemTypeTemporary
,
145 base::FilePath::FromUTF8Unsafe("foo")),
146 kReadFilePermissions
));
148 // Access for non-sandbox type should be disallowed.
149 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
150 provider
.GetPermissionPolicy(
151 FileSystemURL::CreateForTest(
152 GURL("http://foo/"), kFileSystemTypeTest
,
153 base::FilePath::FromUTF8Unsafe("foo")),
154 kReadFilePermissions
));
156 // Write access to the root folder should be restricted.
157 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
158 provider
.GetPermissionPolicy(CreateFileSystemURL(""),
159 kWriteFilePermissions
));
160 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
161 provider
.GetPermissionPolicy(CreateFileSystemURL("/"),
162 kWriteFilePermissions
));
163 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
164 provider
.GetPermissionPolicy(CreateFileSystemURL("/"),
165 kCreateFilePermissions
));
167 // Create access with restricted name should be disallowed.
168 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
169 provider
.GetPermissionPolicy(CreateFileSystemURL(".."),
170 kCreateFilePermissions
));
171 EXPECT_EQ(FILE_PERMISSION_ALWAYS_DENY
,
172 provider
.GetPermissionPolicy(CreateFileSystemURL("."),
173 kCreateFilePermissions
));
175 // Similar but safe cases.
176 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
177 provider
.GetPermissionPolicy(CreateFileSystemURL(" ."),
178 kCreateFilePermissions
));
179 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
180 provider
.GetPermissionPolicy(CreateFileSystemURL(". "),
181 kCreateFilePermissions
));
182 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
183 provider
.GetPermissionPolicy(CreateFileSystemURL(" .."),
184 kCreateFilePermissions
));
185 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
186 provider
.GetPermissionPolicy(CreateFileSystemURL(".. "),
187 kCreateFilePermissions
));
188 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
189 provider
.GetPermissionPolicy(CreateFileSystemURL("b."),
190 kCreateFilePermissions
));
191 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
192 provider
.GetPermissionPolicy(CreateFileSystemURL(".b"),
193 kCreateFilePermissions
));
195 // A path that looks like a drive letter.
196 EXPECT_EQ(FILE_PERMISSION_ALWAYS_ALLOW
,
197 provider
.GetPermissionPolicy(CreateFileSystemURL("c:"),
198 kCreateFilePermissions
));
201 } // namespace fileapi