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