From 3c42de2757205118d8e4a8fb9096313bc2c2fb16 Mon Sep 17 00:00:00 2001 From: Marcel May Date: Sun, 13 Feb 2022 01:47:34 +0100 Subject: [PATCH] IMAP COPY response contains COPYUID UIDVALIDITY of source instead of target folder (fixes #423) - Fix UIDVALIDITY to return destination value instead of source value - Refactor MoveCommand to re-use CopyCommand COPYUID response generation --- .../greenmail/imap/commands/CopyCommand.java | 20 ++++++++--------- .../greenmail/imap/commands/MoveCommand.java | 22 +------------------ 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/CopyCommand.java b/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/CopyCommand.java index bbe416c8c..ecb12262a 100644 --- a/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/CopyCommand.java +++ b/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/CopyCommand.java @@ -34,7 +34,7 @@ class CopyCommand extends SelectedStateCommand implements UidEnabledCommand { protected void doProcess(ImapRequestLineReader request, ImapResponse response, ImapSession session) - throws ProtocolException, FolderException { + throws ProtocolException, FolderException { doProcess(request, response, session, false); } @@ -43,7 +43,7 @@ public void doProcess(ImapRequestLineReader request, ImapResponse response, ImapSession session, boolean useUids) - throws ProtocolException, FolderException { + throws ProtocolException, FolderException { IdRange[] idSet = parser.parseIdRange(request); String mailboxName = parser.mailbox(request); parser.endLine(request); @@ -78,25 +78,25 @@ public void doProcess(ImapRequestLineReader request, } session.unsolicitedResponses(response); - response.commandComplete(this, generateCopyUidResponseCode(currentMailbox, copiedUidsOld, copiedUidsNew)); + response.commandComplete(this, generateCopyUidResponseCode(toFolder, copiedUidsOld, copiedUidsNew)); } /** * Generates COPYUID response code * (see http://tools.ietf.org/html/rfc2359) * using format : COPYUID UIDVALIDITY SOURCE-UIDS TARGET-UIDS. - * + *

* For example COPYUID 38505 304,319,320 3956,3957,3958 * - * @param currentMailbox imap folder which is target of copy command - * @param copiedUidsFrom List of source uids which was successfully copied - * @param copiedUidsTo List of message uids which was successfully copied + * @param destinationFolder imap folder which is target of copy command + * @param copiedUidsFrom List of source uids which was successfully copied + * @param copiedUidsTo List of message uids which was successfully copied * @return response code */ - private String generateCopyUidResponseCode(ImapSessionFolder currentMailbox, - List copiedUidsFrom, List copiedUidsTo) { + static String generateCopyUidResponseCode(MailFolder destinationFolder, + List copiedUidsFrom, List copiedUidsTo) { return "COPYUID" + SP + - currentMailbox.getUidValidity() + SP + + destinationFolder.getUidValidity() + SP + IdRange.uidsToRangeString(copiedUidsFrom) + SP + IdRange.uidsToRangeString(copiedUidsTo); } diff --git a/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/MoveCommand.java b/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/MoveCommand.java index b90b5d6d9..9319b5d4d 100644 --- a/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/MoveCommand.java +++ b/greenmail-core/src/main/java/com/icegreen/greenmail/imap/commands/MoveCommand.java @@ -84,29 +84,9 @@ public void doProcess(ImapRequestLineReader request, } if (useUids) { - response.okResponse(generateCopyUidResponseCode(toFolder, copiedUidsOld, copiedUidsNew), ""); + response.okResponse(CopyCommand.generateCopyUidResponseCode(toFolder, copiedUidsOld, copiedUidsNew), ""); } session.unsolicitedResponses(response); // EXPUNGE responses response.commandComplete(this); } - - /** - * Generates COPYUID response code - * (see http://tools.ietf.org/html/rfc2359) - * using format : COPYUID UIDVALIDITY SOURCE-UIDS TARGET-UIDS. - *

- * For example COPYUID 38505 304,319,320 3956,3957,3958 - * - * @param destinationFolder imap folder which is target of copy command - * @param copiedUidsFrom List of source uids which was successfully copied - * @param copiedUidsTo List of message uids which was successfully copied - * @return response code - */ - private String generateCopyUidResponseCode(MailFolder destinationFolder, - List copiedUidsFrom, List copiedUidsTo) { - return "COPYUID" + SP + - destinationFolder.getUidValidity() + SP + - IdRange.uidsToRangeString(copiedUidsFrom) + SP + - IdRange.uidsToRangeString(copiedUidsTo); - } }