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