Author: dlat
Date: Thu Dec 4 15:05:54 2008
New Revision: 723482
URL: http://svn.apache.org/viewvc?rev=723482&view=rev
Log:
FTPSERVER-231 MFMT Commad does not work on file/path names that have one or
more white spaces
FTPSERVER-232 MFMT command always returns a 2XX reply even if the date could
not be set
FTPSERVER-234 TYPE command with no argument
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
Thu Dec 4 15:05:54 2008
@@ -20,11 +20,8 @@
package org.apache.ftpserver.command.impl;
import java.io.IOException;
-import java.text.DateFormat;
import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.Date;
-import java.util.TimeZone;
import org.apache.ftpserver.command.AbstractCommand;
import org.apache.ftpserver.ftplet.FtpFile;
@@ -33,6 +30,7 @@
import org.apache.ftpserver.impl.FtpIoSession;
import org.apache.ftpserver.impl.FtpServerContext;
import org.apache.ftpserver.impl.LocalizedFtpReply;
+import org.apache.ftpserver.util.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,7 +54,6 @@
final FtpServerContext context, final FtpRequest request)
throws IOException {
- DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
// reset state variables
session.resetState();
@@ -75,7 +72,7 @@
return;
}
- String[] arguments = argument.split(" ");
+ String[] arguments = argument.split(" ",2);
if(arguments.length != 2) {
session
@@ -90,12 +87,10 @@
}
String timestamp = arguments[0].trim();
-
- df.setLenient(false);
- df.setTimeZone(TimeZone.getTimeZone("GMT"));
-
+
try {
- Date time = df.parse(timestamp);
+
+ Date time = DateUtils.parseFTPDate(timestamp);
String fileName = arguments[1].trim();
@@ -133,9 +128,17 @@
return;
}
+ // check if we can set date and retrieve the actual date stored
for the file.
+ if (file.setLastModified(time.getTime())) {
+ // timestamp=DateUtils.getFtpDate(time.getTime());
+ }
+ // we couldn't set the date.
+ else{
+ session.write(LocalizedFtpReply.translate(session, request,
context,
+ FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN,
"MFMT",
+ fileName));
+ }
// all checks okay, lets go
- file.setLastModified(time.getTime());
-
session
.write(LocalizedFtpReply
.translate(
@@ -143,7 +146,7 @@
request,
context,
FtpReply.REPLY_213_FILE_STATUS,
- "MFMT", "ModifyTime=" + timestamp + " " +
fileName));
+ "MFMT", "Modify=" + timestamp + "; " + fileName));
return;
} catch (ParseException e) {
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
Thu Dec 4 15:05:54 2008
@@ -59,6 +59,17 @@
char type = 'A';
if (request.hasArgument()) {
type = request.getArgument().charAt(0);
+ }else{
+ // no type specified
+ session
+ .write(LocalizedFtpReply
+ .translate(
+ session,
+ request,
+ context,
+
FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
+ "TYPE", null));
+ return;
}
// set type
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
Thu Dec 4 15:05:54 2008
@@ -189,8 +189,8 @@
/**
* [EMAIL PROTECTED]
*/
- public void setLastModified(long time) {
- file.setLastModified(time);
+ public boolean setLastModified(long time) {
+ return file.setLastModified(time);
}
/**
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
Thu Dec 4 15:05:54 2008
@@ -19,8 +19,13 @@
package org.apache.ftpserver.util;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.Calendar;
+import java.util.Date;
import java.util.GregorianCalendar;
+import java.util.TimeZone;
/**
* <strong>Internal class, do not use directly.</strong>
@@ -35,6 +40,18 @@
private final static String[] MONTHS = { "Jan", "Feb", "Mar", "Apr", "May",
"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+ /*
+ * Creates the DateFormat object used to parse/format
+ * dates in FTP format.
+ */
+ private final static DateFormat createFTPDateFormat(){
+ DateFormat df=new SimpleDateFormat("yyyyMMddHHmmss");
+ df.setLenient(false);
+ df.setTimeZone(TimeZone.getTimeZone("GMT"));
+ return df;
+ }
+
/**
* Get unix style date string.
*/
@@ -199,4 +216,15 @@
sb.append(milli);
return sb.toString();
}
+ /*
+ * Parses a date in the format used by the FTP commands
+ * involving dates(MFMT, MDTM)
+ */
+ public final static Date parseFTPDate(String dateStr) throws
ParseException{
+ // TODO: Here we could use a single DateFormat (in a thread-safe way)
+ // instead of one per call
+ return createFTPDateFormat().parse(dateStr);
+
+ }
+
}
Modified:
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
(original)
+++
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
Thu Dec 4 15:05:54 2008
@@ -277,5 +277,6 @@
213.MFMT={output.msg}
+450.MFMT=Could not perform action on file {output.msg}.
501.MFMT.invalid=Command Not Implemented for the Specified Arguments
550.MFMT.filemissing=File missing {output.msg}
\ No newline at end of file
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
Thu Dec 4 15:05:54 2008
@@ -40,6 +40,8 @@
private static final File TEST_FILE_IN_DIR1 = new File(TEST_DIR1,
"test4.txt");
+ private static final File TEST_FILE_BLANK_SPACES=new File(ROOT_DIR,"my
test.txt");
+
private static final Calendar EXPECTED_TIME = new GregorianCalendar(2002,
6, 17, 21, 7, 15);
static {
@@ -53,11 +55,11 @@
assertTrue(TEST_FILE1.createNewFile());
assertTrue(TEST_DIR1.mkdir());
assertTrue(TEST_FILE_IN_DIR1.createNewFile());
-
+ assertTrue(TEST_FILE_BLANK_SPACES.createNewFile());
client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
}
-
+
public void testNoArgument() throws Exception {
// must return 500 or 501 errors
assertEquals(501, client.sendCommand("MFMT"));
@@ -69,8 +71,8 @@
}
public void testNoManyArguments() throws Exception {
- // must return 500 or 501 errors
- assertEquals(501, client.sendCommand("MFMT", "20020717210715 test1.txt
too many"));
+ // must return 550 errors as a filename can contain blank spaces
+ assertEquals(550, client.sendCommand("MFMT", "20020717210715 test1.txt
too many"));
}
public void testNonTimestampArgument() throws Exception {
@@ -127,5 +129,11 @@
assertEquals(EXPECTED_TIME.getTimeInMillis(),
TEST_FILE_IN_DIR1.lastModified());
}
+ @SuppressWarnings("deprecation")
+ public void testSetTimeFileWithSpaces() throws Exception{
+ assertEquals(213, client.sendCommand("MFMT", "20020717210715 my
test.txt"));
+
+
assertEquals(EXPECTED_TIME.getTimeInMillis(),TEST_FILE_BLANK_SPACES.lastModified());
+ }
}
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
Thu Dec 4 15:05:54 2008
@@ -130,9 +130,8 @@
return false;
}
- public void setLastModified(long time) {
- // TODO Auto-generated method stub
-
+ public boolean setLastModified(long time) {
+ return false;
}
}
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
Thu Dec 4 15:05:54 2008
@@ -126,8 +126,8 @@
return false;
}
- public void setLastModified(long time) {
- // TODO Auto-generated method stub
+ public boolean setLastModified(long time) {
+ return false;
}
}
Modified:
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
(original)
+++
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
Thu Dec 4 15:05:54 2008
@@ -122,8 +122,8 @@
return false;
}
- public void setLastModified(long time) {
- // TODO Auto-generated method stub
+ public boolean setLastModified(long time) {
+ return false;
}
}
Modified:
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
---
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
(original)
+++
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
Thu Dec 4 15:05:54 2008
@@ -116,7 +116,7 @@
* Set the last modified time stamp of a file
* @param time The last modified time, in milliseconds since the epoch.
See [EMAIL PROTECTED] File#setLastModified(long)}.
*/
- void setLastModified(long time);
+ boolean setLastModified(long time);
/**
* Get file size.