• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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.
4 
5 #include "net/ftp/ftp_directory_listing_parser_netware.h"
6 
7 #include <vector>
8 
9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_util.h"
11 #include "base/strings/string_split.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "net/ftp/ftp_directory_listing_parser.h"
14 #include "net/ftp/ftp_util.h"
15 
16 namespace {
17 
LooksLikeNetwarePermissionsListing(const base::string16 & text)18 bool LooksLikeNetwarePermissionsListing(const base::string16& text) {
19   if (text.length() != 10)
20     return false;
21 
22   if (text[0] != '[' || text[9] != ']')
23     return false;
24   return (text[1] == 'R' || text[1] == '-') &&
25          (text[2] == 'W' || text[2] == '-') &&
26          (text[3] == 'C' || text[3] == '-') &&
27          (text[4] == 'E' || text[4] == '-') &&
28          (text[5] == 'A' || text[5] == '-') &&
29          (text[6] == 'F' || text[6] == '-') &&
30          (text[7] == 'M' || text[7] == '-') &&
31          (text[8] == 'S' || text[8] == '-');
32 }
33 
34 }  // namespace
35 
36 namespace net {
37 
ParseFtpDirectoryListingNetware(const std::vector<base::string16> & lines,const base::Time & current_time,std::vector<FtpDirectoryListingEntry> * entries)38 bool ParseFtpDirectoryListingNetware(
39     const std::vector<base::string16>& lines,
40     const base::Time& current_time,
41     std::vector<FtpDirectoryListingEntry>* entries) {
42   if (!lines.empty() &&
43           !StartsWith(lines[0], base::ASCIIToUTF16("total "), true)) {
44     return false;
45   }
46 
47   for (size_t i = 1U; i < lines.size(); i++) {
48     if (lines[i].empty())
49       continue;
50 
51     std::vector<base::string16> columns;
52     base::SplitString(base::CollapseWhitespace(lines[i], false), ' ', &columns);
53 
54     if (columns.size() < 8)
55       return false;
56 
57     FtpDirectoryListingEntry entry;
58 
59     if (columns[0].length() != 1)
60       return false;
61     if (columns[0][0] == 'd') {
62       entry.type = FtpDirectoryListingEntry::DIRECTORY;
63     } else if (columns[0][0] == '-') {
64       entry.type = FtpDirectoryListingEntry::FILE;
65     } else {
66       return false;
67     }
68 
69     // Note: on older Netware systems the permissions listing is in the same
70     // column as the entry type (just there is no space between them). We do not
71     // support the older format here for simplicity.
72     if (!LooksLikeNetwarePermissionsListing(columns[1]))
73       return false;
74 
75     if (!base::StringToInt64(columns[3], &entry.size))
76       return false;
77     if (entry.size < 0)
78       return false;
79     if (entry.type != FtpDirectoryListingEntry::FILE)
80       entry.size = -1;
81 
82     // Netware uses the same date listing format as Unix "ls -l".
83     if (!FtpUtil::LsDateListingToTime(columns[4], columns[5], columns[6],
84                                       current_time, &entry.last_modified)) {
85       return false;
86     }
87 
88     entry.name = FtpUtil::GetStringPartAfterColumns(lines[i], 7);
89 
90     entries->push_back(entry);
91   }
92 
93   return true;
94 }
95 
96 }  // namespace net
97