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]

Reply via email to