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]