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 bt...@apache.org on 2020/03/09 16:07:42 UTC
[james-project] 11/17: JAMES-3074 Maildir: On the fly UidValidity
sanitizing
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 <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org