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 "mojo/public/cpp/bindings/string.h" | 16 #include "mojo/public/cpp/bindings/string.h" |
17 | 17 |
| 18 #if defined(OS_WIN) |
| 19 #include "base/strings/utf_string_conversions.h" |
| 20 #endif |
| 21 |
18 // module filesystem has various constants which must line up with enum values | 22 // module filesystem has various constants which must line up with enum values |
19 // in base::File::Flags. | 23 // in base::File::Flags. |
20 static_assert(filesystem::kFlagOpen == | 24 static_assert(filesystem::kFlagOpen == |
21 static_cast<uint32>(base::File::FLAG_OPEN), | 25 static_cast<uint32>(base::File::FLAG_OPEN), |
22 ""); | 26 ""); |
23 static_assert(filesystem::kFlagCreate == | 27 static_assert(filesystem::kFlagCreate == |
24 static_cast<uint32>(base::File::FLAG_CREATE), | 28 static_cast<uint32>(base::File::FLAG_CREATE), |
25 ""); | 29 ""); |
26 static_assert(filesystem::kFlagOpenAlways == | 30 static_assert(filesystem::kFlagOpenAlways == |
27 static_cast<uint32>(base::File::FLAG_OPEN_ALWAYS), | 31 static_cast<uint32>(base::File::FLAG_OPEN_ALWAYS), |
28 ""); | 32 ""); |
29 static_assert(filesystem::kCreateAlways == | 33 static_assert(filesystem::kCreateAlways == |
30 static_cast<uint32>(base::File::FLAG_CREATE_ALWAYS), | 34 static_cast<uint32>(base::File::FLAG_CREATE_ALWAYS), |
31 ""); | 35 ""); |
32 static_assert(filesystem::kFlagOpenTruncated == | 36 static_assert(filesystem::kFlagOpenTruncated == |
33 static_cast<uint32>(base::File::FLAG_OPEN_TRUNCATED), | 37 static_cast<uint32>(base::File::FLAG_OPEN_TRUNCATED), |
34 ""); | 38 ""); |
35 static_assert(filesystem::kFlagRead == | 39 static_assert(filesystem::kFlagRead == |
36 static_cast<uint32>(base::File::FLAG_READ), | 40 static_cast<uint32>(base::File::FLAG_READ), |
37 ""); | 41 ""); |
38 static_assert(filesystem::kFlagWrite == | 42 static_assert(filesystem::kFlagWrite == |
39 static_cast<uint32>(base::File::FLAG_WRITE), | 43 static_cast<uint32>(base::File::FLAG_WRITE), |
40 ""); | 44 ""); |
41 static_assert(filesystem::kFlagAppend == | 45 static_assert(filesystem::kFlagAppend == |
42 static_cast<uint32>(base::File::FLAG_APPEND), | 46 static_cast<uint32>(base::File::FLAG_APPEND), |
43 ""); | 47 ""); |
44 | 48 |
45 // filesystem.Error in types.mojom must be the same as base::File::Error. | 49 // filesystem.Error in types.mojom must be the same as base::File::Error. |
46 static_assert(static_cast<int>(filesystem::ERROR_OK) == | 50 static_assert(static_cast<int>(filesystem::FILE_ERROR_OK) == |
47 static_cast<int>(base::File::FILE_OK), | 51 static_cast<int>(base::File::FILE_OK), |
48 ""); | 52 ""); |
49 static_assert(static_cast<int>(filesystem::ERROR_FAILED) == | 53 static_assert(static_cast<int>(filesystem::FILE_ERROR_FAILED) == |
50 static_cast<int>(base::File::FILE_ERROR_FAILED), | 54 static_cast<int>(base::File::FILE_ERROR_FAILED), |
51 ""); | 55 ""); |
52 static_assert(static_cast<int>(filesystem::ERROR_IN_USE) == | 56 static_assert(static_cast<int>(filesystem::FILE_ERROR_IN_USE) == |
53 static_cast<int>(base::File::FILE_ERROR_IN_USE), | 57 static_cast<int>(base::File::FILE_ERROR_IN_USE), |
54 ""); | 58 ""); |
55 static_assert(static_cast<int>(filesystem::ERROR_EXISTS) == | 59 static_assert(static_cast<int>(filesystem::FILE_ERROR_EXISTS) == |
56 static_cast<int>(base::File::FILE_ERROR_EXISTS), | 60 static_cast<int>(base::File::FILE_ERROR_EXISTS), |
57 ""); | 61 ""); |
58 static_assert(static_cast<int>(filesystem::ERROR_NOT_FOUND) == | 62 static_assert(static_cast<int>(filesystem::FILE_ERROR_NOT_FOUND) == |
59 static_cast<int>(base::File::FILE_ERROR_NOT_FOUND), | 63 static_cast<int>(base::File::FILE_ERROR_NOT_FOUND), |
60 ""); | 64 ""); |
61 static_assert(static_cast<int>(filesystem::ERROR_ACCESS_DENIED) == | 65 static_assert(static_cast<int>(filesystem::FILE_ERROR_ACCESS_DENIED) == |
62 static_cast<int>(base::File::FILE_ERROR_ACCESS_DENIED), | 66 static_cast<int>(base::File::FILE_ERROR_ACCESS_DENIED), |
63 ""); | 67 ""); |
64 static_assert(static_cast<int>(filesystem::ERROR_TOO_MANY_OPENED) == | 68 static_assert(static_cast<int>(filesystem::FILE_ERROR_TOO_MANY_OPENED) == |
65 static_cast<int>(base::File::FILE_ERROR_TOO_MANY_OPENED), | 69 static_cast<int>(base::File::FILE_ERROR_TOO_MANY_OPENED), |
66 ""); | 70 ""); |
67 static_assert(static_cast<int>(filesystem::ERROR_NO_MEMORY) == | 71 static_assert(static_cast<int>(filesystem::FILE_ERROR_NO_MEMORY) == |
68 static_cast<int>(base::File::FILE_ERROR_NO_MEMORY), | 72 static_cast<int>(base::File::FILE_ERROR_NO_MEMORY), |
69 ""); | 73 ""); |
70 static_assert(static_cast<int>(filesystem::ERROR_NO_SPACE) == | 74 static_assert(static_cast<int>(filesystem::FILE_ERROR_NO_SPACE) == |
71 static_cast<int>(base::File::FILE_ERROR_NO_SPACE), | 75 static_cast<int>(base::File::FILE_ERROR_NO_SPACE), |
72 ""); | 76 ""); |
73 static_assert(static_cast<int>(filesystem::ERROR_NOT_A_DIRECTORY) == | 77 static_assert(static_cast<int>(filesystem::FILE_ERROR_NOT_A_DIRECTORY) == |
74 static_cast<int>(base::File::FILE_ERROR_NOT_A_DIRECTORY), | 78 static_cast<int>(base::File::FILE_ERROR_NOT_A_DIRECTORY), |
75 ""); | 79 ""); |
76 static_assert(static_cast<int>(filesystem::ERROR_INVALID_OPERATION) == | 80 static_assert(static_cast<int>(filesystem::FILE_ERROR_INVALID_OPERATION) == |
77 static_cast<int>(base::File::FILE_ERROR_INVALID_OPERATION), | 81 static_cast<int>(base::File::FILE_ERROR_INVALID_OPERATION), |
78 ""); | 82 ""); |
79 static_assert(static_cast<int>(filesystem::ERROR_SECURITY) == | 83 static_assert(static_cast<int>(filesystem::FILE_ERROR_SECURITY) == |
80 static_cast<int>(base::File::FILE_ERROR_SECURITY), | 84 static_cast<int>(base::File::FILE_ERROR_SECURITY), |
81 ""); | 85 ""); |
82 static_assert(static_cast<int>(filesystem::ERROR_ABORT) == | 86 static_assert(static_cast<int>(filesystem::FILE_ERROR_ABORT) == |
83 static_cast<int>(base::File::FILE_ERROR_ABORT), | 87 static_cast<int>(base::File::FILE_ERROR_ABORT), |
84 ""); | 88 ""); |
85 static_assert(static_cast<int>(filesystem::ERROR_NOT_A_FILE) == | 89 static_assert(static_cast<int>(filesystem::FILE_ERROR_NOT_A_FILE) == |
86 static_cast<int>(base::File::FILE_ERROR_NOT_A_FILE), | 90 static_cast<int>(base::File::FILE_ERROR_NOT_A_FILE), |
87 ""); | 91 ""); |
88 static_assert(static_cast<int>(filesystem::ERROR_NOT_EMPTY) == | 92 static_assert(static_cast<int>(filesystem::FILE_ERROR_NOT_EMPTY) == |
89 static_cast<int>(base::File::FILE_ERROR_NOT_EMPTY), | 93 static_cast<int>(base::File::FILE_ERROR_NOT_EMPTY), |
90 ""); | 94 ""); |
91 static_assert(static_cast<int>(filesystem::ERROR_INVALID_URL) == | 95 static_assert(static_cast<int>(filesystem::FILE_ERROR_INVALID_URL) == |
92 static_cast<int>(base::File::FILE_ERROR_INVALID_URL), | 96 static_cast<int>(base::File::FILE_ERROR_INVALID_URL), |
93 ""); | 97 ""); |
94 static_assert(static_cast<int>(filesystem::ERROR_IO) == | 98 static_assert(static_cast<int>(filesystem::FILE_ERROR_IO) == |
95 static_cast<int>(base::File::FILE_ERROR_IO), | 99 static_cast<int>(base::File::FILE_ERROR_IO), |
96 ""); | 100 ""); |
97 | 101 |
98 // filesystem.Whence in types.mojom must be the same as base::File::Whence. | 102 // filesystem.Whence in types.mojom must be the same as base::File::Whence. |
99 static_assert(static_cast<int>(filesystem::WHENCE_FROM_BEGIN) == | 103 static_assert(static_cast<int>(filesystem::WHENCE_FROM_BEGIN) == |
100 static_cast<int>(base::File::FROM_BEGIN), | 104 static_cast<int>(base::File::FROM_BEGIN), |
101 ""); | 105 ""); |
102 static_assert(static_cast<int>(filesystem::WHENCE_FROM_CURRENT) == | 106 static_assert(static_cast<int>(filesystem::WHENCE_FROM_CURRENT) == |
103 static_cast<int>(base::File::FROM_CURRENT), | 107 static_cast<int>(base::File::FROM_CURRENT), |
104 ""); | 108 ""); |
105 static_assert(static_cast<int>(filesystem::WHENCE_FROM_END) == | 109 static_assert(static_cast<int>(filesystem::WHENCE_FROM_END) == |
106 static_cast<int>(base::File::FROM_END), | 110 static_cast<int>(base::File::FROM_END), |
107 ""); | 111 ""); |
108 | 112 |
109 namespace filesystem { | 113 namespace filesystem { |
110 | 114 |
111 Error IsWhenceValid(Whence whence) { | 115 FileError IsWhenceValid(Whence whence) { |
112 return (whence == WHENCE_FROM_CURRENT || whence == WHENCE_FROM_BEGIN || | 116 return (whence == WHENCE_FROM_CURRENT || whence == WHENCE_FROM_BEGIN || |
113 whence == WHENCE_FROM_END) | 117 whence == WHENCE_FROM_END) |
114 ? ERROR_OK | 118 ? FILE_ERROR_OK |
115 : ERROR_INVALID_OPERATION; | 119 : FILE_ERROR_INVALID_OPERATION; |
116 } | 120 } |
117 | 121 |
118 Error IsOffsetValid(int64_t offset) { | 122 FileError IsOffsetValid(int64_t offset) { |
119 return (offset >= std::numeric_limits<off_t>::min() && | 123 return (offset >= std::numeric_limits<off_t>::min() && |
120 offset <= std::numeric_limits<off_t>::max()) | 124 offset <= std::numeric_limits<off_t>::max()) |
121 ? ERROR_OK | 125 ? FILE_ERROR_OK |
122 : ERROR_INVALID_OPERATION; | 126 : FILE_ERROR_INVALID_OPERATION; |
123 } | 127 } |
124 | 128 |
125 Error GetError(const base::File& file) { | 129 FileError GetError(const base::File& file) { |
126 return static_cast<filesystem::Error>(file.error_details()); | 130 return static_cast<filesystem::FileError>(file.error_details()); |
127 } | 131 } |
128 | 132 |
129 FileInformationPtr MakeFileInformation(const base::File::Info& info) { | 133 FileInformationPtr MakeFileInformation(const base::File::Info& info) { |
130 FileInformationPtr file_info(FileInformation::New()); | 134 FileInformationPtr file_info(FileInformation::New()); |
131 file_info->type = | 135 file_info->type = |
132 info.is_directory ? FILE_TYPE_DIRECTORY : FILE_TYPE_REGULAR_FILE; | 136 info.is_directory ? FS_FILE_TYPE_DIRECTORY : FS_FILE_TYPE_REGULAR_FILE; |
133 file_info->size = info.size; | 137 file_info->size = info.size; |
134 | 138 |
135 file_info->atime = info.last_accessed.ToDoubleT(); | 139 file_info->atime = info.last_accessed.ToDoubleT(); |
136 file_info->mtime = info.last_modified.ToDoubleT(); | 140 file_info->mtime = info.last_modified.ToDoubleT(); |
137 file_info->ctime = info.creation_time.ToDoubleT(); | 141 file_info->ctime = info.creation_time.ToDoubleT(); |
138 | 142 |
139 return file_info.Pass(); | 143 return file_info.Pass(); |
140 } | 144 } |
141 | 145 |
142 Error ValidatePath(const mojo::String& raw_path, | 146 FileError ValidatePath(const mojo::String& raw_path, |
143 const base::FilePath& filesystem_base, | 147 const base::FilePath& filesystem_base, |
144 base::FilePath* out) { | 148 base::FilePath* out) { |
145 DCHECK(!raw_path.is_null()); | 149 DCHECK(!raw_path.is_null()); |
146 if (!base::IsStringUTF8(raw_path.get())) | 150 if (!base::IsStringUTF8(raw_path.get())) |
147 return ERROR_INVALID_OPERATION; | 151 return FILE_ERROR_INVALID_OPERATION; |
| 152 |
| 153 #if defined(OS_POSIX) |
| 154 base::FilePath::StringType path = raw_path; |
| 155 #elif defined(OS_WIN) |
| 156 base::FilePath::StringType path = base::UTF8ToUTF16(raw_path.get()); |
| 157 #endif |
148 | 158 |
149 // TODO(erg): This isn't really what we want. FilePath::AppendRelativePath() | 159 // TODO(erg): This isn't really what we want. FilePath::AppendRelativePath() |
150 // is closer. We need to deal with entirely hostile apps trying to bust this | 160 // is closer. We need to deal with entirely hostile apps trying to bust this |
151 // function to use a possibly maliciously provided |raw_path| to bust out of | 161 // function to use a possibly maliciously provided |raw_path| to bust out of |
152 // |filesystem_base|. | 162 // |filesystem_base|. |
153 base::FilePath full_path = filesystem_base.Append(raw_path); | 163 base::FilePath full_path = filesystem_base.Append(path); |
154 if (full_path.ReferencesParent()) { | 164 if (full_path.ReferencesParent()) { |
155 // TODO(erg): For now, if it references a parent, we'll consider this bad. | 165 // TODO(erg): For now, if it references a parent, we'll consider this bad. |
156 return ERROR_ACCESS_DENIED; | 166 return FILE_ERROR_ACCESS_DENIED; |
157 } | 167 } |
158 | 168 |
159 *out = full_path; | 169 *out = full_path; |
160 return ERROR_OK; | 170 return FILE_ERROR_OK; |
161 } | 171 } |
162 | 172 |
163 } // namespace filesystem | 173 } // namespace filesystem |
OLD | NEW |