Author: norman
Date: Mon Oct  4 16:32:20 2010
New Revision: 1004318

URL: http://svn.apache.org/viewvc?rev=1004318&view=rev
Log:
Make sure nz-numbers are parsed as stated in the spec (IMAP-221)

Modified:
    
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
    
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java

Modified: 
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java?rev=1004318&r1=1004317&r2=1004318&view=diff
==============================================================================
--- 
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java 
(original)
+++ 
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java 
Mon Oct  4 16:32:20 2010
@@ -244,4 +244,8 @@ public interface ImapConstants {
     public static final String FETCH_BODY = "BODY";
     
     public static final String STARTTLS = "STARTTLS";
+    
+    public static final long MAX_NZ_NUMBER = 4294967295L;
+    public static final long MIN_NZ_NUMBER = 1L;
+
 }

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java?rev=1004318&r1=1004317&r2=1004318&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
 Mon Oct  4 16:32:20 2010
@@ -600,14 +600,14 @@ public abstract class AbstractImapComman
         int pos = range.indexOf(':');
         try {
             if (pos == -1) {
-                long value = parseLong(range);
+                long value = parseUnsignedInteger(range);
                 return new IdRange(value);
             } else {
                
                // Make sure we detect the low and high value 
                // See https://issues.apache.org/jira/browse/IMAP-212
-                long val1 = parseLong(range.substring(0, pos));
-                long val2 = parseLong(range.substring(pos + 1));
+                long val1 = parseUnsignedInteger(range.substring(0, pos));
+                long val2 = parseUnsignedInteger(range.substring(pos + 1));
                 if (val1 <= val2 || val1 == Long.MAX_VALUE) {
                        return new IdRange(val1, val2);
                 } else {
@@ -619,11 +619,15 @@ public abstract class AbstractImapComman
         }
     }
 
-    private long parseLong(String value) {
+    private long  parseUnsignedInteger(String value) throws DecodingException{
         if (value.length() == 1 && value.charAt(0) == '*') {
             return Long.MAX_VALUE;
+        } else {
+               long number = Long.parseLong(value);
+               if (number < ImapConstants.MIN_NZ_NUMBER || number > 
ImapConstants.MAX_NZ_NUMBER) throw new 
DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid message set. 
Numbers must be unsigned 32-bit Integers");
+               return number;
+               
         }
-        return Long.parseLong(value);
     }
 
     /**

Modified: 
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java?rev=1004318&r1=1004317&r2=1004318&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java
 (original)
+++ 
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java
 Mon Oct  4 16:32:20 2010
@@ -23,8 +23,11 @@ import static org.junit.Assert.assertEqu
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 
+import junit.framework.Assert;
+
 import org.apache.commons.logging.Log;
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.decode.DecodingException;
@@ -67,7 +70,33 @@ public class IdRangeParseTest  {
                assertEquals(val2, ranges2[0].getHighVal());
        }
        
-       private String rangeAsString(int val1, int val2) {
+       @Test
+       public void testRangeUnsigned() throws DecodingException {
+               int val1 = 1;
+               
+               try {
+                       ranges(rangeAsString(0, val1));
+                       Assert.fail();
+               } catch (DecodingException e) {
+                       // number smaller then 1 should not work
+               }
+       
+               
+               try {
+                       ranges(rangeAsString(Long.MAX_VALUE, val1));
+                       Assert.fail();
+               } catch (DecodingException e) {
+                       // number smaller then 1 should not work
+               }
+               
+               IdRange[] ranges2 = 
ranges(rangeAsString(ImapConstants.MIN_NZ_NUMBER, ImapConstants.MAX_NZ_NUMBER));
+               assertEquals(1, ranges2.length);
+               assertEquals(ImapConstants.MIN_NZ_NUMBER, 
ranges2[0].getLowVal());
+               assertEquals(ImapConstants.MAX_NZ_NUMBER, 
ranges2[0].getHighVal());
+               
+       }
+       
+       private String rangeAsString(long val1, long val2) {
                return val1 + ":" + val2;
        }
        



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to