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 800c459578 [FIX] JMAP AuditTrail logging was not triggered (#2605)
800c459578 is described below

commit 800c45957847b98acc42a422ab145714f074bcba
Author: Trần Hồng Quân <55171818+quantranhong1...@users.noreply.github.com>
AuthorDate: Mon Jan 20 15:12:26 2025 +0700

    [FIX] JMAP AuditTrail logging was not triggered (#2605)
---
 .../main/scala/org/apache/james/jmap/mail/Email.scala    | 16 +++++++---------
 .../james/jmap/method/DelegateSetCreatePerformer.scala   |  4 ++--
 .../james/jmap/method/DelegateSetDeletePerformer.scala   |  4 ++--
 .../jmap/method/DelegatedAccountDeletePerformer.scala    |  4 ++--
 .../james/jmap/method/EmailSetDeletePerformer.scala      | 12 +++++++-----
 .../james/jmap/method/EmailSubmissionSetMethod.scala     |  8 ++++----
 .../james/jmap/method/MailboxSetUpdatePerformer.scala    |  4 ++--
 7 files changed, 26 insertions(+), 26 deletions(-)

diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Email.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Email.scala
index 179e627fe3..b60b4ae0eb 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Email.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Email.scala
@@ -32,11 +32,11 @@ import eu.timepit.refined.auto._
 import eu.timepit.refined.types.string.NonEmptyString
 import jakarta.inject.Inject
 import org.apache.commons.lang3.StringUtils
+import org.apache.james.jmap.api.model.Preview
 import org.apache.james.jmap.api.model.Size.{Size, sanitizeSize}
-import org.apache.james.jmap.api.model.{EmailAddress, Preview}
 import 
org.apache.james.jmap.api.projections.{MessageFastViewPrecomputedProperties, 
MessageFastViewProjection}
 import org.apache.james.jmap.core.Id.{Id, IdConstraint}
-import org.apache.james.jmap.core.{JmapRfc8621Configuration, Properties, 
UTCDate}
+import org.apache.james.jmap.core.{Properties, UTCDate}
 import org.apache.james.jmap.mail.BracketHeader.sanitize
 import org.apache.james.jmap.mail.EmailFullViewFactory.extractBodyValues
 import org.apache.james.jmap.mail.EmailGetRequest.MaxBodyValueBytes
@@ -55,8 +55,8 @@ import 
org.apache.james.mime4j.field.{AddressListFieldLenientImpl, LenientFieldP
 import org.apache.james.mime4j.message.DefaultMessageBuilder
 import org.apache.james.mime4j.stream.{Field, MimeConfig, RawFieldParser}
 import org.apache.james.mime4j.util.MimeUtil
-import org.apache.james.util.AuditTrail
 import org.apache.james.util.html.HtmlTextExtractor
+import org.apache.james.util.{AuditTrail, ReactorUtils}
 import org.slf4j.{Logger, LoggerFactory}
 import reactor.core.scala.publisher.{SFlux, SMono}
 import reactor.core.scheduler.Schedulers
@@ -662,8 +662,8 @@ private class EmailFullViewReader 
@Inject()(messageIdManager: MessageIdManager,
   private val reader: GenericEmailViewReader[EmailFullView] = new 
GenericEmailViewReader[EmailFullView](messageIdManager, FULL_CONTENT, 
htmlTextExtractor, fullViewFactory)
 
 
-  override def read[T >: EmailFullView](ids: Seq[MessageId], request: 
EmailGetRequest, mailboxSession: MailboxSession): SFlux[T] = {
-    AuditTrail.entry
+  override def read[T >: EmailFullView](ids: Seq[MessageId], request: 
EmailGetRequest, mailboxSession: MailboxSession): SFlux[T] =
+    SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
       .username(() => mailboxSession.getUser.asString())
       .protocol("JMAP")
       .action("Email full view read")
@@ -671,10 +671,8 @@ private class EmailFullViewReader 
@Inject()(messageIdManager: MessageIdManager,
         "loggedInUser", mailboxSession.getLoggedInUser.toScala
           .map(_.asString())
           .getOrElse("")))
-      .log("JMAP Email full view read.")
-
-    reader.read(ids, request, mailboxSession)
-  }
+      .log("JMAP Email full view read.")))
+      .thenMany(reader.read(ids, request, mailboxSession))
 }
 
 object EmailFastViewReader {
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetCreatePerformer.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetCreatePerformer.scala
index a549dcd357..f4bf528149 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetCreatePerformer.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetCreatePerformer.scala
@@ -98,13 +98,13 @@ class DelegateSetCreatePerformer @Inject()(delegationStore: 
DelegationStore,
     SMono.fromPublisher(usersRepository.containsReactive(request.username))
       .filter(bool => bool)
       .flatMap(_ => 
SMono.fromPublisher(delegationStore.addAuthorizedUser(mailboxSession.getUser, 
request.username))
-        .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry
+        .`then`(SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
           .username(() => mailboxSession.getUser.asString())
           .protocol("JMAP")
           .action("DelegateSet/create")
           .parameters(() => ImmutableMap.of("delegator", 
mailboxSession.getUser.asString(),
             "delegatee", request.username.asString()))
-          .log("Delegation added.")))
+          .log("Delegation added."))))
         .`then`(SMono.just[CreationResult](CreationSuccess(delegateCreationId, 
evaluateCreationResponse(request, mailboxSession))))
         .onErrorResume(e => 
SMono.just[CreationResult](CreationFailure(delegateCreationId, e))))
       
