This is an automated email from the ASF dual-hosted git repository.

rcordier 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 da112ef8f6 [ENHANCEMENT] ip and x-forwarded-for im JMAP logging 
context (#2564)
da112ef8f6 is described below

commit da112ef8f693f9ae70879b69cea62b3903990430
Author: Rene Cordier <rcord...@linagora.com>
AuthorDate: Mon Jan 6 10:41:19 2025 +0700

    [ENHANCEMENT] ip and x-forwarded-for im JMAP logging context (#2564)
---
 .../apache/james/jmap/method/DelegateSetCreatePerformer.scala  |  6 +++---
 .../apache/james/jmap/method/DelegateSetDeletePerformer.scala  |  4 ++--
 .../james/jmap/method/DelegatedAccountDeletePerformer.scala    |  4 ++--
 .../org/apache/james/jmap/method/EmailSetDeletePerformer.scala |  7 ++++---
 .../apache/james/jmap/method/EmailSubmissionSetMethod.scala    | 10 +++++-----
 .../apache/james/jmap/method/MailboxSetUpdatePerformer.scala   |  4 ++--
 .../scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala     |  4 ++++
 7 files changed, 22 insertions(+), 17 deletions(-)

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 dd72143d0c..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
@@ -30,7 +30,7 @@ import 
org.apache.james.jmap.method.DelegateSetCreatePerformer.{CreationFailure,
 import org.apache.james.mailbox.MailboxSession
 import org.apache.james.mailbox.exception.UserDoesNotExistException
 import org.apache.james.user.api.{DelegationStore, UsersRepository}
-import org.apache.james.util.AuditTrail
+import org.apache.james.util.{AuditTrail, ReactorUtils}
 import org.slf4j.LoggerFactory
 import play.api.libs.json.JsObject
 import reactor.core.scala.publisher.{SFlux, SMono}
@@ -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(_ => AuditTrail.entry
+        .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."))
+          .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 2e7f88e4dc..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,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(_ => AuditTrail.entry
+            .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.")))
+              .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 677b46c492..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,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(_ => AuditTrail.entry
+            .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.")))
+              .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 b75764f300..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._
@@ -109,7 +110,7 @@ class EmailSetDeletePerformer @Inject()(messageIdManager: 
MessageIdManager,
 
   private def auditTrail(deleteResult: DeleteResult, mailboxSession: 
MailboxSession): Unit =
     if (!deleteResult.getDestroyed.isEmpty) {
-      AuditTrail.entry
+      ReactorUtils.logAsMono(() => AuditTrail.entry
         .username(() => mailboxSession.getUser.asString())
         .protocol("JMAP")
         .action("Email/set destroy")
@@ -117,6 +118,6 @@ class EmailSetDeletePerformer @Inject()(messageIdManager: 
MessageIdManager,
           "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 95fa095a44..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
@@ -51,7 +51,7 @@ import org.apache.james.queue.api.MailQueueFactory.SPOOL
 import org.apache.james.queue.api.{MailQueue, MailQueueFactory}
 import org.apache.james.rrt.api.CanSendFrom
 import org.apache.james.server.core.{MailImpl, MimeMessageSource, 
MimeMessageWrapper}
-import org.apache.james.util.AuditTrail
+import org.apache.james.util.{AuditTrail, ReactorUtils}
 import org.apache.mailet.{Attribute, AttributeName, AttributeValue, Mail}
 import org.slf4j.{Logger, LoggerFactory}
 import play.api.libs.json._
@@ -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(_ => AuditTrail.entry
+        .doOnSuccess(_ => 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(_ => AuditTrail.entry
+        .doOnSuccess(_ => 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 7824aff7d2..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,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(_ => AuditTrail.entry
+        .doOnSuccess(_ => 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`()
 
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
index 5873ab3fb0..377c1e0cdc 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
@@ -37,6 +37,7 @@ import org.apache.james.jmap.http.{Authenticator, 
UserProvisioning}
 import org.apache.james.jmap.json.ResponseSerializer
 import org.apache.james.jmap.{Endpoint, JMAPRoute, JMAPRoutes}
 import org.apache.james.mailbox.MailboxSession
+import org.apache.james.util.{MDCBuilder, ReactorUtils}
 import org.slf4j.{Logger, LoggerFactory}
 import play.api.libs.json.{JsError, JsSuccess, Json}
 import reactor.core.publisher.{Mono, SynchronousSink}
@@ -75,6 +76,9 @@ class JMAPApiRoutes @Inject() (@Named(InjectionKeys.RFC_8621) 
val authenticator:
       .onErrorResume(throwable => handleError(throwable, httpServerResponse))
       .asJava()
       .`then`()
+      .contextWrite(ReactorUtils.context("MDCBuilder.IP", MDCBuilder.create()
+        .addToContext(MDCBuilder.IP, 
Option(httpServerRequest.hostAddress()).map(_.toString()).getOrElse(""))
+        .addToContext("x-forwarded-for", 
Option(httpServerRequest.requestHeaders().get("X-Forwarded-For")).getOrElse(""))))
 
   private def requestAsJsonStream(httpServerRequest: HttpServerRequest): 
SMono[RequestObject] =
     SMono.fromPublisher(httpServerRequest


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

Reply via email to