Author: rdonkin
Date: Sun Nov 4 10:11:59 2007
New Revision: 591811
URL: http://svn.apache.org/viewvc?rev=591811&view=rev
Log:
Added some checks on the input.
Modified:
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/decode/DecoderUtils.java
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/DecoderUtilsTest.java
Modified:
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/decode/DecoderUtils.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/decode/DecoderUtils.java?rev=591811&r1=591810&r2=591811&view=diff
==============================================================================
---
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/decode/DecoderUtils.java
(original)
+++
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/decode/DecoderUtils.java
Sun Nov 4 10:11:59 2007
@@ -85,47 +85,72 @@
* @throws ProtocolException when this conversion fails
*/
public static final Date decodeDateTime(CharSequence chars) throws
ProtocolException {
- final char dayHigh = chars.charAt(0);
- final char dayLow = chars.charAt(1);
- final int day = decodeFixedDay(dayHigh, dayLow);
-
- final char monthFirstChar = chars.charAt(3);
- final char monthSecondChar = chars.charAt(4);
- final char monthThirdChar = chars.charAt(5);
- final int month = decodeMonth(monthFirstChar, monthSecondChar,
monthThirdChar);
-
- final char milleniumChar = chars.charAt(7);
- final char centuryChar = chars.charAt(8);
- final char decadeChar = chars.charAt(9);
- final char yearChar = chars.charAt(10);
- final int year = decodeYear(milleniumChar, centuryChar, decadeChar,
yearChar);
-
- final char zoneDeterminent = chars.charAt(21);
- final char zoneDigitOne = chars.charAt(22);
- final char zoneDigitTwo = chars.charAt(23);
- final char zoneDigitThree = chars.charAt(24);
- final char zoneDigitFour = chars.charAt(25);
- final int offset = decodeZone(zoneDeterminent, zoneDigitOne,
zoneDigitTwo, zoneDigitThree, zoneDigitFour);
-
- final char hourHigh = chars.charAt(12);
- final char hourLow = chars.charAt(13);
- final int hour = applyHourOffset(offset, decodeNumber(hourHigh,
hourLow));
-
- final char minuteHigh = chars.charAt(15);
- final char minuteLow = chars.charAt(16);
- final int minute = applyMinuteOffset(offset, decodeNumber(minuteHigh,
minuteLow));
-
- final char secondHigh = chars.charAt(18);
- final char secondLow = chars.charAt(19);
- final int second = decodeNumber(secondHigh, secondLow);
+ if (isDateTime(chars)) {
+ final char dayHigh = chars.charAt(0);
+ final char dayLow = chars.charAt(1);
+ final int day = decodeFixedDay(dayHigh, dayLow);
+
+ final char monthFirstChar = chars.charAt(3);
+ final char monthSecondChar = chars.charAt(4);
+ final char monthThirdChar = chars.charAt(5);
+ final int month = decodeMonth(monthFirstChar, monthSecondChar,
monthThirdChar);
+
+ final char milleniumChar = chars.charAt(7);
+ final char centuryChar = chars.charAt(8);
+ final char decadeChar = chars.charAt(9);
+ final char yearChar = chars.charAt(10);
+ final int year = decodeYear(milleniumChar, centuryChar,
decadeChar, yearChar);
+
+ final char zoneDeterminent = chars.charAt(21);
+ final char zoneDigitOne = chars.charAt(22);
+ final char zoneDigitTwo = chars.charAt(23);
+ final char zoneDigitThree = chars.charAt(24);
+ final char zoneDigitFour = chars.charAt(25);
+ final int offset = decodeZone(zoneDeterminent, zoneDigitOne,
zoneDigitTwo, zoneDigitThree, zoneDigitFour);
+
+ final char hourHigh = chars.charAt(12);
+ final char hourLow = chars.charAt(13);
+ final int hour = applyHourOffset(offset, decodeNumber(hourHigh,
hourLow));
+
+ final char minuteHigh = chars.charAt(15);
+ final char minuteLow = chars.charAt(16);
+ final int minute = applyMinuteOffset(offset,
decodeNumber(minuteHigh, minuteLow));
+
+ final char secondHigh = chars.charAt(18);
+ final char secondLow = chars.charAt(19);
+ final int second = decodeNumber(secondHigh, secondLow);
+
+ final GregorianCalendar calendar = new
GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.US);
+ calendar.clear();
+ calendar.set(year, month, day, hour, minute, second);
+ final Date result = calendar.getTime();
+ return result;
+ } else {
+ final String message;
+ if (chars == null) {
+ message = "Expected a date-time but was nothing.";
+ } else {
+ message = new StringBuffer("Expected a date-time but was ").
append(chars).toString();
+ }
- final GregorianCalendar calendar = new
GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.US);
- calendar.clear();
- calendar.set(year, month, day, hour, minute, second);
- final Date result = calendar.getTime();
- return result;
+ throw new ProtocolException(message);
+ }
+
}
+ private static boolean isDateTime(CharSequence chars) {
+ final boolean result;
+ if (chars == null) {
+ result = false;
+ } else if (chars.length() < 20) {
+ // Be liberal in what you accept
+ result = false;
+ } else {
+ result =true;
+ }
+ return result;
+ }
+
private static int applyMinuteOffset(final int offset, final int minutes) {
final int result = minutes - ((Math.abs(offset) % 100) * (int)
Math.signum(offset));
return result;
Modified:
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/DecoderUtilsTest.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/DecoderUtilsTest.java?rev=591811&r1=591810&r2=591811&view=diff
==============================================================================
---
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/DecoderUtilsTest.java
(original)
+++
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/DecoderUtilsTest.java
Sun Nov 4 10:11:59 2007
@@ -64,6 +64,48 @@
assertTrue("Extension flags should be added",
flags.contains(EXTENSION_FLAG));
}
+ public void testBadDateTime() throws Exception {
+ checkDateTime(null);
+ checkDateTime("");
+ checkDateTime("This is a string long enough to be too big");
+ checkDateTime("1");
+ checkDateTime("12");
+ checkDateTime("123");
+ checkDateTime("1234");
+ checkDateTime("12345");
+ checkDateTime("123456");
+ checkDateTime("1234567");
+ checkDateTime("12345678");
+ checkDateTime("123456789");
+ checkDateTime("1234567890");
+ checkDateTime("12345678901");
+ checkDateTime("123456789012");
+ checkDateTime("1234567890123");
+ checkDateTime("12345678901234");
+ checkDateTime("123456789012345");
+ checkDateTime("1234567890123456");
+ checkDateTime("12345678901234567");
+ checkDateTime("123456789012345678");
+ checkDateTime("1234567890123456789");
+ checkDateTime("12345678901234567890");
+ checkDateTime("123456789012345678901");
+ checkDateTime("1234567890123456789012");
+ checkDateTime("12345678901234567890123");
+ checkDateTime("123456789012345678901234");
+ checkDateTime("1234567890123456789012345");
+ checkDateTime("12345678901234567890123456");
+ checkDateTime("123456789012345678901234567");
+ }
+
+ private void checkDateTime(String datetime) throws Exception {
+ try {
+ DecoderUtils.decodeDateTime(datetime);
+ fail("Bad date-time" + datetime);
+ } catch (ProtocolException e) {
+ // expected
+ }
+ }
+
public void testSimpleDecodeDateTime() throws Exception {
assertEquals("21 Oct 1972 20:00:00 GMT",
DecoderUtils.decodeDateTime("21-Oct-1972 20:00:00 +0000").toGMTString());
assertEquals("21 Oct 1972 19:00:00 GMT",
DecoderUtils.decodeDateTime("21-Oct-1972 20:00:00 +0100").toGMTString());
@@ -162,7 +204,6 @@
private void dateDecode(String in, TimeZone zone) throws Exception {
Date date = DecoderUtils.decodeDateTime(in);
String out = formatAsImap(date, zone);
- System.out.println(out);
assertEquals("Round trip", in, out);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]