Author: norman Date: Mon Sep 13 17:24:14 2010 New Revision: 996607 URL: http://svn.apache.org/viewvc?rev=996607&view=rev Log: Use BAD response for invalid messageset (IMAP-209)
Added: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MessageRangeException.java Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java?rev=996607&r1=996606&r2=996607&view=diff ============================================================================== --- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java (original) +++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java Mon Sep 13 17:24:14 2010 @@ -55,6 +55,10 @@ public class HumanReadableText { "org.apache.james.imap.GENERIC_SUBSCRIPTION_FAILURE", "Cannot subscribe."); + public static final HumanReadableText INVALID_MESSAGESET = new HumanReadableText( + "org.apache.james.imap.INVALID_MESSAGESET", + "failed. Invalid messageset."); + public static final HumanReadableText INVALID_COMMAND = new HumanReadableText( "org.apache.james.imap.INVALID_COMMAND", "failed. Command not valid in this state."); Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java?rev=996607&r1=996606&r2=996607&view=diff ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java (original) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java Mon Sep 13 17:24:14 2010 @@ -42,6 +42,7 @@ import org.apache.james.imap.message.res import org.apache.james.imap.message.response.RecentResponse; import org.apache.james.imap.processor.base.AbstractChainedProcessor; import org.apache.james.imap.processor.base.ImapSessionUtils; +import org.apache.james.imap.processor.base.MessageRangeException; import org.apache.james.mailbox.MailboxConstants; import org.apache.james.mailbox.MailboxException; import org.apache.james.mailbox.MailboxManager; @@ -369,18 +370,20 @@ abstract public class AbstractMailboxPro * @return * @throws MailboxException */ - protected MessageRange messageRange(SelectedMailbox selected, IdRange range, boolean useUids) throws MailboxException{ - long lowVal = range.getLowVal(); + protected MessageRange messageRange(SelectedMailbox selected, IdRange range, boolean useUids) throws MessageRangeException { + long lowVal = range.getLowVal(); long highVal = range.getHighVal(); - if (useUids == false) { - if (lowVal != Long.MAX_VALUE) { + if (useUids == false) { + if (lowVal != Long.MAX_VALUE) { lowVal = selected.uid((int) lowVal); - if (lowVal == SelectedMailbox.NO_SUCH_MESSAGE) throw new MailboxException("No message found with msn " + lowVal); - } - if (highVal != Long.MAX_VALUE) { + if (lowVal == SelectedMailbox.NO_SUCH_MESSAGE) + throw new MessageRangeException("No message found with msn " + lowVal); + } + if (highVal != Long.MAX_VALUE) { highVal = selected.uid((int) highVal); - if (highVal == SelectedMailbox.NO_SUCH_MESSAGE) throw new MailboxException("No message found with msn " + highVal); - } + if (highVal == SelectedMailbox.NO_SUCH_MESSAGE) + throw new MessageRangeException("No message found with msn " + highVal); + } } MessageRange mRange = MessageRange.range(lowVal, highVal); return mRange; Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java?rev=996607&r1=996606&r2=996607&view=diff ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java (original) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java Mon Sep 13 17:24:14 2010 @@ -31,6 +31,7 @@ import org.apache.james.imap.api.process import org.apache.james.imap.api.process.SelectedMailbox; import org.apache.james.imap.message.request.CopyRequest; import org.apache.james.imap.processor.base.ImapSessionUtils; +import org.apache.james.imap.processor.base.MessageRangeException; import org.apache.james.mailbox.MailboxException; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxPath; @@ -74,6 +75,8 @@ public class CopyProcessor extends Abstr unsolicitedResponses(session, responder, useUids); okComplete(command, tag, responder); } + } catch (MessageRangeException e) { + taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET); } catch (MailboxException e) { no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING); } Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java?rev=996607&r1=996606&r2=996607&view=diff ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java (original) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java Mon Sep 13 17:24:14 2010 @@ -42,6 +42,7 @@ import org.apache.james.imap.api.process import org.apache.james.imap.message.request.SearchRequest; import org.apache.james.imap.message.response.SearchResponse; import org.apache.james.imap.processor.base.ImapSessionUtils; +import org.apache.james.imap.processor.base.MessageRangeException; import org.apache.james.mailbox.MailboxException; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MessageManager; @@ -77,6 +78,8 @@ public class SearchProcessor extends Abs boolean omitExpunged = (!useUids); unsolicitedResponses(session, responder, omitExpunged, useUids); okComplete(command, tag, responder); + } catch (MessageRangeException e) { + taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET); } catch (MailboxException e) { no(command, tag, responder, HumanReadableText.SEARCH_FAILED); } @@ -94,7 +97,7 @@ public class SearchProcessor extends Abs private Collection<Long> findIds(final boolean useUids, final ImapSession session, MessageManager mailbox, final SearchQuery query) - throws MailboxException { + throws MailboxException, MessageRangeException { final Iterator<Long> it = mailbox.search(query, ImapSessionUtils .getMailboxSession(session)); @@ -107,7 +110,7 @@ public class SearchProcessor extends Abs number = new Long(uid); } else { final int msn = session.getSelected().msn(uid); - if (msn == SelectedMailbox.NO_SUCH_MESSAGE) throw new MailboxException("No message found with uid " + uid); + if (msn == SelectedMailbox.NO_SUCH_MESSAGE) throw new MessageRangeException("No message found with uid " + uid); number = new Long(msn); } results.add(number); @@ -115,7 +118,7 @@ public class SearchProcessor extends Abs return results; } - private SearchQuery toQuery(final SearchKey key, final ImapSession session) throws MailboxException { + private SearchQuery toQuery(final SearchKey key, final ImapSession session) throws MessageRangeException { final SearchQuery result = new SearchQuery(); final SelectedMailbox selected = session.getSelected(); if (selected != null) { @@ -127,7 +130,7 @@ public class SearchProcessor extends Abs } private SearchQuery.Criterion toCriterion(final SearchKey key, - final ImapSession session) throws MailboxException { + final ImapSession session) throws MessageRangeException { final int type = key.getType(); final DayMonthYear date = key.getDate(); switch (type) { @@ -225,7 +228,7 @@ public class SearchProcessor extends Abs } private Criterion sequence(IdRange[] sequenceNumbers, - final ImapSession session, boolean msn) throws MailboxException { + final ImapSession session, boolean msn) throws MessageRangeException { final int length = sequenceNumbers.length; final SearchQuery.NumericRange[] ranges = new SearchQuery.NumericRange[length]; for (int i = 0; i < length; i++) { @@ -241,14 +244,14 @@ public class SearchProcessor extends Abs } else { final int highMsn = (int) highVal; highUid = selected.uid(highMsn); - if (highUid == -1) throw new MailboxException("No message found with msn " + highMsn); + if (highUid == -1) throw new MessageRangeException("No message found with msn " + highMsn); } if (lowVal == Long.MAX_VALUE) { lowUid = Long.MAX_VALUE; } else { final int lowMsn = (int) lowVal; lowUid = selected.uid(lowMsn); - if (highUid == -1) throw new MailboxException("No message found with msn " + lowUid); + if (highUid == -1) throw new MessageRangeException("No message found with msn " + lowUid); } } else { @@ -260,7 +263,7 @@ public class SearchProcessor extends Abs return SearchQuery.uid(ranges); } - private Criterion or(List<SearchKey> keys, final ImapSession session) throws MailboxException { + private Criterion or(List<SearchKey> keys, final ImapSession session) throws MessageRangeException { final SearchKey keyOne = keys.get(0); final SearchKey keyTwo = keys.get(1); final Criterion criterionOne = toCriterion(keyOne, session); @@ -269,14 +272,14 @@ public class SearchProcessor extends Abs return result; } - private Criterion not(List<SearchKey> keys, final ImapSession session) throws MailboxException { + private Criterion not(List<SearchKey> keys, final ImapSession session) throws MessageRangeException { final SearchKey key = keys.get(0); final Criterion criterion = toCriterion(key, session); final Criterion result = SearchQuery.not(criterion); return result; } - private Criterion and(List<SearchKey> keys, final ImapSession session) throws MailboxException { + private Criterion and(List<SearchKey> keys, final ImapSession session) throws MessageRangeException { final int size = keys.size(); final List<Criterion> criteria = new ArrayList<Criterion>(size); for (final SearchKey key:keys) { Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java?rev=996607&r1=996606&r2=996607&view=diff ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java (original) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java Mon Sep 13 17:24:14 2010 @@ -35,6 +35,7 @@ import org.apache.james.imap.api.process import org.apache.james.imap.message.request.StoreRequest; import org.apache.james.imap.message.response.FetchResponse; import org.apache.james.imap.processor.base.ImapSessionUtils; +import org.apache.james.imap.processor.base.MessageRangeException; import org.apache.james.mailbox.MailboxException; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; @@ -111,6 +112,8 @@ public class StoreProcessor extends Abst final boolean omitExpunged = (!useUids); unsolicitedResponses(session, responder, omitExpunged, useUids); okComplete(command, tag, responder); + } catch (MessageRangeException e) { + taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET); } catch (MailboxException e) { no(command, tag, responder, HumanReadableText.SAVE_FAILED); } Added: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MessageRangeException.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MessageRangeException.java?rev=996607&view=auto ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MessageRangeException.java (added) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MessageRangeException.java Mon Sep 13 17:24:14 2010 @@ -0,0 +1,29 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.imap.processor.base; + +import javax.mail.MessagingException; + +public class MessageRangeException extends MessagingException{ + + public MessageRangeException(String msg) { + super(msg); + } +} Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java?rev=996607&r1=996606&r2=996607&view=diff ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java (original) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java Mon Sep 13 17:24:14 2010 @@ -38,6 +38,7 @@ import org.apache.james.imap.message.req import org.apache.james.imap.message.response.FetchResponse; import org.apache.james.imap.processor.AbstractMailboxProcessor; import org.apache.james.imap.processor.base.ImapSessionUtils; +import org.apache.james.imap.processor.base.MessageRangeException; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageManager; @@ -102,6 +103,8 @@ public class FetchProcessor extends Abst } catch (UnsupportedCriteriaException e) { no(command, tag, responder, HumanReadableText.UNSUPPORTED_SEARCH_CRITERIA); + } catch (MessageRangeException e) { + taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET); } catch (MessagingException e) { no(command, tag, responder, HumanReadableText.SEARCH_FAILED); } catch (ParseException e) { Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java?rev=996607&r1=996606&r2=996607&view=diff ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java (original) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java Mon Sep 13 17:24:14 2010 @@ -37,6 +37,7 @@ import org.apache.james.imap.api.process import org.apache.james.imap.api.process.SelectedMailbox; import org.apache.james.imap.message.response.FetchResponse; import org.apache.james.imap.processor.base.ImapSessionUtils; +import org.apache.james.imap.processor.base.MessageRangeException; import org.apache.james.mailbox.Content; import org.apache.james.mailbox.MailboxException; import org.apache.james.mailbox.MailboxSession; @@ -105,7 +106,7 @@ final class FetchResponseBuilder { final long resultUid = result.getUid(); final int resultMsn = selected.msn(resultUid); - if (resultMsn == SelectedMailbox.NO_SUCH_MESSAGE) throw new MailboxException("No such message found with uid " + resultUid); + if (resultMsn == SelectedMailbox.NO_SUCH_MESSAGE) throw new MessageRangeException("No such message found with uid " + resultUid); setMsn(resultMsn); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org