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 6dadb19cdd4109f63867edb7b3b95af3796555e3
Author: Benoit Tellier <[email protected]>
AuthorDate: Tue Mar 31 09:29:56 2020 +0700

    JAMES-3129 Only apply PostDequeueDecorator to SPOOL queue
    
    
https://github.com/linagora/james-project/pull/3242/commits/62bab3269ceef65c1741fbbf243e5c109307ad8c
 highlighted a race condition when sending a mail via JMAP.
    
    Cause: the mail is processedn, and marked for outgoing delivery.
    
    It is reenqueued, and appended to outgoing queue.
    
    The post dequeue decorator, moving JMAP mails from outbox to sent is 
applied to times, leading eventualy to invalid results and race condition.
    
    Proposed fix: only apply post dequeue decorator to "spool"
---
 .../james/jmap/draft/send/PostDequeueDecoratorFactory.java    | 11 +++++++++--
 .../james/queue/activemq/ActiveMQCacheableMailQueue.java      |  2 +-
 .../apache/james/queue/api/MailQueueItemDecoratorFactory.java |  2 +-
 .../james/queue/api/RawMailQueueItemDecoratorFactory.java     |  2 +-
 .../org/apache/james/queue/file/FileCacheableMailQueue.java   |  2 +-
 .../org/apache/james/queue/jms/JMSCacheableMailQueue.java     |  2 +-
 .../org/apache/james/queue/memory/MemoryMailQueueFactory.java |  2 +-
 .../java/org/apache/james/queue/rabbitmq/MailQueueName.java   |  4 ++++
 .../org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java    |  2 +-
 9 files changed, 20 insertions(+), 9 deletions(-)

diff --git 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorFactory.java
 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorFactory.java
index 2b642c1..9b09527 100644
--- 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorFactory.java
+++ 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorFactory.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.draft.send;
 
+import static org.apache.james.queue.api.MailQueueFactory.SPOOL;
+
 import javax.inject.Inject;
 
 import org.apache.james.mailbox.MailboxManager;
@@ -27,6 +29,8 @@ import org.apache.james.mailbox.SystemMailboxesProvider;
 import org.apache.james.mailbox.model.MessageId.Factory;
 import org.apache.james.queue.api.MailQueue.MailQueueItem;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
+import org.apache.james.queue.api.RawMailQueueItem;
 
 public class PostDequeueDecoratorFactory implements 
MailQueueItemDecoratorFactory {
     private final MailboxManager mailboxManager;
@@ -44,8 +48,11 @@ public class PostDequeueDecoratorFactory implements 
MailQueueItemDecoratorFactor
     }
 
     @Override
-    public MailQueueItemDecorator decorate(MailQueueItem mailQueueItem) {
-        return new PostDequeueDecorator(mailQueueItem, mailboxManager, 
messageIdFactory, messageIdManager, systemMailboxesProvider);
+    public MailQueueItemDecorator decorate(MailQueueItem mailQueueItem, 
MailQueueName name) {
+        if (name.equals(SPOOL)) {
+            return new PostDequeueDecorator(mailQueueItem, mailboxManager, 
messageIdFactory, messageIdManager, systemMailboxesProvider);
+        }
+        return new RawMailQueueItem(mailQueueItem);
     }
 
 }
diff --git 
a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
 
b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
index e798251..5d7bf03 100644
--- 
a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
+++ 
b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
@@ -229,7 +229,7 @@ public class ActiveMQCacheableMailQueue extends 
JMSCacheableMailQueue implements
     protected MailQueueItem createMailQueueItem(Session session, 
MessageConsumer consumer, Message message) throws JMSException, 
MessagingException {
         Mail mail = createMail(message);
         ActiveMQMailQueueItem activeMQMailQueueItem = new 
ActiveMQMailQueueItem(mail, session, consumer, message);
-        return mailQueueItemDecoratorFactory.decorate(activeMQMailQueueItem);
+        return mailQueueItemDecoratorFactory.decorate(activeMQMailQueueItem, 
queueName);
     }
 
     @Override
diff --git 
a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueItemDecoratorFactory.java
 
