You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/10/04 18:32:20 UTC

svn commit: r1004318 - in /james/imap/trunk: api/src/main/java/org/apache/james/imap/api/ message/src/main/java/org/apache/james/imap/decode/base/ message/src/test/java/org/apache/james/imap/decode/main/

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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org