OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "net/ftp/ftp_directory_listing_parser_ls.h" | 5 #include "net/ftp/ftp_directory_listing_parser_ls.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
10 #include "base/string_split.h" | 10 #include "base/string_split.h" |
11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
12 #include "base/time.h" | 12 #include "base/time.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "net/ftp/ftp_directory_listing_parser.h" | 14 #include "net/ftp/ftp_directory_listing_parser.h" |
15 #include "net/ftp/ftp_util.h" | 15 #include "net/ftp/ftp_util.h" |
16 | 16 |
17 namespace { | 17 namespace { |
18 | 18 |
19 bool LooksLikeUnixPermission(const string16& text) { | 19 bool LooksLikeUnixPermission(const string16& text) { |
20 if (text.length() != 3) | 20 if (text.length() != 3) |
21 return false; | 21 return false; |
22 | 22 |
23 // Meaning of the flags: | 23 // Meaning of the flags: |
24 // r - file is readable | 24 // r - file is readable |
25 // w - file is writable | 25 // w - file is writable |
26 // x - file is executable | 26 // x - file is executable |
27 // s or S - setuid/setgid bit set | 27 // s, S or l - setuid/setgid bit set |
28 // t or T - "sticky" bit set | 28 // t or T - "sticky" bit set |
29 return ((text[0] == 'r' || text[0] == '-') && | 29 return ((text[0] == 'r' || text[0] == '-') && |
30 (text[1] == 'w' || text[1] == '-') && | 30 (text[1] == 'w' || text[1] == '-') && |
31 (text[2] == 'x' || text[2] == 's' || text[2] == 'S' || | 31 (text[2] == 'x' || text[2] == '-' || |
32 text[2] == 't' || text[2] == 'T' || text[2] == '-')); | 32 text[2] == 's' || text[2] == 'S' || text[2] == 'l' || |
| 33 text[2] == 't' || text[2] == 'T')); |
33 } | 34 } |
34 | 35 |
35 bool LooksLikeUnixPermissionsListing(const string16& text) { | 36 bool LooksLikeUnixPermissionsListing(const string16& text) { |
36 if (text.length() < 7) | 37 if (text.length() < 7) |
37 return false; | 38 return false; |
38 | 39 |
39 // Do not check the first character (entry type). There are many weird | 40 // Do not check the first character (entry type). There are many weird |
40 // servers that use special file types (for example Plan9 and append-only | 41 // servers that use special file types (for example Plan9 and append-only |
41 // files). Fortunately, the rest of the permission listing is more consistent. | 42 // files). Fortunately, the rest of the permission listing is more consistent. |
42 | 43 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 base::SplitString(CollapseWhitespace(lines[i], false), ' ', &columns); | 174 base::SplitString(CollapseWhitespace(lines[i], false), ' ', &columns); |
174 | 175 |
175 // Some FTP servers put a "total n" line at the beginning of the listing | 176 // Some FTP servers put a "total n" line at the beginning of the listing |
176 // (n is an integer). Allow such a line, but only once, and only if it's | 177 // (n is an integer). Allow such a line, but only once, and only if it's |
177 // the first non-empty line. Do not match the word exactly, because it may | 178 // the first non-empty line. Do not match the word exactly, because it may |
178 // be in different languages (at least English and German have been seen | 179 // be in different languages (at least English and German have been seen |
179 // in the field). | 180 // in the field). |
180 if (columns.size() == 2 && !received_total_line) { | 181 if (columns.size() == 2 && !received_total_line) { |
181 received_total_line = true; | 182 received_total_line = true; |
182 | 183 |
183 int total_number; | 184 int64 total_number; |
184 if (!base::StringToInt(columns[1], &total_number)) | 185 if (!base::StringToInt64(columns[1], &total_number)) |
185 return false; | 186 return false; |
186 if (total_number < 0) | 187 if (total_number < 0) |
187 return false; | 188 return false; |
188 | 189 |
189 continue; | 190 continue; |
190 } | 191 } |
191 | 192 |
192 FtpDirectoryListingEntry entry; | 193 FtpDirectoryListingEntry entry; |
193 | 194 |
194 size_t column_offset; | 195 size_t column_offset; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 entry.name = entry.name.substr(0, pos); | 259 entry.name = entry.name.substr(0, pos); |
259 } | 260 } |
260 | 261 |
261 entries->push_back(entry); | 262 entries->push_back(entry); |
262 } | 263 } |
263 | 264 |
264 return true; | 265 return true; |
265 } | 266 } |
266 | 267 |
267 } // namespace net | 268 } // namespace net |
OLD | NEW |