This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch x-forwarded-for in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 779a1c26078aac647a927904306994660897a852 Author: Rene Cordier <[email protected]> AuthorDate: Fri Jan 3 11:08:48 2025 +0700 fixup! [ENHANCEMENT] ip and x-forwarded-for im JMAP logging context --- .../java/org/apache/james/util/ReactorUtils.java | 2 +- .../jmap/method/DelegateSetCreatePerformer.scala | 17 +++--- .../jmap/method/DelegateSetDeletePerformer.scala | 18 +++--- .../method/DelegatedAccountDeletePerformer.scala | 17 +++--- .../jmap/method/EmailSetDeletePerformer.scala | 18 +++--- .../jmap/method/EmailSubmissionSetMethod.scala | 68 ++++++++++------------ .../jmap/method/MailboxSetUpdatePerformer.scala | 23 ++++---- 7 files changed, 71 insertions(+), 92 deletions(-) diff --git a/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java b/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java index beb2c0dc5e..8c26be6382 100644 --- a/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java +++ b/server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java @@ -194,7 +194,7 @@ public class ReactorUtils { return signal -> logWithContext(logStatement, signal.getContextView()); } - public static void logWithContext(Runnable logStatement, ContextView contextView) { + private static void logWithContext(Runnable logStatement, ContextView contextView) { try (Closeable mdc = retrieveMDCBuilder(contextView).build()) { logStatement.run(); } catch (IOException e) { 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 da3ff86305..a549dcd357 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,16 +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)) - .subscriberContext(context => { - ReactorUtils.logWithContext(() => 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."), context) - context - }) + .doOnSuccess(_ => 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."))) .`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 cf8487366c..aa966b0044 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,16 +80,12 @@ class DelegateSetDeletePerformer @Inject()(delegationStore: DelegationStore) { .filter(authorizedUser => DelegationId.from(baseUser, authorizedUser).equals(id)) .next() .flatMap(authorizedUser => SMono(delegationStore.removeAuthorizedUser(baseUser, authorizedUser)) - - .subscriberContext(context => { - ReactorUtils.logWithContext(() => AuditTrail.entry - .username(() => baseUser.asString()) - .protocol("JMAP") - .action("DelegateSet/destroy") - .parameters(() => ImmutableMap.of("delegator", baseUser.asString(), - "delegatee", authorizedUser.asString())) - .log("Delegation removed."), context) - context - })) + .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry + .username(() => baseUser.asString()) + .protocol("JMAP") + .action("DelegateSet/destroy") + .parameters(() => ImmutableMap.of("delegator", baseUser.asString(), + "delegatee", authorizedUser.asString())) + .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 149fceaabf..d40aa7c4ac 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,15 +80,12 @@ class DelegatedAccountDeletePerformer @Inject()(delegationStore: DelegationStore .filter(delegatedUser => DelegationId.from(delegatedUser, baseUser).equals(id)) .next() .flatMap(delegatedUser => SMono(delegationStore.removeDelegatedUser(baseUser, delegatedUser)) - .subscriberContext(context => { - ReactorUtils.logWithContext(() => AuditTrail.entry - .username(() => baseUser.asString()) - .protocol("JMAP") - .action("DelegatedAccountSet/destroy") - .parameters(() => ImmutableMap.of("delegator", delegatedUser.asString(), - "delegatee", baseUser.asString())) - .log("Delegation removed."), context) - context - })) + .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry + .username(() => baseUser.asString()) + .protocol("JMAP") + .action("DelegatedAccountSet/destroy") + .parameters(() => ImmutableMap.of("delegator", delegatedUser.asString(), + "delegatee", baseUser.asString())) + .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 72e8d56d18..e62732a1f3 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 @@ -28,8 +28,9 @@ import org.apache.james.jmap.mail.{DestroyIds, EmailSet, EmailSetRequest, Unpars import org.apache.james.jmap.method.EmailSetDeletePerformer.{DestroyFailure, DestroyResult, DestroyResults} import org.apache.james.mailbox.model.{DeleteResult, MessageId} import org.apache.james.mailbox.{MailboxSession, MessageIdManager} -import org.apache.james.util.AuditTrail +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._ @@ -97,10 +98,7 @@ class EmailSetDeletePerformer @Inject()(messageIdManager: MessageIdManager, } SMono(messageIdManager.delete(messageIds.toSet.asJava, mailboxSession)) - .subscriberContext(context => { - auditTrail(messageIds, mailboxSession) - context - }) + .doOnSuccess(auditTrail(_, mailboxSession)) .map(DestroyResult.from) .onErrorResume(e => SMono.just(messageIds.map(id => DestroyFailure(EmailSet.asUnparsed(id), e)))) .map(_ ++ parsingErrors) @@ -110,16 +108,16 @@ class EmailSetDeletePerformer @Inject()(messageIdManager: MessageIdManager, } } - private def auditTrail(deleteResult: Seq[MessageId], mailboxSession: MailboxSession): Unit = - if (deleteResult.nonEmpty) { - AuditTrail.entry + private def auditTrail(deleteResult: DeleteResult, mailboxSession: MailboxSession): Unit = + if (!deleteResult.getDestroyed.isEmpty) { + ReactorUtils.logAsMono(() => AuditTrail.entry .username(() => mailboxSession.getUser.asString()) .protocol("JMAP") .action("Email/set destroy") - .parameters(() => ImmutableMap.of("messageIds", StringUtils.join(deleteResult), + .parameters(() => ImmutableMap.of("messageIds", StringUtils.join(deleteResult.getDestroyed), "loggedInUser", mailboxSession.getLoggedInUser.toScala .map(_.asString()) .getOrElse(""))) - .log("Mails deleted.") + .log("Mails deleted.")) } } 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 d5c5939e58..b58b5f2b73 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,44 +298,38 @@ 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)) - .subscriberContext(context => { - ReactorUtils.logWithContext(() => AuditTrail.entry - .username(() => mailboxSession.getUser.asString()) - .protocol("JMAP") - .action("EmailSubmission") - .parameters(() => ImmutableMap.of("mailId", mail.getName, - "mimeMessageId", Option(mail.getMessage) - .flatMap(message => Option(message.getMessageID)) - .getOrElse(""), - "sender", mail.getMaybeSender.asString, - "recipients", StringUtils.join(mail.getRecipients), - "size", mail.getMessageSize.toString, - "loggedInUser", mailboxSession.getLoggedInUser.toScala - .map(_.asString()) - .getOrElse(""))) - .log("JMAP mail spooled."), context) - context - }) + .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry + .username(() => mailboxSession.getUser.asString()) + .protocol("JMAP") + .action("EmailSubmission") + .parameters(() => ImmutableMap.of("mailId", mail.getName, + "mimeMessageId", Option(mail.getMessage) + .flatMap(message => Option(message.getMessageID)) + .getOrElse(""), + "sender", mail.getMaybeSender.asString, + "recipients", StringUtils.join(mail.getRecipients), + "size", mail.getMessageSize.toString, + "loggedInUser", mailboxSession.getLoggedInUser.toScala + .map(_.asString()) + .getOrElse(""))) + .log("JMAP mail spooled."))) case _ => SMono(queue.enqueueReactive(mail, delay)) - .subscriberContext(context => { - ReactorUtils.logWithContext(() => AuditTrail.entry - .username(() => mailboxSession.getUser.asString()) - .protocol("JMAP") - .action("EmailSubmission") - .parameters(() => ImmutableMap.of("mailId", mail.getName, - "mimeMessageId", Option(mail.getMessage) - .flatMap(message => Option(message.getMessageID)) - .getOrElse(""), - "size", mail.getMessageSize.toString, - "sender", mail.getMaybeSender.asString, - "recipients", StringUtils.join(mail.getRecipients), - "holdFor", delay.toString, - "loggedInUser", mailboxSession.getLoggedInUser.toScala - .map(_.asString()) - .getOrElse(""))) - .log("JMAP mail spooled."), context) - context - }) + .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry + .username(() => mailboxSession.getUser.asString()) + .protocol("JMAP") + .action("EmailSubmission") + .parameters(() => ImmutableMap.of("mailId", mail.getName, + "mimeMessageId", Option(mail.getMessage) + .flatMap(message => Option(message.getMessageID)) + .getOrElse(""), + "size", mail.getMessageSize.toString, + "sender", mail.getMaybeSender.asString, + "recipients", StringUtils.join(mail.getRecipients), + "holdFor", delay.toString, + "loggedInUser", mailboxSession.getLoggedInUser.toScala + .map(_.asString()) + .getOrElse(""))) + .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 3a4c8b0697..0b6d3dd166 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,19 +251,16 @@ class MailboxSetUpdatePerformer @Inject()(serializer: MailboxSerializer, val partialUpdatesOperation: SMono[Unit] = SFlux.fromIterable(validatedPatch.rightsPartialUpdates) .flatMap(partialUpdate => SMono.fromCallable(() => mailboxManager.applyRightsCommand(mailboxId, partialUpdate.asACLCommand(), mailboxSession)) - .subscriberContext(context => { - ReactorUtils.logWithContext(() => AuditTrail.entry - .username(() => mailboxSession.getUser.asString()) - .protocol("JMAP") - .action("Mailbox/set update") - .parameters(() => ImmutableMap.of("loggedInUser", mailboxSession.getLoggedInUser.toScala.map(_.asString()).getOrElse(""), - "delegator", mailboxSession.getUser.asString(), - "delegatee", partialUpdate.entryKey.getName, - "mailboxId", mailboxId.serialize(), - "rights", partialUpdate.rights.asJava.serialize())) - .log("JMAP mailbox shared."), context) - context - }), + .doOnSuccess(_ => ReactorUtils.logAsMono(() => AuditTrail.entry + .username(() => mailboxSession.getUser.asString()) + .protocol("JMAP") + .action("Mailbox/set update") + .parameters(() => ImmutableMap.of("loggedInUser", mailboxSession.getLoggedInUser.toScala.map(_.asString()).getOrElse(""), + "delegator", mailboxSession.getUser.asString(), + "delegatee", partialUpdate.entryKey.getName, + "mailboxId", mailboxId.serialize(), + "rights", partialUpdate.rights.asJava.serialize())) + .log("JMAP mailbox shared."))), maxConcurrency = 5) .`then`() --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
