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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]