.switchIfEmpty(SMono.just[CreationResult](CreationFailure(delegateCreationId, 
new UserDoesNotExistException(request.username))))
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetDeletePerformer.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetDeletePerformer.scala
index aa966b0044..6e903d0bce 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetDeletePerformer.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetDeletePerformer.scala
@@ -80,12 +80,12 @@ class DelegateSetDeletePerformer @Inject()(delegationStore: 
DelegationStore) {
           .filter(authorizedUser => DelegationId.from(baseUser, 
authorizedUser).equals(id))
           .next()
           .flatMap(authorizedUser => 
SMono(delegationStore.removeAuthorizedUser(baseUser, authorizedUser))
-            .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry
+            .`then`(SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
               .username(() => baseUser.asString())
               .protocol("JMAP")
               .action("DelegateSet/destroy")
               .parameters(() => ImmutableMap.of("delegator", 
baseUser.asString(),
                 "delegatee", authorizedUser.asString()))
-              .log("Delegation removed."))))
+              .log("Delegation removed.")))))
           
.`then`(SMono.just[DelegateDeletionResult](DelegateDeletionSuccess(id))))
 }
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegatedAccountDeletePerformer.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegatedAccountDeletePerformer.scala
index d40aa7c4ac..223896205f 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegatedAccountDeletePerformer.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegatedAccountDeletePerformer.scala
@@ -80,12 +80,12 @@ class DelegatedAccountDeletePerformer 
@Inject()(delegationStore: DelegationStore
           .filter(delegatedUser => DelegationId.from(delegatedUser, 
baseUser).equals(id))
           .next()
           .flatMap(delegatedUser => 
SMono(delegationStore.removeDelegatedUser(baseUser, delegatedUser))
-            .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry
+            .`then`(SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
               .username(() => baseUser.asString())
               .protocol("JMAP")
               .action("DelegatedAccountSet/destroy")
               .parameters(() => ImmutableMap.of("delegator", 
delegatedUser.asString(),
                 "delegatee", baseUser.asString()))
-              .log("Delegation removed."))))
+              .log("Delegation removed.")))))
           
.`then`(SMono.just[DelegatedAccountDeletionResult](DelegatedAccountDeletionSuccess(id))))
 }
\ No newline at end of file
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetDeletePerformer.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetDeletePerformer.scala
index e62732a1f3..9a23f3a94c 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetDeletePerformer.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetDeletePerformer.scala
@@ -30,7 +30,6 @@ import org.apache.james.mailbox.model.{DeleteResult, 
MessageId}
 import org.apache.james.mailbox.{MailboxSession, MessageIdManager}
 import org.apache.james.util.{AuditTrail, ReactorUtils}
 import org.slf4j.LoggerFactory
-import reactor.core.publisher.Mono
 import reactor.core.scala.publisher.SMono
 
 import scala.jdk.CollectionConverters._
@@ -98,7 +97,8 @@ class EmailSetDeletePerformer @Inject()(messageIdManager: 
MessageIdManager,
       }
 
       SMono(messageIdManager.delete(messageIds.toSet.asJava, mailboxSession))
-        .doOnSuccess(auditTrail(_, mailboxSession))
+        .flatMap(deleteResult => auditTrail(deleteResult, mailboxSession)
+        .`then`(SMono.just(deleteResult)))
         .map(DestroyResult.from)
         .onErrorResume(e => SMono.just(messageIds.map(id => 
DestroyFailure(EmailSet.asUnparsed(id), e))))
         .map(_ ++ parsingErrors)
