Home | History | Annotate | Download | only in ftp
      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 
     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 
     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