b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueItemDecoratorFactory.java
index 5e62d92..ec48fae 100644
--- 
a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueItemDecoratorFactory.java
+++ 
b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueItemDecoratorFactory.java
@@ -23,7 +23,7 @@ import org.apache.james.queue.api.MailQueue.MailQueueItem;
 
 public interface MailQueueItemDecoratorFactory {
 
-    MailQueueItemDecorator decorate(MailQueueItem mailQueueItem);
+    MailQueueItemDecorator decorate(MailQueueItem mailQueueItem, MailQueueName 
name);
 
     abstract class MailQueueItemDecorator implements MailQueueItem {
         protected MailQueueItem mailQueueItem;
diff --git 
a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/RawMailQueueItemDecoratorFactory.java
 
b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/RawMailQueueItemDecoratorFactory.java
index d489014..9068754 100644
--- 
a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/RawMailQueueItemDecoratorFactory.java
+++ 
b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/RawMailQueueItemDecoratorFactory.java
@@ -23,7 +23,7 @@ import org.apache.james.queue.api.MailQueue.MailQueueItem;
 public class RawMailQueueItemDecoratorFactory implements 
MailQueueItemDecoratorFactory {
 
     @Override
-    public MailQueueItemDecorator decorate(MailQueueItem mailQueueItem) {
+    public MailQueueItemDecorator decorate(MailQueueItem mailQueueItem, 
MailQueueName name) {
         return new RawMailQueueItem(mailQueueItem);
     }
 
diff --git 
a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java
 
b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java
index 041e13d..d32968e 100644
--- 
a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java
+++ 
b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java
@@ -303,7 +303,7 @@ public class FileCacheableMailQueue implements 
ManageableMailQueue {
                             LifecycleUtil.dispose(mail);
                         }
                     };
-                    return 
Mono.just(mailQueueItemDecoratorFactory.decorate(fileMailQueueItem));
+                    return 
Mono.just(mailQueueItemDecoratorFactory.decorate(fileMailQueueItem, queueName));
                 }
                 // TODO: Think about exception handling in detail
             } catch (IOException | ClassNotFoundException | MessagingException 
e) {
diff --git 
a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java
 
b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java
index 5c3bb17..4e7cee9 100644
--- 
a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java
+++ 
b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java
@@ -482,7 +482,7 @@ public class JMSCacheableMailQueue implements 
ManageableMailQueue, JMSSupport, M
     protected MailQueueItem createMailQueueItem(Session session, 
MessageConsumer consumer, Message message) throws JMSException, 
MessagingException {
         Mail mail = createMail(message);
         JMSMailQueueItem jmsMailQueueItem = new JMSMailQueueItem(mail, 
session, consumer);
-        return mailQueueItemDecoratorFactory.decorate(jmsMailQueueItem);
+        return mailQueueItemDecoratorFactory.decorate(jmsMailQueueItem, 
queueName);
     }
 
     protected String getMessageSelector() {
diff --git 
a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
 
b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
index fa949e8..e13cb10 100644
--- 
a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
+++ 
b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
@@ -102,7 +102,7 @@ public class MemoryMailQueueFactory implements 
MailQueueFactory<ManageableMailQu
                 .subscribeOn(Schedulers.elastic())
                 .flatMap(item ->
                     Mono.fromRunnable(() -> 
inProcessingMailItems.add(item)).thenReturn(item))
-                .map(mailQueueItemDecoratorFactory::decorate);
+                .map(item -> mailQueueItemDecoratorFactory.decorate(item, 
name));
         }
 
         @Override
diff --git 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailQueueName.java
 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailQueueName.java
index 5c060de..dfc352d 100644
--- 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailQueueName.java
+++ 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailQueueName.java
@@ -142,6 +142,10 @@ public final class MailQueueName {
         return new WorkQueueName(name);
     }
 
+    org.apache.james.queue.api.MailQueueName toModel() {
+        return org.apache.james.queue.api.MailQueueName.of(asString());
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof MailQueueName) {
diff --git 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java
 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java
index 822fc5a..3ed3ba9 100644
--- 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java
+++ 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java
@@ -84,7 +84,7 @@ public class RabbitMQMailQueue implements ManageableMailQueue 
{
     @Override
     public Flux<MailQueueItem> deQueue() {
         return dequeuer.deQueue()
-            .map(decoratorFactory::decorate);
+            .map(item -> decoratorFactory.decorate(item, name.toModel()));
     }
 
     @Override


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

Reply via email to