@@ -108,9 +108,9 @@ class EmailSetDeletePerformer @Inject()(messageIdManager: 
MessageIdManager,
     }
   }
 
-  private def auditTrail(deleteResult: DeleteResult, mailboxSession: 
MailboxSession): Unit =
+  private def auditTrail(deleteResult: DeleteResult, mailboxSession: 
MailboxSession): SMono[Void] =
     if (!deleteResult.getDestroyed.isEmpty) {
-      ReactorUtils.logAsMono(() => AuditTrail.entry
+      SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
         .username(() => mailboxSession.getUser.asString())
         .protocol("JMAP")
         .action("Email/set destroy")
@@ -118,6 +118,8 @@ class EmailSetDeletePerformer @Inject()(messageIdManager: 
MessageIdManager,
           "loggedInUser", mailboxSession.getLoggedInUser.toScala
             .map(_.asString())
             .getOrElse("")))
-        .log("Mails deleted."))
+        .log("Mails deleted.")))
+    } else {
+      SMono.empty
     }
 }
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSubmissionSetMethod.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSubmissionSetMethod.scala
index b58b5f2b73..31e1c287fc 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSubmissionSetMethod.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSubmissionSetMethod.scala
@@ -298,7 +298,7 @@ class EmailSubmissionSetMethod @Inject()(serializer: 
EmailSubmissionSetSerialize
   private def enqueue(mail: Mail, delay: Duration, mailboxSession: 
MailboxSession): SMono[Unit] =
     (delay match {
       case d if d.isNegative || d.isZero => SMono(queue.enqueueReactive(mail))
-        .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry
+        .`then`(SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
           .username(() => mailboxSession.getUser.asString())
           .protocol("JMAP")
           .action("EmailSubmission")
@@ -312,9 +312,9 @@ class EmailSubmissionSetMethod @Inject()(serializer: 
EmailSubmissionSetSerialize
             "loggedInUser", mailboxSession.getLoggedInUser.toScala
               .map(_.asString())
               .getOrElse("")))
-          .log("JMAP mail spooled.")))
+          .log("JMAP mail spooled."))))
       case _ => SMono(queue.enqueueReactive(mail, delay))
-        .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry
+        .`then`(SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
           .username(() => mailboxSession.getUser.asString())
           .protocol("JMAP")
           .action("EmailSubmission")
@@ -329,7 +329,7 @@ class EmailSubmissionSetMethod @Inject()(serializer: 
EmailSubmissionSetSerialize
             "loggedInUser", mailboxSession.getLoggedInUser.toScala
               .map(_.asString())
               .getOrElse("")))
-          .log("JMAP mail spooled.")))
+          .log("JMAP mail spooled."))))
     }).`then`(SMono.fromCallable(() => 
LifecycleUtil.dispose(mail)).subscribeOn(Schedulers.boundedElastic()))
 
   private def retrieveDelay(mailParameters: Option[Map[ParameterName, 
Option[ParameterValue]]]): Try[Duration] =
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetUpdatePerformer.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetUpdatePerformer.scala
index 0b6d3dd166..ad9844c45e 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetUpdatePerformer.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetUpdatePerformer.scala
@@ -251,7 +251,7 @@ class MailboxSetUpdatePerformer @Inject()(serializer: 
MailboxSerializer,
 
     val partialUpdatesOperation: SMono[Unit] = 
SFlux.fromIterable(validatedPatch.rightsPartialUpdates)
       .flatMap(partialUpdate => SMono.fromCallable(() => 
mailboxManager.applyRightsCommand(mailboxId, partialUpdate.asACLCommand(), 
mailboxSession))
-        .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry
+        .`then`(SMono(ReactorUtils.logAsMono(() => AuditTrail.entry
           .username(() => mailboxSession.getUser.asString())
           .protocol("JMAP")
           .action("Mailbox/set update")
@@ -260,7 +260,7 @@ class MailboxSetUpdatePerformer @Inject()(serializer: 
MailboxSerializer,
             "delegatee", partialUpdate.entryKey.getName,
             "mailboxId", mailboxId.serialize(),
             "rights", partialUpdate.rights.asJava.serialize()))
-          .log("JMAP mailbox shared."))),
+          .log("JMAP mailbox shared.")))),
         maxConcurrency = 5)
       .`then`()
 


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to