Fixing issue where we returned timestamps in the local time zone rather than UTC as required by the RFC (FTPSERVER-330)
git-svn-id: https://svn.apache.org/repos/asf/mina/ftpserver/trunk@818387 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/core/src/main/java/org/apache/ftpserver/util/DateUtils.java b/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
index 76b3f33..e792eda 100644
--- a/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
+++ b/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
@@ -36,6 +36,8 @@
*/
public class DateUtils {
+ private static final TimeZone TIME_ZONE_UTC = TimeZone.getTimeZone("UTC");
+
private final static String[] MONTHS = { "Jan", "Feb", "Mar", "Apr", "May",
"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
@@ -64,7 +66,7 @@
}
StringBuffer sb = new StringBuffer(16);
- Calendar cal = new GregorianCalendar();
+ Calendar cal = new GregorianCalendar(TIME_ZONE_UTC);
cal.setTimeInMillis(millis);
// month
@@ -112,7 +114,7 @@
*/
public final static String getISO8601Date(long millis) {
StringBuffer sb = new StringBuffer(19);
- Calendar cal = new GregorianCalendar();
+ Calendar cal = new GregorianCalendar(TIME_ZONE_UTC);
cal.setTimeInMillis(millis);
// year
@@ -166,8 +168,9 @@
*/
public final static String getFtpDate(long millis) {
StringBuffer sb = new StringBuffer(20);
- Calendar cal = new GregorianCalendar();
+ Calendar cal = new GregorianCalendar(TIME_ZONE_UTC);
cal.setTimeInMillis(millis);
+
// year
sb.append(cal.get(Calendar.YEAR));
diff --git a/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java b/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java
index ac8aae8..53920ce 100644
--- a/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java
+++ b/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java
@@ -21,7 +21,9 @@
import java.io.File;
import java.text.SimpleDateFormat;
+import java.util.Calendar;
import java.util.Date;
+import java.util.TimeZone;
/**
*
@@ -31,7 +33,10 @@
public class MDTMTest extends ClientTestTemplate {
private static final SimpleDateFormat FTP_DATE_FORMAT = new SimpleDateFormat(
"yyyyMMddHHmmss.SSS");
-
+ static {
+ FTP_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+ }
+
private static final File TEST_FILE1 = new File(ROOT_DIR, "test1.txt");
private static final File TEST_DIR1 = new File(ROOT_DIR, "dir1");
@@ -51,11 +56,15 @@
assertFalse(TEST_FILE1.exists());
assertTrue(TEST_FILE1.createNewFile());
- Date expected = new Date(TEST_FILE1.lastModified());
+ Calendar expected = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ expected.clear();
+ expected.setTimeInMillis(TEST_FILE1.lastModified());
assertEquals(213, client.sendCommand("MDTM " + TEST_FILE1.getName()));
- Date actual = FTP_DATE_FORMAT.parse(client.getReplyString()
- .substring(4).trim());
+ Calendar actual = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ actual.clear();
+ actual.setTime(FTP_DATE_FORMAT.parse(client.getReplyString()
+ .substring(4).trim()));
assertEquals(expected, actual);
}
diff --git a/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java b/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
index 606b5f2..a1afaad 100644
--- a/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
+++ b/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
@@ -22,8 +22,9 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.util.Date;
+import java.util.Calendar;
import java.util.List;
+import java.util.TimeZone;
import junit.framework.TestCase;
@@ -38,7 +39,11 @@
@SuppressWarnings("deprecation")
public class MLSTFileFormaterTest extends TestCase {
- private static final Date LAST_MODIFIED_IN_2005 = new Date(105, 1, 2, 3, 4);
+ private static final Calendar LAST_MODIFIED_IN_2005 = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
+ static {
+ LAST_MODIFIED_IN_2005.clear();
+ LAST_MODIFIED_IN_2005.set(2005, Calendar.JANUARY, 2, 3, 4, 5);
+ }
private static final FtpFile TEST_FILE = new MockFileObject();
@@ -70,7 +75,7 @@
}
public long getLastModified() {
- return LAST_MODIFIED_IN_2005.getTime();
+ return LAST_MODIFIED_IN_2005.getTimeInMillis();
}
public int getLinkCount() {
@@ -136,7 +141,8 @@
}
public void testSingleFile() {
- assertEquals("Size=13;Modify=20050202030400.000;Type=file; short\r\n",
+ // time should be in UTC
+ assertEquals("Size=13;Modify=20050102030405.000;Type=file; short\r\n",
formater.format(TEST_FILE));
}
@@ -156,8 +162,8 @@
};
- assertEquals("Size=0;Modify=20050202030400.000;Type=dir; short\r\n",
+ // time should be in UTC
+ assertEquals("Size=0;Modify=20050102030405.000;Type=dir; short\r\n",
formater.format(dir));
}
-
}
\ No newline at end of file
diff --git a/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java b/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
index 6777bb1..c96432b 100644
--- a/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
+++ b/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
@@ -106,7 +106,7 @@
int getLinkCount();
/**
- * Get last modified time.
+ * Get last modified time in UTC.
* @return The timestamp of the last modified time for the {@link FtpFile}
*/
long getLastModified();