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


The following commit(s) were added to refs/heads/master by this push:
     new a0d6b04f00 JAMES-4152 Allow disabling modseq (#2857)
a0d6b04f00 is described below

commit a0d6b04f00712adc80c226523b19144cae3c651e
Author: Benoit TELLIER <[email protected]>
AuthorDate: Tue Nov 18 08:34:55 2025 +0100

    JAMES-4152 Allow disabling modseq (#2857)
---
 docs/modules/servers/partials/configure/jvm.adoc      | 14 ++++++++++++++
 .../cassandra/mail/CassandraMailboxRecentsDAO.java    | 19 +++++++++++++++++++
 .../james/mailbox/cassandra/mail/FlagsExtractor.java  |  4 ++++
 .../postgres/mail/dao/PostgresMailboxMessageDAO.java  |  4 ++++
 .../mail/dao/PostgresMailboxMessageDAOUtils.java      |  4 ++++
 .../james/mailbox/store/StoreMessageManager.java      |  5 ++++-
 6 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/docs/modules/servers/partials/configure/jvm.adoc 
b/docs/modules/servers/partials/configure/jvm.adoc
index dd22fa8ec8..c52b966fa2 100644
--- a/docs/modules/servers/partials/configure/jvm.adoc
+++ b/docs/modules/servers/partials/configure/jvm.adoc
@@ -243,3 +243,17 @@ Ex in `jvm.properties`
 ----
 james.rights.crossdomain.allow=false
 ----
+
+== Drop IMAP Recent handling
+
+This allows for dropping the legacy IMAP flag support, considering all emails 
as recent. This has no impact on modern
+IMAP application as this flag is concidered innacurate.
+
+Note that this flag is removed in IMAP4Rev2.
+
+Ex in  `jvm.properties`
+----
+james.mailbox.handleRecent=false
+----
+
+Defaults to true (no breaking changes)
\ No newline at end of file
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
index bb29631874..80de0e5d9b 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
@@ -34,6 +34,7 @@ import 
org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxRecentsTable;
+import org.apache.james.mailbox.store.StoreMessageManager;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.ProtocolVersion;
@@ -101,6 +102,9 @@ public class CassandraMailboxRecentsDAO {
     }
 
     public Flux<MessageUid> getRecentMessageUidsInMailbox(CassandraId 
mailboxId) {
+        if (!StoreMessageManager.HANDLE_RECENT) {
+            return Flux.empty();
+        }
         return cassandraAsyncExecutor.executeRows(bindWithMailbox(mailboxId, 
readStatement))
             .map(row -> 
TypeCodecs.BIGINT.decodePrimitive(row.getBytesUnsafe(0), protocolVersion))
             .map(MessageUid::of);
@@ -112,12 +116,18 @@ public class CassandraMailboxRecentsDAO {
     }
 
     public Mono<Void> removeFromRecent(CassandraId mailboxId, MessageUid 
messageUid) {
+        if (!StoreMessageManager.HANDLE_RECENT) {
+            return Mono.empty();
+        }
         return cassandraAsyncExecutor.executeVoid(deleteStatement.bind()
             .setUuid(CassandraMailboxRecentsTable.MAILBOX_ID, 
mailboxId.asUuid())
             .setLong(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, 
messageUid.asLong()));
     }
 
     public Mono<Void> removeFromRecent(CassandraId mailboxId, List<MessageUid> 
uids) {
+        if (!StoreMessageManager.HANDLE_RECENT) {
+            return Mono.empty();
+        }
         if (uids.size() == 1) {
             return cassandraAsyncExecutor.executeVoid(deleteStatement.bind()
                 .setUuid(CassandraMailboxRecentsTable.MAILBOX_ID, 
mailboxId.asUuid())
@@ -139,17 +149,26 @@ public class CassandraMailboxRecentsDAO {
     }
 
     public Mono<Void> delete(CassandraId mailboxId) {
+        if (!StoreMessageManager.HANDLE_RECENT) {
+            return Mono.empty();
+        }
         return cassandraAsyncExecutor.executeVoid(deleteAllStatement.bind()
             .setUuid(CassandraMailboxRecentsTable.MAILBOX_ID, 
mailboxId.asUuid()));
     }
 
     public Mono<Void> addToRecent(CassandraId mailboxId, MessageUid 
messageUid) {
+        if (!StoreMessageManager.HANDLE_RECENT) {
+            return Mono.empty();
+        }
         return cassandraAsyncExecutor.executeVoid(addStatement.bind()
             .setUuid(CassandraMailboxRecentsTable.MAILBOX_ID, 
mailboxId.asUuid())
             .setLong(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, 
messageUid.asLong()));
     }
 
     public Mono<Void> addToRecent(CassandraId mailboxId, List<MessageUid> 
uids) {
+        if (!StoreMessageManager.HANDLE_RECENT) {
+            return Mono.empty();
+        }
         if (uids.size() == 1) {
             return cassandraAsyncExecutor.executeVoid(addStatement.bind()
                 .setUuid(CassandraMailboxRecentsTable.MAILBOX_ID, 
mailboxId.asUuid())
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
index 9141c9fc3c..b812ada7ab 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import jakarta.mail.Flags;
 
 import org.apache.james.mailbox.cassandra.table.Flag;
+import org.apache.james.mailbox.store.StoreMessageManager;
 
 import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.ProtocolVersion;
@@ -44,6 +45,9 @@ public class FlagsExtractor {
     private static Flags getFlags(Row row, ProtocolVersion protocolVersion) {
         Flags flags = new Flags();
         for (CqlIdentifier cqlId : Flag.ALL_LOWERCASE) {
+            if (!StoreMessageManager.HANDLE_RECENT && 
cqlId.equals(Flag.RECENT)) {
+                continue;
+            }
             if (TypeCodecs.BOOLEAN.decodePrimitive(row.getBytesUnsafe(cqlId), 
protocolVersion)) {
                 flags.add(Flag.JAVAX_MAIL_FLAG.get(cqlId));
             }
diff --git 
a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAO.java
 
b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAO.java
index f17477fd78..fdc5c1ec62 100644
--- 
a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAO.java
+++ 
b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAO.java
@@ -72,6 +72,7 @@ import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.postgres.PostgresMailboxId;
 import org.apache.james.mailbox.postgres.PostgresMessageId;
 import 
org.apache.james.mailbox.postgres.mail.PostgresMessageDataDefinition.MessageTable;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -170,6 +171,9 @@ public class PostgresMailboxMessageDAO {
     }
 
     public Flux<MessageUid> findAllRecentMessageUid(PostgresMailboxId 
mailboxId) {
+        if (!StoreMessageManager.HANDLE_RECENT) {
+            return Flux.empty();
+        }
         return postgresExecutor.executeRows(dslContext -> 
Flux.from(dslContext.select(MESSAGE_UID)
                 .from(TABLE_NAME)
                 .where(MAILBOX_ID.eq((mailboxId.asUuid())))
diff --git 
a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAOUtils.java
 
b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAOUtils.java
index ba759875e6..858670ffc7 100644
--- 
a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAOUtils.java
+++ 
b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAOUtils.java
@@ -65,6 +65,7 @@ import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.postgres.PostgresMailboxId;
 import org.apache.james.mailbox.postgres.PostgresMessageId;
 import org.apache.james.mailbox.postgres.mail.PostgresMessageDataDefinition;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.impl.Properties;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
@@ -83,6 +84,9 @@ interface PostgresMailboxMessageDAOUtils {
     Function<Record, Flags> RECORD_TO_FLAGS_FUNCTION = record -> {
         Flags flags = new Flags();
         BOOLEAN_FLAGS_MAPPING.forEach((flagColumn, flagMapped) -> {
+            if (!StoreMessageManager.HANDLE_RECENT && 
flagColumn.equals(IS_RECENT)) {
+                return;
+            }
             if (record.get(flagColumn)) {
                 flags.add(flagMapped);
             }
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 4146c1d042..283cce7167 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -134,6 +134,9 @@ import reactor.core.scheduler.Schedulers;
  * {@link MailboxSession}'s.
  */
 public class StoreMessageManager implements MessageManager {
+    public static final boolean HANDLE_RECENT = 
Optional.ofNullable(System.getProperty("james.mailbox.handleRecent"))
+        .map(Boolean::parseBoolean)
+        .orElse(true);
     /**
      * The minimal Permanent flags the {@link MessageManager} must support. 
<br>
      * 
@@ -494,7 +497,7 @@ public class StoreMessageManager implements MessageManager {
             trimFlags(flags, mailboxSession);
 
         }
-        if (isRecent) {
+        if (isRecent && HANDLE_RECENT) {
             flags.add(Flag.RECENT);
         }
         return flags;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to