You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2014/12/10 02:57:43 UTC
svn commit: r1644305 - in /commons/proper/net/trunk/src: changes/changes.xml
main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java
test/java/org/apache/commons/net/ftp/parser/MLSxEntryParserTest.java
Author: sebb
Date: Wed Dec 10 01:57:43 2014
New Revision: 1644305
URL: http://svn.apache.org/r1644305
Log:
NET-563 MLSxEntryParser needs test cases; parsing is too lax
Added:
commons/proper/net/trunk/src/test/java/org/apache/commons/net/ftp/parser/MLSxEntryParserTest.java
Modified:
commons/proper/net/trunk/src/changes/changes.xml
commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java
Modified: commons/proper/net/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/changes/changes.xml?rev=1644305&r1=1644304&r2=1644305&view=diff
==============================================================================
--- commons/proper/net/trunk/src/changes/changes.xml [utf-8] (original)
+++ commons/proper/net/trunk/src/changes/changes.xml [utf-8] Wed Dec 10 01:57:43 2014
@@ -68,6 +68,9 @@ This is mainly a bug-fix release. See fu
IMAPExportMbox (example app) allows IMAP folders to be exported into an mbox file.
This is the inverse of the IMAPImportMbox example added previously
">
+ <action issue="NET-563" type="fix" dev="sebb">
+ MLSxEntryParser needs test cases; parsing is too lax
+ </action>
<action issue="NET-561" type="fix" dev="sebb">
FTPFile.toFormattedString prints user and group in wrong order
</action>
Modified: commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java?rev=1644305&r1=1644304&r2=1644305&view=diff
==============================================================================
--- commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java (original)
+++ commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/parser/MLSxEntryParser.java Wed Dec 10 01:57:43 2014
@@ -93,25 +93,43 @@ public class MLSxEntryParser extends FTP
// @Override
public FTPFile parseFTPEntry(String entry) {
+ if (entry.startsWith(" ")) {// leading space means no facts are present
+ if (entry.length() > 1) { // is there a path name?
+ FTPFile file = new FTPFile();
+ file.setRawListing(entry);
+ file.setName(entry.substring(1));
+ return file;
+ } else {
+ return null; // Invalid - no pathname
+ }
+
+ }
String parts[] = entry.split(" ",2); // Path may contain space
- if (parts.length != 2) {
+ if (parts.length != 2 || parts[1].length() == 0) {
+ return null; // no space found or no file name
+ }
+ final String factList = parts[0];
+ if (!factList.endsWith(";")) {
return null;
}
FTPFile file = new FTPFile();
file.setRawListing(entry);
file.setName(parts[1]);
- String[] facts = parts[0].split(";");
+ String[] facts = factList.split(";");
boolean hasUnixMode = parts[0].toLowerCase(Locale.ENGLISH).contains("unix.mode=");
for(String fact : facts) {
- String []factparts = fact.split("=");
+ String []factparts = fact.split("=", -1); // Don't drop empty values
// Sample missing permission
// drwx------ 2 mirror mirror 4096 Mar 13 2010 subversion
// modify=20100313224553;perm=;type=dir;unique=811U282598;UNIX.group=500;UNIX.mode=0700;UNIX.owner=500; subversion
if (factparts.length != 2) {
- continue; // nothing to do here
+ return null; // invalid - there was no "=" sign
}
String factname = factparts[0].toLowerCase(Locale.ENGLISH);
String factvalue = factparts[1];
+ if (factvalue.length() == 0) {
+ continue; // nothing to see here
+ }
String valueLowerCase = factvalue.toLowerCase(Locale.ENGLISH);
if ("size".equals(factname)) {
file.setSize(Long.parseLong(factvalue));
@@ -132,10 +150,10 @@ public class MLSxEntryParser extends FTP
GregorianCalendar gc = new GregorianCalendar(GMT);
try {
gc.setTime(sdf.parse(factvalue));
+ file.setTimestamp(gc);
} catch (ParseException e) {
// TODO ??
}
- file.setTimestamp(gc);
}
else if ("type".equals(factname)) {
Integer intType = TYPE_TO_INT.get(valueLowerCase);
Added: commons/proper/net/trunk/src/test/java/org/apache/commons/net/ftp/parser/MLSxEntryParserTest.java
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/test/java/org/apache/commons/net/ftp/parser/MLSxEntryParserTest.java?rev=1644305&view=auto
==============================================================================
--- commons/proper/net/trunk/src/test/java/org/apache/commons/net/ftp/parser/MLSxEntryParserTest.java (added)
+++ commons/proper/net/trunk/src/test/java/org/apache/commons/net/ftp/parser/MLSxEntryParserTest.java Wed Dec 10 01:57:43 2014
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.net.ftp.parser;
+
+import org.apache.commons.net.ftp.FTPFile;
+import org.apache.commons.net.ftp.FTPFileEntryParser;
+
+/**
+ * @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
+ * @version $Id: UnixFTPEntryParserTest.java 1643407 2014-12-05 19:32:00Z sebb $
+ */
+public class MLSxEntryParserTest extends FTPParseTestFramework {
+
+ private static final String[] badsamples = {
+ "Type=cdir;Modify=20141022065101;UNIX.mode=0775;/no/space", // no space between facts and name
+ "Type=cdir;Modify=20141022065103;UNIX.mode=0775;", // no name or space
+ "/no/leading/space",
+ "", //empty
+ "Type=cdir;Modify=20141022065102;UNIX.mode=0775; ", // no name
+ "Type=dir;Size; missing =size",
+ "Type=dir missing-semicolon",
+ "Type= missing value and semicolon",
+ " ", // no path
+ };
+
+ private static final String[] goodsamples = {
+ "Type=cdir;Modify=20141022065102;UNIX.mode=0775; /commons/net",
+ "Type=pdir;Modify=20141205180002;UNIX.mode=0775; /commons",
+ "Type=file;Size=431;Modify=20130303210732;UNIX.mode=0664; HEADER.html",
+ "Type=file;Size=1880;Modify=20130611172748;UNIX.mode=0664; README.html",
+ "Type=file;Size=2364;Modify=20130611170131;UNIX.mode=0664; RELEASE-NOTES.txt",
+ "Type=dir;Modify=20141022065102;UNIX.mode=0775; binaries",
+ "Type=dir;Modify=20141022065102.999;UNIX.mode=0775; source",
+ " /no/facts", // no facts
+ "Type=; /empty/fact",
+ "Size=; /empty/size",
+ " Type=cdir;Modify=20141022065102;UNIX.mode=0775; /leading/space", // leading space before facts => it's a file name!
+ " ", // pathname of space
+ };
+
+ public MLSxEntryParserTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected String[] getBadListing() {
+ return (badsamples);
+ }
+
+ @Override
+ protected String[] getGoodListing() {
+ return (goodsamples);
+ }
+
+
+ @Override
+ protected FTPFileEntryParser getParser() {
+ return (MLSxEntryParser.getInstance());
+ }
+
+ /**
+ * Check if FTPFile entry parsing failed; i.e. if entry is null.
+ * We override parent check, as a null timestamp is not acceptable
+ * for these tests.
+ *
+ * @param f FTPFile entry - may be null
+ * @return null if f is null
+ */
+ @Override
+ protected FTPFile nullFileOrNullDate(FTPFile f) {
+ return f;
+ }
+
+// @Override
+ public void testParseFieldsOnFile() throws Exception {
+ }
+
+// @Override
+ public void testParseFieldsOnDirectory() throws Exception {
+ }
+}