OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/filesystem/util.h" | 5 #include "components/filesystem/util.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
10 #include <time.h> | 10 #include <time.h> |
11 | 11 |
12 #include <limits> | 12 #include <limits> |
13 | 13 |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
17 #include "mojo/public/cpp/bindings/string.h" | 17 #include "mojo/public/cpp/bindings/string.h" |
18 | 18 |
19 #if defined(OS_WIN) | 19 #if defined(OS_WIN) |
20 #include "base/strings/utf_string_conversions.h" | 20 #include "base/strings/utf_string_conversions.h" |
21 #endif | 21 #endif |
22 | 22 |
23 // module filesystem has various constants which must line up with enum values | 23 // module filesystem has various constants which must line up with enum values |
24 // in base::File::Flags. | 24 // in base::File::Flags. |
25 static_assert(filesystem::kFlagOpen == | 25 static_assert(filesystem::mojom::kFlagOpen == |
26 static_cast<uint32_t>(base::File::FLAG_OPEN), | 26 static_cast<uint32_t>(base::File::FLAG_OPEN), |
27 ""); | 27 ""); |
28 static_assert(filesystem::kFlagCreate == | 28 static_assert(filesystem::mojom::kFlagCreate == |
29 static_cast<uint32_t>(base::File::FLAG_CREATE), | 29 static_cast<uint32_t>(base::File::FLAG_CREATE), |
30 ""); | 30 ""); |
31 static_assert(filesystem::kFlagOpenAlways == | 31 static_assert(filesystem::mojom::kFlagOpenAlways == |
32 static_cast<uint32_t>(base::File::FLAG_OPEN_ALWAYS), | 32 static_cast<uint32_t>(base::File::FLAG_OPEN_ALWAYS), |
33 ""); | 33 ""); |
34 static_assert(filesystem::kCreateAlways == | 34 static_assert(filesystem::mojom::kCreateAlways == |
35 static_cast<uint32_t>(base::File::FLAG_CREATE_ALWAYS), | 35 static_cast<uint32_t>(base::File::FLAG_CREATE_ALWAYS), |
36 ""); | 36 ""); |
37 static_assert(filesystem::kFlagOpenTruncated == | 37 static_assert(filesystem::mojom::kFlagOpenTruncated == |
38 static_cast<uint32_t>(base::File::FLAG_OPEN_TRUNCATED), | 38 static_cast<uint32_t>(base::File::FLAG_OPEN_TRUNCATED), |
39 ""); | 39 ""); |
40 static_assert(filesystem::kFlagRead == | 40 static_assert(filesystem::mojom::kFlagRead == |
41 static_cast<uint32_t>(base::File::FLAG_READ), | 41 static_cast<uint32_t>(base::File::FLAG_READ), |
42 ""); | 42 ""); |
43 static_assert(filesystem::kFlagWrite == | 43 static_assert(filesystem::mojom::kFlagWrite == |
44 static_cast<uint32_t>(base::File::FLAG_WRITE), | 44 static_cast<uint32_t>(base::File::FLAG_WRITE), |
45 ""); | 45 ""); |
46 static_assert(filesystem::kFlagAppend == | 46 static_assert(filesystem::mojom::kFlagAppend == |
47 static_cast<uint32_t>(base::File::FLAG_APPEND), | 47 static_cast<uint32_t>(base::File::FLAG_APPEND), |
48 ""); | 48 ""); |
49 | 49 |
50 // filesystem.Error in types.mojom must be the same as base::File::Error. | 50 // filesystem.Error in types.mojom must be the same as base::File::Error. |
51 static_assert(static_cast<int>(filesystem::FileError::OK) == | 51 static_assert(static_cast<int>(filesystem::mojom::FileError::OK) == |
52 static_cast<int>(base::File::FILE_OK), | 52 static_cast<int>(base::File::FILE_OK), |
53 ""); | 53 ""); |
54 static_assert(static_cast<int>(filesystem::FileError::FAILED) == | 54 static_assert(static_cast<int>(filesystem::mojom::FileError::FAILED) == |
55 static_cast<int>(base::File::FILE_ERROR_FAILED), | 55 static_cast<int>(base::File::FILE_ERROR_FAILED), |
56 ""); | 56 ""); |
57 static_assert(static_cast<int>(filesystem::FileError::IN_USE) == | 57 static_assert(static_cast<int>(filesystem::mojom::FileError::IN_USE) == |
58 static_cast<int>(base::File::FILE_ERROR_IN_USE), | 58 static_cast<int>(base::File::FILE_ERROR_IN_USE), |
59 ""); | 59 ""); |
60 static_assert(static_cast<int>(filesystem::FileError::EXISTS) == | 60 static_assert(static_cast<int>(filesystem::mojom::FileError::EXISTS) == |
61 static_cast<int>(base::File::FILE_ERROR_EXISTS), | 61 static_cast<int>(base::File::FILE_ERROR_EXISTS), |
62 ""); | 62 ""); |
63 static_assert(static_cast<int>(filesystem::FileError::NOT_FOUND) == | 63 static_assert(static_cast<int>(filesystem::mojom::FileError::NOT_FOUND) == |
64 static_cast<int>(base::File::FILE_ERROR_NOT_FOUND), | 64 static_cast<int>(base::File::FILE_ERROR_NOT_FOUND), |
65 ""); | 65 ""); |
66 static_assert(static_cast<int>(filesystem::FileError::ACCESS_DENIED) == | 66 static_assert(static_cast<int>(filesystem::mojom::FileError::ACCESS_DENIED) == |
67 static_cast<int>(base::File::FILE_ERROR_ACCESS_DENIED), | 67 static_cast<int>(base::File::FILE_ERROR_ACCESS_DENIED), |
68 ""); | 68 ""); |
69 static_assert(static_cast<int>(filesystem::FileError::TOO_MANY_OPENED) == | 69 static_assert(static_cast<int>(filesystem::mojom::FileError::TOO_MANY_OPENED) == |
70 static_cast<int>(base::File::FILE_ERROR_TOO_MANY_OPENED), | 70 static_cast<int>(base::File::FILE_ERROR_TOO_MANY_OPENED), |
71 ""); | 71 ""); |
72 static_assert(static_cast<int>(filesystem::FileError::NO_MEMORY) == | 72 static_assert(static_cast<int>(filesystem::mojom::FileError::NO_MEMORY) == |
73 static_cast<int>(base::File::FILE_ERROR_NO_MEMORY), | 73 static_cast<int>(base::File::FILE_ERROR_NO_MEMORY), |
74 ""); | 74 ""); |
75 static_assert(static_cast<int>(filesystem::FileError::NO_SPACE) == | 75 static_assert(static_cast<int>(filesystem::mojom::FileError::NO_SPACE) == |
76 static_cast<int>(base::File::FILE_ERROR_NO_SPACE), | 76 static_cast<int>(base::File::FILE_ERROR_NO_SPACE), |
77 ""); | 77 ""); |
78 static_assert(static_cast<int>(filesystem::FileError::NOT_A_DIRECTORY) == | 78 static_assert(static_cast<int>(filesystem::mojom::FileError::NOT_A_DIRECTORY) == |
79 static_cast<int>(base::File::FILE_ERROR_NOT_A_DIRECTORY), | 79 static_cast<int>(base::File::FILE_ERROR_NOT_A_DIRECTORY), |
80 ""); | 80 ""); |
81 static_assert(static_cast<int>(filesystem::FileError::INVALID_OPERATION) == | 81 static_assert( |
82 static_cast<int>(base::File::FILE_ERROR_INVALID_OPERATION), | 82 static_cast<int>(filesystem::mojom::FileError::INVALID_OPERATION) == |
83 ""); | 83 static_cast<int>(base::File::FILE_ERROR_INVALID_OPERATION), |
84 static_assert(static_cast<int>(filesystem::FileError::SECURITY) == | 84 ""); |
| 85 static_assert(static_cast<int>(filesystem::mojom::FileError::SECURITY) == |
85 static_cast<int>(base::File::FILE_ERROR_SECURITY), | 86 static_cast<int>(base::File::FILE_ERROR_SECURITY), |
86 ""); | 87 ""); |
87 static_assert(static_cast<int>(filesystem::FileError::ABORT) == | 88 static_assert(static_cast<int>(filesystem::mojom::FileError::ABORT) == |
88 static_cast<int>(base::File::FILE_ERROR_ABORT), | 89 static_cast<int>(base::File::FILE_ERROR_ABORT), |
89 ""); | 90 ""); |
90 static_assert(static_cast<int>(filesystem::FileError::NOT_A_FILE) == | 91 static_assert(static_cast<int>(filesystem::mojom::FileError::NOT_A_FILE) == |
91 static_cast<int>(base::File::FILE_ERROR_NOT_A_FILE), | 92 static_cast<int>(base::File::FILE_ERROR_NOT_A_FILE), |
92 ""); | 93 ""); |
93 static_assert(static_cast<int>(filesystem::FileError::NOT_EMPTY) == | 94 static_assert(static_cast<int>(filesystem::mojom::FileError::NOT_EMPTY) == |
94 static_cast<int>(base::File::FILE_ERROR_NOT_EMPTY), | 95 static_cast<int>(base::File::FILE_ERROR_NOT_EMPTY), |
95 ""); | 96 ""); |
96 static_assert(static_cast<int>(filesystem::FileError::INVALID_URL) == | 97 static_assert(static_cast<int>(filesystem::mojom::FileError::INVALID_URL) == |
97 static_cast<int>(base::File::FILE_ERROR_INVALID_URL), | 98 static_cast<int>(base::File::FILE_ERROR_INVALID_URL), |
98 ""); | 99 ""); |
99 static_assert(static_cast<int>(filesystem::FileError::IO) == | 100 static_assert(static_cast<int>(filesystem::mojom::FileError::IO) == |
100 static_cast<int>(base::File::FILE_ERROR_IO), | 101 static_cast<int>(base::File::FILE_ERROR_IO), |
101 ""); | 102 ""); |
102 | 103 |
103 // filesystem.Whence in types.mojom must be the same as base::File::Whence. | 104 // filesystem.Whence in types.mojom must be the same as base::File::Whence. |
104 static_assert(static_cast<int>(filesystem::Whence::FROM_BEGIN) == | 105 static_assert(static_cast<int>(filesystem::mojom::Whence::FROM_BEGIN) == |
105 static_cast<int>(base::File::FROM_BEGIN), | 106 static_cast<int>(base::File::FROM_BEGIN), |
106 ""); | 107 ""); |
107 static_assert(static_cast<int>(filesystem::Whence::FROM_CURRENT) == | 108 static_assert(static_cast<int>(filesystem::mojom::Whence::FROM_CURRENT) == |
108 static_cast<int>(base::File::FROM_CURRENT), | 109 static_cast<int>(base::File::FROM_CURRENT), |
109 ""); | 110 ""); |
110 static_assert(static_cast<int>(filesystem::Whence::FROM_END) == | 111 static_assert(static_cast<int>(filesystem::mojom::Whence::FROM_END) == |
111 static_cast<int>(base::File::FROM_END), | 112 static_cast<int>(base::File::FROM_END), |
112 ""); | 113 ""); |
113 | 114 |
114 namespace filesystem { | 115 namespace filesystem { |
115 | 116 |
116 FileError IsWhenceValid(Whence whence) { | 117 mojom::FileError IsWhenceValid(mojom::Whence whence) { |
117 return (whence == Whence::FROM_CURRENT || whence == Whence::FROM_BEGIN || | 118 return (whence == mojom::Whence::FROM_CURRENT || |
118 whence == Whence::FROM_END) | 119 whence == mojom::Whence::FROM_BEGIN || |
119 ? FileError::OK | 120 whence == mojom::Whence::FROM_END) |
120 : FileError::INVALID_OPERATION; | 121 ? mojom::FileError::OK |
| 122 : mojom::FileError::INVALID_OPERATION; |
121 } | 123 } |
122 | 124 |
123 FileError IsOffsetValid(int64_t offset) { | 125 mojom::FileError IsOffsetValid(int64_t offset) { |
124 return (offset >= std::numeric_limits<off_t>::min() && | 126 return (offset >= std::numeric_limits<off_t>::min() && |
125 offset <= std::numeric_limits<off_t>::max()) | 127 offset <= std::numeric_limits<off_t>::max()) |
126 ? FileError::OK | 128 ? mojom::FileError::OK |
127 : FileError::INVALID_OPERATION; | 129 : mojom::FileError::INVALID_OPERATION; |
128 } | 130 } |
129 | 131 |
130 FileError GetError(const base::File& file) { | 132 mojom::FileError GetError(const base::File& file) { |
131 return static_cast<filesystem::FileError>(file.error_details()); | 133 return static_cast<filesystem::mojom::FileError>(file.error_details()); |
132 } | 134 } |
133 | 135 |
134 FileInformationPtr MakeFileInformation(const base::File::Info& info) { | 136 mojom::FileInformationPtr MakeFileInformation(const base::File::Info& info) { |
135 FileInformationPtr file_info(FileInformation::New()); | 137 mojom::FileInformationPtr file_info(mojom::FileInformation::New()); |
136 file_info->type = | 138 file_info->type = info.is_directory ? mojom::FsFileType::DIRECTORY |
137 info.is_directory ? FsFileType::DIRECTORY : FsFileType::REGULAR_FILE; | 139 : mojom::FsFileType::REGULAR_FILE; |
138 file_info->size = info.size; | 140 file_info->size = info.size; |
139 | 141 |
140 file_info->atime = info.last_accessed.ToDoubleT(); | 142 file_info->atime = info.last_accessed.ToDoubleT(); |
141 file_info->mtime = info.last_modified.ToDoubleT(); | 143 file_info->mtime = info.last_modified.ToDoubleT(); |
142 file_info->ctime = info.creation_time.ToDoubleT(); | 144 file_info->ctime = info.creation_time.ToDoubleT(); |
143 | 145 |
144 return file_info; | 146 return file_info; |
145 } | 147 } |
146 | 148 |
147 FileError ValidatePath(const mojo::String& raw_path, | 149 mojom::FileError ValidatePath(const mojo::String& raw_path, |
148 const base::FilePath& filesystem_base, | 150 const base::FilePath& filesystem_base, |
149 base::FilePath* out) { | 151 base::FilePath* out) { |
150 DCHECK(!raw_path.is_null()); | 152 DCHECK(!raw_path.is_null()); |
151 if (!base::IsStringUTF8(raw_path.get())) | 153 if (!base::IsStringUTF8(raw_path.get())) |
152 return FileError::INVALID_OPERATION; | 154 return mojom::FileError::INVALID_OPERATION; |
153 | 155 |
154 #if defined(OS_POSIX) | 156 #if defined(OS_POSIX) |
155 base::FilePath::StringType path = raw_path; | 157 base::FilePath::StringType path = raw_path; |
156 #elif defined(OS_WIN) | 158 #elif defined(OS_WIN) |
157 base::FilePath::StringType path = base::UTF8ToUTF16(raw_path.get()); | 159 base::FilePath::StringType path = base::UTF8ToUTF16(raw_path.get()); |
158 #endif | 160 #endif |
159 | 161 |
160 // TODO(erg): This isn't really what we want. FilePath::AppendRelativePath() | 162 // TODO(erg): This isn't really what we want. FilePath::AppendRelativePath() |
161 // is closer. We need to deal with entirely hostile apps trying to bust this | 163 // is closer. We need to deal with entirely hostile apps trying to bust this |
162 // function to use a possibly maliciously provided |raw_path| to bust out of | 164 // function to use a possibly maliciously provided |raw_path| to bust out of |
163 // |filesystem_base|. | 165 // |filesystem_base|. |
164 base::FilePath full_path = filesystem_base.Append(path); | 166 base::FilePath full_path = filesystem_base.Append(path); |
165 if (full_path.ReferencesParent()) { | 167 if (full_path.ReferencesParent()) { |
166 // TODO(erg): For now, if it references a parent, we'll consider this bad. | 168 // TODO(erg): For now, if it references a parent, we'll consider this bad. |
167 return FileError::ACCESS_DENIED; | 169 return mojom::FileError::ACCESS_DENIED; |
168 } | 170 } |
169 | 171 |
170 *out = full_path; | 172 *out = full_path; |
171 return FileError::OK; | 173 return mojom::FileError::OK; |
172 } | 174 } |
173 | 175 |
174 } // namespace filesystem | 176 } // namespace filesystem |
OLD | NEW |