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/string_number_conversions.h"
     10 #include "base/string_split.h"
     11 #include "base/string_util.h"
     12 #include "base/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 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<string16>& lines,
     40     const base::Time& current_time,
     41     std::vector<FtpDirectoryListingEntry>* entries) {
     42   if (!lines.empty() && !StartsWith(lines[0], ASCIIToUTF16("total "), true))
     43     return false;
     44 
     45   for (size_t i = 1U; i < lines.size(); i++) {
     46     if (lines[i].empty())
     47       continue;
     48 
     49     std::vector<string16> columns;
     50     base::SplitString(CollapseWhitespace(lines[i], false), ' ', &columns);
     51 
     52     if (columns.size() != 8)
     53       return false;
     54 
     55     FtpDirectoryListingEntry entry;
     56 
     57     if (columns[0].length() != 1)
     58       return false;
     59     if (columns[0][0] == 'd') {
     60       entry.type = FtpDirectoryListingEntry::DIRECTORY;
     61     } else if (columns[0][0] == '-') {
     62       entry.type = FtpDirectoryListingEntry::FILE;
     63     } else {
     64       return false;
     65     }
     66 
     67     // Note: on older Netware systems the permissions listing is in the same
     68     // column as the entry type (just there is no space between them). We do not
     69     // support the older format here for simplicity.
     70     if (!LooksLikeNetwarePermissionsListing(columns[1]))
     71       return false;
     72 
     73     if (!base::StringToInt64(columns[3], &entry.size))
     74       return false;
     75     if (entry.size < 0)
     76       return false;
     77     if (entry.type != FtpDirectoryListingEntry::FILE)
     78       entry.size = -1;
     79 
     80     // Netware uses the same date listing format as Unix "ls -l".
     81     if (!FtpUtil::LsDateListingToTime(columns[4], columns[5], columns[6],
     82                                       current_time, &entry.last_modified)) {
     83       return false;
     84     }
     85 
     86     entry.name = columns[7];
     87 
     88     entries->push_back(entry);
     89   }
     90 
     91   return true;
     92 }
     93 
     94 }  // namespace net
     95