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