This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 837299290848cdc11a90c2e73c4af549a0f1106f Author: Benoit Tellier <[email protected]> AuthorDate: Wed Feb 26 12:01:12 2020 +0700 JAMES-3074 Maildir: On the fly UidValidity sanitizing Impact: major. All the generated value are invalids. --- CHANGELOG.md | 1 + .../java/org/apache/james/mailbox/model/UidValidity.java | 2 +- .../task/SolveMailboxInconsistenciesServiceTest.java | 4 ++-- .../org/apache/james/mailbox/maildir/MaildirFolder.java | 10 +++++++++- upgrade-instructions.md | 16 ++++++++++++++++ 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03c3253..b846a76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ of tasks being currently executed. - JAMES-2972 Incorrect attribute name in the mailet configuration thanks to jtconsol - JAMES-2632 JMAP Draft GetMailboxes performance enhancements when retrieving all mailboxes of a user - JAMES-2964 Forbid to create User quota/ Domain quota/ Global quota using negative number +- JAMES-3074 Maildir backend generated invalid UidValidity. Read upgrade instructions. ### Removed - Classes marked as deprecated whose removal was planned after 3.4.0 release (See JAMES-2703). This includes: diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/UidValidity.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/UidValidity.java index 05e0f03..05d65a9 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/UidValidity.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/UidValidity.java @@ -64,7 +64,7 @@ public class UidValidity { return new UidValidity(uidValidity); } - private static boolean isValid(long uidValidityAsLong) { + public static boolean isValid(long uidValidityAsLong) { return uidValidityAsLong > 0 && uidValidityAsLong < UPPER_EXCLUSIVE_BOUND; } diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java index 804d6f9..97cc2f2 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java @@ -48,8 +48,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; class SolveMailboxInconsistenciesServiceTest { - private static final UidValidity UID_VALIDITY_1 = UidValidity.ofValid(145); - private static final UidValidity UID_VALIDITY_2 = UidValidity.ofValid(147); + private static final UidValidity UID_VALIDITY_1 = UidValidity.of(145); + private static final UidValidity UID_VALIDITY_2 = UidValidity.of(147); private static final Username USER = Username.of("user"); private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(USER, "abc"); private static final MailboxPath NEW_MAILBOX_PATH = MailboxPath.forUser(USER, "xyz"); diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java index 6809c8f..88148ff 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java @@ -281,10 +281,18 @@ public class MaildirFolder { InputStreamReader isr = new InputStreamReader(fis)) { char[] uidValidity = new char[20]; int len = isr.read(uidValidity); - return UidValidity.of(Long.parseLong(String.valueOf(uidValidity, 0, len).trim())); + long uidValidityValue = Long.parseLong(String.valueOf(uidValidity, 0, len).trim()); + return sanitizeUidValidity(uidValidityValue); } } + private UidValidity sanitizeUidValidity(long uidValidityValue) throws IOException { + if (!UidValidity.isValid(uidValidityValue)) { + return resetUidValidity(); + } + return UidValidity.ofValid(uidValidityValue); + } + /** * Save the given uidValidity to the file system */ diff --git a/upgrade-instructions.md b/upgrade-instructions.md index e77d568..d37ba88 100644 --- a/upgrade-instructions.md +++ b/upgrade-instructions.md @@ -27,6 +27,22 @@ Change list: - [User mailboxes reIndexing endpoint change](#user-mailboxes-reindexing-endpoint-change) - [Hybrid blobStore replaces Union blobStore](#hybrid-blobstore-replaces-union-blobstore) - [New forbidden set of characters in Usernames local part](#new-forbidden-set-of-characters-in-usernames-local-part) + - [UidValidity and maildir](#uid-validity-and-maildir) + +### UidValidity and maildir + +Date 26/02/2020 + +SHA-1 XXX + +JIRA: https://issues.apache.org/jira/browse/JAMES-3074 + +Concerned products: Spring with maildir backend + +Maildir generated too big values to conform to RFC-3501. We changed the generation mechanism to use valid UidValidity +for newly created mailboxes. Regarding persisted mailboxes, we regenerate invalid UidValidity upon reads. + +While this sanitizing is transparent to the end user and the admin, it might lead to IMAP client full resynchronisation. ### New forbidden set of characters in Usernames local part --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
