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]